hadoop缓冲与流式处理

2g32fytz  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(409)

有人能给我解释一下hadoop流和缓冲的区别吗?
以下是我在hive中读到的内容:
在join的每个map/reduce阶段中,序列中的最后一个表通过reducer流式传输,而其他表则被缓冲。因此,它有助于减少reducer中为join键的特定值缓冲行所需的内存,方法是组织表,使最大的表出现在序列的最后。e、 g.英寸:

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

czq61nw11#

hadoop流通常指使用定制的python或shell脚本来执行map-reduce逻辑例如,使用hive transform关键字。)
在这种情况下,hadoop缓冲指的是带有连接的配置单元查询的map-reduce作业中的一个阶段,当记录从Map器中排序和分组后被读入到reducer中。作者解释了为什么要对配置单元查询中的连接子句进行排序,以便最大的表排在最后;因为它有助于优化配置单元中连接的实现。
它们是完全不同的概念。
针对您的意见:
在hive的连接实现中,它必须从多个表中获取记录,按连接键对它们进行排序,然后按正确的顺序将它们整理在一起。它必须读取按不同表分组的数据,因此它们必须看到来自不同表的组,一旦看到所有表,就开始处理它们。第一个表中的第一组需要缓冲(保存在内存中),因为在看到最后一个表之前无法处理它们。最后一个表可以流式传输(每一行在读取时都会被处理),因为其他表组都在内存中,连接可以启动。

cgyqldqp

cgyqldqp2#

在reduce端连接中,来自多个表的值通常被标记,以便在reducer阶段对它们进行标识,以确定它们来自哪个表。
考虑两个表的情况:
在reduce调用时,将迭代与两个表关联的混合值。
在迭代过程中,其中一个标记/表的值被本地存储到arraylist中(这是缓冲)。
在流式传递其余值并检测到另一个标记/表的值时,将从保存的arraylist中获取第一个标记的值。两个标记值被合并并写入输出收集器。
与此相比,如果较大的表值保留在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端进行流式处理:
从a join b on(a.key=b.key1)选择/+streamtable(a)/a.val,b.val,c.val;从a join b on(a.key=b.key1)选择join c on(c.key=b.key1)

相关问题