Hadoop 配置单元合并小ORC文件

Hadoop 配置单元合并小ORC文件,hadoop,apache-spark,hive,mapreduce,amazon-emr,Hadoop,Apache Spark,Hive,Mapreduce,Amazon Emr,我的输入由大量的小ORC文件组成,我希望在每天结束时合并这些文件,并将数据分割成100MB的块 我的输入和输出都是S3,使用的环境是EMR 正在设置的配置单元参数 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 =

我的输入由大量的小ORC文件组成,我希望在每天结束时合并这些文件,并将数据分割成100MB的块

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

正在设置的配置单元参数

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,在这个insert语句之后,我希望S3中有4个文件,但所有这些文件都合并到一个文件中,这不是所需的输出


有人能告诉我出了什么问题吗?

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

  • 分区:它设置目录
  • 分发人:设置每个目录中的文件
如果您只希望每个目录中有4个文件,则可以按随机数分发,例如:

插入表dev.orc\u convert\u zzz\u 18分区(事件类型)
从dev.events\u part\u input\u 18中选择*
其中event_type='ScreenLoad'按类型分配((FLOOR(RAND()*4.0))作为INT);
但我建议您按数据中的某个列进行分发,以便查询。它可以缩短查询时间


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

mapred
属性都是deprecated@cricket_007哦,好的,谢谢。我会查的。我刚刚找到了答案,我们可以使用集群将分区进一步拆分为多个部分。我在这里探索hive是因为我的spark输出有太多的小文件,如果我通过Presto向最终用户公开这些小文件,那么查询这些小文件的速度会变慢。你应该在spark中使用
合并
重新分区
来修复你的小文件问题是的,我已经尝试了合并,考虑到大量的输入数据,这花费了太多的时间。因此,我正在避免在Spark层进行合并,一旦事件被分区,我将有选择地在Hive或Spark中为特定的事件集应用合并,现在使用HiveCan尝试相同的操作,您不在Spark层提取分区吗?我不认为有必要写入磁盘,只是为了读回磁盘,而不是有一些数据持久性Hi@lev我试过这个,但我得到了30个分区,你知道我如何控制吗,我试过将reducer设置为10,认为它将产生10个文件,但我最终还是得到了30个你是对的,
RAND
返回一个介于0和1之间的双精度值。我修正了答案我也试过了,但不起作用,请在这里找到屏幕截图,不确定我在这里犯了什么错误也试过了((FLOOR(RAND()*4.0))as INT)%4,但luckI没有试过其他名为os的字段,它有15个不同的值,因此理想情况下应该创建15个文件,但结果也是30个,截图: