You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置错误导致无法启动安全模式DataNode,寻求解决方法

Hadoop安全模式下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 07:40:26