【问题标题】:How to determine file size in HDFS using Hive如何使用 Hive 确定 HDFS 中的文件大小
【发布时间】:2023-03-29 08:25:01
【问题描述】:

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

据我了解,这与查询过程中使用的reducer数量有关。假设我希望每个分区有 5 个文件而不是 1 个,我使用这个命令:

set mapreduce.job.reduces=5;

这将使系统在第 1 阶段使用 5 个 reduce 任务,但会在第 2 阶段自动切换到 1 个 reducer(在编译时自动确定)。根据我的阅读,这是由于在选择减速器数量时编译器比配置更重要。似乎有些任务不能“并行化”,只能由一个进程或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

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

【问题讨论】:

  • order by ut,ts?

标签: hadoop hive hdfs


【解决方案1】:

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

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

reducer个数根据

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 会在自动确定reducer 数量时将此作为最大reducer 数量。

所以,如果你想增加 reducer 并行度,增加 hive.exec.reducers.max 并减少 hive.exec.reducers.bytes.per.reducer 每个 reducer 将为每个分区创建一个文件(不大于 hive.exec.reducers.bytes.per.reducer )。一个 reducer 可能会收到许多分区数据,因此会在每个分区中创建许多小文件。这是因为在 shuffle 阶段分区数据将分布在许多 reducer 之间。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-19
    • 2018-12-26
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    相关资源
    最近更新 更多