在Hive中使用UDF连接两个大表 - 性能太慢

时间:2014-09-04 06:05:50

标签: performance hadoop hive

我在蜂巢中有两张桌子。一个拥有大约200万条记录,另外一条拥有14个记录。我正在加入这两张桌子。我也在WHERE子句中应用UDF。执行JOIN操作需要花费太多时间。

我已经尝试多次运行查询但它运行了大约2小时仍然我的reducer仍然是70%,之后我得到异常“java.io.IOException:设备上没有剩余空间“和工作被杀。

我试图设置如下参数:

set mapreduce.task.io.sort.mb=256;
set mapreduce.task.io.sort.factor=100;
set mapreduce.map.output.compress=true;
set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.GzipCodec;
set mapred.child.java.opts=-Xmx1024m;

我的查询

insert overwrite table output select col1, col2, name1, name2, col3, col4, 
t.zip, t.state from table1 m join table2 t ON (t.state=m.state and t.zip=m.zip) 
where matchStrings(concat(name1,'|',name2))>=0.9;

以上查询需要8个映射器和2个reducer。

有人可以建议我应该做些什么来提高性能。

1 个答案:

答案 0 :(得分:1)

该异常可能表示群集中没有足够的空间用于正在运行的查询创建的临时文件。您应该尝试向群集添加更多磁盘空间,或者通过使用子查询首先过滤每个表中的行来减少连接的行数。