mapreduce会使用大多数gzip文件所在的节点吗?

时间:2013-05-13 08:48:56

标签: hadoop mapreduce distributed-computing

我的HDFS群集包含一些大gzip个文件。

我确保这些gzip'd文件的所有块都在同一个DataNode上,方法是将它们从此数据节点写入HDFS。

for i in {1..10}; do
    scp file$i.gz datanode1:
    ssh datanode$i hadoop fs -put file$i.gz /data/
done

现在我想对所有这些文件运行mapreduce任务。

我希望JobTracker将file1处理datanode1的工作放在FileInputFormat上,其中所有的块都是。

事实上,如果一个datanode死了,我将失去局部性,但它会一直有效直到它死亡吗?

如果它不起作用,我可以写一个{{1}}来做那个吗?

1 个答案:

答案 0 :(得分:0)

GZip不是可拆分的压缩格式(如果你将gzip文件端到端堆叠,那么我首先要确保你的gzip文件的块大小与实际文件大小相同/更大。< / p>

由于gzip文件不可拆分,如果你有一个块大小为256m的1G gzip文件,则该文件的所有块都不可能驻留在同一个数据节点上(即使你从对于数据节点,随着时间的推移无法保证失败并确保块不会移动到其他节点)。在这种情况下,如果任何块在运行任务的节点上不驻留,则作业跟踪器将永远不会报告本地映射任务。

对于任务分配 - 如果你在datanode1上说4个地图槽,但要处理100个文件,那么作业跟踪器不会在datanode1上运行所有100个任务。如果该节点上有一个空闲任务槽,并且该节点上有一个拆分位置的map任务,它将尝试在datanode1上运行一个任务,但如果这四个槽正在使用中,JT将指示其他任务跟踪器运行作业(如果他们有空闲插槽)而不是等待在同一节点上运行所有100个任务。

是的,如果datanode死了,如果块大小小于文件(因为我在第一句中提到的原因),你很可能会丢失数据局部性,但是如果块大小与文件大小相同或更大然后,您将拥有具有该块副本的任何数据节点上的数据位置。