Hadoop 3.3.x开启Simple认证后NameNode启动及接口访问401问题
解决Hadoop 3.3.x开启Simple认证后的401认证失败问题
问题核心
配置Simple认证并关闭匿名访问后,Namenode与JournalNode、Standby Namenode之间的内部HTTP调用(如getJournal、imageTransfer端点)返回401错误,curl携带user.name参数访问JMX端点也失败;开启匿名访问则一切正常。
解决方案
1. 统一所有节点的core-site.xml配置
在所有集群节点(Namenode、JournalNode、Datanode等)的core-site.xml中补充完整认证配置,确保规则一致:
<!-- 已配置的Simple认证基础参数 --> <property> <name>hadoop.http.authentication.type</name> <value>simple</value> </property> <property> <name>hadoop.http.authentication.simple.anonymous.allowed</name> <value>false</value> </property> <property> <name>hadoop.http.filter.initializers</name> <value>org.apache.hadoop.security.AuthenticationFilterInitializer</value> </property> <!-- 新增:指定允许通过认证的服务用户 --> <property> <name>hadoop.http.authentication.simple.allowed.users</name> <value>hdfs,yarn,mapred</value> </property>
该参数需包含集群核心服务的运行用户(如hdfs是Namenode、JournalNode的默认运行用户),多个用户用逗号分隔。
2. 确保服务进程以合法用户启动
所有Hadoop服务必须以hadoop.http.authentication.simple.allowed.users中指定的用户运行:
- 切换到合法用户(如
hdfs):su - hdfs - 执行服务启动命令,示例:
hdfs namenode -format hdfs namenode hdfs journalnode
3. 修正curl访问的参数格式
Simple认证下,user.name需作为URL参数传递,正确的curl命令格式:
curl -s "http://localhost:9870/jmx?qry=Hadoop:service=NameNode,name=NameNodeStatus&user.name=hdfs"
注意user.name参数需与其他参数用&分隔,放在URL参数列表中。
4. 规范Standby Namenode的bootstrap操作
执行bootstrapStandby命令时,必须以hdfs用户运行,确保内部HTTP请求携带合法身份:
su - hdfs hdfs namenode -bootstrapStandby
5. 验证JournalNode配置一致性
确认所有JournalNode的core-site.xml与Namenode完全一致,避免因配置差异导致跨节点访问认证失败。
问题原因
关闭匿名访问后,Hadoop HTTP服务会拦截未携带合法用户身份的请求。默认情况下,内部服务调用依赖进程运行的用户身份生成认证信息,若未配置允许的用户列表,或服务以非法用户启动,会导致内部请求被拒绝,返回401错误。
内容的提问来源于stack exchange,提问作者Abhishek Karigar
相关产品推荐
相关产品推荐

