- 术语:
- job(作业):客户端需要执行的一个工作单元,包括输入数据、MP程序、配置信息
- Hadoop将job分成若干task(任务)来执行,其中包括两类任务:map任务、reduce任务。这些任务在集群的节点上,并通过YARN进行调度
- Hadoop将MP输入数据划分成等长的小数据块,成为“输入分片(input split)。Hadoop为每个分片构建一个map任务
- 多余大多数作业来说,一个合理分片大小趋向于HDFS的一个块的大小,默认128MB。每个新建文件可以单独指定块大小
- Hadoop在数据分片所在的节点上运行map任务,即所谓的”数据本地化优化“。
- 仅仅在非常偶然的情况下(该情况基本不会发生),将map任务分配的计算节点与数据节点分开
- 分片大小与块大小相同:优势:确保可以存储在单个节点上的最大输入块的大小,如果分片跨越两个数据块,那么对于任何一个HDFS节点,基本上都不可能同时存储这两个数据块
- map任务将其输出写入本地磁盘,而非HDFS,因为map的输出是中间结果。
- reduce任务并不具备数据本地化优势,
- 单个reduce任务的输入通常来自于所有map的输出;
- reduce的输出通常存储在HDFS中以实现可靠存储。
- reduce输出的第一个副本存储在本地节点上,其他副本出于可靠性考虑存储在其他机架的节点中。因此,reduce输出写入HDFS确实需要占用网络带宽。
- reduce任务的数量并非由输入数据的大小决定,而是独立指定的。
- 可将map输出进行分区,对每个分区指定和一个reduce任务
- 存在物reduce的MP数据流????
- combiner函数
- 集群上的可用带宽限制 MapReduce作业的数量,因此尽量避免map和reduce任务之间的数据传输时有利的。
- Hadoop允许用户针对map任务的输出指定一个combiner
- combiner接口与reduce相同,代码也可与reduce完全相同,但不能以偏概全,例如,求平均值的reduce代码,不能用于combiner
- combiner的作用:将map的结果预先reduce。
- MapReduce框架保证了键的有序性
- 通过Hadoop Streaming ,可以使用非java语言,实现mapreduce计算架构;
- 通过Hadoop Streaming ,利用Hadoop的job管理功能,实现ruby、shell的mapreduce计算
- Hadoop Streaming 使用Unix标准流作为Hadoop和应用程序之间的接口,所以我们可以使用任何编程语言通过标准输入输出来写Mapreduce程序。
- Hadoop Streaming 语法
- hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-*.jar \
- -input input/ncdc/sample.txt \
- -output output \
- -mapper xxx.rb \
- -reducer yyy.rb