こんにちは、エクスチュアの權泳東(権泳東/コン・ヨンドン)です。
今日も普段あまり使わないであろう小ネタです。
BigQueryのテーブルをエクスポートして、Dataproc上でHiveのExternal Tableとして扱うケースがあったので、その時のメモです。
1. BigQueryのテーブルをエクスポートする
BigQueryのテーブルをCloud Storageのバケットにエクスポートします。
BigQueryのエクスポート形式としてはCSVやJSONを普段よく使いますが、
・スキーマにARRAY型を含んでいるため、CSV形式ではエクスポート出来ない。
・Dataprocクラスタ上でHive(Hive on Spark)を使ってデータを処理するというのが今回の要件。
という条件があったので、AVROフォーマットでエクスポートしました。
AVRO(アブロ)とは、スキーマ定義を持つバイナリデータで、HadoopやSparkとの親和性が高いという利点があります。
というわけで、BigQueryからテーブルをCloud Storageにエクスポートをします。
bqコマンドでエクスポートするのですが、–source_format=AVROオプションを使ってファイル形式をAVROにします。
1 2 | $ bq load --replace --source_format=AVRO \ dataset_name.table_name gs: //bucket_name/bigquery/ * |
ファイルサイズが1GB以上あると自動分割されるので、エクスポートするファイル名はアスタリスク「*」にしておきます。
しばらくするとエクスポートが完了して、バケット内に000000000000, 000000000001, というように分割ファイルが作成されました。
2. AVROファイルでHiveの外部テーブルを作成する
今度はDataprocクラスタを作成して、Hive外部テーブルを作成するジョブを登録します。
これもコマンドで実行します。
まずはクラスタの作成
1 2 3 4 5 6 | $ gcloud beta dataproc --region us-west1 clusters create dataproc-cluster \ --subnet default --no-address --zone us-west1-c \ --master-machine- type n1-standard-1 --master-boot-disk-size 100 \ --num-workers 20 --worker-machine- type n1-standard-1 --worker-boot-disk-size 100 --project project_name |
us-west1-cにworkerクラスを20台用意するのですが、IPアドレスの割当てが8個しかないので–no-addressオプションを使ってVMインスタンスはローカルIPだけ使うようにしてます。
そして次はテーブル作成ジョブの作成です。
avro_tableという名前のHive外部テーブルを作成します。
1 2 3 | $ source . /hiveql .sh $ gcloud dataproc jobs submit spark-sql --cluster dataproc-cluster \ --region us-west1 -e "${HIVEQL}" |
上記のhiveql.shの中身はこうなってます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | HIVEQL=$( cat <<EOF CREATE EXTERNAL TABLE avro_table ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' LOCATION 'gs://bucket_name/bigquery/' TBLPROPERTIES ( 'avro.schema.literal' ='{ "name" : "avro_table" , "type" : "record" , "fields" : [ { "name" : "id" , "type" :[ "string" , "null" ]}, { "name" : "ary_id" , "type" :[{ "type" : "array" , "items" : "string" }, "null" ]}, { "name" : "info" , "type" :[ "string" , "null" ]} ] }'); EOF ) |
数十秒ほどして、Dataprocコンソールに Job output is complete のメッセージが出力されて
Status: Succeeded
という状態になればHive外部テーブルの作成完了です。
今回はBigQueryからAVRO形式でエクスポートしてファイルを使ってHive外部テーブルをDataprocクラスタ上に作成する方法についてでした。
弊社ではGoogle Cloud Platformを使ってビッグデータ分析基盤を構築するための支援業務を行っております。
お問合わせはこちらからどうぞ。
ブログへの記事リクエストはこちらまで