2.1 气象数据集
没啥可读的,就是说有一组数据,然后呢,要从这些数据里找到每一年的最高气温
2.2 使用unix工具来分析数据
也没啥可看的,就是说可以用awk工具来处理这个数据,要运行42分钟
2.3使用hadoop来分析数据
2.3.1 map和reduce
敲黑板啦,这个重点!!
看上面这个图,
map阶段:入参就是一行一行的原始数据,然后经过map之后,会输出一个一个的键值对,key是年份,value是温度。
shuffle阶段:把key相同的数据整理一下,value就合并在一起,然后发给reduce
reduce阶段:把value的值做个排序,输出结果
2.3.2 java MapReduce
此处主要是讲java如何开发mr程序。主要是三个类,map, reduce,job
map:
reduce:
job:
2.4横向扩展
2.4.1 数据流
作业(job): 是客户端要执行的一个工作单元,包含 数据,mr程序,配置信息
分片:将rm程序的输入数据分成等长的数据块,每个分片会构造一个map程序,分片越小,负载均衡水平越好。分片太小,管理分片和构建map程序会耗时变多。默认是128m.
数据本地化:在存储有数据的节点上运行map任务,就可以避免网络开销,可以获得最佳性能。如果存储副本的节点正在运行其他任务,那么会把作业调度到某存储节点的同一机架的空闲节点上运行map。在存储节点的不同机架运行的情况几乎不可能。
map任务的结果,是存储在硬盘中的,而不是hdfs,因为是中间结果,最终是要删除的,为了减小开销。map任务把中间结果传输给reduce时失败,会在其他节点重新map一次,再发给reduce。
reduce任务没有数据本地化,一般reduce结果会存入hdfs,一个副本也会存在reduce运行的节点上。
reduce任务的数量并非由输入的数据量大小决定,而是独立指定的,第8章会讲
如果有多个reduce任务,每个map任务就会针对输出进行分区(partition),每个分区有很多key。分区可以由用户的自定义分区函数来控制,一般使用默认的hash算法来分区,比较高效。
shuffle:混洗,map和reduce之间的数据流。调整混洗参数对作业的运行时间影响非常大
无reduce任务: 当任务完全并行,无需混洗,可能会出现无reduce任务,这时,map把结果直接写入hdfs
2.4.2 combiner函数
提前reduce,属于优化方案,对于那些combiner多次,reduce结果还是一样的。比如:
假如加了combiner
好处,可以减少map到reduce的数据传输量,减少reduce的计算量。但是不能完全取代reduce,因为不同map之间,就不能combiner了。
2.4.3运行分布式的mapReduce作业
这里没啥可说的
2.5 hadoop streaming
开始我以为是讲流式计算,结果我错了,这里讲的是:
因为hadoop streaming使用标准的unix标准流来作为hadoop和应用程序的接口,所以可以使用任何标准语言来编写mr程序。
然后演示了:ruby和python如何来写mr程序