2017-12-21 13 views
0

私はGoogleのdataprocクラスタ上のスパークジョブを実行しようとしているが、次のエラーを取得しています:HadoopのセキュリティGroupMappingServiceProvider例外

Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: class org.apache.hadoop.security.JniBasedUnixGroupsMapping not org.apache.hadoop.security.GroupMappingServiceProvider 
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2330) 
    at org.apache.hadoop.security.Groups.<init>(Groups.java:108) 
    at org.apache.hadoop.security.Groups.<init>(Groups.java:102) 
    at org.apache.hadoop.security.Groups.getUserToGroupsMappingService(Groups.java:450) 
    at org.apache.hadoop.security.UserGroupInformation.initialize(UserGroupInformation.java:310) 
    at org.apache.hadoop.security.UserGroupInformation.ensureInitialized(UserGroupInformation.java:277) 
    at org.apache.hadoop.security.UserGroupInformation.loginUserFromSubject(UserGroupInformation.java:833) 
    at org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:803) 
    at org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:676) 
    at org.apache.spark.util.Utils$$anonfun$getCurrentUserName$1.apply(Utils.scala:2430) 
    at org.apache.spark.util.Utils$$anonfun$getCurrentUserName$1.apply(Utils.scala:2430) 
    at scala.Option.getOrElse(Option.scala:121) 
    at org.apache.spark.util.Utils$.getCurrentUserName(Utils.scala:2430) 
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:295) 
    at org.apache.spark.api.java.JavaSparkContext.<init>(JavaSparkContext.scala:58) 
    at com.my.package.spark.SparkModule.provideJavaSparkContext(SparkModule.java:59) 
    at com.my.package.spark.SparkModule$$ModuleAdapter$ProvideJavaSparkContextProvidesAdapter.get(SparkModule$$ModuleAdapter.java:140) 
    at com.my.package.spark.SparkModule$$ModuleAdapter$ProvideJavaSparkContextProvidesAdapter.get(SparkModule$$ModuleAdapter.java:101) 
    at dagger.internal.Linker$SingletonBinding.get(Linker.java:364) 
    at spark.Main$$InjectAdapter.get(Main$$InjectAdapter.java:65) 
    at spark.Main$$InjectAdapter.get(Main$$InjectAdapter.java:23) 
    at dagger.ObjectGraph$DaggerObjectGraph.get(ObjectGraph.java:272) 
    at spark.Main.main(Main.java:45) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:755) 
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:180) 
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:205) 
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:119) 
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) 
Caused by: java.lang.RuntimeException: class org.apache.hadoop.security.JniBasedUnixGroupsMapping not org.apache.hadoop.security.GroupMappingServiceProvider 
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2324) 
    ... 31 more 

Dataprocバージョンを:1.1.51と1.2 0.15

ジョブ構成:

地域:グローバル
クラスタ私クラスタ
ジョブの種類:スパーク
JARファイル:GS://bucket/jars/spark-job.jar
メインクラスまたはjar:spark.Main
引数:
プロパティ:
spark.driver.extraClassPath:
spark.driver.userClassPathFirst /path/to/google-api-client-1.20.0.jar:真

私はそれをコマンドライン上でこの方法を実行している問題はない:

spark-submit --conf "spark.driver.extraClassPath=/path/to/google-api-client-1.20.0.jar" --conf "spark.driver.userClassPathFirst=true" --class spark.Main /path/to/spark-job.jar 

しかし、UI/APIを使用すると、クラス名とjarファイルの両方に合格することはできませんので、代わりに次のようになります。

spark-submit --conf spark.driver.extraClassPath=/path/to/google-api-client-1.20.0.jar --conf spark.driver.userClassPathFirst=true --class spark.Main --jars /tmp/1f4d5289-37af-4311-9ccc-5eee34acaf62/spark-job.jar /usr/lib/hadoop/hadoop-common.jar 
それはextraClassPathを提供するとの問題がある場合、私は把握することはできません

かspark-job.jarとhadoop-common.jarが何らかの形で矛盾している場合

答えて

0

私はこれがDataprocが火花提出する指定のjarというuserClassPathFirstの組み合わせと/usr/lib/hadoop/hadoop-common.jarによって引き起こされると思い。場合によっては、ユーザークラスローダーのGroupMappingServiceProviderのインスタンスが使用され、その他の場合は、システムクラスローダーのインスタンスが使用されます。あるクラスローダーからロードされたクラスが別のクラスローダーからロードされた同じクラスと等しくない場合、この例外が発生します。

userClassPathFirstの代わりに、代わりにmaven shadeのようなものを使用して競合するクラスを再配置するのは意味がありますか?

+0

ありがとうございました。私は既にmavenを使用しているので、ここで説明した移転を追加しました(https://stackoverflow.com/questions/33922719/running-app-jar-file-on-spark-submit-in-a-google-dataproc-cluster -instance/33925408)。 これで、extraClassPathを使わずにジョブを開始できますが、別のハープオーバーエラーが発生します。 'java.util.ServiceConfigurationError:org.apache.hadoop.io.compressCompressionCodec:プロバイダorg.apache.hadoop.io.compress.Lz4Codecサブタイプではありません。 ' org.apache.hadoop.ioの再配置を使用する.compressは役に立たなかった。 – MRR

+0

これはuserClassPathFirstであるかどうかですか? api-clientがあなたのjarに再配置されると、userClassPathFirstを使わずにあなたの仕事を実行できることを期待します。 –

+0

また、userClassPathFirst 'spark-submit --conf spark.driver.userClassPathFirst = false --class spark.Main --jars /path/to/spark-job-SHADED.jar/usr/lib/hadoop/hadoop-commonもありません。 jar' – MRR

関連する問題