1.概述

  在上篇博客中,我们搭建了《配置高可用Hadoop平台》,接下来我们就可以驾着Hadoop这艘巨轮在大数据的海洋中遨游了。工欲善其事,必先利其器。是的,没错;我们开发需要有开发工具(IDE);本篇文章,我打算讲解如何搭建和使用开发环境,以及编写和讲解WordCount这个例子,给即将在Hadoop的海洋驰骋的童鞋入个门。上次,我在《网站日志统计案例分析与实现》中说会将源码放到Github,后来,我考虑了下,决定将《高可用的Hadoop平台》做一个系列,后面基于这个平台,我会单独写一篇来赘述具体的实现过程,和在实现过程中遇到的一些问题,以及解决这些问题的方案。下面我们开始今天的启航

2.启航

  IDE:JBoss Developer Studio 8.0.0.GA (Eclipse的升级版,Redhat公司出的)

  JDK:1.7(或1.8)

  Hadoop2x-eclipse-plugin:这个插件,本地单元测试或自己做学术研究比较好用

  插件下载地址:https://github.com/smartdengjie/hadoop2x-eclipse-plugin

  由于JBoss Developer Studio 8基本适合于Retina屏,所以,我们这里直接使用JBoss Developer Studio 8,JBoss Developer Studio 7对Retina屏的支持不是很完美,这里就不赘述了。

  附上一张IDE的截图:

2.1安装插件

  下面我们开始安装插件,首先展示首次打开的界面,如下图所示:

  然后,我们到上面给的Github的地址,clone整个工程,里面有编译好的jar和源码,可自行选择(使用已存在的和自己编译对应的版本),这里我直接使用编译好的版本。我们将jar放到IDE的plugins目录下,如下图所示:

  接着,我们重启IDE,界面出现如下图所示的,即表示插件添加成功,若没有,查看IDE的启动日志,根据异常日志定位出原因。

2.2设置Hadoop插件

  配置信息如下所示(已在图中说明):

  添加本地的hadoop源码目录:

  到这里,IDE和插件的搭建就完成了,下面我们进入一段简单的开发,hadoop的源码中提供了许多example让我学习,这里我以WordCount为例子来说明:

3.WordCount

  首先我们看下hadoop的源码文件目录,如下图所示:

