【发布时间】: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 中使用
coalesce或repartition来解决您的小文件问题 -
是的,我已经尝试过合并,考虑到输入数据量,它花费了太多时间。所以我避免在 Spark 层合并,一旦事件被分区,将有选择地将合并应用于 Hive 或 Spark 中的一组特定事件,现在使用 Hive 尝试相同
-
不能在 Spark 层提取分区吗?我认为不需要写入磁盘,只需将其读回即可,而不需要一些数据持久性
标签: hadoop apache-spark hive mapreduce amazon-emr