我在hive阶段表中有一个150 GB的文件,该文件使用以下表属性
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;
我也曾尝试将地图内存增加到15GB,但仍然失败。 有什么办法可以优化这个? 任何包含火花或蜂巢的解决方案都可以。
答案 0 :(得分:0)
您可以检查以下内容: 1)尝试在/etc/hive/conf/hive-env.sh中为hive-server2增加HADOOP_HEAPSIZE 2)通过连接到主节点以反映设置更改,使用以下命令重新启动Hive 须藤停止蜂巢hcatalog服务器 须藤启动蜂巢hcatalog服务器 sudo status hive-hcatalog-server
参考:https://aws.amazon.com/premiumsupport/knowledge-center/emr-hive-outofmemoryerror-heap-space/
答案 1 :(得分:0)
添加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;
您还可以使用按分区键分配和随机整数来在更多的reducer之间平均分配数据:distribute by substr(date), FLOOR(RAND()*100.0)%20
答案 2 :(得分:-1)
我认为您在此sql任务中获得了很多分区。 java堆错误可能是由大量任务引起的。
因此,您可以考虑创建一个范围分区表(按月)以减少任务数量。