Hive 由于堆空间问题,配置单元脚本无法处理太多分区

Hive 由于堆空间问题,配置单元脚本无法处理太多分区,hive,hiveql,hadoop2,hadoop-partitioning,Hive,Hiveql,Hadoop2,Hadoop Partitioning,由于堆空间问题,我的脚本无法处理太多分区。为了避免这个问题,我试图将所有分区插入到一个分区中,但我面临以下错误 失败:SemanticException[错误10044]:第1:23行无法插入目标表,因为列编号/类型不同“2021-01-16”:表insclause-0有78列,但查询有79列 set hive.exec.dynamic.partition=true; set mapreduce.reduce.memory.mb=6144; set mapreduce.r

由于堆空间问题,我的脚本无法处理太多分区。为了避免这个问题,我试图将所有分区插入到一个分区中,但我面临以下错误

失败:SemanticException[错误10044]:第1:23行无法插入目标表,因为列编号/类型不同“2021-01-16”:表insclause-0有78列,但查询有79列

    set hive.exec.dynamic.partition=true;
    set mapreduce.reduce.memory.mb=6144;
    set mapreduce.reduce.java.opts=-Xmx5g;
    set hive.exec.dynamic.partition=true;
    insert overwrite table db_temp.travel_history_denorm partition (start_date='2021-01-16')
    select * from db_temp.travel_history_denorm_temp_bq
    distribute by start_date;```


Can someone please suggest what is the issue, I checked the schema for the tables it is the same. ?

您正在插入到静态分区(targettablepartition子句中指定的分区值),在这种情况下,您不应该在select中有partition列。并选择*返回分区列(最后一个),这就是查询失败的原因,它应该是无分区列:

静态分区插入:

insert overwrite table db_temp.travel_history_denorm partition (start_date='2021-01-16')
   select col1, col2, col3 ... --All columns except start_date partition column
     from ...
动态分区:

 insert overwrite table db_temp.travel_history_denorm partition (start_date)
       select * --All columns in the same order, including partition
         from ...
添加
distributeby
将触发额外的reduce步骤,所有记录都将根据
distributeby
进行分组,每个reducer接收单个分区。当您在每个reducer中加载许多动态分区时,这有助于解决OOM问题。如果不按每个还原器分发,则会在每个分区中创建文件,同时保留太多的缓冲区

除了按分发之外,您还可以设置每个减速机的最大字节数。此设置将限制单个减速器处理的数据量,并有助于:

 set hive.exec.reducers.bytes.per.reducer=16777216; --adjust for optimal performance
如果这个数字太小,它将触发太多的减速器,如果太大,那么每个减速器将处理太多的数据。相应地调整

还可以尝试动态分区加载的此设置:

set hive.optimize.sort.dynamic.partition=true;
启用时,动态分区列将被全局排序。 这样,我们可以为每个分区只打开一个记录编写器 减压器中的值,从而降低减压器上的记忆压力

您可以组合所有这些方法:按分区键分发、bytes.per.reducer和sort.dynamic.partition以进行动态分区加载


此外,异常消息有助于了解OOM发生的确切位置,并进行相应的修复。

我不想将当天的所有数据插入分区=2021-01-16,这就是在同一个分区上提到where子句的原因column@Never_Give_Up查询中没有WHERE子句,只有静态分区规范WHERE子句应该在分发之前。无论如何,语法是不正确的。对于静态分区加载,您应该在select中没有分区列。使用我的建议尝试动态加载下面是错误,我正在使用tez enginre错误:在执行任务时遇到错误:尝试\u 16034529831\u 0011\u 0:java.lang.OutOfMemory错误:java堆space@Never_Give_Up在哪个容器里?你确定它在减速机里吗?如果是,请尝试该设置。让人惊讶的是,是泰兹!你在问题中没有提到同样的问题。对于Tez add,还应设置hive.Tez.auto.reducer.parallelism=true;和内存设置不同:
set tez.reduce.memory.mb=6144;设置hive.tez.container.size=9216;设置hive.tez.java.opts=-Xmx6144m我将尝试你的建议来通过优化,看看它是否有效。我接受你的回答。