gpt4 book ai didi

Hadoop 缓冲与流式处理

转载 作者:可可西里 更新时间:2023-11-01 14:44:46 27 4
gpt4 key购买 nike

有人可以向我解释一下 Hadoop Streaming 和 Buffering 之间的区别吗?

这是我在 Hive 中阅读的上下文:

在连接的每个 map/reduce 阶段,序列中的最后一个表通过 reducer 流式传输,而其他表则被缓冲。因此,通过组织表使得最大的表出现在序列的最后,有助于减少 reducer 中缓冲连接键的特定值的行所需的内存。例如在:

SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1) 

最佳答案

在 reduce 侧连接中,来自多个表的值通常被标记以在 reducer 阶段识别它们,对于它们来自的表。

考虑两个表的情况:

在 reduce 调用中,迭代与两个表关联的混合值。

在迭代期间,标签/表之一的值在本地存储到数组列表中。 (这是缓冲)。

当其余的值被流过并检测到另一个标签/表的值时,第一个标签的值是从保存的数组列表中获取的。这两个标签值被连接并写入输出收集器。

将此与以下情况进行对比:如果较大的表值保存在 arraylist 中,那么当 arraylist 超出容器的 JVM 内存时可能会导致 OOM。

void reduce(TextPair key , Iterator <TextPair> values ,OutputCollector <Text,Text> output ,Reporter reporter ) throws IOException {
//buffer for table1
ArrayList <Text> table1Values = new ArrayList <Text>() ;
//table1 tag
Text table1Tag = key . getSecond();
TextPair value = null;
while( values . hasNext() ){
value = values . next() ;
if(value.getSecond().equals(table1Tag)){
table1Values.add (value.getFirst() );
}
else{
for( Text val : table1Values ){
output.collect ( key.getFirst() ,new Text(val.toString() + "\t"+ value.getFirst().toString () ));
}
}
}

您可以使用以下提示指定哪些连接表将在 reduce 端进行流处理:

SELECT/*+ STREAMTABLE(a) */a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1)

关于Hadoop 缓冲与流式处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24265846/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com