2

类似于未使用 HDFS 的数据局部性,但特定于 HDFS。

我们有 2 个 hadoop 集群,我们正在向集群 A JobTracker 提交一个猪作业,它从集群 B 读取一个大数据集(100GB)并将其连接到集群 A 的一个小数据集(10 行)。

b_data = load 'hdfs://b-cluster/big.txt' as ( customer_id: chararray);
a_data = load 'hdfs://a-cluster/small.txt' as ( customer_id: chararray);
j_data = join a_data by acct_id left, b_data by customer_id;
dump j_data;

令人惊讶的是,它的工作原理与我们在集群 A 上仅使用本地数据集时所用的时间几乎相同(大约 10 分钟)

技术上发生了什么?任务跟踪器是否仅在 A 节点上运行?他们如何从 B 个数据节点读取数据集?为什么它这么快,因为他们不可能享受数据本地化,不是吗?

谢谢!

4

1 回答 1

1

实际上,从同步的角度来看,HDFS 集群和 MapReduce 集群彼此没有任何关系……它们是完全独立的。碰巧的是,我们经常将它们放在一起以利用数据局部性。

作业跟踪器更喜欢以数据本地方式分配作业,但如果不能,它只会将它们提交给任何任务跟踪器*。此时,从本地 HDFS 或远程 HDFS 读取是相同的机制:通过网络。协议是一样的,所以没问题!

至于为什么你没有注意到减速,我不确定!也许你有一个快速的网络(10GigE?)!任务跟踪器肯定是通过网络从远程数据节点获取数据。但是,它正在并行执行此操作。我想你会在更大的范围内注意到。

* 我忽略了机架位置步骤

于 2013-08-05T17:15:34.930 回答