CDSW在Session中运行代码超过一次就报错问题分析

发布日期:2020-12-28 17:28
1605562-20190218152043695-247883054
问题描述:
在CDSW中启动一个Session然后运行代码,第一次能够正常运行,在第一次运行完成后不关闭Session,在同一个Session中再次运行代码,此时就会出现报错,主要的报错信息为“Delegation Token can be issued only with kerberos or web authentication”,报错的截图如下:


问题分析过程:
由于这个报错出现在CDSW服务中,因此首先需要确认是CDSW侧导致的问题还是CDH侧导致的问题。

针对报错的Session,到CDSW所在服务器通过kubectl命令获取到Session的日志,在日志中并无报错的信息,日志截图如下:


在Session日志中没有查看到有效信息的情况下,在启动Session的Terminal中执行了两次同样的代码,第二次依然报错;在这之后,在CDSW的Master节点,通过启动pyspark-shell命令行的方式提交了两次同样的代码,第二次和之前一样报错,通过上面的测试,我们可以得出该问题与CDSW无关,由于报错的作业类型是PySpark,因此我们将问题的重点转移到CDH集群的Spark上,目前报错的环境使用的Spark版本是Spark2.2.0-cloudera1,下面针对Spark来分析该问题。

通过报错信息分析是与认证相关的报错,通过查询资料在Apache官网上找到了相关的jira,编号为SPARK-21890,链接如下:
    https://issues.apache.org/jira/browse/SPARK-21890
该jira描述Spark Client已经拥有了hdfs token,但是Spark Client本身无法感知到该hdfs token已获取,因此还是会继续请求,同时hdfs credentials provider对于这种已有凭据的请求不会进行任何处理,因此导致了Delegation Token的报错,详情可以查阅上面的jira链接,同时该jira影响的版本是Spark2.2.0,与行内使用的Spark版本相符,在与Support沟通后,确认了问题是该jira导致。
    问题处理结论:
基于该问题是Spark版本的bug导致,因此从根本上解决该问题的方式是升级行内的Spark版本,目前行内所使用的Spark2.2.0是一个比较老的版本,该版本在CDH5.16.2上其实已经不支持了,参考下面链接:

https://docs.cloudera.com/documentation/spark2/latest/topics/spark2_requirements.html

目前行内的集群由于是从5.13升级上来的,因此还在继续使用该版本的Spark,建议将行内的Spark版本升级到Spark2.4,一方面来说Spark2.4是Spark2的最高版本,相比Spark2.2多了新特性以及一些bug的修复,同时行内之前也有业务人员提出过更高版本Spark的需求,另一方面CDH6以及目前CDP7.1.4打包的都是Spark2.4。
CDH中Spark各版本对应的fix可以参考下面的链接:
    https://docs.cloudera.com/documentation/spark2/latest/topics/spark2_fixed_issues.html 
在进行Spark版本升级之前,如果遇到多次执行代码时遇到该报错,那么停止当前Session后,重新打开一个新的Session再运行代码即可。
分享到:
推荐精彩博文