远程操作 hdfs 提示用户权限不足问题解决

本贴最后更新于 2458 天前,其中的信息可能已经物是人非

远程操作hdfs提示用户权限不足问题解决

最近在做的项目需要远程操作HDFS文件系统上面的文件,大家应该知道HDFS上的文件是有所属用户和组的,每个用户有与之对应的权限;

当你是用你本机的用户远程操作HDFS的话,可能会出现以下错误

1539757287560

查询许久之后,发现只需要在你远程操作前增加以下一句代码即可操作成功

System.setProperty("HADOOP_USER_NAME", user);

user是你所操作文件的用户

此时,就可以远程操作HDFS了.

可是,不久以后又一个新的问题冒出来了.因为项目所使用的集群有两种,一种是vanilla插件生成的用户为hadoop的集群,一种是Ambari插件生成用户为hdfs的集群.

当你远程操作完一种集群以后,需要再次向另一种集群发起请求的时候,以上的错误又出现了

1539758142374

我开始也是百思不得其解,明明每次操作之前,我都会根据集群类型的不同修改用户的呀,为什么还会出现以上错误.

后来在几经波折之下,终于找出了问题所在

通过追踪源码发现,用户获取模块是在UserGroupInformation类中获取的,部分代码如下:

Principal user = null; // if we are using kerberos, try it out if (isAuthenticationMethodEnabled(AuthenticationMethod.KERBEROS)) { user = getCanonicalUser(KerberosPrincipal.class); if (LOG.isDebugEnabled()) { LOG.debug("using kerberos user:"+user); } } //If we don't have a kerberos user and security is disabled, check //if user is specified in the environment or properties if (!isSecurityEnabled() && (user == null)) { String envUser = System.getenv(HADOOP_USER_NAME); if (envUser == null) { envUser = System.getProperty(HADOOP_USER_NAME); } user = envUser == null ? null : new User(envUser); } // use the OS user if (user == null) { user = getCanonicalUser(OS_PRINCIPAL_CLASS); if (LOG.isDebugEnabled()) { LOG.debug("using local user:"+user); } } // if we found the user, add our principal if (user != null) { subject.getPrincipals().add(new User(user.getName())); return true; } LOG.error("Can't find user in " + subject); throw new LoginException("Can't find user name");

从上面代码片段可以知道,Hadoop先判断集群是否启用了Kerberos授权.如果是,则直接从配置中获取用户(可以为空);

如果不是,则往下走.所以如果没有启用安全认证或者从Kerberos获取的用户为null,那么获取HADOOP_USER_NAME系统环境变量,如果获取到的系统环境变量为空,那么将会获取java环境变量,并将它的值作为Hadoop执行用户.

如果我们没有设置HADOOP_USER_NAME环境变量,那么程序将调用whoami来获取当前用户,并用groups来获取用户所在组.

所以,之前通过设置System.setProperty("HADOOP_USER_NAME", user); 设置java环境变量就可操作hdfs了.

可是后来换了集群用户以后通过设置java环境变量就不能修改了

1539763416140

通过上图,不难发现原因. 源码中加了一个判断 user==null,当第一次获取java环境变量以后,user已经有值了,所以不会再次重新获取.

出现了这个问题,确实挺让人头疼的. 我需要这么做才能让它重新设置用户呢?

修改源码吗? 我这种菜鸟怎么敢修改源码呢

 

后来发现,在获取HDFS文件系统的时候,有一个方法我没有注意到,也是一个解决我上面出现问题的最重要的方法.

//返回默认文件系统,core-site.xml中指定的,如果没有指定,则默认本地文件系统 public static FileSystem get(Configuration conf) throws IOException public static FileSystem newInstance(Configuration conf) throws IOException //通过给定 URI 方案和权限来确定要使用的文件系统,若 URI 中未指定方案,返回默认文件系统 public static FileSystem get(URI uri, Configuration conf) throws IOException public static FileSystem newInstance(URI uri, Configuration conf) throws IOException //作为给定用户来访问文件系统,对安全来说很重要 public static FileSystem get(final URI uri, final Configuration conf, final String user) throws IOException, InterruptedException public static FileSystem newInstance(final URI uri, final Configuration conf, final String user) throws IOException, InterruptedException

在获取FileSystem 的时候是可以设置用户的user的,好吧! 我承认我又傻逼了一次,这不是第一次.也不是最后一次 ~~

  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    93 引用 • 122 回帖 • 616 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone

    博主很有学识,讲的通俗易懂,解决和我很久没有解决的问题,给你个大赞!!!

  • someone

    使用 ambari 集群会遇到这样的问题,亲测可行:微笑:

  • someone

    这篇文章正好解决了一直的问题,博主谢谢啦😜

推荐标签 标签

  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 734 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    17 引用 • 7 回帖 • 2 关注
  • 叶归
    12 引用 • 56 回帖 • 23 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 42 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 828 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 53 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    76 引用 • 258 回帖 • 625 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 16 关注
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    37 引用 • 157 回帖
  • Follow
    4 引用 • 12 回帖 • 4 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    167 引用 • 408 回帖 • 487 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    85 引用 • 324 回帖
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    54 引用 • 37 回帖
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 26 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 2 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 642 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 469 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 2 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 153 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 67 回帖 • 446 关注
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    199 引用 • 1421 回帖 • 2 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    100 引用 • 905 回帖
  • Anytype
    3 引用 • 31 回帖 • 28 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    115 引用 • 319 回帖 • 1 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    12 引用 • 59 回帖
  • Outlook
    1 引用 • 5 回帖 • 2 关注
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1444 引用 • 10083 回帖 • 506 关注