"Delegation Token can be issued only with kerberos or web authentication" 在闲置后重新启动 spark 上下文时

"Delegation Token can be issued only with kerberos or web authentication" when restarting spark context after idle

我尝试将 spark 应用程序部署到由 YARN 控制的 kerberized hadoop 集群。 Spark 版本为 1.5.0-cdh5.5.2.

当空闲超过 10 秒后停止 SparkContext 并初始化一个新的时,我遇到了奇怪的异常。

我尝试做一些类似于 开发人员所做的事情,并明确指定 hdfs 名称节点地址,但没有帮助。

更令人困惑的是,如果我根本不重置 SparkContext 或在此 spark 上下文中执行最后一个命令后不到 10 秒内重置它,一切正常。

我该如何解决?

这是遇到问题的最小化情况:

package demo;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;


public class App
{
    public static void main( String[] args ) throws Exception {

        SparkConf sparkConf = new SparkConf();
        sparkConf.setAppName("demo");
        sparkConf.set("spark.yarn.access.namenodes", "hdfs://hdp:8020");

        JavaSparkContext jsc = new JavaSparkContext(sparkConf);

        int waiting_time = 10;
        System.out.println("Waiting time: " + Integer.toString(waiting_time));
        Thread.sleep(waiting_time * 1000);

        jsc.stop();

        jsc = new JavaSparkContext(sparkConf); // "Delegation token ..." exception here
    }

}

引发异常时的堆栈跟踪: https://gist.github.com/anonymous/18e15010010069b119aa0934d6f42726

spark-提交命令:

spark-submit --principal mp@LAGOON --keytab mp.keytab --master yarn-client --class demo.App demo.jar

问题是由这个问题引起的:https://issues.apache.org/jira/browse/SPARK-15754

在 Spark 1.6.2 中已修复。

对我来说,重新登录每次都解决了问题

  def main(args: Array[String]): Unit = {

    val timer = new Timer()
    timer.schedule(new TimerTask {
      override def run(): Unit = {
        UserGroupInformation.reset()
        UserGroupInformation.loginUserFromKeytab("xxx", "/path/to/keytab")
        val spark = SparkSession.builder()
          .appName("TokenRenew")
          .getOrCreate()
        spark.read.csv("/tmp/test.txt").show
        spark.stop()

      }
    }, 0, 1000 * 60)

  }