如何使用Hive确定HDFS中的文件大小

时间:2017-07-27 09:02:30

标签: hadoop hive hdfs

我正在使用的工作区设置为Hive 1.1.0和CDH 5.5.4。我做了一个查询,带来了22个分区的结果。保存在此分区目录中的文件始终是唯一的,可以从20MB变化到700MB。

据我所知,这与查询过程中使用的reducer数量有关。假设我想为每个分区而不是1分配5个文件,我使用这个命令:

set mapreduce.job.reduces=5;

这将使系统在阶段1中使用5个reduce任务,但会在阶段2自动切换到1个reducer(在编译时自动确定)。从我读到的,这是由于编译器在选择减速器数量时比配置更重要。似乎某些任务不能“并行化”,只能通过一个进程或减速器任务完成,因此系统会自动确定它。

代码:

insert into table core.pae_ind1 partition (project,ut,year,month)
select ts,date_time, if(
-- m1
code_ac_dcu_m1_d1=0
and (min(case when code_ac_dcu_m1_d1=1 then ts end ) over (partition by ut 
order by ts rows between 1 following and 1000 following)-ts) <= 15,
min(case when code_ac_dcu_m1_d1=1 then ts end ) over (partition by ut order 
by ts rows between 1 following and 1000 following)-ts,NULL) as 
t_open_dcu_m1_d1,

if( code_ac_dcu_m1_d1=2
and (min(case when code_ac_dcu_m1_d1=3 then ts end ) over (partition by ut 
order by ts rows between 1 following and 1000 following)-ts) <= 15,
min(case when code_ac_dcu_m1_d1=3 then ts end ) over (partition by ut order 
by ts rows between 1 following and 1000 following)-ts, NULL) as 
t_close_dcu_m1_d1,
project,ut,year,month

from core.pae_open_close
where ut='902'
order by ut,ts

这导致最后有大量文件。我想知道是否有办法将这些结果文件拆分成较小的文件(最好用尺寸来限制它们)。

1 个答案:

答案 0 :(得分:1)

正如@DuduMarkovitz指出的那样,您的代码包含全局订购数据集的指令。这将在单个减速器上运行。您最好从表中选择订购。即使您的文件在插入后按顺序排列并且它们是可拆分的 - 它们将在许多映射器上读取,然后由于并行性而导致结果不正常,您需要订购。只需在插入中删除此order by ut,ts并使用这些配置设置来控制reducer的数量:

set hive.exec.reducers.bytes.per.reducer=67108864;  
set hive.exec.reducers.max = 2000; --default 1009 

根据

确定的减速器数量

mapred.reduce.tasks - 每个作业的默认减少任务数。通常设置为接近可用主机数的素数。 mapred.job.tracker为&#34; local&#34;时忽略。 Hadoop默认将此值设置为1,而Hive使用-1作为其默认值。通过将此属性设置为-1,Hive将自动确定减少器的数量。

hive.exec.reducers.bytes.per.reducer - Hive 0.14.0及更早版本的默认值为1 GB。

另外hive.exec.reducers.max - 将使用的最大减速器数。如果mapred.reduce.tasks为负数,Hive会在自动确定减速器数量时将其用作减速器的最大数量。

因此,如果您想增加Reducer并行度,请增加hive.exec.reducers.max并减少hive.exec.reducers.bytes.per.reducer 每个reducer将为每个分区创建一个文件(不大于hive.exec.reducers.bytes.per.reducer)。一个reducer可能会收到许多分区数据,因此会在每个分区中创建许多小文件。这是因为在随机相位分区上,数据将在许多减速器之间分配。

如果您不希望每个reducer创建每个(或太多)分区,则distribute by partition key(而不是订单)。在这种情况下,分区中的文件数量将更像partition_size/hive.exec.reducers.bytes.per.reducer