gpt4 book ai didi

Hadoop 作业使用相同的 reducer 输出到相同的文件

转载 作者:可可西里 更新时间:2023-11-01 16:18:55 25 4
gpt4 key购买 nike

我遇到了一个有趣的情况,现在正在寻找如何有意识地去做。在我的本地单节点设置中,我从终端屏幕同时运行了 2 个作业。我的两个作业都使用相同的 reducer,它们仅在 map 函数(聚合键 - 分组依据)上有所不同,两个作业的输出都写入了第一个作业的输出(虽然第二个作业确实创建了自己的文件夹,但它是空的).我正在做的是提供跨不同级别的汇总聚合,这种行为对我来说很吸引人,我可以在一个文件中使用来自两个不同级别的聚合输出(也经过完美排序)。

我的问题是如何在真实的 Hadoop 集群中实现相同的目标,我们有多个数据节点,即我以编程方式启动多个作业,所有作业都访问相同的输入文件,以不同方式映射数据,但使用相同的 reducer,输出是在一个文件中可用,而不是在 5 个不同的输出文件中可用。

请指教。

我在看merge output files after reduce phase在我决定问我的问题之前。

谢谢和亲切的问候,

莫伊兹艾哈迈德。

最佳答案

当不同的映射器使用相同的输入文件,换句话说,使用相同的数据结构时,所有这些不同映射器的源代码可以放入单个映射器实现的单独方法中,并使用上下文中的参数来决定哪个映射要调用的函数。从好的方面来说,您只需要启动一个 Map Reduce 作业。示例为伪代码:

class ComplexMapper extends Mapper {

protected BitSet mappingBitmap = new BitSet();

protected void setup(Context context) ... {
{
String params = context.getConfiguration().get("params");
---analyze params and set bits into the mappingBitmap
}

protected void mapA(Object key, Object value, Context context){
.....
context.write(keyA, value);
}


protected void mapB(Object key, Object value, Context context){
.....
context.write(keyA, value);
}


protected void mapB(Object key, Object value, Context context){
.....
context.write(keyB, value);
}

public void map(Object key, Object value, Context context) ..... {
if (mappingBitmap.get(1)) {
mapA(key, value, context);
}
if (mappingBitmap.get(2)) {
mapB(key, value, context);
}
if (mappingBitmap.get(3)) {
mapC(key, value, context);
}
}

因为它可以通过接口(interface)等更优雅地实现。

在作业设置中只需添加:

Configuration conf = new Configuration();
conf.set("params", "AB");

Job job = new Job(conf);

正如 Praveen Sripati 提到的,只有一个输出文件会迫使您只有一个 Reducer,这可能对性能不利。当你从 hdfs 下载它们时,你总是可以连接 part** 文件。示例:

hadoop fs -text /output_dir/part* > wholefile.txt

关于Hadoop 作业使用相同的 reducer 输出到相同的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13029796/

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