現在、Dataprocに組み込まれているGCSコネクタは現在compiles against an oldergoogle-api-services-storage-v1
バージョンです。 com.google.api.services.storage.model.StorageObject.getTimeCreated()
メソッドは、それ以降のバージョンでのみ追加されていました。そのため、古いバージョンがクラスパスで勝ったときにエラーになります。完全な下位互換性を検証した後、近い将来リリースでバージョンを更新する予定です。
一方で、あなたは自分のグアバのバージョンをもたらすユーザーとクラスパスの衝突の原因を避けるために同じように、あなた自身のfatjarにシェードプラグインを使用してcom.google.api.services.storage.*
パッケージを再パッケージするためにGCSコネクタrepackages com.google.common.*を試すことができますいずれか、またはあなたが試すことができます。なお、
export GCS_BUCKET=[SOME BUCKET YOU OWN HERE WITHOUT gs:// PREFIX]
# Clone the code, update the dependency, build it
git clone https://github.com/GoogleCloudPlatform/bigdata-interop.git
cd bigdata-interop
sed -i "s/v1-rev35/v1-rev83/" pom.xml
mvn -P hadoop2 package
# Upload the new GCS connector to GCS
gsutil cp gcs/target/gcs-connector-1.5.3-hadoop2-SNAPSHOT-shaded.jar gs://${GCS_BUCKET}/gcs-connector-1.5.3-hadoop2-SNAPSHOT-shaded.jar
# Create a quick init action
cat <<EOF> install_new_gcs.sh
#!/bin/bash
rm /usr/lib/hadoop/lib/gcs-connector-*.jar
gsutil cp gs://${GCS_BUCKET}/gcs-connector-1.5.3-hadoop2-SNAPSHOT-shaded.jar \
/usr/lib/hadoop/lib/
chmod 644 /usr/lib/hadoop/lib/gcs-connector-*.jar
EOF
gsutil cp install_new_gcs.sh gs://${GCS_BUCKET}/install_new_gcs.sh
# Create your dataproc cluster
gcloud dataproc clusters create ${USER}-new-connector \
--initialization-actions gs://${GCS_BUCKET}/install_new_gcs.sh
:GCSを再コンパイルすることは自分自身をコネクタと(あなたは基本的にあなたがGCSバケットを供給する必要がある最初の行を除いてそのままここにすべてをコピー/ペーストすることができます)初期化アクションを使用してDataprocクラスタにそれを交換しますここでの根本的な原因は、自動的にインストールされたHadoopのGCSコネクタと独自のGCSライブラリとの衝突であるため、あなたのコードで代わりにHadoop FileSystemインターフェイスを使用することを検討してください。 Dataprocでは、これはPath
を渡す場所で、gs://bucket/foo/bar
という形式のパスを使用できるように構成され、自動的にGCSコネクタライブラリをロードして動作させます。あなたのコードは次のようになります:
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.conf.Configuration;
...
Path foo = new Path("gs://my-bucket/my-data.txt");
InputStream is = foo.getFileSystem(new Configuration()).open(foo);
...
まず、感謝しますあなたは非常に、デニス。私はあなたのインストラクションを再コンパイルしてスワップしようとしました。ジョブを実行しようとすると、このエラーが発生します: '=========== Cloud Dataproc Agent Error =========== java.lang.NullPointerException \t com.google.api.client.util.SecurityUtils.loadKeyStore(SecurityUtils.java:84) \t com.google.api.client.googleapis.GoogleUtils.getCertificateTrustStore(GoogleUtils.java:76) ) \t com.google.api.client.googleapis.javanet.GoogleNetHttpTransport.newTrustportTransport(GoogleNetHttpTransport.java:55) '。どんな手掛かり? – juanignaciosl
私はHadoop FSでも試していますが、ジョブは失敗します: 'ExitCodeException exitCode = 52:at org.apache.hadoop.util.Shell.runCommand(Shell.java:545)...'。私はまだHadoop自体をデバッグしようとしていますが、それは関連していると思われます。私は自分の仕事を単純なstdoutメッセージで置き換えて実行すると動作します。 – juanignaciosl
'Path foo = new Path(" gs://my-bucket/my-data.txt ");'スタイルは最終的に私のために働いた、ありがとう! – juanignaciosl