Hadoop权威指南》读书笔记二 — Chapter 2

1.MapReduce 中的 map 数目是怎么判定的?

Hadoop creates one map task for each split.

2.split 块大小

如何对split 块的大小进行合理的分割?分割太小、大各有什么问题?

  • 01.分割的小的话,有利于负载均衡。
    分割小利于负载均衡的原因是:
    如果只有一个split,那么就相应的只有一个 mapper 任务,但是如果有多个 split,那么就可以有多个mapper任务同时运行了,这样会使得集群达到一个高效率的负载。比如说,有的机器性能好,它就能在一般机器运行一个 mapper 任务的时间内运行多个 mapper 任务。
  • 02.如果分割大的话,则不利于负载均衡
    如上所述,分割大的话,不利于集群效率的利用
  • 03.如果分割的太小的话,又会有什么问题?

the overhead of managing the splits and map task creation begins to dominate the total job execution time

这句话的意思是: 如果分割太小的话,那么管理 splitsmap task 的时间就会主导任务运行快慢的时间了。
所以一般分割的split大小都会和 HDFS的一个 block大小相同。其目的就是实现 data locality
《Hadoop权威指南》读书笔记 — Chapter2_# 《Hadoop权威指南》上述的图中分别表示了三种不同的数据位置模式:Data-localrack-locak off-rack

3. splitmap task 是谁在管理?怎么管理?

【updating…】

4. 在计算MapReduce job时,分发的map task 所在的节点已经在计算其它的 map task了,那么该怎么处理?对于 MapReduce job,是怎么进行任务分配的?

  • 01.分发的 map task 到该 map任务所需要的 data 所在的节点【数据局部性】
  • 02.如果 data 所在的节点已经有 map 任务在运行了,那么就会找在同一个机架中的节点【我对同一个机架的理解是:它们连在同一个局域网上】
  • 03.不巧的是,上述两个步骤都没有完成,那么该怎么办呢? 就会找另外机架的节点了。【这就会导致跨机架的数据传输】

可以看到上面的这些都是为了,减少数据的传输,毕竟在MapReduce任务中,瓶颈是磁盘I/O 和 网络带宽MapReduce 调优工作所做的一切,都是为了减少瓶颈资源的消耗

5.Why MapReduce task's logic split is same to HDFS block size?

【为什么建议将 MapReduce 中逻辑 split 的大小设置成 和块大小相同呢?】
这个原因就是上述的问题2。

  • 如果我们将 split 设置成大于一个 block,那么这就会导致从不同的 block 中读取数据,而 HDFS 存储数据的机制是:跨机器的冗余备份。这就极有可能导致在不同的机器间传输数据,然后导致网络延时;【网络带宽】
  • 如果将一个split 设置成小于 一个 block,那么就会导致读取浪费,因为程序都已经使用了寻址时间 + 读取时间了,如果不多读一点儿数据,则会使得读取磁盘数据的效率降低。【磁盘I/O】

6. MapReduce 中的 reduce 任务会同 map 任务一样,有数据局部性的优势么?

不会。原因如下:

  • reduce 会将每个key相同的键值对进行处理
  • 因为 键值对相同 的数据不一定在同一个mapper中,所以就导致reduce 任务需要从所有的Map 输出中得到键值对,即不会从单个map中获取值,这就导致需要从各个 map 任务中读取值,所以就不会使用的数据的局部性原理。

7. MapReduce 中的 reduce 任务是怎么存储结果的?

  • reduce 任务会将输出放到本地node中存储,然后另外的冗余备份将会放到其它机架node中。
  • 有多少个reduce 任务,就会有多少个输出文件

8. MapReduce 中的 reducer 数是如何指定的?

reducer 数目是由程序指定的,而不是根据输入数据的数目确定。

9.如果有多个Reducer,那么每个map将会把其输出分区成 Reducer数目的那么些分区【即N(reducer)个分区】,并将这些分区一一发送给reducer

一个分区中可以有多个key,但是同个key 所对应的记录必须在同一个分区中。
用户可以自定义分区函数,但是更多地时候,使用默认的分区函数就具有非常好的效果。

10. MapReducemap的结果写入到磁盘还是写入到hdfs? 为什么呢?

Why Map tasks write their output to the local disk,not to HDFS?

写入到磁盘。
写入到HDFS中的block 都是有冗余备份的,所以相对于写到磁盘,可能时间会更长【因为写入到HDFS本质上也是写入到磁盘】

11. 可以没有 reduce 任务么?

可以,reduce 任务并非必要,有时候 mapper任务即可以解决问题。

12. combiner 函数可以取代 reduce 函数么?

不可以取代。
那么问题又来了?combiner函数的作用是什么?【updating…】
但是可以通过combiner function 减少map的输出

13. HadoopMapReduce 代码仅仅支持java语言么?

不是的。
Hadoop代码不仅仅对java 语言开放,对Ruby,python等都是支持的。
在hadoop和程序之间,使用的是Unix的标准流作为接口,所以任何能够读取、写入标准输入的语言均能够写MapReduce程序。

Hadoop Streaming use Unix standard streams as the interface between Hadoop and your program,so you can use any language that can read standard input and write to standard output to write your MapReduce program.

14. Data flow

  • multiple Mapper & One reducer
    《Hadoop权威指南》读书笔记 — Chapter2_Big Data_02
  • multiple Mapper & Mulitple reducer
    《Hadoop权威指南》读书笔记 — Chapter2_Big Data_03