0445-如何为Spark应用启用Kerberos的Debug日志

本文档详细介绍了在CDH集群中,当Kerberos认证问题导致Spark作业失败时,如何启用Kerberos的Debug日志进行调试。内容包括设置`sun.security.krb5.debug=true`参数,配置Spark Driver和Executor的日志,以及调整Spark Gateway的日志配置,确保Debug日志被记录以便分析。

温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
Fayson的github:
https://github.com/fayson/cdhproject
提示:代码块部分可以左右滑动查看噢

1

文档编写目的

在CDH集群启用了Kerberos后,在执行Spark作业时难免会遇到由于Kerberos认证问题导致作业运行失败的时候,那我们需要针对Spark作业进行调试,通过一些Debug日志查看认证失败的原因。本篇文章Fayson主要介绍如何为Spark的Driver和Executor的JVM启用Kerberos的Debug日志。

  • 内容概述

1.启用Kerberos的Debug日志

2.示例运行

3.总结

  • 测试环境

1.CM和CDH版本为5.15

2

启用Kerberos的Debug日志

Spark的运行环境Java环境,在为Spark的Driver和Executor启用Kerberos的Debug日志时,可以通过配置通用的Java属性“sun.security.krb5.debug=true”。可以在Java的运行命令中增加参数“-D sun.security.krb5.debug=true”,在运行时启用该属性。

对于Spark,需要在Spark的属性中将这些Java命令行属性分别传递给Driver和Executor对应的JVM,方式如下;

1.Spark Driver启用Kerberos的Debug日志,添加如下参数

