如何在将数据插入存储桶时合并由配置单元创建的小文件?
How to merge small files created by hive while inserting data into buckets?
我有一个包含呼叫数据记录 (CDR) 的配置单元 table。我将 table 在 phone 数字上分区并在 call_date 上分桶。现在,当我将数据插入配置单元时,过时的 call_date 正在我的存储桶中创建小文件,这导致名称节点元数据增加和性能下降。
有没有办法把这些小文件合并成一个呢
使用 Hive 插入 table 时控制文件大小的一种方法是设置以下参数:
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).
合并 table 文件的最简单方法是重新制作它,同时在运行时使用 运行 上述配置单元命令:
CREATE TABLE new_table LIKE old_table;
INSERT INTO new_table select * from old_table;
在您的情况下,对于 ORC tables,您可以在创建后连接文件:
ALTER TABLE table_name [PARTITION (partition_key = 'partition_value')] CONCATENATE;
我有一个包含呼叫数据记录 (CDR) 的配置单元 table。我将 table 在 phone 数字上分区并在 call_date 上分桶。现在,当我将数据插入配置单元时,过时的 call_date 正在我的存储桶中创建小文件,这导致名称节点元数据增加和性能下降。 有没有办法把这些小文件合并成一个呢
使用 Hive 插入 table 时控制文件大小的一种方法是设置以下参数:
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).
合并 table 文件的最简单方法是重新制作它,同时在运行时使用 运行 上述配置单元命令:
CREATE TABLE new_table LIKE old_table;
INSERT INTO new_table select * from old_table;
在您的情况下,对于 ORC tables,您可以在创建后连接文件:
ALTER TABLE table_name [PARTITION (partition_key = 'partition_value')] CONCATENATE;