こんにちは、エクスチュアの權泳東(権泳東/コン・ヨンドン)です。
今日も普段あまり使わないであろう小ネタです。
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にします。
$ bq load --replace --source_format=AVRO \ dataset_name.table_name gs://bucket_name/bigquery/*
ファイルサイズが1GB以上あると自動分割されるので、エクスポートするファイル名はアスタリスク「*」にしておきます。
しばらくするとエクスポートが完了して、バケット内に000000000000, 000000000001, というように分割ファイルが作成されました。
2. AVROファイルでHiveの外部テーブルを作成する
今度はDataprocクラスタを作成して、Hive外部テーブルを作成するジョブを登録します。
これもコマンドで実行します。
まずはクラスタの作成
$ 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 --scopes 'https://www.googleapis.com/auth/cloud-platform' \ --project project_name
us-west1-cにworkerクラスを20台用意するのですが、IPアドレスの割当てが8個しかないので–no-addressオプションを使ってVMインスタンスはローカルIPだけ使うようにしてます。
そして次はテーブル作成ジョブの作成です。
avro_tableという名前のHive外部テーブルを作成します。
$ source ./hiveql.sh $ gcloud dataproc jobs submit spark-sql --cluster dataproc-cluster \ --region us-west1 -e "${HIVEQL}"
上記のhiveql.shの中身はこうなってます。
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を使ってビッグデータ分析基盤を構築するための支援業務を行っております。
お問合わせはこちらからどうぞ。
ブログへの記事リクエストはこちらまで