Dataproc提交PySpark作业使用节点本地keytab访问Kerberos Kafka失败
问题根因
认证失败本质是Dataproc+YARN的两个隐式运行逻辑导致的,和Krb5LoginModule的路径解析规则无关:
- 第一是文件权限不匹配:提前部署在节点本地的keytab、票据缓存文件默认属于部署运维账号,权限通常为
600仅属主可读,但Spark Driver/Executor运行在YARN容器中时,使用的是Dataproc默认的yarn用户,没有权限读取这些受保护的凭证文件。Krb5LoginModule读取凭证时遇到权限错误不会直接抛出文件不可读的明确异常,会直接跳过当前凭证来源,按优先级降级到下一种认证方式,最终降级到交互式密码输入环节,在非交互的作业环境下就抛出你看到的密码提示错误。 - 第二是路径解析规则不匹配:Krb5LoginModule本身只识别裸的本地文件系统绝对路径,尝试加的
file://、local://这类URI前缀会被模块当成非法路径直接解析失败;同时使用票据缓存模式时,YARN容器启动时会默认重置KRB5CCNAME环境变量,覆盖jaas中配置的自定义缓存路径,导致票据缓存检索失败。
之前用--files从提交端上传文件的方案能跑通,核心原因是YARN会自动将上传的文件分发到每个容器的私有工作目录,并且自动设置为容器运行用户可读,不存在权限和路径解析问题。
生产环境可行方案
以下方案均不需要在提交端存储keytab文件,完全适配生产部署要求,按落地复杂度从低到高排序:
方案1:提交时直接引用集群本地预置文件(落地最快,无侵入)
提交作业时在--files参数中使用file:///前缀引用集群节点本地的预置文件,YARN会直接从各节点的对应路径拉取文件到容器工作目录,自动配置正确的可读权限,不需要修改任何现有文件的权限或部署配置,jaas配置和之前验证通过的版本完全一致即可。
提交命令示例:
gcloud dataproc jobs submit pyspark \ --cluster MY-CLUSTER --region us-west1 --project MY_PROJECT \ --files file:///path/to/keytab/my_keytab_file.keytab,file:///path/to/keytab/my_jaas_file.conf \ --properties spark.driver.extraJavaOptions=-Djava.security.auth.login.config=my_jaas_file.conf,spark.executor.extraJavaOptions=-Djava.security.auth.login.config=my_jaas_file.conf \ gs://CODE_BUCKET/path/to/python/main.py
对应的jaas配置不需要写绝对路径,直接引用文件名即可:
KafkaClient { com.sun.security.auth.module.Krb5LoginModule required debug=true useKeyTab=true storeKey=true serviceName="kafka" keyTab="my_keytab_file.keytab" principal="principal@MY.COMPANY.COM"; };
注意:该方案要求所有Master、Worker节点的预置文件路径完全一致。
方案2:给YARN运行用户加凭证读权限(长期维护成本最低)
如果不想每次提交作业都在--files中指定本地路径,可以直接给节点上预置的凭证文件加YARN用户的读权限,推荐用ACL实现,避免修改文件原有属主影响常驻票据更新服务:
- 所有集群节点执行以下命令配置ACL:
# 给yarn用户添加keytab和票据缓存的读权限 setfacl -m u:yarn:r /path/to/keytab/my_keytab_file.keytab setfacl -m u:yarn:r /path/to/keytab/krb5_ccache
- jaas配置中直接写裸绝对路径,不要加任何URI前缀,同时补充
storeKey=true参数保证凭证持久化:
KafkaClient { com.sun.security.auth.module.Krb5LoginModule required debug=true useKeyTab=true storeKey=true serviceName="kafka" keyTab="/path/to/keytab/my_keytab_file.keytab" principal="principal@MY.COMPANY.COM"; };
如果使用票据缓存模式,提交作业时需要额外指定环境变量覆盖YARN默认的KRB5配置:
gcloud dataproc jobs submit pyspark \ --cluster MY-CLUSTER --region us-west1 --project MY_PROJECT \ --properties spark.driver.extraJavaOptions=-Djava.security.auth.login.config=/path/to/keytab/my_jaas_file.config,spark.executor.extraJavaOptions=-Djava.security.auth.login.config=/path/to/keytab/my_jaas_file.config,spark.executor.env.KRB5CCNAME=/path/to/keytab/krb5_ccache,spark.yarn.appMasterEnv.KRB5CCNAME=/path/to/keytab/krb5_ccache \ gs://CODE_BUCKET/path/to/python/main.py
方案3:集群初始化时预置凭证到公共可读目录
如果是新部署集群,可以在集群创建时通过初始化动作脚本,将keytab和jaas配置文件统一拷贝到Hadoop公共库目录/usr/lib/hadoop/lib/下,该目录默认对所有YARN容器用户可读,后续所有作业直接引用该路径下的jaas配置即可,不需要额外加权限或在提交时指定文件分发。
内容的提问来源于stack exchange,提问作者Trandafir Stefan
相关产品推荐
相关产品推荐

