V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ylxb23
V2EX  ›  问与答

java 开发,测试 hdfs 时报错: java.io.IOException: HADOOP_HOME or hadoop.home.dir are not set.

  •  
  •   ylxb23 · 2016-03-27 22:20:05 +08:00 · 12705 次点击
    这是一个创建于 2959 天前的主题,其中的信息可能已经有所发展或是发生改变。

    具体:

    java.io.IOException: HADOOP_HOME or hadoop.home.dir are not set.
    	at org.apache.hadoop.util.Shell.checkHadoopHome(Shell.java:302)
    	at org.apache.hadoop.util.Shell.<clinit>(Shell.java:327)
    	at org.apache.hadoop.util.StringUtils.<clinit>(StringUtils.java:79)
    	at org.apache.hadoop.security.Groups.parseStaticMapping(Groups.java:104)
    	at org.apache.hadoop.security.Groups.<init>(Groups.java:86)
    	at org.apache.hadoop.security.Groups.<init>(Groups.java:66)
    	at org.apache.hadoop.security.Groups.getUserToGroupsMappingService(Groups.java:280)
    	at org.apache.hadoop.security.UserGroupInformation.initialize(UserGroupInformation.java:271)
    	at org.apache.hadoop.security.UserGroupInformation.ensureInitialized(UserGroupInformation.java:248)
    	at org.apache.hadoop.security.UserGroupInformation.loginUserFromSubject(UserGroupInformation.java:763)
    	at org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:748)
    	at org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:621)
    	at org.apache.hadoop.fs.FileSystem$Cache$Key.<init>(FileSystem.java:2753)
    	at org.apache.hadoop.fs.FileSystem$Cache$Key.<init>(FileSystem.java:2745)
    	at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2611)
    	at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:370)
    	at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:169)
    	at edu.mypackage.HDFSFileSystemFactory.getMyDefaultHdfs(HDFSFileSystemFactory.java:27)
    	at edu.mypackage.Test.main(Main.java:22)
    

    获取 FileSystem 时指定了:

    conf.set("fs.default.name", "hdfs://192.168.1.200:9000");  // “ hdfs://192.168.1.200:9000 ” 是 hdfs master 地址 
    conf.set("hadoop.tmp.dir", "/home/hadoop/tmp");
    

    因为 hdfs 的 master 机器不是本机,所以在本机上并没有添加 %HADOOP_HOME% 这个变量,也没有 hadoop.home.dir ,但是在初始化 FileSystem 的时候,在 conf 中给了 hadoop.home.dir 的配置。但还是报以上错误了。

    已经尝试了:

    1 、 java 中添加 System.setProperty("hadoop.home.dir", "/usr/local/etc/hadoop"); // "/usr/local/etc/hadoop" 是 hadoop 的 home 目录。运行结果不出所料是说本地没有 hadoop 的相关 binary 文件 2 、在本机添加 HADOOP_HOME 环境变量,毫无疑问,没用

    注: master主机上也已经有 HADOOP_HOME这个变量了。 已经是可以访问 dfs ,且能成功创建文件等,但就是有以上的报错信息。我想请问一下这个报错怎么去除。

    3 条回复    2016-04-04 23:08:57 +08:00
    ylxb23
        1
    ylxb23  
    OP
       2016-03-27 22:27:34 +08:00
    ok , 已明了 =_=
    nicktogo
        2
    nicktogo  
       2016-03-28 00:30:03 +08:00 via Android
    楼主可以分享下解决方案
    ylxb23
        3
    ylxb23  
    OP
       2016-04-04 23:08:57 +08:00
    @nicktogo 其实也并不是真正的解决了这个问题,主要是跟踪了一下异常,明白了一个问题。这里的 Exception 在“ at org.apache.hadoop.util.Shell.checkHadoopHome(Shell.java:302)”这里可以看出,获取的 HADOOP_HOME 是从本地的环境中获取的,也就是“ System.getProperty("hadoop.home.dir");”,但很明显,我们的 hadoop 环境并不是在本机,所以访问不到。同时我开的是 DEBUG 模式,也就是这个异常并不是真正意义上的异常(参考: http://mail-archives.apache.org/mod_mbox/flink-user/201509.mbox/%3CCAGr9p8CRW-av0-d4ZJJy+=cP7GCHoGvivwjFdKv=uBctbGUOYg@mail.gmail.com%3E )。

    不过既然有问题,还是有真正的解决办法的。既然是在本地调试不能访问 HADOOP_HOME 环境变量,那就开启远程调试吧,这样应该就能解决这种调试的报错了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2315 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:50 · PVG 18:50 · LAX 03:50 · JFK 06:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.