spark.driver.extraJavaOptions
<think>我们正在处理Hadoop读取文件时出现的"Available token kerberos"错误。这个错误通常发生在Kerberos认证环境中,表明客户端尝试使用Kerberos认证,但认证过程出现问题。根据引用[1]和引用[2],我们可以知道Kerberos认证在Hadoop中的重要性以及可能遇到的问题。 错误分析: 错误信息"Available token kerberos"通常意味着客户端在尝试使用Kerberos票据进行认证,但是认证失败。可能的原因包括: 1. Kerberos票据不存在(例如,未使用kinit命令获取票据) 2. 票据已过期 3. 配置文件中关于Kerberos的配置不正确 4. 客户端与KDC(密钥分发中心)之间的通信问题 5. keytab文件问题(如果使用keytab认证) 解决步骤: 1. **检查Kerberos票据状态** 使用命令`klist`查看当前票据是否有效。如果票据不存在或已过期,需要重新获取。 - 使用用户名/密码获取:`kinit <username>` - 使用keytab文件获取:`kinit -kt <keytab_file> <principal>` 2. **确认Hadoop配置** 根据引用[3]中关于core-site.xml的配置,确保以下Kerberos相关配置正确: - `hadoop.security.authentication`设置为`kerberos` - `hadoop.security.authorization`设置为`true` 同时,检查hdfs-site.xml中与Kerberos相关的配置,如: - `dfs.namenode.kerberos.principal` - `dfs.datanode.kerberos.principal` 3. **检查服务主体和keytab文件** 确保Hadoop服务(如NameNode, DataNode)已经使用正确的keytab文件启动,并且这些文件在正确的位置,并且有正确的权限(通常为400)。 4. **检查客户端配置** 在客户端代码中,确保正确设置了Kerberos认证。例如,在Java代码中,需要设置: ```java Configuration conf = new Configuration(); conf.set("hadoop.security.authentication", "kerberos"); UserGroupInformation.setConfiguration(conf); UserGroupInformation.loginUserFromKeytab(principal, keytabFile); ``` 5. **检查网络连通性** 确保客户端可以访问KDC服务器(通常通过TCP/UDP端口88)。可以使用`telnet <KDC_HOST> 88`来测试连通性。 6. **查看日志** 检查Hadoop服务的日志(特别是NameNode和DataNode的日志)以及客户端的日志,寻找更详细的错误信息。 7. **时间同步** Kerberos要求所有节点的时间必须同步(通常时间差不超过5分钟)。使用`ntpdate`命令同步时间。 8. **使用调试模式** 在客户端启用Kerberos调试模式,可以设置环境变量: ```bash export KRB5_TRACE=/dev/stderr ``` 或者在Java代码中设置系统属性: ```java System.setProperty("sun.security.krb5.debug", "true"); ``` 9. **检查keytab文件是否可用** 使用keytab文件获取票据,测试keytab文件是否有效: ```bash kinit -kt <keytab_file> <principal> ``` 10. **检查Kerberos领域配置** 确保`/etc/krb5.conf`文件中的领域配置正确,特别是领域名称、KDC和admin_server的地址。 如果以上步骤都检查无误,通常可以解决该问题。 代码示例(Java客户端使用Kerberos认证): 以下是一个使用keytab文件进行Kerberos认证的Java代码片段: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.security.UserGroupInformation; public class HdfsKerberosExample { public static void main(String[] args) { String hdfsUri = "hdfs://namenode:8020"; String principal = "user@REALM"; String keytabPath = "/path/to/user.keytab"; Configuration conf = new Configuration(); conf.set("fs.defaultFS", hdfsUri); conf.set("hadoop.security.authentication", "kerberos"); try { UserGroupInformation.setConfiguration(conf); UserGroupInformation.loginUserFromKeytab(principal, keytabPath); FileSystem fs = FileSystem.get(conf); // 使用fs进行操作... fs.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 注意:在运行代码之前,确保keytab文件在指定路径,并且principal正确。 如果问题仍然存在,请提供更详细的错误日志以便进一步分析。 §§相关问题§§ 1. 如何为Hadoop集群配置Kerberos认证? 2. 如何更新Kerberos票据的过期时间? 3. Hadoop Kerberos认证中常见错误有哪些?</think>### Hadoop读取文件报错"Available token kerberos"的解决方法 这个错误通常发生在Kerberos认证环境中,表明Hadoop客户端尝试使用Kerberos认证但未找到有效凭据。以下是完整的解决步骤: #### 1. **验证Kerberos票据状态** ```bash klist -e ``` - ✅ 检查票据是否有效(过期时间) - ❌ 若无票据或已过期:`kinit -kt <keytab_path> <principal>` - 确保主体(principal)与Hadoop服务端配置匹配[^1] #### 2. **检查Hadoop安全配置** 在`core-site.xml`中确认: ```xml <property> <name>hadoop.security.authentication</name> <value>kerberos</value> <!-- 必须为kerberos --> </property> <property> <name>hadoop.security.authorization</name> <value>true</value> </property> ``` 配置错误是常见原因[^3] #### 3. **客户端代码认证处理** Java代码中必须显式登录: ```java // 关键配置 Configuration conf = new Configuration(); conf.set("hadoop.security.authentication", "kerberos"); // 必须执行Kerberos登录 UserGroupInformation.setConfiguration(conf); UserGroupInformation.loginUserFromKeytab( "your_principal@REALM", // 完整主体名 "/path/to/keytab.file" // keytab路径 ); // 然后获取文件系统 FileSystem fs = FileSystem.get(conf); ``` #### 4. **Keytab文件验证** - 检查keytab文件是否存在且可读 - 验证主体匹配性: ```bash klist -ket /path/to/keytab.file ``` - Spark场景需确认文件已上传: ```scala if (SparkFiles.get("xxx.keytab") == null) { throw new RuntimeException("keytab未上传!") } ``` 通过`spark-submit --files`或`sparkContext.addFile()`上传[^2] #### 5. **Kerberos领域配置** 检查`/etc/krb5.conf`: ```ini [realms] YOUR_REALM = { kdc = kdc-server.yourdomain.com admin_server = kdc-admin.yourdomain.com } ``` 确保域名解析正常 #### 6. **时间同步验证** ```bash ntpdate -q time.server ``` 所有节点时间偏差需 **≤5分钟**,否则认证失败 #### 7. **调试日志分析** 启用Kerberos调试: ```java System.setProperty("sun.security.krb5.debug", "true"); ``` 在日志中搜索: - `KRBError` - KDC返回的错误详情 - `TGT expiration` - 票据过期时间 #### 8. **服务端配置检查** 确认HDFS服务端: ```xml <!-- hdfs-site.xml --> <property> <name>dfs.namenode.kerberos.principal</name> <value>hdfs/_HOST@REALM</value> </property> <property> <name>dfs.datanode.kerberos.principal</name> <value>hdfs/_HOST@REALM</value> </property> ``` 主体格式必须正确[^1] ### 常见解决路径 ```mermaid graph TD A[出现错误] --> B{票据有效?} B -->|否| C[kinit获取新票据] B -->|是| D{配置正确?} D -->|否| E[修正core-site.xml] D -->|是| F{Keytab可访问?} F -->|否| G[重新部署keytab] F -->|是| H[检查时间同步] H --> I[分析Kerberos日志] ``` ### 典型错误场景 1. **票据过期** `kinit`后立即重试操作 2. **主体不匹配** 客户端主体需与服务器白名单匹配: ```xml <property> <name>hadoop.proxyuser.{client_user}.groups</name> <value>*</value> </property> ``` 3. **跨域问题** 多领域环境中配置领域信任: ```ini [domain_realm] .domain1.com = REALM1 .domain2.com = REALM2 ``` > **关键提示**:生产环境中,建议使用`jaas.conf`文件配置Kerberos,通过`-Djava.security.auth.login.config`参数指定[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值