hadoop - 如何在将数据插入存储桶时合并由配置单元创建的小文件?
问题描述
我有一个包含呼叫数据记录(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)。
合并表文件的最简单方法是重新制作它,同时在运行时运行上述 hive 命令:
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;
推荐阅读
- python - 海龟图形 begin_fill() 函数在 MAC 上无法正常工作
- java - 签名长度不正确:得到 768 但预期为 512,在 Java 中验证
- excel - 成对列的条件格式
- quarkus - 如何在 Quarkus 中设置日志记录级别?
- java - 对象不同不检测更改
- nuget - 在 azure can build 处理期间出现错误“无法确定还原 NuGet 包的包文件夹”
- javascript - 盖茨比动态影像
- c++ - (软问题)自动 CMakeLists 编辑和更新
- javascript - 如何基于队列预加载图像以供浏览器缓存并在其他页面中使用
- azure - Spark 活动的返回值