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

2016-03-27 22:20:05 +08:00
 ylxb23

具体:

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 ,且能成功创建文件等,但就是有以上的报错信息。我想请问一下这个报错怎么去除。

12722 次点击
所在节点    问与答
3 条回复
ylxb23
2016-03-27 22:27:34 +08:00
ok , 已明了 =_=
nicktogo
2016-03-28 00:30:03 +08:00
楼主可以分享下解决方案
ylxb23
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 环境变量,那就开启远程调试吧,这样应该就能解决这种调试的报错了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/266714

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX