在hadoop中合并同一分区内多个文件的最佳选择?

在hadoop中合并同一分区内多个文件的最佳选择?,hadoop,hive,hdfs,hiveql,hadoop-partitioning,Hadoop,Hive,Hdfs,Hiveql,Hadoop Partitioning,我在event_date上划分了一个表,由于某种原因,当我将数据插入到外部表时,有些日期只有一个或两个文件,而有些日期超过200个 在启动配置单元查询以插入数据时,我总是使用这段代码,因此我不确定它在某些日期(而不是其他日期)的哪里/如何出错。我认为“merge.tezfiles”行是专门处理插入时文件合并的 SET mapred.job.queue.name=my_directory; use this_directory; SET hive.exec.dynamic.partition=tr

我在event_date上划分了一个表,由于某种原因,当我将数据插入到外部表时,有些日期只有一个或两个文件,而有些日期超过200个

在启动配置单元查询以插入数据时,我总是使用这段代码,因此我不确定它在某些日期(而不是其他日期)的哪里/如何出错。我认为“merge.tezfiles”行是专门处理插入时文件合并的

SET mapred.job.queue.name=my_directory;
use this_directory;
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;
SET hive.exec.max.dynamic.partitions=2000;
SET hive.exec.max.dynamic.partitions.pernode=2000;
SET hive.merge.tezfiles=true;
我在网上找到的所有东西都提到必须在本地复制文件并再次上传

是否有一种方法可以以干净简单的方式合并每个日期分区内的多个文件

我在几个日期分别尝试了以下4个和15个文件。运行后的配置单元输出确认了无关文件已被删除,但当我返回并查看Hadoop时,这些文件的数量与我开始时一样多。幸运的是,当我检查数据时,数据仍然是准确的,所以我不确定它首先删除了什么?这不是要使用的正确命令吗

alter table table_being_edited PARTITION(event_dt='2017-01-01') CONCATENATE;  
下面是一行,它确认额外的文件已被删除:

Moved: 'my_hdfs_filepath/event_dt=2019-10-24/000052_0' to trash at: my_trash_directory/.Trash/Current
嗯 所用时间:75.321秒

对于有15个文件的日期,它给了我类似的15倍输出


如果可能的话,我希望将包含许多文件的日期缩小到只有一个或两个,因为我们的名称空间已经用完了。我对所有这些都很陌生,所以有没有简单的方法可以将文件合并到一个日期分区中?

您可以尝试设置以下属性


SET hive.merge.mapfiles=true;
SET hive.merge.mapredfiles=true;
SET hive.merge.smallfiles.avgsize=134217728; ( 128 MB)


您可以参考此

除了我的其他配置单元参数集之外,还可以添加这一行,这样在将零件文件插入新表时,我就能够一致地将其合并到一个大小为5 GB或更小的文件中:

set hive.merge.smallfiles.avgsize=5000000000;
也可以使用getmerge,然后将文件放回原处,但这需要额外的步骤将文件从本地拉下来(必须有大量的存储空间,具体取决于文件的大小),这比创建新表和使用此额外的SET参数插入要麻烦得多

另一种选择是使用

set hive.merge.mapfiles=true;

这似乎是创建映射器数量的参数。如果我们有少量的文件,它必须创建许多映射器,这对于hadoop设计来说不是最优的,因此tez merge选项更合适

如果HDFS/MapR FS的块大小是256MB,最好将smallfiles.avgsize设置为256MB

SET hive.merge.tezfiles=true; --Merge small files at the end of a Tez DAG.
SET hive.merge.mapfiles=true; --Hive will start an additional map-reduce job to merge the output files into bigger files
SET hive.merge.mapredfiles=true; --Hive will start an additional map-reduce job to merge the output files into bigger files
SET hive.merge.orcfile.stripe.level=true; --When hive.merge.mapfiles, hive.merge.mapredfiles or hive.merge.tezfiles is enabled while writing a table with ORC file format, enabling this configuration property will do stripe-level fast merge for small ORC files.
SET hive.merge.size.per.task=256000000; --Size of merged files at the end of the job.
SET hive.merge.smallfiles.avgsize=256000000; --When the average output file size of a job is less than this number, Hive will start an additional map-reduce job to merge the output files into bigger files. This is only done for map-only jobs if hive.merge.mapfiles is true, and for map-reduce jobs if hive.merge.mapredfiles is true.

这些设置是否只需在配置单元会话开始时运行一次,即可应用于该会话中运行的任何配置单元命令?还是每次创建/插入表时都需要运行它?我最大的问题是,我是如何在某些日子里得到这么多文件的,而不是其他日子。它应用合并的方式似乎非常随机。此外,您的设置在最初创建表时可能会有所帮助,但是您对合并当前现有文件有什么想法吗?这些设置是否只需要在配置单元会话开始时运行一次,就可以应用于该会话中运行的任何配置单元命令?还是每次创建/插入表时都需要运行它?--每次尝试插入数据时,都需要使用这些设置;但是,您对合并当前已有的文件有什么想法吗?--请尝试运行
altertable\u正在编辑的分区(event\u dt='2017-01-01')连接**具有上述属性**不幸的是,这些设置似乎对我不起作用。我试着设置你的属性并重新运行15个文件的日期。它再次说它删除了文件,但当我在运行后检查时,它仍然包含15个文件。