0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Hive-BigQuery Connector

Posted at

Hive-BigQuery Connector とは

Google CloudにDataprocというHadoopのマネージド・サービスがあります。数クリックでHadoopクラスタがすぐに構築でき、SparkやHiveなどのジョブを動かせます。Dataprocを利用する場合、データはHDFS(Hadoop Distributed File System)ではなく、Google Cloud Storageを利用するのが一般的です。そこにParquetなどのファイルを置いて、HiveテーブルにしてHiveクエリを投げたり、Sparkジョブでデータ処理したりできます。

一方、BigQueryのストレージを保存先にすることもできます。そのデータは、もちろんBigQueryでクエリすることもできますし、DataprocからHiveやSparkを使ってアクセスすることもできます。

今回はHiveからBigQueryのデータにアクセスするための、Hive-BigQuery Connectorを試してみます。

Dataprocへのインストール

DataprocでHadoopクラスタを構築した場合、デフォルトでHive-BigQuery Connectorはインストールされません。Dataprocには、init actionと呼ばれるクラスタ構築時に自動的に実行されるスクリプトを設定する機能があります。今回のコネクターをインストールする初期スクリプト自体もGoogle Cloudからこちら
で提供されています。

以下のコマンドでHive-BigQuery ConnectorがインストールされたHadoopクラスタが出来上がります。リージョンは適宜変えてください。

REGION=us-central1
CLUSTER_NAME=test-hive-bigquery-connector
gcloud dataproc clusters create ${CLUSTER_NAME} \
    --region ${REGION} \
    --initialization-actions gs://goog-dataproc-initialization-actions-${REGION}/connectors/connectors.sh \
    --metadata hive-bigquery-connector-version=2.0.3

テーブルを作ってみる

BigQueryのテーブルを作成するHiveクエリを投げてみます。

gcloud dataproc jobs submit hive \
 --cluster=test-hive-bigquery-connector \
 -e="CREATE TABLE mytable (word_count BIGINT, word STRING)
 STORED BY 'com.google.cloud.hive.bigquery.connector.BigQueryStorageHandler'
TBLPROPERTIES (
    'bq.table'='myproject.mydataset.mytable'
);"

クエリの部分だけ抜き出すとこんな感じ。

CREATE TABLE mytable (word_count BIGINT, word STRING)
 STORED BY 'com.google.cloud.hive.bigquery.connector.BigQueryStorageHandler'
TBLPROPERTIES (
    'bq.table'='myproject.mydataset.mytable'
);

できました。

Screenshot 2024-05-23 at 11.15.28.png

データ挿入してみる

次のコマンドを実行してHiveQLでBigQueryのテーブルにデータ挿入してみます。

gcloud dataproc jobs submit hive \
 --cluster=test-hive-bigquery-connector \
 -e="INSERT INTO TABLE mytable VALUES
    (20, 'is'),
    (3, 'Bob'),
    (1, 'kind');"

入った。

Screenshot 2024-05-23 at 11.32.15.png

データ読んでみる

最後にデータを読んでみます。

gcloud dataproc jobs submit hive \
 --cluster=test-hive-bigquery-connector \
 -e="SELECT * FROM mytable;"

こんな感じのアウトプット。

Screenshot 2024-05-23 at 11.37.10.png

もう少しまともなクエリをBigQueryのパブリックテーブルに投げてみます。BigQueryが持つパブリックデータセット bigquery-public-data.austin_bikeshare.bikeshare_trips にクエリを投げてみます。すでにあるテーブルをHiveでクエリするためには次のように外部テーブルとして認識させます。

gcloud dataproc jobs submit hive \
 --cluster=test-hive-bigquery-connector \
 -e="CREATE EXTERNAL TABLE bikeshare_trips (trip_id STRING, subscriber_type STRING, bike_id STRING, bike_type STRING, start_time TIMESTAMPLOCALTZ, start_station_id BIGINT, start_station_name STRING, end_station_id STRING, end_station_name STRING, duration_minutes BIGINT)
STORED BY 'com.google.cloud.hive.bigquery.connector.BigQueryStorageHandler'
TBLPROPERTIES (
    'bq.table'='bigquery-public-data.austin_bikeshare.bikeshare_trips'
);"

で、クエリしてみる。

gcloud dataproc jobs submit hive \
 --cluster=test-hive-bigquery-connector \
 -e="SELECT subscriber_type, COUNT(1)
 FROM bikeshare_trips
 GROUP BY subscriber_type
 LIMIT 10;"

Screenshot 2024-05-23 at 14.53.01.png

その他README読んで気になったこと

  • パーティションやクラスタを適用したテーブルも作れる
  • ちゃんとパーティションとクラスタのプルーニングも効く
  • Predicate pushdownによって、一部のクエリはBigQuery Storage Read APIが使われる(つまりHiveの処理が減る)
  • 書き込みはデフォルトでBigQuery Storage Write APIが使われるが、パラメーターでLoadを利用するindirect writeも選択できる。
  • ビューやマテビューを読む場合、Strorage Read APIが直接使えないため、一時テーブルにマテリアライズするということをしている、そのため性能は劣化するしコストもかかる
  • ビューの読み取りはデフォルト不可。オプションで有効化できる
  • テーブルスナップショットは通常のテーブル同様利用できる
  • BigLakeテーブルも読める
  • デフォルトではクラスターのサービスアカウントでBigQueryのデータにアクセスするので、その権限付与が必要
  • DMLはサポートされていない
  • CTAS/CTLTはサポートされていない

まとめ

ぶっちゃけ同じSQLならBigQuery SQLに変換してBigQueryで処理させたほうがコストパフォーマンスはかなりいいと思いますが、クエリの書き換えなど移行が困難なものがあれば今回のコネクターを使うものありですね。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?