我的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}}来做那个吗?
答案 0 :(得分:0)
GZip不是可拆分的压缩格式(如果你将gzip文件端到端堆叠,那么我首先要确保你的gzip文件的块大小与实际文件大小相同/更大。< / p>
由于gzip文件不可拆分,如果你有一个块大小为256m的1G gzip文件,则该文件的所有块都不可能驻留在同一个数据节点上(即使你从对于数据节点,随着时间的推移无法保证失败并确保块不会移动到其他节点)。在这种情况下,如果任何块在运行任务的节点上不驻留,则作业跟踪器将永远不会报告本地映射任务。
对于任务分配 - 如果你在datanode1上说4个地图槽,但要处理100个文件,那么作业跟踪器不会在datanode1上运行所有100个任务。如果该节点上有一个空闲任务槽,并且该节点上有一个拆分位置的map任务,它将尝试在datanode1上运行一个任务,但如果这四个槽正在使用中,JT将指示其他任务跟踪器运行作业(如果他们有空闲插槽)而不是等待在同一节点上运行所有100个任务。
是的,如果datanode死了,如果块大小小于文件(因为我在第一句中提到的原因),你很可能会丢失数据局部性,但是如果块大小与文件大小相同或更大然后,您将拥有具有该块副本的任何数据节点上的数据位置。