优化配置单元查询.java.lang.OutOfMemoryError:超出了java堆空间/GC开销限制



由于一直遇到OOM错误,我如何优化此表单的查询?或者想出一个更好的执行计划?如果我删除了substring子句,查询就会正常工作,这表明这需要大量内存。

当作业失败时,直线输出显示OOM Java堆空间。在线阅读建议我增加export HADOOP_HEAPSIZE,但这仍然会导致错误。我尝试的另一件事是增加hive.tez.container.sizehive.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+属性

最新更新