2016-09-14 13 views
2

私はローカルで動作するSparkジョブを実行しようとしています。 Google Storageを使用します。私はこのエラーを取得しています:NoSuchMethodError StorageObject.getTimeCreated実行中のジョブDataproc

Exception in thread "main" java.lang.NoSuchMethodError: com.google.api.services.storage.model.StorageObject.getTimeCreated()Lcom/google/api/client/util/DateTime; 
    at com.google.cloud.storage.BlobInfo.fromPb(BlobInfo.java:798) 
    at com.google.cloud.storage.Blob.fromPb(Blob.java:641) 
    at com.google.cloud.storage.StorageImpl.create(StorageImpl.java:139) 
    at com.google.cloud.storage.StorageImpl.create(StorageImpl.java:132) 
... 

Dataprocジョブがgcloud-java-storage-0.2.8.jarを使用している、と私はそのメソッドが定義されているにもかかわらず、成功せずgoogle-api-services-storage-v1-rev62-1.21.0.jargoogle-api-services-storage-v1-rev83-1.22.0.jarの両方を試してみました。適切なバージョンのgoogle-api-services-storageを使用していないようですが、アップロードとjarの指定以外に何ができるのか分かりません。

紛失しているものはありますか?

答えて

3

現在、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); 
... 
+0

まず、感謝しますあなたは非常に、デニス。私はあなたのインストラクションを再コンパイルしてスワップしようとしました。ジョブを実行しようとすると、このエラーが発生します: '=========== 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

+0

私はHadoop FSでも試していますが、ジョブは失敗します: 'ExitCodeException exitCode = 52:at org.apache.hadoop.util.Shell.runCommand(Shell.java:545)...'。私はまだHadoop自体をデバッグしようとしていますが、それは関連していると思われます。私は自分の仕事を単純なstdoutメッセージで置き換えて実行すると動作します。 – juanignaciosl

+0

'Path foo = new Path(" gs://my-bucket/my-data.txt ");'スタイルは最終的に私のために働いた、ありがとう! – juanignaciosl

0

私はDataprocの1.0イメージバージョンで同じ問題に遭遇しました。私は、クラスタの初期化アクションに次のように追加して、それを解決:

#!/bin/bash 

rm /usr/lib/hadoop/lib/bigquery-connector-0.10.1-hadoop2.jar 
rm /usr/lib/hadoop/lib/gcs-connector-1.6.0-hadoop2.jar 

rm /usr/lib/hadoop/lib/guava-11.0.2.jar 
gsutil cp gs://my-bucket/jars/guava-18.0.jar /usr/lib/hadoop/lib/ 

はまた、私は次のMavenの構成で、脂肪ジャーとしての私のスパークアプリケーションのjarファイルを構築しました:すべての

<dependency> 
     <groupId>com.google.apis</groupId> 
     <artifactId>google-api-services-storage</artifactId> 
     <version>v1-rev97-1.22.0</version> 
    </dependency> 
    <dependency> 
     <groupId>com.google.cloud.bigdataoss</groupId> 
     <artifactId>gcs-connector</artifactId> 
     <version>1.6.0-hadoop2</version> 
    </dependency> 
関連する問題