我有一个HDFS集群,里面有一些大的gzip
'd文件。
我通过从这个数据节点将这些gzip
'd文件的所有块写入HDFS,确保它们都在同一个DataNode上。
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
吗?
GZip不是一种可拆分的压缩格式(如果你端到端地堆叠GZip文件,那就是这样(,所以我首先要确保你的GZip文件的块大小与实际文件大小相同/更大。
由于gzip文件是不可拆分的,如果您有一个块大小为256m的1G gzip文件,则该文件的所有块可能都不在同一数据节点上(即使您从其中一个数据节点上传,也不能保证随着时间的推移,出现故障时,块不会移动到其他节点(。在这种情况下,如果任何块不驻留在运行任务的节点上,则作业跟踪器将永远不会报告本地映射任务。
至于任务分配,如果你在datanode1上有4个映射槽,但有100个文件要处理,那么作业跟踪器不会在datanode上运行所有100个任务。如果datanode1上有一个空闲的任务槽,并且映射任务在该节点上有拆分的位置,则JT将尝试在该节点运行任务,但如果这4个槽使用后,JT将指示其他任务跟踪器运行作业(如果它们有空闲槽(,而不是等待在同一节点上运行所有100个任务。
是的,如果数据节点死亡,如果块大小小于文件(出于我在第一句中提到的原因(,你很可能会失去数据位置,但如果块大小与文件相同或更大,那么你将在任何有该块副本的数据节点上拥有数据位置。