Hadoop, Spark: java.lang.NoSuchFieldError: TOKEN_KIND

Hadoop, Spark: java.lang.NoSuchFieldError: TOKEN_KIND

我想分享我最近遇到的一个有趣的错误:

Exception in thread "main" java.lang.NoSuchFieldError: TOKEN_KIND
at org.apache.hadoop.crypto.key.kms.KMSClientProvider$KMSTokenRenewer.handleKind(KMSClientProvider.java:166)
at org.apache.hadoop.security.token.Token.getRenewer(Token.java:351)
at org.apache.hadoop.security.token.Token.renew(Token.java:377)
at org.apache.spark.deploy.security.HadoopFSCredentialProvider$$anonfun$getTokenRenewalInterval$$anonfun$$anonfun$apply.apply$mcJ$sp(HadoopFSDelegationTokeProvider.scala:119)

我试图像这样在 Cloudera 集群上将作业 spark2 提交到远程驱动程序主机:

spark = SparkSession.builder
   .master("yarn")
   .config("cluster")
   .config("spark.driver.host", "remote_driver_host")
   .config("spark.yarn.keytab", "path_to_pricnipar.keytab")
   .config("spark.yarn.principal", "principal.name") \
   .config("spark.driver.bindAddress", "0.0.0.0") \
   .getOrCreate()

Cloudera集群上的Apache spark和Hadoop版本分别为:2.3.0和2.6.0。

所以问题的原因很简单,它是 spark 本地二进制文件与远程 spark 驱动程序版本不匹配。 我在本地安装了 spark 2.4.5,而在 Cloudera 上安装的是 2.3.0,在将版本调整为 2.3.0 后,问题得到解决并且 spark 作业成功完成。