3.1源码解读

  1. package cn.hdfs.mr.example;
  2.  
  3. import java.io.IOException;
  4. import java.util.Random;
  5. import java.util.StringTokenizer;
  6.  
  7. import org.apache.hadoop.conf.Configuration;
  8. import org.apache.hadoop.fs.Path;
  9. import org.apache.hadoop.io.IntWritable;
  10. import org.apache.hadoop.io.Text;
  11. import org.apache.hadoop.mapreduce.Job;
  12. import org.apache.hadoop.mapreduce.Mapper;
  13. import org.apache.hadoop.mapreduce.Reducer;
  14. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  15. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  16. import org.slf4j.Logger;
  17. import org.slf4j.LoggerFactory;
  18.  
  19. import cn.hdfs.utils.ConfigUtils;
  20.  
  21. /**
  22. *
  23. * @author dengjie
  24. * @date 2015年03月13日
  25. * @description Wordcount的例子是一个比较经典的mapreduce例子,可以叫做Hadoop版的hello world。
  26. * 它将文件中的单词分割取出,然后shuffle,sort(map过程),接着进入到汇总统计
  27. * (reduce过程),最后写道hdfs中。基本流程就是这样。
  28. */
  29. public class WordCount {
  30.  
  31. private static Logger log = LoggerFactory.getLogger(WordCount.class);
  32.  
  33. public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
  34.  
  35. private final static IntWritable one = new IntWritable(1);
  36. private Text word = new Text();
  37.  
  38. /*
  39. * 源文件:a b b
  40. *
  41. * map之后:
  42. *
  43. * a 1
  44. *
  45. * b 1
  46. *
  47. * b 1
  48. */
  49. public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
  50. StringTokenizer itr = new StringTokenizer(value.toString());// 整行读取
  51. while (itr.hasMoreTokens()) {
  52. word.set(itr.nextToken());// 按空格分割单词
  53. context.write(word, one);// 每次统计出来的单词+1
  54. }
  55. }
  56. }
  57.  
  58. /*
  59. * reduce之前:
  60. *
  61. * a 1
  62. *
  63. * b 1
  64. *
  65. * b 1
  66. *
  67. * reduce之后:
  68. *
  69. * a 1
  70. *
  71. * b 2
  72. */
  73. public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
  74. private IntWritable result = new IntWritable();
  75.  
  76. public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
  77. int sum = 0;
  78. for (IntWritable val : values) {
  79. sum += val.get();
  80. }
  81. result.set(sum);
  82. context.write(key, result);
  83. }
  84. }
  85.  
  86. @SuppressWarnings("deprecation")
  87. public static void main(String[] args) throws Exception {
  88. Configuration conf1 = new Configuration();
  89. Configuration conf2 = new Configuration();
  90. long random1 = new Random().nextLong();// 重定下输出目录1
  91. long random2 = new Random().nextLong();// 重定下输出目录2
  92. log.info("random1 -> " + random1 + ",random2 -> " + random2);
  93. Job job1 = new Job(conf1, "word count1");
  94. job1.setJarByClass(WordCount.class);
  95. job1.setMapperClass(TokenizerMapper.class);// 指定Map计算的类
  96. job1.setCombinerClass(IntSumReducer.class);// 合并的类
  97. job1.setReducerClass(IntSumReducer.class);// Reduce的类
  98. job1.setOutputKeyClass(Text.class);// 输出Key类型
  99. job1.setOutputValueClass(IntWritable.class);// 输出值类型
  100.  
  101. Job job2 = new Job(conf2, "word count2");
  102. job2.setJarByClass(WordCount.class);
  103. job2.setMapperClass(TokenizerMapper.class);
  104. job2.setCombinerClass(IntSumReducer.class);
  105. job2.setReducerClass(IntSumReducer.class);
  106. job2.setOutputKeyClass(Text.class);
  107. job2.setOutputValueClass(IntWritable.class);
  108. // FileInputFormat.addInputPath(job, new
  109. // Path(String.format(ConfigUtils.HDFS.WORDCOUNT_IN, "test.txt")));
  110. // 指定输入路径
  111. FileInputFormat.addInputPath(job1, new Path(String.format(ConfigUtils.HDFS.WORDCOUNT_IN, "word")));
  112. // 指定输出路径
  113. FileOutputFormat.setOutputPath(job1, new Path(String.format(ConfigUtils.HDFS.WORDCOUNT_OUT, random1)));
  114. FileInputFormat.addInputPath(job2, new Path(String.format(ConfigUtils.HDFS.WORDCOUNT_IN, "word")));
  115. FileOutputFormat.setOutputPath(job2, new Path(String.format(ConfigUtils.HDFS.WORDCOUNT_OUT, random2)));
  116.  
  117. boolean flag1 = job1.waitForCompletion(true);// 执行完MR任务后退出应用
  118. boolean flag2 = job1.waitForCompletion(true);
  119. if (flag1 && flag2) {
  120. System.exit(0);
  121. } else {
  122. System.exit(1);
  123. }
  124.  
  125. }
  126. }

4.总结

  这篇文章就和大家分享到这里,如果在研究的过程有什么问题,可以加群讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!

