我正在使用的工作区设置为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
这导致最后有大量文件。我想知道是否有办法将这些结果文件拆分成较小的文件(最好用尺寸来限制它们)。
答案 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