gpt4 book ai didi

java - 通过 Dataproc API 的 Spark 作业的 Hadoop 安全性 GroupMappingServiceProvider 异常

转载 作者:可可西里 更新时间:2023-11-01 14:22:43 25 4
gpt4 key购买 nike

我正在尝试在 google dataproc 集群上运行 Spark 作业,但出现以下错误:

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.15

作业配置:

地区:全局
集群 my-cluster
工作类型:Spark
Jar 文件:gs://bucket/jars/spark-job.jar
主类或 jar:spark.Main
参数:
属性:
spark.driver.extraClassPath:/path/to/google-api-client-1.20.0.jar
spark.driver.userClassPathFirst: true

我在命令行上以这种方式运行它没有问题:

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 有某种冲突。

最佳答案

对于遇到此问题的任何人(即使您没有使用 Spark)

此异常在此处引发 Configuration.java#L2585

配置.java 1

异常的含义

Hadoop 告诉你,第二个类不是另一个类的子类子接口(interface)

这就是 Class.isAssignableFrom(OtherClass) 在上图中 2584 行所做的事情

The java.lang.Class.isAssignableFrom() determines if the class orinterface represented by this Class object is either the same as,or is a superclass or superinterface of, the class orinterface represented by the specified Class parameter.

但我们知道

  • org.apache.hadoop.security.GroupMappingServiceProvider

父类(super class)
  • org.apache.hadoop.security.JniBasedUnixGroupsMapping

那么这怎么会发生呢?

为什么会这样

这可能有多种原因

  1. 您的 classpath 上有两个版本的 hadoop-client
  2. 您已将 Hadoop 与一个库捆绑在一起,但它的版本或发行版与另一个捆绑的 Hadoop 库不同。
  3. 您的类路径指向多个 Hadoop 安装或 Hadoop 客户端,而它们应该只有一个 hadoop-client jar
  4. 您使用了错误的 Hadoop 包 - 例如,您的目标是 Cloudera 环境并且您使用的是 Hadoop 库的开源版本

解决方案

  • 使所有 Hadoop 库版本符契约(Contract)一版本
  • 创建一个元包,并在所有插件、客户端和包中仅依赖于这个元包 jar。
  • 改用您的客户端库的正确发行版本 - 例如:
  • 通过 hadoop-client-apihadoop-client-runtime 使用 Hadoop Client Libs 的阴影版本

关于java - 通过 Dataproc API 的 Spark 作业的 Hadoop 安全性 GroupMappingServiceProvider 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47929270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com