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



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

据我了解,这与查询过程中使用的化简器数量有关。假设我想为每个分区提供 5 个文件而不是 1 个文件,我使用以下命令:

set mapreduce.job.reduces=5;

这将使系统在第 1 阶段使用 5 个化简任务,但在阶段 2 会自动切换到 1 个化简器(在编译时自动确定(。从我读到的内容来看,这是由于编译器在选择化简器数量时比配置更重要。似乎有些任务不能"平行化",只能由一个进程或减速器任务来完成,因此系统会自动确定它。

法典:

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

这导致最后有巨大的文件。我想知道是否有办法将此结果文件拆分为较小的文件(最好按大小限制它们(。

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

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

减速器数量根据

mapred.reduce.tasks- 每个作业的默认减少任务数。通常设置为接近可用主机数的素数。当mapred.job.tracker为"local"时忽略。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 将使用此值作为最大化简器数。

因此,如果要增加化简器并行度,请增加hive.exec.reducers.max并减少hive.exec.reducers.bytes.per.reducer每个化简器将为每个分区创建一个文件(不大于hive.exec.reducers.bytes.per.reducer(。一个化简器可能会接收许多分区数据,因此会在每个分区中创建许多小文件。这是因为在随机阶段分区,数据将分布在许多化简器之间。

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

最新更新