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

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

远程操作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 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    86 引用 • 122 回帖 • 625 关注

相关帖子

欢迎来到这里!

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

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

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

  • someone

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

  • someone

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

推荐标签 标签

  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 94 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 351 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 376 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖 • 1 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    287 引用 • 4484 回帖 • 669 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 327 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 764 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    169 引用 • 506 回帖
  • SOHO

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

    7 引用 • 55 回帖 • 19 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 664 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 26 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖 • 2 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1705 回帖 • 1 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    4 引用 • 16 回帖 • 5 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 173 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1348 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    729 引用 • 1327 回帖
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 22 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 585 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    690 引用 • 535 回帖
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 700 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 483 关注