我想分享一个我最近遇到的有趣的错误:
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$1$$anonfun$5$$anonfun$apply$1.apply$mcJ$sp(HadoopFSDelegationTokeProvider.scala:119)
我试图像这样将作业提交到Cloudera集群上的远程驱动程序主机:
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作业成功完成。