クラウド道場

BigQuery Storage APIの性能を試すため 1億件回してみました

Author
ide
Lv:1 Exp:493

技術本部 システム開発部所属
Bigqueryがおもしろいと感じています

BigQuery Storage API の性能を試すため
1億件回してみました

夜間バッチが朝になっても終わらず、辛い思いをされた方はいませんでしょうか?
BigQueryを使用するバッチ処理でも、大量データ処理が終わらなくて辛い思いをした人はいると思います。
その辛い思いを解決するBigQueryでの取得方法が、
Google Cloud Next ’19で、発表されました。
「BigQuery Storage API」というAPIです。

本稿では、BigQueryStorageAPIとは何か、どんな場合に活用できるのか、それを使うとどんなメリットがあるのかについて解説します。また実際にサンプルデータを使ってデータ取得処理をした結果をご紹介します。
本稿を読むことで、BigQueryStorageAPIを使う際に必要なAPIの設定および、大量データを編集した場合の速度の違いを把握することができます。

BigQueryStorageAPIはPythonにも対応していますが、本稿では言及しません。
予めご承知おき下さい。

前書きと、この記事でやる事

これまでは、BigQueryのテーブルデータを取得する方法として、以下の2つの方法がありました。

 取得方法1:tabledata.listやjobs.getQueryResultsのREST-APIを使用して結果取得
 取得方法2:Cloud StorageにCSVやJSONなどでファイルにBigQueryの結果を一括出力

残念なことに、上記2つでBigQueryのデータを取得する際、
以下の理由で、大量のデータ処理をする場合に課題がありました。

 取得方法1でデータを大量処理した場合:1件目のデータ処理は早い。全データ処理が遅い。  
 取得方法2でデータを大量処理した場合:全データ処理は速い。1件目のデータ処理が遅い。
 
これらの方法に対して、「BigQuery Storage API」は大量のデータを高速で取得・処理できるとの内容になっています。

高速という内容が、今までのやり方(以降REST-APIと記載)と比べて10%程度の向上を意味していたら、
処理速度が向上しても嬉しくありません。

また、「BigQuery Storage API」実行には追加料金がかかります。
たとえ処理が速くても、REST-APIと比べ、料金が5倍かかったら、使いたいと思えません。

本稿では、

  • どれぐらい速いのか?
  • お値段は?

の2つの視点で、 BigQuery Storage APIを検証してみたいと思います。

1. 比較する為の条件

以下の前提で比較しました。

GoogleのPublicデータセットを使用して、1億レコードをスキャンする処理を実行してみます。

  • JavaのAPIを使用して比較。
  • 処理開始時間と処理終了時間を以下2通りで比較
     ①BigQuery Storage APIを使用して、結果取得。結果の取得がすべて完了するまでの時間を計測。
     ②BigQueryの結果をRESTAPIで、結果取得。結果の取得がすべて完了するまでの時間を計測。
  • 使用テーブル:[bigquery-public-data.san_francisco.transactions]
  • レコード数:107,501,619 件
  • スキャン量:0.82GB
  • リージョン:US

2. BigQuery Storage APIを使う前の準備

BigQuery Storage APIを使うまでに設定しないといけないことがありますので記載します。

BigQuery Storage APIの有効化

 BigQuery Storage APIを利用するアカウントで、APIを有効化します
使用するプロジェクトを選択する。
左上のナビゲーションメニューから「APIとサービス」をクリック

「APIとサービスを有効化」をクリック

検索画面で「Bigquery Storage API」と入力して表示された検索結果をクリック

「有効にする」 をクリック

有効になったら設定は終了です。

   
※プログラムは
 「5.参考:BigQuery Storage APIでデータ処理する際に作成したプログラム概要」
 をご参照ください。

   

3. 比較検討

以下にBigQuery Storage APIとRESTAPIの
実行結果概要を記載します。

処理方法 BigQuery Storage API RESTAPI
プログラム処理開始時間 13:30:49 21:16:37
1件目処理開示時間 13:30:53 21:16:46
処理完了時間 13:33:25 23:00:32
料金(単位:ドル ※) クエリ:4.1$
ストレージAPI:0.9$
クエリ:4.1$

※USリージョン、2019年5月時点での料金です。
クエリは、1TBあたり5$で計算しています。
ストレージAPIは、1TBあたり1.1$で計算しています。
  
以上の結果から実際にかかった時間、料金は以下の通りになります。

処理方法 BigQuery Storage API RESTAPI
1件目の処理開始までに費やした時間 4秒 9秒
全件終了までに費やした時間 2分32秒 1時間43分46秒
料金 5$ 4.1$

4. 感想

BigQueryStorageAPIは、案件にはまれば、費用対効果は凄く良いと思いました。
1億件の処理完了までに、2.5分(BigQueryStorageAPI)と、100分(REST-API) と
処理時間に大きく差分が発生しました。ざっくり40倍ですね。本当に速いです。
費用は25%上乗せされますが、時間性能が大きく違います。

ハマりポイントですが、BigQuery Storage APIの設定を忘れて、実行できませんでした。
(このAPIに限りませんが)BigQuery Storage API使用をする際、APIの有効化はつい忘れがちですので、気をつけましょう!

参考までにテスト で使用したプログラム概要を下に掲載します。
データの取り出し方に関してはBigQuery Storage APIとREST-APIで書き方が大きく異なります。
下に記載しているURLを参照ください。

5. 参考:BigQuery Storage APIでデータ処理する際に使用したプログラム概要

※以下のモジュールをダウンロードして、一部編集したものになりますhttps://github.com/GoogleCloudPlatform/java-docs-samples/blob/master/bigquery/bigquerystorage/src/main/java/com/example/bigquerystorage/StorageSample.java

  • 編集概要
     ①取得元プロジェクトをbigquery-public-data.san_francisco.transactionsに変更
     ②レコード取得開始前に、処理開始の時間を記載する処理を追記
     ③レコード値を取得後、何も編集せずに処理を終了する様に処理を編集

6. 参考:RESTAPIでデータ処理する際に作成したプログラム概要

※以下のモジュールをダウンロードして、一部編集したものになりますhttps://github.com/GoogleCloudPlatform/java-docs-samples/blob/master/bigquery/cloud-client/src/main/java/com/example/bigquery/SimpleApp.java

  • 編集概要
    ①取得元プロジェクトをbigquery-public-data.san_francisco.transactionsに変更
    ②レコード取得開始前に、処理開始の時間を記載する処理を追記
    ③レコード値を取得後、何も編集せずに処理を終了する様に処理を編集
次の記事を読み込んでいます
次の記事を読み込んでいます