配置错误导致无法启动安全模式DataNode,寻求解决方法
前置配置说明
所有服务主体已创建对应keytab,域为HADOOP.COM,主机名server.hadoop.com。已完成SSH密钥配置(公钥写入authorized_keys并设置chmod 600权限),安装Unlimited JCE Extensions以支持AES-256加密,计划通过JSVC以root身份运行DataNode,但DataNode无法在安全模式下启动,以下是排查与修复步骤:
当前配置文件
core-site.xml
<property> <name>fs.default.name</name> <value>hdfs://localhost:9000</value> </property> <property> <name>hadoop.security.authentication</name> <value>kerberos</value> </property> <property> <name>hadoop.security.authorization</name> <value>true</value> </property> <property> <name>hadoop.rpc.protection</name> <value>privacy</value> </property>
hdfs-site.xml
<property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.name.dir</name> <value>/home/hdoop/hadoopdata/hdfs/namenode</value> </property> <property> <name>dfs.data.dir</name> <value>/home/hdoop/hadoopdata/hdfs/datanode</value> </property> <!-- General HDFS security config --> <property> <name>dfs.block.access.token.enable</name> <value>true</value> </property> <!-- NameNode security config --> <property> <name>dfs.https.address</name> <value>server.hadoop.com:50470</value> </property> <property> <name>dfs.https.port</name> <value>50470</value> </property> <property> <name>dfs.namenode.keytab.file</name> <value>/etc/security/keytabs/hdfs.service.keytab</value> <!-- path to the HDFS keytab --> </property> <property> <name>dfs.namenode.kerberos.principal</name> <value>hdfs/server.hadoop.com@HADOOP.COM</value> </property> <property> <name>dfs.namenode.kerberos.internal.spnego.principal</name> <value>HTTP/server.hadoop.com@HADOOP.COM</value> </property> <!-- secondaryNameNode security config --> <property> <name>dfs.secondary.namenode.keytab.file</name> <value>/etc/security/keytabs/hdfs.service.keytab</value> </property> <property> <name>dfs.secondary.namenode.kerberos.principal</name> <value>hdfs/server.hadoop.com@HADOOP.COM</value> </property> <property> <name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name> <value>HTTP/server.hadoop.com@HADOOP.COM</value> </property> <!-- DataNode security config --> <property> <name>dfs.datanode.data.dir.perm</name> <value>750</value> </property> <property> <name>dfs.datanode.address</name> <value>0.0.0.0:1004</value> </property> <property> <name>dfs.datanode.http.address</name> <value>0.0.0.0:1006</value> </property> <property> <name>dfs.datanode.keytab.file</name> <value>/etc/security/keytabs/dn.service.keytab</value> <!-- path to the HDFS keytab --> </property> <property> <name>dfs.datanode.kerberos.principal</name> <value>dn/admin@HADOOP.COM</value> </property> <property> <name>dfs.web.authentication.kerberos.principal</name> <value>HTTP/server.hadoop.com@HADOOP.COM</value> </property> <property> <name>dfs.web.authentication.kerberos.keytab</name> <value>/etc/security/keytabs/http.service.keytab</value> </property>
hadoop-env.sh
# Set Hadoop-specific environment variables here. export HDFS_NAMENODE_USER=hdoop export HDFS_DATANODE_USER=hdoop export HDFS_SECONDARYNAMENODE_USER=hdoop export HADOOP_OS_TYPE=${HADOOP_OS_TYPE:-$(uname -s)} export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 export HADOOP_OS_TYPE=${HADOOP_OS_TYPE:-$(uname -s)} export JSVC_HOME=/home/hdoop #here I have my commons-daemon-1.3.1-src
排查与修复步骤
1. 修正DataNode Kerberos主体格式
当前dfs.datanode.kerberos.principal配置为dn/admin@HADOOP.COM,不符合Hadoop服务主体标准格式(服务名/主机名@REALM),修改为:
<property> <name>dfs.datanode.kerberos.principal</name> <value>dn/server.hadoop.com@HADOOP.COM</value> </property>
同时验证keytab文件是否包含该主体:
klist -kt /etc/security/keytabs/dn.service.keytab
确保输出中存在dn/server.hadoop.com@HADOOP.COM条目。
2. 修复Keytab文件权限
Keytab文件必须仅允许运行DataNode的用户(hdoop)读写,执行以下命令:
chown hdoop:hdoop /etc/security/keytabs/dn.service.keytab chmod 400 /etc/security/keytabs/dn.service.keytab
3. 修正NameNode地址配置
安全模式下DataNode需通过主机名访问NameNode(Kerberos验证依赖主机名),修改core-site.xml中的fs.default.name:
<property> <name>fs.default.name</name> <value>hdfs://server.hadoop.com:9000</value> </property>
同时检查/etc/hosts确保server.hadoop.com能正确解析到对应IP。
4. 配置JSVC运行参数
在hadoop-env.sh中添加以下参数,确保以root启动并切换到hdoop用户运行:
export HDFS_DATANODE_SECURE_USER=root export HDFS_DATANODE_OPTS="-jvm server -user hdoop"
确认JSVC_HOME路径下存在编译好的jsvc二进制文件。
5. 验证Kerberos票据获取
尝试用DataNode的keytab获取票据,验证认证是否正常:
kinit -kt /etc/security/keytabs/dn.service.keytab dn/server.hadoop.com@HADOOP.COM klist
若获取失败,检查KDC服务状态、主体是否在KDC中注册。
6. 查看DataNode日志定位问题
查看DataNode日志(默认路径$HADOOP_HOME/logs/hadoop-hdoop-datanode-server.hadoop.com.log),根据错误信息进一步排查,常见问题包括Kerberos认证失败、权限不足、端口占用等。
内容的提问来源于stack exchange,提问作者Ayoub Ba-haddou

