如何优化这个表单的查询,因为我一直遇到这个OOM错误?还是想出一个更好的执行计划?如果删除子字符串子句,查询将正常工作,这意味着这需要大量内存。
当作业失败时,直线输出将显示OOM Java堆空间。在线阅读表明我增加了export HADOOP_HEAPSIZE,但这仍然会导致错误。我尝试的另一件事是增加hive.tez.container.size和hive.tez.java.opts (tez堆),但是仍然存在这个错误。在纱线日志中,会超过GC开销限制,这意味着内存不足和/或查询计划的组合效率极低,因为它无法收集足够的内存。
我正在使用Azure HDInsight交互式查询4.0。20个工作节点、D13v2 8核心和56 worker。
源表
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发布于 2020-07-09 11:10:40
如果其他一切正常,请尝试在查询结束时按分区键添加:
from database.sourcetable
distribute by aAAA, bBBB, cCCC因此,每个还原器只创建一个分区文件,占用的内存更少。
发布于 2020-07-10 13:58:49
尝试对分区列进行排序:
SET hive.optimize.sort.dynamic.partition=true;启用
后,将对动态分区列进行全局排序。这样,我们只能为还原器中的每个分区值保留一个记录编写器,从而减少减速器的内存压力。
https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties
https://stackoverflow.com/questions/62804436
复制相似问题