最近、ログファイルをハイブテーブルにロードしたいのですが、特定のディレクトリからデータを読み取り、それらをハイブに自動的にロードできるツールが必要です。このディレクトリには多くのサブディレクトリが含まれる場合があります。たとえば、特定のディレクトリは「/log」で、サブディレクトリは「/log/20130115」、「/log/20130116」、「/log/201301017」です。新しいデータが特定のディレクトリに保存されると、ツールはこのデータを自動的に検出してハイブテーブルにロードできるという機能を実現できるETLツールはありますか。そのようなツールはありますか? 自分でスクリプトを作成する必要がありますか?
2 に答える
これは、Hive 外部テーブルを使用し、テーブルを日ごとにパーティション分割することで簡単に実行できます。たとえば、次のようにテーブルを作成します。
create external table mytable(...)
partitioned by (day string)
location '/user/hive/warehouse/mytable';
これにより、基本的にメタストアに空のテーブルが作成され、/user/hive/warehouse/mytable
.
次に、 key=valueの形式でこのディレクトリにデータをロードできます。ここで、keyはパーティション名 (ここでは「日」) で、value はパーティションの値です。例えば:
hadoop fs -put /log/20130115 /user/hive/warehouse/mytable/day=20130115
データがそこにロードされると、HDFS ディレクトリにありますが、Hive メタストアはそれがテーブルに属していることをまだ認識していないため、次の方法で追加できます。
alter table mytable add partition(day='20130115');
これで、メタストアが新しいパーティションで更新され、このパーティションでテーブルにクエリを実行できるようになります。
これはスクリプトにとって簡単なはずです。これらのコマンドを順番に実行し、date
コマンドでロードするパーティションを見つける 1 日 1 回実行される cron ジョブを作成できます。たとえば、次のコマンドを継続的に実行します。
hadoop fs -test /log/`date +%Y%m%d`
$?
が 0 に等しいかどうかを確認すると、ファイルがここにあるかどうかがわかります。存在する場合は、上記のように転送してパーティションを追加できます。
Hive が提供する LOAD DATA コマンドを利用できます。ユースケースに完全に一致します。ローカル ファイル システムのディレクトリを指定し、そこから Hive テーブルを作成します。
使用例 - LOAD DATA LOCAL INPATH '/home/user/some-directory' OVERWRITE INTO TABLE table