2

我有一个带有一些大gzip文件的 HDFS 集群。

我确保这些gzip文件的所有块都在同一个 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那样做吗?

4

1 回答 1

0

GZip 不是一种可拆分的压缩格式(如果您将 gzip 文件端到端堆叠,则它是),所以我首先要确保您的 gzip 文件的块大小与实际文件大小相同/更大。

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

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

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

于 2013-05-13T10:47:11.073 回答