关于MapReduce

MapReduce与RDBMS的适用场景区别

MapReduce适用场景:
1、适合一次写入,多次读取数据的应用
2、对半结构化或者非结构化数据非常有效,非常适用于分析各种日志文件

RDBMS
适用场景:
1、适合于点查询和更新
2、能够提供低延迟的数据检索
3、快速的少量数据更新,适合持续更新的数据集
4、适用于结构化数据

特征

1、尽量在计算节点上存储数据,以实现数据的本地快速访问,数据本地化是核心特征
2、 能够检测到并重新执行失败的map或者reduce任务,正因为采用无共享框架,MapReduce才能够实现失败检测,这意味着各个任务之间是彼此独立的。因此程序的执行顺序无关紧要
3、将问题分解为独立的小块,然后并行进行计算

详解

MapReduce任务过程

1、过程分为map阶段和reduce阶段,每个阶段都以键值对作为输入和输出

2、map阶段输入的是NCDC原始数据。选择文本格式作为输入格式,将数据集的每一行作为文本输入

3、map函数的键是某一行起始位置相对于文件起始位置的偏移量

4、map函数的输出经由MapReduce框架处理后,最后发送到reduce函数。这个过程基于键来对键值对进行排序和分组。(有代码实现在hadoop权威指南中P24)

代码实现三部分(有代码实现及操作在hadoop权威指南中P24)

doris相比Hadoop hadoop和rdbms有什么区别_HDFS

1、map函数四个形参类型分别指定输入键、输入值、输出键、输出值。
2、reduce函数的输入类型必须与map函数输出类型一致,形参指定输出类型。
3、代码运行作业

Hadoop的基本类型

hadoop本身提供了一套优于网络序列化传输的基本类型,而不是直接使用java内嵌类型。
这些类型都在org.apache.hadoop.io包中。其中LongWritable相当于java的Long类型,Text相当于String,IntWritable类型相当于Integer类型。

输出文件

1、每个reducer都有一个名为part-00000的输出文件(在输出目录下)

2、新API中map的输出文件名为part-m-nnnnn,reducer的输出文件名为part-r-nnnnn(其中nnnn是从0开始的表示分块序号的整数)

控制作业执行过程的两类节点

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

分片

Hadoop将MapReduce的输入数据划分为等长的小数据块,称为输入分片,简称“分片”。
Hadoop为每个分片构建一个map任务,并由该任务来运行用户自定义的map函数从而处理分片中的每条记录。

分片大小的确定

①分片被切分的越细,负载均衡的会更高
②但如果切片切分得太小,那么管理分片的总时间和构建map任务的总时间将决定作业的整个执行时间。
因此对于大多数作业来说,一个合理的分片大小趋于HDFS的一个块的大小,默认是64MB(从2.7.3版本开始block size的默认大小为128M,之前版本的默认值是64M),不过可以针对集群调整这个默认值(对新建的所有文件),或对新建的每个文件具体指定。

为什么最佳分片的大小应该与块大小相同

1、因为它是确保可以存储在单个节点上的最大输入块大小。如果分片跨越两个数据块,那么对于任何一个HDFS节点,基本上都不可能同时存储这两个数据块,因此分片中的部分数据需要通过网络传输到map任务节点,效率低。

2、Hadoop在存储有输入数据(HDFS中的数据)的节点上运行map任务,可以获得最佳性能。这就是所谓的“数据本地化优化”,因为它无需使用宝贵的集群带宽资源。
但是对于一个map任务的输入来说,存储有某个HDFS数据块备份的节点可能正在运行其他map任务,此时作业调度需要在三个备份中的某个数据寻求同个机架中空闲的机器来运行该map任务。
注意:但reduce任务不具备数据本地化的优势——单个reduce任务的输入通常来自于所有mapper的输出(不绝对),排过序的map输出通过网络传输发送到运行reduce任务的节点。数据在reduce端合并,然后由用户定义的reduce函数处理。

Map任务和reduce任务的输出

Map任务输出写入本地硬盘,是中间结果,reduce任务的输出为最终结果,通常存储在HDFS中以实现可靠存储

reduce任务的数量

reduce任务的数量并非由输入数据的大小决定的,而是独立指定的。如果有多个reduce任务,每个map任务就会针对输出进行分区(partition),即为每个reduce任务建一个分区。分区由用户定义的partition函数控制,但通常用默认的partitioner通过哈希函数来分区,很高效。

混洗

Map任务和reduce任务之间的数据流称为(shuffle)混洗。

doris相比Hadoop hadoop和rdbms有什么区别_HDFS_02

doris相比Hadoop hadoop和rdbms有什么区别_数据_03

当数据处理可以完全平行时,即无需混洗时,可能出现无reduce任务的情况。这种情况下,唯一的非本地节点数据传输就是map任务将结果写入HDFS

doris相比Hadoop hadoop和rdbms有什么区别_数据_04

Combiner优化

集群上可用带宽限制了MapReduce作业的数量,应该尽量避免map任务和reduce任务之间的数据传输。
Hadoop允许用户针对map任务的输出指定一个combiner。Combiner属于优化方案,所以hadoop无法确定要对map任务输出记录调用多少次combiner(如果需要),但无论调用多少次,reducer的输出结果不变。combiner是通过Reducer类来定义的,针对于每个map任务