hadoop - 如何在将数据插入存储桶时合并由配置单元创建的小文件?

标签 hadoop hive mapreduce hdfs bigdata

我有一个包含调用数据记录 (CDR) 的配置单元表。我根据电话号码对表进行了分区,并根据 call_date 进行了分桶。现在,当我将数据插入配置单元时,过时的 call_date 在我的存储桶中创建小文件,这导致名称节点元数据增加和性能下降。 有没有办法将这些小文件合并成一个。

最佳答案

在使用 Hive 插入表时控制文件大小的一种方法是设置以下参数:

set hive.merge.tezfiles=true;
set hive.merge.mapfiles=true;
set hive.merge.mapredfiles=true;
set hive.merge.size.per.task=128000000;
set hive.merge.smallfiles.avgsize=128000000;

这将适用于 M/R 和 Tez 引擎,并将确保创建的所有文件的大小等于或小于 128 MB(您可以根据您的用例更改该大小数字。额外阅读此处:https://community.cloudera.com/t5/Community-Articles/ORC-Creation-Best-Practices/ta-p/248963) .

合并表文件的最简单方法是重新制作它,同时在运行时运行上述配置单元命令:

CREATE TABLE new_table LIKE old_table;
INSERT INTO new_table select * from old_table;

在您的情况下,对于 ORC 表,您可以在创建后连接文件:

ALTER TABLE table_name [PARTITION (partition_key = 'partition_value')] CONCATENATE;

关于hadoop - 如何在将数据插入存储桶时合并由配置单元创建的小文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57950721/

相关文章:

hadoop - Hive 字符串函数的输出将被表中的值替换

hadoop - 如何将数据从node-red发送到Hadoop?

hadoop - 无法启动 Ambari 服务

java - 如何从现有的 Web 应用程序访问 HDFS(Hadoop 文件系统)

linux - 管道 envsubst 输出到配置单元

scala - 使用ReduceByKey 对值列表进行分组

java - 如何在 hadoop 中创建数据节点路径?

pyspark - 使用循环创建 Spark SQL 查询

java - Hadoop MapReduce RecordReader 实现是否必要?

java - 什么相当于hadoop 2.7.1中的hadoop-core-xxx.jar