BigQueryクエリの処理の流れ

 BigQueryクエリの処理の流れ

0cf0e64940658884ce5d88e10dfb2409?s=128

GoogleCloudPlatformJapan

April 24, 2015
Tweet

Transcript

  1. 4.

    クエリを実行してみよう SELECT language, SUM(views) as views FROM ( SELECT title,

    language, MAX(views) as views FROM [helixdata2:benchmark.Wiki100B] WHERE REGEXP_MATCH(title, "G.*o.*") GROUP EACH BY title, language ) GROUP EACH BY language ORDER BY views desc
  2. 5.

    1000億行に対する複雑なクエリ実行時の性能 実行時間:21秒 - 4 TBのデータを読み込み - 1000億行に対する正規表現の適用 - 278 GBのデータをシャッフル

    並列処理しなかったら: - 4 TBのディスク読み込みに11.6時間(100 MBpsの場合) - 1000億行の正規表現処理に27時間(1行あたり1 μsecの場合) - 278 GBのシャッフルに37分(1Gbpsの場合)
  3. 6.

    curlでクエリを実行する curl -H "$(python auth.py)" \ -H "Content-Type: application/json" \

    -X POST \ -d {'jobReference': { \ 'jobId': 'job_1429217599', \ 'projectId': 'bigquery-e2e'}, \ 'configuration': { \ 'query': { \ 'query': 'SELECT ...’}}} \ "https://www.googleapis.com/bigquery/v2/projects/bigquery-e2e/jobs"
  4. 7.

    リクエストの中身は... POST /bigquery/v2/projects/bigquery-e2e/jobs HTTP/1.1 User-Agent: curl/7.30.0 Host: www.googleapis.com Accept: */*

    Authorization: Bearer <redacted> Content-Type: application/json Content-Length: 126 {'jobReference': {'jobId': 'job_1429217599', 'projectId': 'bigquery-e2e'}, 'configuration': {'query': {'query': 'SELECT 17'}}}
  5. 8.

    Client HTTP POST GFE JSON API frontend HTTP JSON HTTP

    BigQuery API Server protobuf gRPC ジョブの投入
  6. 10.

    HTTP POST クエリジョブの状態変化 HTTP Error HTTP OK OK? OK? OK?

    PENDING RUNNING DONE w/ errorResult DONE no no no yes yes yes
  7. 11.

    Client HTTP POST GFE 200 OK API Frontend HTTP 200

    OK HTTP BigQuery API Server protobuf gRPC Spanner 新規ジョブ Stubby ジョブ投入の完了
  8. 12.

    レスポンスヘッダ HTTP/1.1 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Pragma:

    no-cache Vary: X-Origin Content-Type: application/json; charset=UTF-8 Server: GSE Accept-Ranges: none Vary: Origin,Accept-Encoding Transfer-Encoding: chunked
  9. 13.

    レスポンスデータ { "kind": "bigquery#job", "id": "bigquery-e2e:job_1429217599", "jobReference": {"projectId": "bigquery-e2e", "jobId":

    "job_1429217599"}, "configuration": {...} "status": { "state": "RUNNING" }, "statistics": { "creationTime": "1429217642957", "startTime": "1429217643549" }, "user_email": "jtigani@gmail.com" }
  10. 14.

    レスポンスデータ(configuration) "configuration": { "query": { "query": "SELECT ...", "destinationTable": {

    "projectId": "bigquery-e2e", "datasetId": "_0e32b38e1117b2fcea992287c138bd53acfff7cc", "tableId": "anon6163a05d4704b78c589f41813708f340a2df2d1f" }, "createDisposition": "CREATE_IF_NEEDED", "writeDisposition": "WRITE_TRUNCATE" } }
  11. 15.

    新しいジョブの開始 1. 確認フェーズ: - 認証チェック - クオータのチェック - 入力内容の検証 -

    キャッシュのチェック - 出力テーブルの用意 2. ジョブをメタデータストアに保存 3. リクエスト元に正常開始を伝える
  12. 16.

    ところで:BigQueryのキャッシュの動き 以下のSHA-1ハッシュ値をとる: - データ更新時間 - 参照テーブル 以下の場合はキャッシュを使わない: - 値が変化する関数を使用(NOW()など) -

    固定の出力テーブルを指定 - 参照テーブルがストリーミングバッファを使用 SHA-1ハッシュ値が出力テーブル名となる ユーザー単位でキャッシュされる
  13. 17.

    BigQuery APIサーバ Spanner テーブル メタデータ Dremel ゲー トウェイ Dremel クエリ

    Dremelクラスタ us-central-1-a Dremelクラスタ us-central-2-a Dremel クエリ Dremelクエリの開始
  14. 21.

    Dremel ゲー トウェイ Dremel Root Mixer Dremel クエリ Dremel Mixer-1

    Dremel Mixer-1 Dremel Mixer-1 Dremel Shard Dremel Shard Dremel Shard Dremel Shard Dremel Shard Dremel Shard Dremelクエリの実行ツリー
  15. 22.

    Dremel Root Mixer クエリプランの構築 - クエリを複数のステージに分割 - 処理内容を並列タスクに分割 クエリのスケジューリング -

    利用可能なスロットを各ユーザーに分配 - クエリの割り込み クエリを下位のmixer/shardに転送
  16. 24.

    Dremel Shard Dremel Shard Dremel Shard CFS CFS CFS CFS

    CFS CFS 分散メタデータ 分散ファイル 分散 ストレージ データの読み込み Streaming BigTable
  17. 25.

    ストレージ階層 Colossusメタデータ - ディレクトリ構造 - ACLs Colossusファイル - ほとんどフラットな構造 -

    一部のACLs - 暗号化 分散ストレージ - ディスクエンコード(RAID的なもの) - クラスタ内でレプリケーション
  18. 28.

    Dremel Shard CFS CFS CFS CFS WHERE REGEXP_MATCH( title, "G.*o.")

    フィルタリングの実行 CFS CFS Drmel Shard
  19. 31.

    Dremel Shard Dremel Shard Dremel Shard CFS CFS CFS CFSr

    CFS CFS データのマテリアライズ
  20. 33.

    BigQuery APIサーバ Spanner テーブル メタデータ Dremel ゲー トウェイ クエリス テータス

    Dremelクラスタ us-central-1-a クエリス テータス クエリ結果の保存