【问题标题】:How to optimize loading 150GB data into hive table?如何优化将 150GB 数据加载到 hive 表中?
【发布时间】:2019-01-30 15:44:17
【问题描述】:

我在 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,但还是失败了。 有没有办法优化这个? 任何包含 spark 或 hive 的解决方案都可以。

【问题讨论】:

    标签: apache-spark hadoop memory hive cloudera


    【解决方案1】:

    您能否检查以下内容: 1) 尝试在 /etc/hive/conf/hive-env.sh 中为 hive-server2 增加 HADOOP_HEAPSIZE 2)通过连接到主节点使用以下命令重新启动 Hive 以反映设置的更改 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/

    【讨论】:

      【解决方案2】:

      添加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

      【讨论】:

        【解决方案3】:

        我认为你在这个 sql 任务中得到了这么多的分区。 java heap error可能是由于任务数量过多造成的。

        所以你可以考虑创建一个范围分区(按月)的表来减少任务数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多