关于这个问题最令人沮丧的部分是,显而易见的答案是"修复源表!" - 遗憾的是我无法做到(这是由另一个拒绝帮助的团队管理和维护的。)
所以,我正在寻找一种技术解决方案来实现这一目标,而无需更改源表。
情况是这样的:我有一个源表,我正在尝试编写一个hive查询来创建一个新表。查询最终需要花费数小时才能完成,原因是工作变得瓶颈缩小为一个减速器。
当我将源表跟随其在hdfs上的位置时,我注意到有1009个部分文件。其中1008个是0字节,其中1个是400 GB。
这解释了为什么1个reducer需要很长时间,因为所有数据都包含在一个文件中。
我尝试添加以下设置,试图将工作拆分为多个Reducer。
set hive.merge.mapfiles=true;
set hive.merge.mapredfiles=true;
set hive.merge.smallfiles.avgsize=134217728;
set hive.merge.size.per.task=134217728;
set mapred.max.split.size=134217728;
set mapred.min.split.size=134217728;
set hive.exec.reducers.bytes.per.reducer=134217728;
所有尝试都以我的新表结束,看起来与源表完全相同,包含大量的0字节文件,以及包含所有数据的单个文件。我能够控制减少器,它控制文件的总数......但是我无法控制数据以使结果均匀分布。
关于我如何能够修复"的任何想法我的结果表有均匀分布的文件?如果我可以在查询过程中修复此问题,即使是我的Reducer上的负载并使查询更快,也可以获得奖励。
源表如下所示:
CREATE TABLE `source_tbl`(
`col1` varchar(16)
, `col2` smallint
, `col3` varchar(5),
... many more cols ...
`col20000` int)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
'hdfs://cluster/user/hive/warehouse/schema.db/source_tbl'
TBLPROPERTIES (
'COLUMN_STATS_ACCURATE'='true',
'numFiles'='1009',
'numRows'='19187489',
'rawDataSize'='2972053294998',
'totalSize'='50796390931',
'transient_lastDdlTime'='1501859524')
我的疑问是:
create table schema.dest_tbl as select * from schema.source_tbl;