从零自学Hadoop(08):第一个MapReduce
阅读目录
本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作。
文章是哥(mephisto)写的,SourceLink
序
上一篇,我们的Eclipse插件搞定,那开始我们的MapReduce之旅。
在这里,我们先调用官方的wordcount例子,然后再手动创建个例子,这样可以更好的理解Job。
数据准备
一:说明
wordcount这个类是对不同的word进行统计个数,所以这里我们得准备数据,当然也不需要很大的数据量,毕竟是自己做试验对吧。
二:造数据
打开记事本,输入各种word,有相同的,不同的。然后保存为words_01.txt。
三:上传
打开eclipse,然后在DFS location 中将我们准备的数据源上传到tmp/input。
这样我们的数据就准备好了。
wordcount
一:官网示例
wordcount是hadoop的一个官网试例,打包在hadoop-mapreduce-examples-<ver>.jar。
二:找到示例
我们在结果中看到两个地方有,那就找个近一点的地方吧。
find / -name *hadoop-mapreduce-examples*
四:进入目录
我们选择进入/usr/hdp/下面的这个例子。
cd /usr/hdp/2.3.0.0-/hadoop-mapreduce五:执行
我们先使用hadoop jar这个命令执行。
命令说明:hadoop jar 包名称 方法 输入文件/目录 输出目录
#切换用户
su hsfs
#执行
hadoop jar hadoop-mapreduce-examples-2.7.1.2.3.0.-.jar wordcount /tmp/input/words_01.txt /tmp/output/1007_01命令执行结果
插件结果
job页面结果
这样我们的第一个job就这样顺利的执行完成了。
Yarn
一:介绍
Hadoop2.X和Hadoop1.X有两个最大的变化,也是根本性变化。
其中一个是Namenode的单点问题解决,然后就是Yarn的引入。在这里我们就不做展开的讲了,后面会安排章节进行讲述。
二:Yarn命令
如果仔细看的话,我们可以发现在上面hadoop jar这个命令执行后,会有一个警告。
yarn jar hadoop-mapreduce-examples-2.7.1.2.3.0.-.jar wordcount /tmp/input/words_01.txt /tmp/output/1007_02
新建MapReduce
一:通过插件新建工程
这里就不详说了,在上一篇我们通过插件建立了一个工程,我们直接使用那个工程“com.first”。
二:新建WordCountEx类
这个是我们的自定义的wordcount类,仿照官网例子写的,做了点DIY,方便大家理解。
完成后
三:新建Mapper
在WordCountEx类中建一个内部类MyMapper。
在这里我们做了点DIY,排除了字母长度小于5的数据,方便大家对比理解程序。
static class MyMapper extends Mapper<Object, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1);
private Text word = new Text(); @Override
protected void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context)
throws IOException, InterruptedException { // 分割字符串
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
// 排除字母少于5个的
String tmp = itr.nextToken();
if (tmp.length() < 5)
continue;
word.set(tmp);
context.write(word, one);
}
} }四:新建Reduce
同上,我们将map的结果乘以2,然后输出的内容的key加了个前缀。
static class MyReduce extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
private Text keyEx = new Text(); @Override
protected void reduce(Text key, Iterable<IntWritable> values,
Reducer<Text, IntWritable, Text, IntWritable>.Context context)
throws IOException, InterruptedException { int sum = 0;
for (IntWritable val : values) {
// 将map的结果放大,乘以2
sum += val.get() * 2;
}
result.set(sum);
// 自定义输出key
keyEx.set("输出:" + key.toString());
context.write(keyEx, result);
} }五:新建Main
在main方法中我们得定义一个job,配置它。
public static void main(String[] args) throws Exception { //配置信息
Configuration conf = new Configuration(); //job名称
Job job = Job.getInstance(conf, "mywordcount"); job.setJarByClass(WordCountEx.class);
job.setMapperClass(MyMapper.class);
// job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(MyReduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class); //输入、输出path
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1])); //结束
System.exit(job.waitForCompletion(true) ? 0 : 1);
}六:导出jar包
导出我们写好的jar包。命名为com.first.jar
七:放入Linux
将导出的jar包放到H31的/var/tmp下
cd /var/tmp
ls八:执行
大家仔细看下命令和结果会发现有什么不同
yarn jar com.first.jar /tmp/input/words_01.txt /tmp/output/1007_03
如果是仔细看了,发现少个wordcount对吧,为什么列,因为在导出jar包的时候制定的main函数。
九:导出不指定main入口的jar包
我们在导出的时候,不指定main的入口。
十:执行2
我们发现这里就得多带一个参数了,就是方法的入口,这里得全路径。
yarn jar com.first.jar com.first.WordCountEx /tmp/input/words_01.txt /tmp/output/1007_04
十一:结果
我们看下输出的结果,可以明显的看到少于5个长度的被排除了,而且结果的count都乘以了2。前缀乱码的不要纠结了,换个编码方式就好了。
--------------------------------------------------------------------
到此,本章节的内容讲述完毕。
示例下载
Github:https://github.com/sinodzh/HadoopExample/tree/master/2015/com.first
系列索引
本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作。
文章是哥(mephisto)写的,SourceLink
从零自学Hadoop(08):第一个MapReduce的更多相关文章
- 从零自学Hadoop系列索引
本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 从零自学Hadoop(01):认识Hadoop ...
- 从零自学Hadoop(01):认识Hadoop
本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 阅读目录 序 Hadoop 项目起源 优点 核心 ...
- 从零自学Hadoop(07):Eclipse插件
阅读目录 序 Eclipse Eclipse插件 新建插件项目 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写 ...
- 从零自学Hadoop(09):使用Maven构建Hadoop工程
阅读目录 序 Maven 安装 构建 示例下载 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,Source ...
- 从零自学Hadoop(10):Hadoop1.x与Hadoop2.x
阅读目录 序 里程碑 Hadoop1.x与Hadoop2.x 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的 ...
- 从零自学Hadoop(11):Hadoop命令上
阅读目录 序 概述 Hadoop Common Commands User Commands Administration Commands File System Shell 引用 系列索引 本文版 ...
- 从零自学Hadoop(13):Hadoop命令下
阅读目录 序 MapReduce Commands User Commands Administration Commands YARN Commands User Commands Administ ...
- 从零自学Hadoop(14):Hive介绍及安装
阅读目录 序 介绍 安装 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 本系列已 ...
- 从零自学Hadoop(16):Hive数据导入导出,集群数据迁移上
阅读目录 序 导入文件到Hive 将其他表的查询结果导入表 动态分区插入 将SQL语句的值插入到表中 模拟数据文件下载 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并 ...
随机推荐
- 利用AE编写切图工具的一些探讨
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 这周利用晚上在家时间研究了下如何使用AE来开发切图工具.最初 ...
- Apple的LZF算法解析
有关LZF算法的相关解析文档比较少,但是Apple对LZF的开源,可以让我们对该算法进行一个简单的解析.LZFSE 基于 Lempel-Ziv ,并使用了有限状态熵编码.LZF采用类似lz77和lzs ...
- DotNet隐藏敏感信息操作方法
在项目中,有时候一些信息不便完全显示,只需要显示部分信息.现在提供一些隐藏敏感信息的操作方法,主要为对信息的截取操作: 1.指定左右字符数量,中间的*的个数和实际长度有关: /// <summa ...
- .NET Core New csproj 如何发布可执行文件
一.前言 .NET工具链在最新的Preview3版本中,引入了新的MSBuild项目系统,项目文件又回归了.csproj的XML文件来管理,项目文件.包引用.程序集引用..NET Core工具集.发布 ...
- SqlServer 分页查询
1.not in方法 select top 10 from books where id not in (select top 30 id from books) 2.row_number()函数 ...
- 基于Metronic的Bootstrap开发框架经验总结(12)--页面链接收藏夹功能的实现
在一个系统里面,往往有很多菜单项目,每个菜单项对应一个页面,一般用户只需要用到一些常用的功能,如果每次都需要去各个层次的菜单里面去找对应的功能,那确实有点繁琐.特别是在菜单繁多,而客户又对系统整体不熟 ...
- 在IIS启用MP4
在Windows 2008 R2 Server中,网站无法播放MP4视频.我们需要在IIS的MIME type: 如果我们不想在IIS管理介面更改与设置,或是我们没有更多权限,这样我们可以项目的Web ...
- jquery 和 css 属性
offset()获取标签离左上角的位置,离顶部和左部的距离.离整个屏幕的左上角的距离. position() 相对于某一个标签的位置.离父标签的距离.离父标签的左上角的距离. height(), wi ...
- python之网络编程
本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道.FIFO.消息队列) 同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 共享内存(匿名的和具名的) 远程过程调用 ...
- javascript 模式(2)——单例模式
单例模式是一种非常极端的模式,它保证了一个类在整个应用程序域中只有一个实体,意味着当你多次创建某一个类的实例的时候它们都是第一次创建的那个. 在Java或c#环境实现单例模式很简单,只需要定义静态变量 ...












