MapReduce
作业控制
两类节点控制作业的执行:一个jobtracker和一系列tasktracker。
jobtracker调度tasktracker上运行的任务来协调整个作业。tasktracker在运行任务的同时将运行进度报告发送给jobtracker。
作业的输入数据划分为分片(split),每个分片构建一个map任务,一般一个分片就是一个HDFS的块大小,这是最佳分片。
map任务
“数据本地化优化”:在存储有输入数据的节点上运行map任务,不消耗宝贵的带宽资源。(这也是为什么一个分片一个块的原因,如果一个分片多个块的话,会有带宽消耗)。
map任务将其输出写入本地磁盘,而非HDFS,因为map的输出只是中间结果,不需要备份。
reduce任务
- reduce任务不具备“数据本地化”的优势。它的输出需要存储到HDFS中实现可靠存储,第一个副本存入本地节点,其他存入其他机架节点。
- reduce任务的数量不由输入数据大小决定,而是独立指定的。
- 对于多个reduce任务,每个map任务会对输出进行分区(partition),每个reduce任务对应一个分区。每个分区有许多键,但是同一个键对应的记录都会在同一个分区中。分区由用户定义的partition函数控制,默认是哈希函数。
- map和reduce间的数据流称为shuffle(混洗)。
combiner
- combiner是一种对map输出的优化方案,可以将combiner的输出为reduce的输入,减少map和reduce任务间的数据传输,节省带宽。
HDFS
设计
流式数据访问:一次写入、多次读取时最高效的访问模式
HDFS不支持低时间延迟的数据访问,可以使用HBase。
namenode将文件系统的元数据存储在内存中。
HDFS只能有一个writer,写入操作将数据添加在文件末尾。不支持多写入。
概念
数据块
一个块默认128MB。HDFS中小于一个块大小的文件不会占据整个块的空间。
HDFS的块比磁盘块大,是为了最小化寻址开销。因而,传输一个文件的时间取决于磁盘传输速率。但是这个块也不应该设置的过大,过大的话,块少,则map任务少,若是少于集群中的节点数量,则作业运行速度慢。
列出文件系统中各个文件由哪些块构成:
% hadoop fsck / -files -blocks