场景
动态分区时,最后一轮reduce会按照字段的值作为key去分发数据到不同的reducer,但是如果分区值的数量过少,就会导致严重的数据倾斜。运行时间过长。
任务growth.m_device_impression.sql中,由于p_app_name是分区字段,而目前只有三个可能的值,所以最后一轮按key分发任务时,只有三个reducer。其中某个值的那个reducer要跑一个小时。这是由于数据倾斜导致的任务满问题。
-- 简化版sql
USE growth;
CREATE TABLE IF NOT EXISTS m_device_impression
(
platform_type STRING,
device_id BIGINT
impression BIGINT,
)
PARTITIONED BY (p_date STRING, p_app_name STRING)
--CLUSTERED BY(device_id) INTO 30 BUCKETS
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS
INPUTFORMAT "org.apache.hado