Carpe Diem

備忘録

DataflowのAvro to BigtableテンプレートでQuotaエラーが発生した場合の対応

概要

Bigtableのデータを他プロジェクトに移したい場合、公式のDataflowテンプレートを用いて以下の図のようにExport & Importできます。

しかしBigtableのデータが多すぎるとImportする際に、

Error message from worker: java.lang.IllegalArgumentException: Key xxxxxx has 141530 mutations, which is over the 100000 maximum.

といったBigtableのquotaエラーが発生することがあります。今回はその対応方法です。

環境

  • maven 3.8.6
  • OpenJDK 11
  • DataflowTemplates 2022-09-05-00_RC00

方法

大きく分けると2つやることがあります。

  1. splitLargeRowsパラメータを追加
  2. 公式テンプレートの修正

1. splitLargeRowsパラメータを追加

公式ドキュメントには書いてないのですが、

ref: https://cloud.google.com/dataflow/docs/guides/templates/provided-batch?hl=ja#template-parameters_10

データ量が多い場合の対策として分割するオプションが付いています。

    @Description(
        "Set the option to split a large row into multiple MutateRows requests. When a row is"
            + " split across requests, updates are not atomic. ")
    void setSplitLargeRows(ValueProvider<Boolean> splitLargeRows);

https://github.com/GoogleCloudPlatform/DataflowTemplates/blob/2022-09-05-00_RC00/src/main/java/com/google/cloud/teleport/bigtable/AvroToBigtable.java#L74

なのでこれをparametersに加えます。

gcloud dataflow jobs run my-job-001 \
  --gcs-location gs://dataflow-templates-asia-northeast1/latest/Cloud_Bigtable_to_GCS_Avro \
  --region $REGION \
  --staging-location gs://$BUCKET_NAME/temp/ \
  --subnetwork regions/$REGION/subnetworks/$SUBNET \
  --network $NETWORK \
  --parameters \
  bigtableProjectId=$PROJECT_ID, \
  bigtableInstanceId=$INSTANCE_ID, \
  bigtableTableId=$TABLE_ID, \
  inputFilePattern=gs://mybucket/somefolder/prefix*, \
  splitLargeRows=true

2. 公式テンプレートの修正

しかしsplitLargeRowsだけ有効にしても以下のエラーが発生します。

Error message from worker: java.lang.IllegalArgumentException: Key xxxxxx has 100000 mutations, which is over the 100000 maximum.

100000のquotaに対して100000件扱っているというバグで、これは過去のPR1で修正されており、bigtable-client-core 1.21.0からは問題なくなります2

しかし現在のテンプレートは上記が反映されていないバージョン1.15.0を指定している3ため、引き続きこの問題が発生します。
なので公式の指定しているバージョンを1.26.3に修正したテンプレートを作成します。

修正方法

公式のgithubをcloneします。

https://github.com/GoogleCloudPlatform/DataflowTemplates

次にpom.xmlを修正します。

     <mock-server-netty.version>5.11.1</mock-server-netty.version>
     <os-maven-plugin.version>1.5.0.Final</os-maven-plugin.version>
     <open-census.version>0.24.0</open-census.version>
-    <bigtable.version>1.15.0</bigtable.version>
-    <bigtable-beam-import.version>1.15.0</bigtable-beam-import.version>
+    <bigtable.version>1.26.3</bigtable.version>
+    <bigtable-beam-import.version>1.26.3</bigtable-beam-import.version>
     <protobuf.version>3.11.1</protobuf.version>
     <json.version>20200518</json.version>
     <junit.jupiter.version>5.5.2</junit.jupiter.version>

修正したらテンプレートを生成します。

mvn compile exec:java \
  -Dexec.mainClass=com.google.cloud.teleport.bigtable.AvroToBigtable \
  -Dexec.cleanupDaemonThreads=false \
  -Dexec.args=" \
    --project=$PROJECT_ID \
    --region=$REGION \
    --stagingLocation=gs://$BUCKET_NAME/staging \
    --tempLocation=gs://$BUCKET_NAME/temp \
    --templateLocation=gs://$BUCKET_NAME/templates/AvroToBigTable.json \
    --runner=DataflowRunner"

動作確認

作成したテンプレートを指定して実行すれば成功するようになります。

gcloud dataflow jobs run my-job-001 \
  --gcs-location gs://$BUCKET_NAME/templates/AvroToBigTable.json \
  --region $REGION \
  --staging-location gs://$BUCKET_NAME/temp/ \
  --subnetwork regions/$REGION/subnetworks/$SUBNET \
  --network $NETWORK \
  --parameters \
  bigtableProjectId=$PROJECT_ID, \
  bigtableInstanceId=$INSTANCE_ID, \
  bigtableTableId=$TABLE_ID, \
  inputFilePattern=gs://mybucket/somefolder/prefix*, \
  splitLargeRows=true

その他

package jdk.nashorn.api.scripting does not exist

最初コンパイルしてみると以下のエラーが出ました。

org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.6.2:compile (default-compile) on project google-cloud-teleport-java: Compilation failure /DataflowTemplates/src/main/java/com/google/cloud/teleport/templates/common/JavascriptTextTransformer.java:[40,33] package jdk.nashorn.api.scripting does not exist

どうやらJDK 15でnashornが削除されたようで、最新のJDK18など使っている場合はJDK11にダウングレードする必要があります。

github.com

コメントにはJDK8 or JDK11で、とありますが、JDK8は別のエラーでコケました。

まとめ

大きめのBigtableデータを他プロジェクトに移したい時に遭遇した問題を、Dataflowテンプレートを修正することで解決しました。