Hadoop中的数据局部性是什么
在本Hadoop教程中,我们将讨论Hadoop中的数据局部性,数据局部性如何帮助更快地运行作业并节省集群带宽。
Hadoop中的数据局部性
将文件存储在HDFS中时,它将分为128 MB(默认块大小)的块,并且这些块存储在集群中的不同节点上。这些HDFS块也根据复制因子进行复制(默认为3)。即使在创建副本时,Hadoop也会考虑集群拓扑并尝试遵守数据局部性。
当MapReduce作业开始处理Hadoop中的文件时,MapReduce作业将计算该作业的输入拆分,默认情况下,输入拆分大小与HDFS块大小相同,即128 MB。 Hadoop框架创建的地图任务与作业中的输入拆分一样多。
例如–有一个1 GB的文件,存储为8个HDFS块,每个块128 MB。一个处理该文件的MapReduce作业计算出有8个输入拆分,然后Hadoop框架将启动8个地图任务来处理这8个输入拆分。现在,处理这些拆分更有意义的是:
将映射任务(大多数情况下只有几KB)发送到驻留数据的节点(映射任务必须处理的128 MB块)
或者
将数据传输到启动Map任务的网络上?
别忘了有8个Map任务,所有这些任务都需要拆分数据,如果所有这些数据都跨节点传输到各自的Map任务,那么这将给带宽带来很大压力。
为了避免使用这种Hadoop框架,我们采取了称为"数据局部性优化"的聪明方法,而不是将数据引入计算中,而是将计算结果发送到数据中。 Hadoop尝试在拆分数据驻留在HDFS中的相同节点上运行Map任务,从而使任务数据位于本地。
在YARN中执行任务
当应用程序主服务器从ResourceManager请求容器中的地图任务时,也将考虑数据局部性。调度程序尝试在数据所驻留的节点上分配容器,以便该任务是数据本地的。但这并非总是可能的,因为数据所驻留的节点上可能没有足够的资源来运行地图任务,这使我们陷入了地图任务与数据之间的接近程度的话题。
地图任务和数据邻近类别
Hadoop中的数据位置根据Map任务和数据之间的接近程度分为三类。
- 本地数据–如果映射任务在数据所驻留的同一节点上运行,这是最佳情况,称为数据本地。
- 本地机架–如果映射任务在同一机架上运行,但不在拆分所在的同一节点上运行,则称为机架本地。
- 不同机架–如果映射任务不能在同一节点上运行,甚至不能在同一机架上运行,则映射任务必须从不同机架获取必须处理的数据。这是最不喜欢的方案。