《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
这句话的意思是: 如果分割太小的话,那么管理 splits
和 map task
的时间就会主导任务运行快慢的时间了。
所以一般分割的split大小都会和 HDFS的一个 block
大小相同。其目的就是实现 data locality
。
上述的图中分别表示了三种不同的数据位置模式:Data-local
,rack-locak
off-rack
。
3. split
和 map 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. MapReduce
中map
的结果写入到磁盘还是写入到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. Hadoop
的 MapReduce
代码仅仅支持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
multiple Mapper & Mulitple reducer