概要
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つやることがあります。
- splitLargeRowsパラメータを追加
- 公式テンプレートの修正
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);
なのでこれを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にダウングレードする必要があります。
コメントにはJDK8 or JDK11で、とありますが、JDK8は別のエラーでコケました。
まとめ
大きめのBigtableデータを他プロジェクトに移したい時に遭遇した問題を、Dataflowテンプレートを修正することで解決しました。
-
https://github.com/googleapis/java-bigtable-hbase/pull/3008, https://github.com/googleapis/java-bigtable-hbase/pull/3009↩
-
https://github.com/googleapis/java-bigtable-hbase/pull/3025↩
-
https://github.com/GoogleCloudPlatform/DataflowTemplates/blob/77eee0ac09dcabce96b304b9fe3ded487a3e2cf6/pom.xml#L61-L62↩