【分析思路】hadoop 3.3.1 bug修复:failed with status code 401 Response message: Authentication required

一. 问题概述

为了支持国产化,hadoop需要安装3.3.1版本,而客户这边需要安全认证,所以对于hadoop需要做的事是升级到3.3.1版本、支持HA模式、安全认证。本文关注hadoop升级和启动过程中出现的401权限问题。

具体地、安装hadoop3.3.1,当格式化完namenode准备同步元数据到另外一个nn节点时报错,即在另外一个namenode节点执行:

hdfs namenode -bootstrapStandby

报错:

...
ERROR [main] org.apache.hadoop.hdfs.server.namenode.NameNode: Failed to start namenode.
java.io.IOException: java.lang.RuntimeException: org.apache.hadoop.hdfs.server.common.HttpGetFailedException: Image transfer servlet at http://XXXXX/imagetransfer?ge
timage=1&txid=0&storageInfo=-65:271209174:1614287921618:CID-f21dbb8a-8660-4ef6-8045-f80daf067c38&bootstrapstandby=true failed with status code 401
Response message:
Authentication required
        at org.apache.hadoop.hdfs.server.namenode.ha.BootstrapStandby.run(BootstrapStandby.java:549)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1728)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1821)
Caused by: java.lang.RuntimeException: org.apache.hadoop.hdfs.server.common.HttpGetFailedException: Image transfer servlet at http://XXXXX/imagetransfer?getimage=1&t
xid=0&storageInfo=-65:271209174:1614287921618:CID-f21dbb8a-8660-4ef6-8045-f80daf067c38&bootstrapstandby=true failed with status code 401
Response message:
Authentication required
        at org.apache.hadoop.hdfs.server.namenode.ha.BootstrapStandby$1.run(BootstrapStandby.java:127)
        at org.apache.hadoop.hdfs.server.namenode.ha.BootstrapStandby$1.run(BootstrapStandby.java:121)
        at org.apache.hadoop.security.SecurityUtil.doAsLoginUserOrFatal(SecurityUtil.java:485)
        at org.apache.hadoop.hdfs.server.namenode.ha.BootstrapStandby.run(BootstrapStandby.java:121)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:90)
        at org.apache.hadoop.hdfs.server.namenode.ha.BootstrapStandby.run(BootstrapStandby.java:544)
        ... 2 more
...

log的基本信息就是:

通过http://XXXXX/imagetransfer?xxx 同步镜像到另外一个namenode时,报401权限错误。

这个问题我们也可以大概了解是因为设置了web console的simple认证,而通过的url没有添加 user.name=xxx 导致报401。

那既然这样,我们就不执行这个命令去同步元数据,直接SCP将数据拷贝到目标节点。

scp -P 36000 -r namenode/*   root@ip:/data/appData/hadoop/namenode/

启动两个namenode节点发现报错暂时消失。。。
 

然而问题很快就又出现了,我停掉namenode然后再启动,发现又报了如下错:
在这里插入图片描述

根据堆栈信息可以大概了解到,namenode启动时找journalnode去同步数据报权限的错误,类似的也是通过http请求去同步数据。。。
 
是官方的bug吗?!

此时可以猜测:hadoop升级到3.3.1后,有关web的请求都需要手动添加认证(user.name=xxx)!!! 直接访问web端还好,可以自己手动添加,但是hadoop内部通讯手动添加认证,实在是无能为力。。。

 
 

二. 解决思路

1. 理解hadoop web请求鉴权的逻辑,修改源码 ing

通过观察源码,大概了解到,当hadoop进行web请求时,hadoop会有一个filter进行拦截,然后进行鉴权的检查。
对于我们配置的simple认证,鉴权的方式如下:

public class PseudoAuthenticationHandler implements AuthenticationHandler {
。。。
  @Override
  public AuthenticationToken authenticate(HttpServletRequest request, HttpServletResponse response)
    throws IOException, AuthenticationException {
    AuthenticationToken token;
    String userName = getUserName(request);
    if (userName == null) {
      if (getAcceptAnonymous()) {
        token = AuthenticationToken.ANONYMOUS;
      } else {
        response.setStatus(HttpServletResponse.SC_FORBIDDEN);
        response.setHeader(WWW_AUTHENTICATE, PSEUDO_AUTH);
        token = null;
      }
    } else {
      token = new AuthenticationToken(userName, userName, getType());
    }
    return token;
  }

具体逻辑放到专门一篇来分析ing。

具体实现见,最新文章

【修改源码】修复hadoop 3.3.1 内部通讯权限问题:failed with status code 401 Response message: Authentication required

 

2. 放弃hadoop官方的安全认证,使用tegine代理

思路大概是:通过自定义端口,当访问此端口时,进行认证,认证通过后再跳转hadoop页面。而对于hadoop内部通讯,其实此时已经没有了认证。

具体实现见:
Hadoop Web 控制台安全认证——使用用户名 + 密码登陆设置方法 (Hadoop HTTP web-控制台认证 )

 

3. 通过Kerberos认证

大数据常用的认证方式,但自建比较麻烦。

目前做一套Kerberos的认证,需要将hadoop、zookeeper、flink 、kafka等组件都进行配置,而且有一些坑,虽然推荐,但是感觉费力不讨好,使得服务运维成本变高。

 

4. 降低版本到2.x

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据提供的引用内容,{"message":"鉴权失败,header异常","status":401}的问题可能是由于hadoop 3.3.1内部通讯权限问题导致的。具体的错误信息是"failed with status code 401 Response message: Authentication required"。 根据引用的内容,这个问题可能是因为设置了web console的simple认证,但请求的URL没有添加"user.name=xxx"参数导致的401错误。 引用中的源码解释了hadoop进行web请求时的鉴权方式。对于simple认证,会检查请求中是否包含userName。如果请求中没有userName,但允许匿名访问,则返回匿名访问的token;如果不允许匿名访问,则返回状态码403。如果请求中包含userName,则返回相应的认证token。 综上所述,{"message":"鉴权失败,header异常","status":401}的问题可能是由于hadoop的鉴权机制导致的,可能缺少必要的认证信息或认证参数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【分析思路hadoop 3.3.1 bug修复failed with status code 401 Response message: Authentication ...](https://blog.csdn.net/hiliang521/article/details/126709611)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

roman_日积跬步-终至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值