由于一直遇到OOM错误,我如何优化此表单的查询?或者想出一个更好的执行计划?如果我删除了substring子句,查询就会正常工作,这表明这需要大量内存。
当作业失败时,直线输出显示OOM Java堆空间。在线阅读建议我增加export HADOOP_HEAPSIZE
,但这仍然会导致错误。我尝试的另一件事是增加hive.tez.container.size
和hive.tez.java.opts
(tez堆(,但仍然有这个错误。在YARN日志中,会超过GC开销限制,这表明内存不足和/或查询计划效率极低,因为它无法收集回足够的内存。
我正在使用Azure HDInsight Interactive Query 4.0。20个工作节点,D13v2 8核,56GB RAM。
源表
create external table database.sourcetable(
a,
b,
c,
...
(183 total columns)
...
)
PARTITIONED BY (
W string,
X int,
Y string,
Z int
)
目标表格
create external table database.NEWTABLE(
a,
b,
c,
...
(187 total columns)
...
W,
X,
Y,
Z
)
PARTITIONED BY (
aAAA,
bBBB
)
查询
insert overwrite table database.NEWTABLE partition(aAAA, bBBB, cCCC)
select
a,
b,
c,
...
(187 total columns)
...
W,
X,
Y,
Z,
cast(a as string) as aAAA,
from_unixtime(unix_timestamp(b,'yyMMdd'),'yyyyMMdd') as bBBB,
substring(upper(c),1,2) as cCCC
from database.sourcetable
如果其他一切都正常,请尝试在查询末尾添加distribute by partiton键:
from database.sourcetable
distribute by aAAA, bBBB, cCCC
因此,每个reducer将只创建一个分区文件,消耗更少的内存
尝试对分区列进行排序:
SET hive.optimize.sort.dynamic.partition=true;
启用时,动态分区列将进行全局排序。这样,我们就可以为reducer中的每个分区值只打开一个记录写入程序,从而降低reducer上的内存压力。
https://cwiki.apache.org/confluence/display/Hive/Configuration+属性