集群模式运行Spark作业时Kafka JAAS配置文件找不到求助
核心问题分析
报错显示找不到HDFS路径的JAAS文件,原因是Cluster模式下,JVM的java.security.auth.login.config参数不能直接指向HDFS路径,必须指向本地文件;同时你的配置里存在重复的JAAS参数设置,导致覆盖了正确的配置。
具体解决步骤
删除重复的JAAS配置项:
你的spark-submit命令里,--driver-java-options中重复设置了-Djava.security.auth.login.config="$PATH_KAFKA_CLIENT_JAAS_CONF",这会覆盖spark.driver.extraJavaOptions里的正确配置(指向本地文件名),导致Driver尝试读取HDFS路径的文件,而本地不存在。直接去掉这一行即可。确认
--files参数的正确性:
确保$PATH_KAFKA_CLIENT_JAAS_CONF是HDFS的完整路径(比如hdfs://dev3hdp/opt/wmb/kafka/conf/kafka_client_jaas.conf),并且文件确实存在。可以用以下命令验证:hdfs dfs -ls $PATH_KAFKA_CLIENT_JAAS_CONF保证JAAS参数指向本地文件名:
spark.driver.extraJavaOptions和spark.executor.extraJavaOptions中的$KAFKA_CLIENT_JAAS_CONF_FILENAME必须是JAAS文件的纯文件名(比如kafka_client_jaas.conf),因为Spark通过--files上传后,会将文件放到Driver和Executor的当前工作目录,直接用文件名即可访问。检查HDFS文件权限:
确保Spark作业的执行用户对HDFS上的JAAS文件有读权限,权限不足会导致无法下载文件到本地。可以用以下命令修改权限:hdfs dfs -chmod 644 $PATH_KAFKA_CLIENT_JAAS_CONF
修正后的spark-submit关键片段示例
spark-submit \ --master yarn \ --name my_job \ --class org.my.main.class \ --deploy-mode cluster \ --queue $QUEUE \ --jars $KAFKA_JARS \ --files $PATH_KAFKA_CLIENT_JAAS_CONF,$KEY_PATH \ --driver-memory 6g \ --executor-memory 4g \ --executor-cores 2 \ --num-executors 2 \ --conf "spark.driver.extraJavaOptions=-Djava.security.auth.login.config="$KAFKA_CLIENT_JAAS_CONF_FILENAME \ --conf "spark.executor.extraJavaOptions=-Djava.security.auth.login.config="$KAFKA_CLIENT_JAAS_CONF_FILENAME \ --conf spark.hadoop.hive.llap.daemon.service.hosts="@llap0" \ --conf spark.sql.hive.hiveserver2.jdbc.url=$HIVESERVER2_INTERACTIVE_JDBC_URL \ --conf spark.datasource.hive.warehouse.metastoreUri=$METASTORE_URI \ --conf spark.datasource.hive.warehouse.load.staging.dir="/tmp" \ --conf spark.hadoop.hive.zookeeper.quorum=$ZOOKEEPER_SERVER \ --driver-java-options "\ -Dkafka.bootstrap.servers=\"$KAFKA_BOOTSTRAP_SERVER_EXTERNAL\" \ -Dkafka.topic=\"$KAFKA_TOPIC_NAME\" \ -Dspark.executor.instances=$SPARK_INSTANCE \ "
内容的提问来源于stack exchange,提问作者coolguy2021

