如何优化将150gb数据加载到配置单元表中?

jtoj6r0c  于 2021-05-27  发布在  Hadoop
关注(0)|答案(3)|浏览(363)

我在hivestage表中有一个150gb的文件,它使用以下表属性

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
    WITH SERDEPROPERTIES (
       "separatorChar" = "|",
       "quoteChar"     = "'",
       "escapeChar"    = "\\"
    )  
    STORED AS TEXTFILE;

现在,当我将这个数据加载到主表中时,在运行一个小时后,它将失败并出现java堆错误。我使用的是分区主表,数据中大约有12000个分区。对于加载数据,我使用简单的hql:

insert overwrite mainTable partition(date)
    select * from stage table;

我也尝试过将Map内存增加到15gb,但失败了。有没有办法优化这个?任何解决方案,包括Spark或Hive将工作。

zujrkrfu

zujrkrfu1#

是否可以检查以下内容:1)尝试在/etc/hive/conf/hive-env.sh中增加hadoop\u heapsize for hive-server2 2)通过连接到主节点使用以下命令重新启动配置单元以反映设置的更改sudo stop hive hcatalog server sudo start hive hcatalog server sudo status hive hcatalog server
参考文献:https://aws.amazon.com/premiumsupport/knowledge-center/emr-hive-outofmemoryerror-heap-space/

noj0wjuj

noj0wjuj2#

添加 distribute by partition key ```
insert overwrite mainTable partition(date)
select * from stage table
distribute by date;

这将触发最后的reduce阶段(如果它只在map上运行),并且每个reducer将编写单个分区,而不是所有分区,从而创建更少的文件并使用更少的缓冲区来消耗更少的内存。
如果需要更多的并行性,请检查bytes.per.reducer配置单元设置,可能太高了。

set hive.exec.reducers.bytes.per.reducer=67108864;

您还可以使用distribute by partition key和random integer在多个缩减器之间均匀分布数据: `distribute by substr(date), FLOOR(RAND()*100.0)%20` 
fwzugrvs

fwzugrvs3#

我认为在这个sql任务中会有很多分区。java堆错误可能是由于任务数量过多造成的。
因此,您可以考虑创建一个范围分区(按月)表来减少任务数。

相关问题