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

时间:2019-01-30 02:00:06

标签: apache-spark hadoop memory hive cloudera

我在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,但仍然失败。 有什么办法可以优化这个? 任何包含火花或蜂巢的解决方案都可以。

3 个答案:

答案 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堆错误可能是由大量任务引起的。

因此,您可以考虑创建一个范围分区表(按月)以减少任务数量。