玻璃心 2014-05-17
文章来源:http://www.itnose.net/detail/6044147.html 更多文章:http://www.itnose.net/type/119.html
hadoop streaming允许我们使用任何可执行脚本来处理按行组织的数据流,数据取自UNIX的标准输入STDIN,并输出到STDOUT
通过设定mapper为‘RandomSample.py 10’,我们按十分之一的采样率,没有设定特殊的reducer,一般默认使用IdentityReducer(把输入直接转向输出)
通过HDFS的命令getMerge(输出合并)或其他文件操作,可以获得正确数目的输出文件
随机采样脚本用Python实现,但是只要基于STDIN和STDOUT的脚本语言都可以,当把一个文件当作php脚本时,<?php ...........?>这里的?>要省略
在Sreaming中,每个mapper都会看到完整的数据流,也正是由mapper负责将完整的数据流分割成记录,而在java模式中,是由框架将输入数据分割为记录,每次仅将一个记录传给map()。
Streaming模式更容易维护一个分片中跨记录的状态信息,我们利用这一点计算多个记录中的最大值。
聚类算法:可以让mapper计算一个分片(多个记录)的最大值,reducer接收这些值并输出一个全局最大值
我们使用聚合函数来计算统计,它通常分为三类:分配型,代数型和全集型。最大函数式是一个分配型的例子,其他分配型包括最小值,求和和计数,分配型函数具有分配律特征,你可以在逻辑上循环的将这些函数应用到更小块的数据上
默认情况下Streaming使用制表符分离记录的key和value,当没有制表符时,整个记录被视为key,而value为空白文本。mapper可以选择把每条记录翻译成一个键值对,还是一行文本
实践上讲reducer的输出直接写入到一个文件中,但技术上讲,在写之前还有个无操作的步骤,在这个步骤中,Streaming API将reducer的输出自动用制表符分开,并将键值对送到默认的TextOutPutFormat中,即在文件输出前,默认插入一个制表符
hadoop有个aggregate软件包,它让数据汇集更为简单
当我们使用的时候,可以直接封装,例如编写ValueHistogram.py对ValueHistogram进行封装
在mapper和reducer之间增加了combiner,它在数据的转换上必须同reducer等价,mapreduce可以使用combiner次数不限(0到N),如果我们去掉combiner,reducer输出应保持不变,而且当combiner被应用于中间数据任意子集时,仍需保持等价转换的特性