こちらの記事は弊社技術ブログに掲載していた内容となります。一部を除き、投稿当時の情報となりますので、紹介内容の最新情報については別途公式情報等をご参照下さい。 目次 Toggle BigQuery Storage API の性能を試すため1億件回してみました前書きと、この記事でやる事比較する為の条件BigQuery Storage APIを使う前の準備比較検討感想参考:BigQuery Storage APIでデータ処理する際に使用したプログラム概要参考:RESTAPIでデータ処理する際に作成したプログラム概要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を検証してみたいと思います。 比較する為の条件 以下の前提で比較しました。 GoogleのPublicデータセットを使用して、1億レコードをスキャンする処理を実行してみます。 JavaのAPIを使用して比較。 処理開始時間と処理終了時間を以下2通りで比較 ①BigQuery Storage APIを使用して、結果取得。結果の取得がすべて完了するまでの時間を計測。 ②BigQueryの結果をRESTAPIで、結果取得。結果の取得がすべて完了するまでの時間を計測。 使用テーブル:[`bigquery-public-data.san_francisco.transactions`] レコード数:107,501,619 件 スキャン量:0.82GB リージョン:US BigQuery Storage APIを使う前の準備 BigQuery Storage APIを使うまでに設定しないといけないことがありますので記載します。 BigQuery Storage APIの有効化 BigQuery Storage APIを利用するアカウントで、APIを有効化します 使用するプロジェクトを選択する。 左上のナビゲーションメニューから「APIとサービス」をクリック 「APIとサービスを有効化」をクリック 検索画面で「Bigquery Storage API」と入力して表示された検索結果をクリック 「有効にする」 をクリック 有効になったら設定は終了です。 ※プログラムは「5.参考:BigQuery Storage APIでデータ処理する際に作成したプログラム概要」をご参照ください。 比較検討 以下に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リージョン、2020年8月時点での料金です。 クエリは、1TBあたり5$で計算しています。 ストレージAPIは、1TBあたり1.1$で計算しています。 以上の結果から実際にかかった時間、料金は以下の通りになります。 処理方法 BigQuery Storage API RESTAPI 1件目の処理開始までに費やした時間 4秒 9秒 全件終了までに費やした時間 2分32秒 1時間43分46秒 料金 5$ 4.1$ 感想 BigQueryStorageAPIは、案件にはまれば、費用対効果は凄く良いと思いました。 1億件の処理完了までに、2.5分(BigQueryStorageAPI)と、100分(REST-API) と 処理時間に大きく差分が発生しました。ざっくり40倍ですね。本当に速いです。 費用は25%上乗せされますが、時間性能が大きく違います。 ハマりポイントですが、BigQuery Storage APIの設定を忘れて、実行できませんでした。 (このAPIに限りませんが)BigQuery Storage API使用をする際、APIの有効化はつい忘れがちですので、気をつけましょう! 参考までにテスト で使用したプログラム概要を下に掲載します。 データの取り出し方に関してはBigQuery Storage APIとREST-APIで書き方が大きく異なります。 下に記載しているURLを参照ください。 参考: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に変更 ②レコード取得開始前に、処理開始の時間を記載する処理を追記 ③レコード値を取得後、何も編集せずに処理を終了する様に処理を編集 参考: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に変更 ②レコード取得開始前に、処理開始の時間を記載する処理を追記 ③レコード値を取得後、何も編集せずに処理を終了する様に処理を編集 BigQuery 活用でお悩みですか? クラウドエースは、Google Cloud 専門のシステムインテグレーターとして、BigQuery をはじめとしたデータ分析基盤構築や技術サポートを行っております。豊富な知見と実績をもとに、弊社エンジニアがナレッジ共有やワークショップを行い、システム内製化の技術支援と共同制作も可能です。 株式会社セブン-イレブン・ジャパン様の BigQuery 活用事例はこちら BigQuery を最大限に活用いただけるよう、さまざまなサポートをご用意しておりますので、お困りごとがありましたらお気軽にご相談ください。 その他、さらにGoogle Cloud とクラウドエースについて詳しく知りたいという方は、こちらの資料もぜひ合わせて御覧ください。