1.Hadoop&Streaming简介
1.1 Hadoop简介
Hadoop MapReduce是一个用于处理海量数据的分布式计算框架,这个框架解决了诸如数据分布式存储,作业调度,容错,机器间通信等复杂问题,可以让没有分布式处理经验的工程师非常简单的写出并行分布式程序。
MapReduce采用“分而治之”的思想,将计算任务抽象成Map和Reduce两个计算过程:
A.首先把输入分割成不相关的若干键值(key1/value1)集合,这些键值会有多个map任务来并行处理。
B.MapReduce会对map的输出(一些中间键值对key2/value2集合)按照key2进行排序,排序用memcmp的方式对key在内存中字节数组进行比较后进行排序。
C.将属于同一个key2的所有value2组合分至一个reduce作为输入
D.由reduce任务计算出最终结果并输入key3/value3
通常计算任务的输入和输出都是存放在HDFS(Hadoop Distributed File System)中,系统会尽量调度计算任务到数据所在的节点上运行,而不是将数据移动到计算节点,减少大量数据在网络中的传输,尽量节省带宽。
1.2 Streaming简介
Hadoop MR和HDFS有Java实现,默认提供Java编程接口,另外提供C++编程接口和Streaming框架,Streaming框架允许任何程序语言实现的程序在MR中使用,方便已有程序向Hadoop平台移植。
Streaming的原理是用Java实现一个包装用户程序的MR程序,该程序负责调用MR Java接口获取key/value对输入,创建一个新的进程启动包装过的用户程序,将数据通过管道传递给包装过的用户处理程序,然后调用MR Java接口将用户程序的输出切分成key/value对输入。
1.3 Demo示例
mapper为一个python程序,reduce直接为“cat”命令,不做其他处理:(文件为一个shell脚本)
1: $hadoop streaming \
2: -input "$input_path" \
3: -output "$output_path" \
4: -mapper "mapper.py" \
5: -reduce "cat" \
6: -file "mapper.py" \
7: -jobconf mapred.job.name="Streaming_demo"
1.4 Streaming开发过程中需要注意的几个方面:
A.Mapper程序:对输入key/value数据进行处理;
B.Reducer程序:对mapper的输出进行归并处理;
C.Combiner:在本地对一个计算节点上的mapper输出进行归并
D.Partitioner:将mapper的输出分配到reducer
E.InputFormat/OutputFormat:对输入数据进行切分,保存输出数据
2.Streaming优缺点分析
2.1 Streaming优点
A. 一方面用其他语言(包括脚本语言)编写的程序可以方便地移植到Hadoop平台上,程序只需要按照一定的格式从标准输入读取数据、向标准输出写数据就可以在Hadoop平台上使用,原有的单机程序稍加改动就可以在Hadoop平台进行分布式处理;另一方面用于Streaming的程序可以在单机上用下面的方式运行,因此可以先用小规模数据在单机调试,使用本地的调试方法和调试工具,节省开发测试的时间。
cat input | mapper | sort | reducer > output
B. 可以使用性能更好的语言(C/C++)来编写程序。
C. Streaming框架汇总通过limit等方式可以灵活的先知应用程序使用的内存等资源
2.2 Streaming缺点
A. Hadoop Streaming默认只能处理文本数据,无法直接对二进制数据进行处理
B. Streaming中的mapper和reducer默认只能向标准输出写数据,不能方便地处理多路输出