1. 提交任务的命令

spark-submit  \
--class <classname> \
--master yarn \
--deploy-mode client \
--executor-memory 2g \
--executor-cores 2 \
--driver-memory 2g \
--num-executors 2 \
--queue default \
--principal ocsp-yg@ASIAINFO.COM \
--keytab /etc/security/keytabs/hdfs.headless.keytab \
--files "/usr/OCSP/conf/kafka_client_jaas.conf,/usr/OCSP/conf/ocsp.keytab" \
--driver-java-options "-Djava.security.auth.login.config=/usr/OCSP/conf/kafka_client_jaas.conf" \
--conf "spark.executor.extraJavaOptions=-Djava.security.auth.login.config=./kafka_client_jaas.conf" \
--jars <your jars>,/usr/OCSP/lib/spark-kafka-0-10-connector-assembly_2.10-1.0.1.jar /usr/OCSP/lib/ocsp-core_1.6-2.1.0.jar

 

  • –principal与–keytab这两个参数为spark需要的Kerberos认证信息

  • –driver-java-options “-Djava.security.auth.login.config=/usr/OCSP/conf/kafka_client_jaas.conf”driver连接kafka用到的认证信息,因此使用本地绝对路径

  • –conf “spark.executor.extraJavaOptions=-Djava.security.auth.login.config=./kafka_client_jaas.conf”executor连接kafka用到的Kerberos认证信息,因此使用container中的相对路径./

  • jaas文件中定义了principal与keytab,由于我们使用了yarn-client模式,driver需要的文件在本地文件系统,executor需要的文件需要我们使用–files的方式上传,–files “/usr/OCSP/conf/kafka_client_jaas.conf,/usr/OCSP/conf/ocsp.keytab”

  • 有的文档中说–files中传keytab文件会与spark本身的–keytab 冲突,其实是因为他们对spark和kafka使用了相同的principal和keytab,在上述命令中我为了清晰起见,让spark使用了principal ocsp-yg@ASIAINFO.COM,keytab hdfs.headless.keytab,让spark连接kafka时使用了principal ocsp/ASIAINFO.COM(principal其实是在jaas文件中指定的,3中详细讲jaas文件) keytab ocsp.keytab,当spark提交任务时,yarn会将–keytab后面的keytab文件与–files里的文件先后上传,即 hdfs.headless.keytab与ocsp.keytab均会被上传,spark与kafka各取所需,即可正常工作。当spark与kafka要使用相同的keytab文件时,比如都用ocsp.keytab,那么yarn会先后上传两次ocsp.keytab,在spark正使用的时候更新了keytab,造成异常退出

  • 因此如果spark与kafka需要使用相同的keytab文件,我们只需要在–files里不要上传keytab即可避免冲突

spark-submit \
--class <classname> \
--master yarn \
--deploy-mode client \
--executor-memory 2g \
--executor-cores 2 \
--driver-memory 2g \
--num-executors 2 \
--queue default \
--principal ocsp@ASIAINFO.COM \
--keytab /etc/security/keytabs/ocsp.keytab \
--files "/usr/OCSP/conf/kafka_client_jaas.conf" \
--driver-java-options "-Djava.security.auth.login.config=/usr/OCSP/conf/kafka_client_jaas.conf" \
--conf "spark.executor.extraJavaOptions=-Djava.security.auth.login.config=./kafka_client_jaas.conf" \
--jars <your jars>,/usr/OCSP/lib/spark-kafka-0-10-connector-assembly_2.10-1.0.1.jar /usr/OCSP/lib/ocsp-core_1.6-2.1.0.jar

 

  • 还有一个问题是本例中drvier和executor使用了相同的kafka_client_jaas.conf,这也会造成一些问题,3中会详细说明

2. 生成keytab和principal

  • 在KDC Server上执行
    kadmin -p admin/admin@ASIAINFO.COM
  • 生成principal,principal最好使用ocsp的用户名+domain
    addprinc -randkey ocsp/ASIAINFO.COM
  • 生成keytab
    ktadd -k /data/ocsp.keytab ocsp/ASIAINFO.COM
  • 将keytab文件copy到spark driver所在的机器(因为OCSP默认使用yarn-client模式)

3. 创建spark读取kafka的jaas配置文件

  • 配置文件kafka_client_jaas.conf样例如下:
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
  useTicketCache=false
  useKeyTab=true
  principal="ocsp@ASIAINFO.COM"
  keyTab="./ocsp.keytab"
  renewTicket=true
  storeKey=true
  serviceName="ocsp";
};
  • 其中useTicketCache指从系统的cash中读取credential信息,useKeyTab指从指定的keyTab文件读取credential

  • principal和keytab用第二步生成的principal与keytab,注意:keytab的路径

    • 如果这个conf文件是给driver读取,则我们要用keytab文件在本地的绝对路径
    • 如果这个conf文件是executor读取,则我们要用keytab文件在container中的相对路径,即./ocsp.keytab
    • 如果为了方便起见,drvier与executor要使用相同的jaas文件,路径配置为./ocsp.keytab,我们需要将keytab文件copy到运行spark-submit的当前路径
    • 如果driver和executor要使用不同的jaas文件,则driver的jaas文件中,keytab应为本地绝对路径,executor的jaas文件中,keytab应为相对路径./

版权声明:本文为felixzh原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/felixzh/p/10562730.html