1. ホーム
  2. hadoop

[解決済み] ハイブがバケットにデータを挿入する際に作成した小さなファイルをマージする方法は?

2022-02-14 20:26:29

質問内容

私は、通話データレコード(CDR)を含むハイブテーブルを持っています。このテーブルは、電話番号でパーティショニングされ、call_dateでバケット化されています。現在、ハイブにデータを挿入すると、バックデイトのcall_dateがバケットに小さなファイルを作成し、ネームノードメタデータが増加し、パフォーマンスが低下しています。 これらの小さなファイルを1つに統合する方法はありますか?

解決方法は?

Hiveを使用してテーブルに挿入する際のファイルサイズを制御する方法の1つとして、以下のパラメータを設定することが挙げられます。

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エンジンの両方で動作し、作成されるすべてのファイルのサイズが128MB以下であることを保証します(このサイズ数はユースケースに応じて変更可能です)。詳しくはこちらをご覧ください。 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;