看完hadoop权威指南第一,二章,初步了解了hadoop的结构和相关生态,主要详细从第二章mapreduce学习开始,现总结备查。
什么是mapreduce?
读完后,就问自己什么是mapreduce,想自己理解归纳下。
mapreduce是一种分布式的并行计算编程模型。主要把计算分map和reduce两个阶段。
- map阶段是把原始输入数据分为多块输入到多个map函数中进行并行的逻辑处理和排序,然后输出中间结果;
- reduce阶段是以map阶段的多个输出汇聚后,作为reduce函数的输入,再由reduce函数进行汇总逻辑计算,然后输出最后结果。
两个阶段都是通过KEY/VALUE的方式作为输入和输出。一般map的输入可以是文件格式(如文件行号作为KEY,每行数据作为VALUE)。
hadoop的mapreduce工作模式
hadoop中的mapreduce是由job控制和执行的。一个job包括:输入数据,mapreduce程序和配置。
- 准备输入数据到hadoop的HDFS(分布是文件系统,同时负责把原始输入数据分割个小块,也叫分片。),由namenode主节点控制分片逻辑和元数据,分别保存在多个datanode节点机上。
- jobtracker(任务主控机,和HDFS的namenode一般在一台机器上)生成多个task,协调多个tasktracker来分别并行执行计算。通常在存储输入数据分片的每个datanode上运行计算(数据就近计算优化:data locality optimization)
- 一般来说,hadoop为每个分片构建一个map任务,在jobtracker的协调下由tasktracker进行运算,然后把多map任务的输出排序后,通过网络发送给一个reduce任务节点(也是tasktracker,由jobtracker协调),合并数据后由reduce函数继续计算处理并输出最后结果。
- 关于分片的大小:如果太小,片总数量多,管理和协调分片及计算的时间和构建map任务的时间想多较多;如果太大,并行计算的任务数太小,负载平衡的效果则受到影响。原始数据的分片在hadoop的HDFS中一般是64M,但是可以根据实际情况进行参数调整。
- map的计算结果是中间结果一般保存在节点本地磁盘,因为中间结果是临时的,不需要写多份;reduce的最终结果保存在HDFS上。
书中hadoop-HDFS的数据量
原始数据的输入有推和拉两种方式
- 推一般是0.20版本前的JAVA-API提供的每次map函数只读取一行的处理方式(也可以使用实例变量保持每次读取的数据,然后在批量处理,实现拉方式);
- 拉方式是0.20后的新API提供的UNIX标准流方式进行输入输出,这就和JAVA-IO的处理方式一样,由read来控制读取的数量多少和处理时机。
hadoop的流(streaming)
hadoop的mapreduce程序框架提供了UNIX标志流作为hadoop和应用程序间的接口,所以可以使用任何支持标志输入/输出流的语音进行mapreduce程序开发(基本大部分语音都支持,呵呵)。
本节无源代码,因为主要是理论,代码也是书上的示例,拷贝无意义。