高可用Hadoop平台-启航的更多相关文章

  1. 高可用Hadoop平台-探索

    1.概述 上篇<高可用Hadoop平台-启航>博客已经让我们初步了解了Hadoop平台:接下来,我们对Hadoop做进一步的探索,一步一步的揭开Hadoop的神秘面纱.下面,我们开始赘述今 ...

  2. 高可用Hadoop平台-Oozie工作流之Hadoop调度

    1.概述 在<高可用Hadoop平台-Oozie工作流>一篇中,给大家分享了如何去单一的集成Oozie这样一个插件.今天为大家介绍如何去使用Oozie创建相关工作流运行与Hadoop上,已 ...

  3. 高可用Hadoop平台-Hue In Hadoop

    1.概述 前面一篇博客<高可用Hadoop平台-Ganglia安装部署>,为大家介绍了Ganglia在Hadoop中的集成,今天为大家介绍另一款工具——Hue,该工具功能比较丰富,下面是今 ...

  4. 高可用Hadoop平台-实战尾声篇

    1.概述 今天这篇博客就是<高可用Hadoop平台>的尾声篇了,从搭建安装到入门运行 Hadoop 版的 HelloWorld(WordCount 可以称的上是 Hadoop 版的 Hel ...

  5. 高可用Hadoop平台-实战

    1.概述 今天继续<高可用的Hadoop平台>系列,今天开始进行小规模的实战下,前面的准备工作完成后,基本用于统计数据的平台都拥有了,关于导出统计结果的文章留到后面赘述.今天要和大家分享的 ...

  6. 高可用Hadoop平台-集成Hive HAProxy

    1.概述 这篇博客是接着<高可用Hadoop平台>系列讲,本篇博客是为后面用 Hive 来做数据统计做准备的,介绍如何在 Hadoop HA 平台下集成高可用的 Hive 工具,下面我打算 ...

  7. 高可用Hadoop平台-Flume NG实战图解篇

    1.概述 今天补充一篇关于Flume的博客,前面在讲解高可用的Hadoop平台的时候遗漏了这篇,本篇博客为大家讲述以下内容: Flume NG简述 单点Flume NG搭建.运行 高可用Flume N ...

  8. 高可用Hadoop平台-Ganglia安装部署

    1.概述 最近,有朋友私密我,Hadoop有什么好的监控工具,其实,Hadoop的监控工具还是蛮多的.今天给大家分享一个老牌监控工具Ganglia,这个在企业用的也算是比较多的,Hadoop对它的兼容 ...

  9. 高可用Hadoop平台-HBase集群搭建

    1.概述 今天补充一篇HBase集群的搭建,这个是高可用系列遗漏的一篇博客,今天抽时间补上,今天给大家介绍的主要内容目录如下所示: 基础软件的准备 HBase介绍 HBase集群搭建 单点问题验证 截 ...

随机推荐

  1. Ng第十四课:降维(Dimensionality Reduction)

    14.1  动机一:数据压缩 14.2  动机二:数据可视化 14.3  主成分分析问题 14.4  主成分分析算法 14.5  选择主成分的数量 14.6  重建的压缩表示 14.7  主成分分析法 ...

  2. 前端- html 和css

    html HTML 指超文本标签语言. HTML 是通向 WEB 技术世界的钥匙. html属性:所有标签的通用属性 html事件:On...html5加了很多事件 html视频/音频:处理音视频 h ...

  3. 事件冒泡的应用——jq on的实现

    曾对jQuery中on的实现有所疑问,一直没有找到合适的实现方法,今日看<javascript高级程序设计>中的事件冒泡有了些思路. 针对于新增的DOM元素,JQ中若为其绑定事件就必须使用 ...

  4. MapReduce编程之wordcount

    实践 MapReduce编程之wordcount import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Fi ...

  5. ASP.NET Web API 框架研究 Self Host模式下的消息处理管道

    Self Host模式下的ASP.NET Web API与WCF非常相似,都可以寄宿在任意类型的托管应用程序中,宿主可以是Windows Form .WPF.控制台应用以及Windows Servic ...

  6. CxGrid筛选自动添加百分号和默认旧的滚动条样式

    CxGrid筛选自动添加百分号和默认旧的滚动条样式 2018-10-29 Delphi 约 693 字  预计阅读 2 分钟 文章目录 cxGrid支持使用like过滤时自动添加百分号 DevExpr ...

  7. C# .NET 根据Url链接保存Image图片到本地磁盘

    根据一个Image的Url链接可以在浏览器中显示一个图片,如果要通过代码将图片保存在本地磁盘可以通过以下方式: 1.首先获取图片的二进制数组. static public byte[] GetByte ...

  8. ContentControl as CC和ContentPresenter as CP的使用

    1.CC为文本控件的父类,它继承为control,所以他是控件, 2.CP继承FrameworkElement,所以他是容器,相当于占位符 3.想让控件中能包含子控件就需要用CP,反之用CC就行.(不 ...

  9. 【npm】详解npm的模块安装机制

      依赖树表面的逻辑结构与依赖树真实的物理结构 依赖树表面的逻辑结构与依赖树真实的物理结构并不一定相同! 这里要先提到两个命令:tree -d(linux)和npm ls(npm) 在一个npm项目下 ...

  10. io读取文件时考虑问题有?

    1.根据不同的文件内容选择不同的操作类 文本文件选Reader\Writer 图片.视频  inputStream\outputStream 2.要考虑源文件的编码格式,例如源文件是以GBK编码的,要 ...