我有一个非分区表SRC。我有一个目标表DST分区日期字段action_dt。我想将数据从SRC加载到DST并通过action_dt对其进行分区。
在加载时,SRC表仅包含一个action_dt(示例20170701)的数据(3000万条记录)。我使用以下查询来执行插入:
SET mapred.max.split.size=268435456;
SET mapred.output.compression.type=BLOCK;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
SET hive.exec.compress.output=true;
SET parquet.compression=SNAPPY;
SET hive.merge.size.per.task=268435456;
SET hive.merge.smallfiles.avgsize=268435456;
SET hive.merge.mapfiles=true;
SET hive.merge.mapredfiles=true;
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;
SET mapreduce.reduce.memory.mb = 16384;
SET mapreduce.reduce.java.opts=-Djava.net.preferIPv4Stack=true -Xmx12g;
SET hive.execution.engine=tez;
SET hive.exec.reducers.bytes.per.reducer=104857600;
INSERT OVERWRITE TABLE DST partition(action_dt)
SELECT col1, col2, col3, action_dt FROM SRC;
SRC表是gzip压缩的,有大约80个大小为80-100MB的文件。当执行上述查询时,虽然启动了大约70个减速器,但是在10秒内执行了69个减速器,但是第70个减速器正在处理所有数据。
为什么会这样?是因为它认识到数据属于一个' action_dt' (20170701)?有没有一种方法可以拆分,以便多个Reducer可以处理这些数据?我尝试使用DISTRIBUTE BY但没有用。
感谢任何反馈。感谢。