“在空闲时重新启动spark上下文时,”只能使用kerberos或Web身份验证颁发“委派令牌”

时间:2016-11-27 22:06:41

标签: hadoop apache-spark yarn kerberos gssapi

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

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

我试图做类似于this开发人员的事情,并明确指定了hdfs namenode地址,但它没有帮助。

如果我根本不重置SparkContext或在此火花上下文中执行最后一个命令后不到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-submit命令:

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

2 个答案:

答案 0 :(得分:1)

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

在Spark 1.6.2中,它已修复。

答案 1 :(得分:0)

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

  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)

  }