什么是hadoop streaming
一开始是只能用java语言来编写mapreduce程序的。
hadoop streaming是一种框架,可以让我们使用其他的语言来编写mapreduce程序,而不止局限于Java。
hadoop streaming使用unix的standard streams作为我们的mr程序和MapReduce框架之间的接口。只要我们的mr程序可以再标准io上进行读写。
hadoop streaming的特点
- map的输入是通过标准input一行一行接受数据的
- map的输出必须是key-value对
- reduce的输入是map的输出,也就是说,reduce的输入也必须是key-value对
什么是map reduce
map reduce是一种编程模型。分为map和reduce两个步骤。
map将一组key-value映射为一组新的key-value,然后交给并发的reduce。
key相同的key-value传入同一个reducer,reducer做进一步处理,并把结果输出到hdfs。
word count的map reduce原理
map接受的key是文件的名称,value是文件的内容。
map的输出key是词,value是1,表示找到的一个词。
map首先对一个文件分词,然后遍历这些词,每遇到一个词,就产生一个(kye=词,value=1)
相同词的key-value对,传输到同一个reducer,reducer累加得到该词出现的次数,并把计算结果输出到hdfs。
word count的程序运行步骤
- 将输入文件分成n片。n为mapper程序的数量。
- 每一片内容分给一个mapper程序进行计算。
- 每个mapper程序计算后,将结果交给reducer。
- 每个reducer汇总mapper的输入,各自输出一份结果。
使用streaming发布一个用python写的mr程序
hadoop jar /opt/hadoop-2.6.0/share/hadoop/tools/lib/hadoop-streaming-2.6.0.jar -mapper /home/hadoop/hadoop_wordcount/mapper.py -reducer /home/hadoop/hadoop_wordcount/reducer.py -input test.txt -output res.txt -jobconf mapred.map.tasks=4 -mapred.reduce.tasks=2
其中-mapper用于指定mapper程序,
-reducer用于指定reducer程序,
-input指定输入文件,
-output指定输出文件,
-jobconf mapred.map.tasks指定mapper的数量
-jobconf mapred.reduce.tasks指定reducer的数量