【问题标题】:Hive Merge Small ORC FilesHive 合并小型 ORC 文件
【发布时间】:2018-04-10 04:38:39
【问题描述】:

我的输入包含大量小的 ORC 文件,我想在一天结束时合并这些文件,并且我想将数据分成 100MB 的块。

我的输入和输出都是 S3,环境使用的是 EMR,

正在设置的 Hive 参数,

set hive.msck.path.validation=ignore;
set hive.exec.reducers.bytes.per.reducer=256000000;
SET hive.exec.dynamic.partition = true;
SET hive.exec.dynamic.partition.mode = nonstrict;
SET hive.mapred.mode = nonstrict;

set hive.merge.mapredfiles=true;
set hive.merge.mapfile=true ;

set hive.exec.parallel = true;
set hive.exec.parallel.thread.number = 8;

SET hive.exec.stagingdir=/tmp/hive/  ;
SET hive.exec.scratchdir=/tmp/hive/ ;

set mapred.max.split.size=68157440;
set mapred.min.split.size=68157440;
set hive.merge.smallfiles.avgsize=104857600;
set hive.merge.size.per.task=104857600;
set mapred.reduce.tasks=10;

我的插入语句:

insert into table dev.orc_convert_zzz_18 partition(event_type) select * from dev.events_part_input_18 where event_type = 'ScreenLoad' distribute by event_type;

现在的问题是,我有大约 80 个输入文件,总共 500MB 大小,在这个插入语句之后,我期待 S3 中有 4 个文件,但是所有这些文件都被合并到一个不需要的文件中输出。

谁能告诉我,怎么回事,

【问题讨论】:

  • mapred 属性均已弃用
  • @cricket_007 哦,好的,谢谢会检查。刚才我已经想出了答案,我们可以使用聚类进一步将分区拆分为多个部分。我在这里探索 hive,因为我的 spark 输出有太多小文件,如果我通过 Presto 向最终用户公开这些小文件,那么查询这些小文件会更慢community.hortonworks.com/content/supportkb/49637/…
  • 您应该在 Spark 中使用 coalescerepartition 来解决您的小文件问题
  • 是的,我已经尝试过合并,考虑到输入数据量,它花费了太多时间。所以我避免在 Spark 层合并,一旦事件被分区,将有选择地将合并应用于 Hive 或 Spark 中的一组特定事件,现在使用 Hive 尝试相同
  • 不能在 Spark 层提取分区吗?我认为不需要写入磁盘,只需将其读回即可,而不需要一些数据持久性

标签: hadoop apache-spark hive mapreduce amazon-emr


【解决方案1】:

您正在使用 2 个不同的概念来控制输出文件:

  • 分区:设置目录
  • 分发者:设置每个目录下的文件

如果你只想在每个目录下有4个文件,你可以只分配一个随机数,例如:

insert into table dev.orc_convert_zzz_18 partition(event_type) 
select * from dev.events_part_input_18 
where event_type = 'ScreenLoad' distribute by Cast((FLOOR(RAND()*4.0)) as INT);

但我建议按您可能查询的数据中的某些列进行分布。它可以缩短您的查询时间。

可以阅读更多关于它的信息here

【讨论】:

  • 嗨@lev 我试过这个,但我得到了 30 个分区,知道如何控制它,我尝试将减速器设置为 10,认为它会产生 10 个文件,但我最终还是得到了30
  • 你是对的,RAND 返回一个介于 0 和 1 之间的双精度值。我已修复答案
  • 我也试过了,但没用,请在此处找到屏幕截图,不知道这里有什么错误ibb.co/eFqorR
  • 也试过这个 Cast((FLOOR(RAND()*4.0)) as INT) % 4 ,但不是运气
  • 我尝试使用另一个名为 os 的字段,该字段有 15 个不同的值,因此理想情况下应该创建 15 个文件,但结果也有 30 个,截图:ibb.co/nicOQm
猜你喜欢
  • 2019-02-11
  • 2018-10-07
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 2017-08-25
相关资源
最近更新 更多