在 Hive 中使用 UDF 连接两个大表 - 性能太慢
Posted
技术标签:
【中文标题】在 Hive 中使用 UDF 连接两个大表 - 性能太慢【英文标题】:Joins on two large tables using UDF in Hive - performance is too slow 【发布时间】:2014-09-04 06:05:50 【问题描述】:我在蜂巢中有两张桌子。一个有大约 200 万条记录,另一个有 1400 万条记录。我正在加入这两个表。我也在 WHERE 子句中应用 UDF。 JOIN 操作耗时过长。
我尝试多次运行查询,但它运行了大约 2 小时,我的减速器仍然保持在 70%,之后我收到异常 "java.io.IOException: No space left on device " 然后工作就被杀死了。
我尝试设置如下参数:
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 个 mapper 和 2 个 reducer。
有人可以建议我应该做些什么来提高性能。
【问题讨论】:
我在这个查询的任何地方都没有看到WHERE
子句。
【参考方案1】:
该异常可能表明您在集群中没有足够的空间来存储您正在运行的查询所创建的临时文件。您应该尝试向集群添加更多磁盘空间或通过使用子查询首先过滤每个表中的行来减少连接的行数。
【讨论】:
以上是关于在 Hive 中使用 UDF 连接两个大表 - 性能太慢的主要内容,如果未能解决你的问题,请参考以下文章