我正在阅读一些与HDFS架构和Apache crunch PTable相关的文档。根据我的理解,当我们生成PTable时,数据在内部存储在HDFS中的数据节点上。
这意味着,如果我在HDFS中有<K1,V1>,<K2,V2>,<K1,V3>,<K3,V4>,<K2,V5>
的PTable和两个数据节点D1和D2。
假设每个数据节点都有容纳3对的容量。因此D1将保留<K1,V1>,<K2,V2>,<K1,V3>
,D2将保留<K3,V4>,<K2,V5>
。
如果我在此PTable上执行collectValues,我在内部运行另一个map-reduce作业以从PTable获取这些值并生成<K,Collection<V>>
对。所以最后我会有<K1,Collection<V1,V3>>, <K2,Collection<V2,V5>> and <K3,Collection<V4>>
。并且这些对将再次分配到不同的数据节点。
现在,我怀疑收集值(V1,V3 of K1)
将如何存储在生成的PTable中?这些数据是否也将分布在节点上,即
V1存储在D1
V3存储在D2
或者,V1和V3仅存储在一个节点中。
如果密钥的所有集合值都存储在一个节点(未分发)中,那么对于大型数据集,对每个密钥的收集值的处理是否会变慢?
答案 0 :(得分:0)
同一个键的所有值都在一个节点中。这是一般地图减少的概念 - 而不是紧缩。 原因是你想要所有项目都在一个地方 - 这就是你想要实现的本地化。