更新时间:2024-11-29 GMT+08:00

动态分区插入场景内存优化

操作场景

SparkSQL在往动态分区表中插入数据时,分区数越多,单个Task生成的HDFS文件越多,则元数据占用的内存也越多。这就导致程序GC(Gabage Collection)严重,甚至发生OOM(Out of Memory)。

经测试证明:10240个Task,2000个分区,在执行HDFS文件从临时目录rename到目标目录动作前,FileStatus元数据大小约29G。为避免以上问题,可修改SQL语句对数据进行重分区,以减少HDFS文件个数。

操作步骤

在动态分区语句中加入distribute by,by值为分区字段。

示例如下:

insert into table store_returns partition (sr_returned_date_sk) select sr_return_time_sk,sr_item_sk,sr_customer_sk,sr_cdemo_sk,sr_hdemo_sk,sr_addr_sk,sr_store_sk,sr_reason_sk,sr_ticket_number,sr_return_quantity,sr_return_amt,sr_return_tax,sr_return_amt_inc_tax,sr_fee,sr_return_ship_cost,sr_refunded_cash,sr_reversed_charge,sr_store_credit,sr_net_loss,sr_returned_date_sk from ${SOURCE}.store_returns distribute by sr_returned_date_sk;