Doodad,出现IllegalArgumentException异常
感谢“<span style="font-family:'Microsoft YaHei';">我是菜鸟要早起</span>”大神的心血博客http://blog.csdn.net/licongcong_0224/article/details/12972889,参考了之后终于算是把Hadoop 2.2里要配置的内容搞清楚了。不过在启动Hadoop 服务时(本人使用了伪分布式的单机部署方式),还是出现了问题。
这次的问题乍看起来很奇怪,在本机完成配置启动Hadoop的时候,首先,我们需要对namenode进行format,但是在执行了命令之后,却出现了如下的异常:FATAL namenode.NameNode: Exception in namenode join java.lang.IllegalArgumentException: URI has an authority component。别的不管,就冲着这个 authority,我义无反顾地在 format命令前加上了 sudo,结果发现…………木有起到半点作用。
那么,直接跳过format环节执行start-all呢?结果看起来有点神奇,几个进程居然还都跑起来了。不过明眼一看……怪了,唯独没有namenode进程(如下图所示)。通过namenode上50070端口的 Web UI也发现无法打开网页。于是查看namenode的log文件,发现又出现了上述的IllegalArgumentException异常;而在datanode的log文件里,也发现了一大串Retrying connect to server。嗯……好吧……看来得耗上了。
经过几番查找、尝试,终于发现了问题的原因。这个异常的出现主要与这么两个文件有关:core-site.xml和hdfs-site.xml。想必进行过Hadoop配置的人对这两个文件都有着很深的印象,而这两个文件中,与本问题关系最直接的就是这么几个Property:
- 在core-site.xml里,我们配置了hadoop.tmp.dir属性,以我这里的配置为例:
- <property>
- <name>hadoop.tmp.dir</name>
- <value>file:/home/hdusr/hadoop-2.2.0/tmp/</value>
- </property>
- 在hdfs-site.xml里,我们通过如下的方式使用了hadoop.tmp.dir的属性值(以下的写法也是Hadoop 2.2中hdfs-site的默认配置值):
- <property>
- <name>dfs.namenode.name.dir</name>
- <value>file://${hadoop.tmp.dir}/dfs/name</value>
- </property>
- <property>
- <name>dfs.datanode.data.dir</name>
- <value>file://${hadoop.tmp.dir}/dfs/data</value>
- </property>
总而言之,IllegalArgumentException出现在本人的这种配置情况中时,可以通过把hdfs-site.xml修改为如下形式解决。
- 为了解决这个出现的异常,我们把hdfs-site.xml中的以下两个属性修改为:
- <property>
- <name>dfs.namenode.name.dir</name>
- <value>file:/home/hdusr/hadoop-2.2.0/tmp/dfs/name</value>(即使用完整的绝对地址)
- </property>
- <property>
- <name>dfs.datanode.data.dir</name>
- <value>file:/home/hdusr/hadoop-2.2.0/tmp/dfs/name</value>(即使用完整的绝对地址)
- </property>
以上只是本人作为菜鸟的一些不成熟的见解,所言不实之处还请见谅,望各位高人指点,感激不尽