Hadoop权威指南(第2版)--第2章

1.MapReduce编程模型:线性可伸缩,使用无共享框架,将问题分为独立的块,再进行并行计算。

MapReduce编程模型可用于数据处理,模型比较简单,但用于绽有用的程序并不简单。Hadoop可以运行由各种语言编写的MapReduce程序。

MapReduce程序本质上是并行运行的,优势在于处理大规模数据集。

2. MapReduce任务过程分为2个处理阶段:map阶段和reduce阶段。每个阶段都以键/值对作为输入和输出,并由程序员选择它们的类型。程序员需要完成2个函数:map函数和reduce函数。

3. map阶段:只是一个数据准备阶段。比较适合去除已损记录,去除掉缺失的、可疑的或错误的气温数据。

4.Hadoop自身提供一套可优化网络序列化传输的基本类型,可在org.apache.hadoop.io包中找到。

LongWritable类型===java中的Long类型

Text类型===Java中的String类型

    转换:String str = text.toString();

IntWritable类型===Java中的Integer类型

OutputCollector<Text, IntWritable>

Mapper<*,*,*,*>

Reducer<*,*,*,*>

MapReduceBase

JobClient

JobConf:指定作业执行规范,可以用来控制整个作业的运行。

5.Hadoop命令运行作业比直接使用Java命令运行更方便

6.Hadoop0.20.0包含新的Java MapReduce API,与旧的API的区别:

6.1新的API倾向于使用虚类,而不是接口,因为这更容易扩展。mapper和reducer都是虚类

6.2 新的API放在org.apache.hadoop.mapreduce包中

6.3 新的API使用MapContext上下文对象,使用户代码能与MapReduce系统通信。MapContext基本具备了JobConf,OutputCollector和Reporter功能

6.4 新的API支持“推”和“拉”式的迭代。

6.5 新的API实现了配置的统一。所有作业的配置均通过Configuration来完成。

6.6 新的API中作业控制由Job类实现,删除了JobClient类

6.7 输出文件的命名方式稍有不同,map的输出文件名为part-m-nnnnn,而reduce的输出为part-r-nnnnn(其中,nnnnn表示分块序号,为整数,且从0开始)

7.数据流

MapReduce作业是客户端需要执行的一个工作单元,包括:输入数据、MapReduce程序和配置信息。

有2类节点控制着作业执行过程:一个jobtracker和一系列tasktracker

jobtracker通过调度tasktracker上运行的任务,来协调所有运行在系统上的作业;tasktracker在运行任务的同时,将运行进度报告发送给jobtracker,jobtracker由此记录每项作业任务的整体进度情况。如果其中一个任务失败,jobtracker可以在另一个tasktracker节点上重新调度该任务。

8.Hadoop将MapReduce的输入数据划分成等长的小数据块,称为输入分片

Hadoop为每个分片构建一个map任务,并由该任务来运行用户自定义的map函数,从而处理分片中每条记录。map任务将其输出写入本地硬盘,而非HDFS,因为map输出的是中间结果。

9.HDFS的一个块大小,默认是64MB,它是确保可以存储在单个节点上的最大输入块的大小。

10.数据本地化优化:Hadoop在存储有HDFS数据的节点上运行map任务,可以获得最佳性。

11.reduce任务并不具备数据本地化的优势,单个reduce任务的输入通常来自于所有的mapper的输出,因此,排序后的map输出需通过网络传输发送到运行reduce任务的节点。数据在reduce端合并,然后由用户定义的reduce函数处理,reduce的输出通常存储在HDFS中以实现可靠存储。因此,reduce输出写入HDFS确实需要占用网络带宽。

12.一个reduce任务的MapReduce数据流

13. 多个reduce任务的MapReduce数据流

14.多个reduce任务的数据流表明,map任务和reduce任务之间的数据流称为shuffle混洗,因为每个reduce任务的输入都来自许多map任务。

调整混洗参数对作业总执行时间会有非常大的影响。

15.也可能没有任何reduce任务,数据处理可以完全并行时,即无需混洗,此时,唯一的非本地节点数据传输是map任务将结果写入HDFS。如下图:

16.合并函数,在MapReduce作业中使用combiner,需要慎重考虑。如果reduce函数需要处理不同map输出中具有相同键的记录,则combiner不能取代reduce。

17.Hadoop提供MapReduce的API,并允许你使用非Java的其他语言来写自己的map和reduce函数。Hadoop的Streaming使用Unix标准流作为Hadoop和应用程序之间的接口Streaming天生适合于文本处理,在文本模式下使用时,有一个数据的行视图。

18.Streaming和Java MapReduce API之间的设计差异

Java API控件的map函数一次只能处理一条记录,而Streaming中,map程序可以自己决定如何处理输入数据。Java API系统提供一个针对每个键组的迭代器,而在Streaming中,需要在程序中找出键组的边界。

19.Hadoop的Pipes

Hadoop的Pipes是Hadoop MapReduce的C++接口代称。不同于使用标准输入和输出来实现map和reduce之间的Streaming,Pipes使用套接字作为tasktracker与C++版本map函数或reduce函数的进程之间的通道。而未使用JNI。

20. Hadoop守护进程开始运行后,第一步把可执行文件复制到HDFS,以便在启动map和reduce任务时,tasktracker能够找到关联的可执行程序。

$ hadoop fs –put max_temperature bin/max_temperature

使用hadoop Pipes命令使其运行,使用-program参数传递在HDFS中可执行文件的URI,使用-D选项,表示不指定C++记录读取函数或记录写出函数。

$ hadoop pipes \

-D hadoop.pipes.java.recordreader=true \

-D haddop.pipes.java.recordwriter=true \

-input sample.txt \

-output output \

-program bin/max_temperature

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值