问题再现:

  使用本机 Ecilpse  (Windows环境) 去访问远程 hadoop 集群出现以下异常:

  

问题原因:

  因为远程提交的情况下如果没有 hadoop 的系统环境变量,就会读取当前主机的用户名,所以 hadoop 集群的节点中没有该用户名的权限,所以出现的异常。

问题解决:

  a、如果是测试环境,可以取消 hadoop hdfs 的用户权限检查。打开 conf/hdfs-site.xml,找到 dfs.permissions 属性修改为 false(默认为true),然后配置分发到其它节点,然后重启集群。此法没有效果。

  b、修改 hadoop location 参数,在 advanced parameter 选项卡中,找到 hadoop.job.ugi 项,将此项改为启动 hadoop 的用户名即可。(注意第一次设置的时候可能没有 hadoop.job.ugi 参数,报错后再去看就有了),此法的参数没有找到!

  c、因为 Eclipse 使用 hadoop 插件提交作业时,会默认以 当前主机的用户名 的身份去将作业写入 HDFS 文件系统中,由于 当前主机的用户名 对 hadoop 目录并没有写入权限,所以导致异常的发生。

     解决方法为:放开 hadoop 目录的权限 ,命令如下 :$ hadoop fs -chmod 777 /   # 表示为整个根目录开放权限,不推荐此法!

  d、远程提交,如果没有 hadoop 的系统环境变量,就会读取当前主机的用户名,结果 hadoop 集群中没有该用户,所以就异常了。

     解决方法为:在远程 Linux 上将 export HADOOP_USER_NAME = bruce  添加到 ~/.bash_profile 中,然后生效该文件 $ source  ~/.bash_profile ,不推荐此法!

  e、执行 login.login 的时候调用了 hadoop 里面的 HadoopLoginModule 方法,而关键是在 commit 方法里面,在这里优先读取 HADOOP_USER_NAME 系统环境变量,然后是 java 环境变量 中的  HADOOP_USER_NAME ,如果再没有就从 NTUserPrincipal 等里面取。即 只要 在系统的环境变量里面添加 HADOOP_USER_NAME=xxx(xxx 是 HDFS 上的有权限的用户,具体看自己的情况),或者在当前 JDK 的变量参数里面添加 HADOOP_USER_NAME 这个 Java变 量。推荐此法!如下图:

  

  f、再代码中加入 System.setProperty("HADOOP_USER_NAME", "atguigu") ,此法没有测试过!

  g、或者设置 conf/hdfs-site.xml,此法没有测试过!

<property>
  <name>hadoop.security.authentication</name>
  <value>simple</value>
</property>

附录

  hadoop 的整个登录过程

login.login();
这个会调用 HadoopLoginModule 的 login() 和 commit()方法。
HadoopLoginModule 的 login() 方法是一个空函数,只打印了一行调试日志 LOG.debug("hadoop login");
commit() 方法负责把 Principal 添加到 Subject 中。
此时一个首要问题是 username 是什么?
在使用了 kerberos 的情况下,从 javax.security.auth.kerberos.KerberosPrincipal 的实例获取 username。
在未使用 kerberos 的情况下,优先读取 HADOOP_USER_NAME 这个系统环境变量,如果不为空,那么拿它作 username。否则,读取 HADOOP_USER_NAME 这个 java 环境变量。
否则,从 com.sun.security.auth.NTUserPrincipal 或者 com.sun.security.auth.UnixPrincipal 的实例获取 username。
如果以上尝试都失败,那么抛出异常 LoginException("Can’t find user name")。
最终拿 username 构造 org.apache.hadoop.security.User 的实例添加到 Subject 中。

参考

  https://blog.csdn.net/lunhuishizhe/article/details/50489849

  https://blog.csdn.net/wireless_com/article/details/51192713

最新文章

  1. .NET Core采用的全新配置系统[1]: 读取配置数据
  2. mobiscroll之treelist使用
  3. Android_server提示端口被占用
  4. 一张图看懂单机/集群/热备/磁盘阵列(RAID)
  5. Newtonsoft.Json动态过滤属性
  6. VMware简介
  7. Enum枚举类型的使用笔记
  8. java数组元素的输出
  9. Django Tutorial 学习笔记
  10. web服务构架
  11. django admin manytomany获取所选字段值
  12. Colorful(Folders星语多彩文件夹) v1.7绿色版
  13. VHD进阶:差分VHD备份系统
  14. 下载安装Git
  15. [Java Web学习]junit.framework.AssertionFailedError: No tests found in {Class}
  16. 【转载】理解本真的REST架构风格
  17. 主机性能监控之wmi 获取磁盘信息
  18. 【iCore4 双核心板_ARM】例程十五:USB_CDC实验——高速数据传输
  19. vue 创建单文件组件 注册组件 以及组件的使用
  20. 基于注解的接口限流+统一session认证

热门文章

  1. 因式分解 &#183; Factor Combinations
  2. [Selenium]Grid模式下运行时打印出当前Case在哪台node机器上运行
  3. java中double和float精度丢失问题
  4. 关于Safari浏览器使用的几点总结
  5. tp5和gateworer集成
  6. Linux 基础教程 28-nc命令
  7. 大数据项目中js中代码和java中代码(解决Tomcat打印日志中文乱码)
  8. 基于jCOM搭建Java-微软信息桥梁(下)
  9. HTML5 Canvas之猜数字游戏
  10. [leetcode] 8. Maximum Depth of Binary Tree