级联加入两个文件非常慢

时间:2013-12-06 20:28:44

标签: java hadoop cascading

我正在使用级联来做一个HashJoin两个300MB的文件。我执行以下级联工作流程:

// select the field which I need from the first file
Fields f1 = new Fields("id_1");
docPipe1 = new Each( docPipe1, scrubArguments, new ScrubFunction( f1 ), Fields.RESULTS );   

// select the fields which I need from the second file 
Fields f2 = new Fields("id_2","category");
docPipe2 = new Each( docPipe2, scrubArguments, new ScrubFunction( f2), Fields.RESULTS ); 

// hashJoin
Pipe tokenPipe = new HashJoin( docPipe1, new Fields("id_1"), 
                     docPipe2, new Fields("id_2"), new LeftJoin());

// count the number of each "category" based on the id_1 matching id_2
Pipe pipe = new Pipe(tokenPipe );
pipe = new GroupBy( pipe , new Fields("category"));
pipe = new Every( pipe, Fields.ALL, new Count(), Fields.ALL );

我在Hadoop集群上运行这个级联程序,该集群有3个datanode,每个是8个RAM和4个核心(我将mapred.child.java.opts设置为4096MB。);但是我需要大约30分钟来获得最终结果。我认为它太慢了,但我认为我的程序和集群中没有问题。如何让这种级联加快?

2 个答案:

答案 0 :(得分:3)

在级联用户指南

中给出

HashJoin尝试将整个右侧流保留在内存中以进行快速比较(不仅仅是当前的分组,因为没有为HashJoin执行分组)。因此右侧流中的一个非常大的元组流可能会超出可配置的溢出到磁盘阈值,从而降低性能并可能导致内存错误。因此,建议在右侧使用较小的流。

使用可能有用的CoGroup

答案 1 :(得分:0)

您的hadoop群集可能可能正忙或专门从事其他工作,因此需要花费时间。我不认为用CoGroup替换HashJoin会对你有所帮助,因为CoGroup是一个减少边连接,而HashJoin做了一个地图端连接,因此HashJoin比ConGroup更具性能。我认为您应该再次尝试使用不太繁忙的群集,因为您的代码看起来也不错。