Hadoop(自带)例子

1. 计算单词数

该MapReduce程式用于计算某一文件夹下所有文件中的英文单词数,英文单词以空格隔开,实现类似于Linux的wc(WordCount)命令。

准备数据

在本地文件系统的HOME目录下创建文件夹input及其下文件file01file02,内容如下:

file01:

hello world
you are welcome

file02:

world is beautiful
you you you

将文件夹上传至HDFS

cd ~ # 转置HOME目录下
hadoop fs -copyFromLocal input/ /user/hadoop/ # 将input上传至/user/hadoop

查看一下文件是否已上传成功:

hadoop fs -ls /user/hadoop/input

运行WordCount程序

跳转至hadoop安装目录下:

hadoop jar hadoop-0.20.203.0-examples.jar wordcount /user/hadoop/input /user/hadoop/output

Tips 执行过一次之后HDFS会产生output目录,第二次执行时就会报告output文件夹已存在的错误。所以第二次的输出目录设置为output2,就不用删除output文件夹。

查看结果

如果运行正常结束,/user/hadoop/output目录下将有结果文件,查看文件内容:

hadoop fs -cat /user/hadoop/output/part-r-00000

正常的话显示如下信息:

are     1
beautiful       1
hello   1
is      1
welcome 1
world   2
you     4

结果分析

分析过程详解这裡,不过该博客的代码是旧的。该程序是独立的,可以按照Hadoop集成环境单独编译该程式并运行。

2. SecondarySort数字对排序

该MapReduce用于数字对<a,b>的排序,并以a分组。首先准备文件和数据:

mkdir sortinput
cd sortinput
touch file01
touch file02
#编译file01和file02内容
hadoop fs -copyFromLocal sortinput sortinput # 上传至hdfs

file01和file02内容如下:

file01:

1 23
1 24
2 34
1 10
3 33
2 57

file02:

3 23
3 89
2 32
1 39
2 27
1 3

然后在hadoop主目录下执行SecondaySort:

bin/hadoop jar hadoop-examples-0.20.203.0.jar  secondarysort sortinput sortoutput

正常结束的话可查看到结果:

hadoop fs -cat sortoutput/part-r-00000
------------------------------------------------
1       3
1       10
1       23
1       24
1       39
------------------------------------------------
2       27
2       32
2       34
2       57
------------------------------------------------
3       23
3       33
3       89

源代码及原理

思路:将数字对<a,b>当作key,b当作value,在map函数中将输入文件每行转换成<key,value>。然后以a(没有b)作为分区的输入值,将相同的a都送入相同的分区。然后通过一个分组比较器GroupingComparator将相同的a作为一个分组,这样在reduce中,相同的a都会被当作同一个key输入给reduce,最后reduce将结果输出。至于排序,已经在magic般的洗牌过程中完成。其实我在想,其他应用也需要排序吗?MapReduce只要完成分拣的过程就行了吧?

亮点:自定义序列化类IntPair,参考Hadoop序列化;分区和分组的应用。

文档更新时间: 2018-11-10 18:59   作者:nick