使用Hive在Reducers上进行分发?

时间:2017-09-07 14:59:29

标签: hive mapreduce hdfs tez

关于这个问题最令人沮丧的部分是,显而易见的答案是"修复源表!" - 遗憾的是我无法做到(这是由另一个拒绝帮助的团队管理和维护的。)

所以,我正在寻找一种技术解决方案来实现这一目标,而无需更改源表。

情况是这样的:我有一个源表,我正在尝试编写一个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;

0 个答案:

没有答案