第一章 初始hadoop
- MapReduce比较适合处理整个数据集的动态查询。适合一次写入多次读取。
- MapReduce对非结构化或半结构化数据非常有效,因为它是在处理数据时才对数据进行解释。即MapReduce输入的键和值并不是数据固有的属性,而是由分析数据的人来选的。
- MapReduce是一种线性可伸缩编程模型,我们需要写map函数和reduce函数,每个函数定义一个键值对集合到另一个键值对集合的映射。这些函数不必关注数据集机器所用集群的大小,可以原封不动地应用于小规模数据集或者大规模数据集。且随着数据的增长,运行速度呈线性增长(原因是集群也可以扩展)。
- MapReduce 尽量在计算节点上存储数据,以实现数据的本地快速访问,数据本地化特性是MapReduce的核心特征。
- 有了MapReduce ,程序员不必操心系统部分失效的问题,因为它自己的系统实现能够检测到并重新执行那些失败的map任务或reduce任务。
正因为采用的是无共享框架,MapReduce才能实现失败检测,各个任务之间彼此独立,因此任务的执行顺序无关紧要。
第二章 关于MapReduce
MapReduce 本质是并行运行的,可以把大规模数据分析任务分发给任何一个拥有足够多机器的数据中心。它的优势是处理大规模数据集。 Map和Reduce分为两个阶段:map阶段和reduce阶段。都以键值对作为输入输出。
1.map函数是一个数据准备阶段,使reduce函数可以继续对它进行处理。也是一个适合处理已损数据的地方。
2.map函数的输出经过MapReduce框架的处理后,发送到reduce函数。(处理:基于键对键值对进行排序分组。)
3.Job 对象 指定作业执行规范。控制整个作业的运行。在集群上运行需要打包成jar文件。(Job对象有其特定的执行流程,以及需要指定的对象等等,具体看书27页。)
Data Flow ##
一个MapReduce job是一个客户端希望执行的工作单元,包括输入数据,MapReduce程序和配置信息。Hadoop把job分割成tasks即map task和reduce task。这些tasks由YARN调度并运行在集群的节点上,如果一个task失败了,它将自动调到其他节点重新运行。Hadoop把一个MapReduce job输入数据分割成固定大小的片段称为输入片段,Hadoop为每个片段创建map task.
每一片数据的处理时间要小很多,但是也不能分太多片,通常一片数据的大小为一个HDFS block的大小(默认128MB).
hadoop试图在数据本地进行计算,reduce的输入通常是所有map的输出,没有数据本地性。
reduce任务的数量并非由输入数据的大小决定,而是独立指定的。
Partition 如果有好多的reduce任务,map任务就会针对输出进行分区(partition),为每一个reduce任务建一个分区。每个分区有许多键,但每个键对应的键值对记录都在同一个分区中。分区由用户定义的partition控制。但通常用默认的partioner通过哈希函数来分区。
shuffle map任务和reduce任务之间的数据流称为shuffle(混洗)。每个reduce任务的输入都来自许多的map任务。调整混洗参数对作业总执行时间影响非常大。
最后:当数据处理可以完全并行,无需混洗,可能会出现无reduce任务的情况。这时,唯一的非本地节点数据传输是map任务把结果写入HDFS.
MapReduce的数据流
Combiner Functions
用户可以指定一个combiner(合并函数)处理map的输出,并成为reduce的输入,但是combiner(合并函数)不是MapReduce的标配,hadoop并不能保证调用多少次合并函数。combiner不能代替reduce任务,我们任然需要reduce函数来处理不同map输出中具有相同键的记录。
指定合并函数
- 1
- 1
Hadoop Streaming
Hadoop提供了MapReduce的API,允许使用非Java的其他语言写自己的map和reduce函数。Streaming天生适用于文本处理,map的输入数据通过标准输入流传递给map函数,最后将结果写到标准输出。