上周我们搭建好了hadoop环境,接下来我们进行一些MapReduce实践。
本次测试是对一篇英文文章进行单词计数,统计每一个单词出现的总次数并输出结果。注:图片来源:八斗学院
思路如上图:
→input:文章
→将文章的每一行按照空格切分为列表.strip().split(’ ')
→读取列表元素(单词)
→对读取到的每一个单词进行标记word1 1
→排序相同的单词
→统计每一个单词的总数并输出word1 n
我们实践来看下:
1)input文章内容如下:
文章只有三行。
2)map.py:
import sys
for line in sys.stdin:#这里按标准输入文章
ss = line.strip().split(' ')#将文章每一行内容按空格切分为列表,可print ss 看下具体结果
for word in ss:#遍历列表,读取里面的元素
print '\t'.join([word.strip(), '1'])
mapping测试:
cat test.txt | python map.py
输出结果:读取每一个单词并标记1
2)red.py:
#!/usr/local/bin/python
import sys
current_word = None
sum = 0
for line in sys.stdin:#这里按照标准输入,输入的是map.py输出的结果
word, val = line.strip().split('\t')#map输出的结果我们是按照\t进行分隔
if current_word == None:
current_word = word
if current_word != word:
print "%s\t%s" % (current_word, sum)
current_word = word
sum = 0
sum += 1
print “%s\t%s” % (current_word, str(sum))
reducing本地测试1:
cat test.txt | python map.py | python red.py
输出结果:
从上图看,此结果并没有将相同的单词统计在一起,这是因为本地测试命令没有将map.py的输出结果进行排序合并!本地测试时需要手动排序,在集群上运行时,MapReduce框架会自动进行排序合并!这是需要注意的!
reducing本地测试2:
cat test.txt | python map.py | sort -k1 | python red.py
输出结果:我们看到相同的单词已经统计在一起了
至此,MapReduce本地测试就完成了,步骤就是这样,我们在写代码的时候,可以对每一个不熟悉的函数单独进行本地测试,看其输出结构究竟是什么,以了解其中的含义,加深理解。
3)接下来我们让这个测试在集群上运行一下看结果如何:
run.sh脚本如下:
HADOOP_CMD="/usr/local/src/hadoop-2.6.1/bin/hadoop"
STREAM_JAR_PATH="/usr/local/src/hadoop-2.6.1/share/hadoop/tools/lib/hadoop-streaming-2.6.1.jar"
INPUT_FILE_PATH_1="/test.txt"
OUTPUT_PATH="/output"
$HADOOP_CMD fs -rm -r -skipTrash $OUTPUT_PATH
#Step 1.
$HADOOP_CMD jar $STREAM_JAR_PATH \
-input $INPUT_FILE_PATH_1 \
-output $OUTPUT_PATH \
-mapper "python map.py" \
-reducer "python red.py" \
-file ./map.py \
-file ./red.py
运行脚本之前先上传test.txt文件到HDFS上
hadoop fs -put text.txt /
hadoop fs -ls /查看是否上传成功
运行脚本
bash run.sh
hadoop fs -ls /运行完后查看输出
hadoop fs -ls /output查看输出结果:
hadoop fs -text /output/part-00000
输出结果和我们本地测试结果一致!end!
下一文我们将介绍MapReduce在集群上分发文件的几种方式。
欢迎关注:【大数据学习笔记】个人公众号,一起交流学习!感谢指导!