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 AS-yg@ASD.COM
--keytab /etc/security/keytabs/hdfs.headless.keytab
--files "/usr/AS/conf/kafka_client_jaas.conf,/usr/AS/conf/AS.keytab"
--driver-java-options "-Djava.security.auth.login.config=/usr/AS/conf/kafka_client_jaas.conf"
--conf "spark.executor.extraJavaOptions=-Djava.security.auth.login.config=./kafka_client_jaas.conf"
--jars <your jars>,/usr/AS/lib/spark-kafka-0-10-connector-assembly_2.10-1.0.1.jar /usr/AS/lib/AS-core_1.6-2.1.0.jar
--principal与--keytab这两个参数为spark需要的Kerberos认证信息
--driver-java-options "-Djava.security.auth.login.config=/usr/AS/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/AS/conf/kafka_client_jaas.conf,/usr/AS/conf/AS.keytab"
有的文档中说--files中传keytab文件会与spark本身的--keytab 冲突,其实是因为他们对spark和kafka使用了相同的principal和keytab,
在上述命令中我为了清晰起见,让spark使用了principal AS-yg@ASD.COM,keytab hdfs.headless.keytab,
让spark连接kafka时使用了principal AS/ASD.COM(principal其实是在jaas文件中指定的,3中详细讲jaas文件) keytab AS.keytab,
当spark提交任务时,yarn会将--keytab后面的keytab文件与--files里的文件先后上传,即 hdfs.headless.keytab与AS.keytab均会被上传,
spark与kafka各取所需,即可正常工作。当spark与kafka要使用相同的keytab文件时,比如都用AS.keytab,那么yarn会先后上传两次AS.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 AS@ASD.COM
--keytab /etc/security/keytabs/AS.keytab
--files "/usr/AS/conf/kafka_client_jaas.conf"
--driver-java-options "-Djava.security.auth.login.config=/usr/AS/conf/kafka_client_jaas.conf"
--conf "spark.executor.extraJavaOptions=-Djava.security.auth.login.config=./kafka_client_jaas.conf"
--jars <your jars>,/usr/AS/lib/spark-kafka-0-10-connector-assembly_2.10-1.0.1.jar /usr/AS/lib/AS-core_1.6-2.1.0.jar
还有一个问题是本例中drvier和executor使用了相同的kafka_client_jaas.conf,这也会造成一些问题,3中会详细说明
2. 生成keytab和principal
在KDC Server上执行
kadmin -p admin/admin@ASD.COM
生成principal,principal最好使用AS的用户名+domain
addprinc -randkey AS/ASD.COM
生成keytab
ktadd -k /data/AS.keytab AS/ASD.COM
将keytab文件copy到spark driver所在的机器(因为AS默认使用yarn-client模式)
3. 创建spark读取kafka的jaas配置文件
配置文件 kafka_client_jaas.conf样例如下:
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useTicketCache=false
useKeyTab=true
principal="AS@ASD.COM"
keyTab="./AS.keytab"
renewTicket=true
storeKey=true
serviceName="AS";
};
其中useTicketCache指从系统的cash中读取credential信息,useKeyTab指从指定的keyTab文件读取credential
principal和keytab用第二步生成的principal与keytab,注意:keytab的路径
如果这个conf文件是给driver读取,则我们要用keytab文件在本地的绝对路径
如果这个conf文件是executor读取,则我们要用keytab文件在container中的相对路径,即./AS.keytab
如果为了方便起见,drvier与executor要使用相同的jaas文件,路径配置为./AS.keytab,我们需要将keytab文件copy到运行spark-submit的当前路径
如果driver和executor要使用不同的jaas文件,则driver的jaas文件中,keytab应为本地绝对路径,executor的jaas文件中,keytab应为相对路径./