Hadoop启动不了Namenode进程,出现IllegalArgumentException异常

      感谢“我是菜鸟要早起”大神的心血博客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.xmlhdfs-site.xml。想必进行过Hadoop配置的人对这两个文件都有着很深的印象,而这两个文件中,与本问题关系最直接的就是这么几个Property:

在core-site.xml里,我们配置了hadoop.tmp.dir属性,以我这里的配置为例:

	hadoop.tmp.dir
	file:/home/hdusr/hadoop-2.2.0/tmp/
在hdfs-site.xml里,我们通过如下的方式使用了hadoop.tmp.dir的属性值(以下的写法也是Hadoop 2.2中hdfs-site的默认配置值):

	dfs.namenode.name.dir
	file://${hadoop.tmp.dir}/dfs/name


	dfs.datanode.data.dir
	file://${hadoop.tmp.dir}/dfs/data

      这样的配置看似没有什么大的问题,而且还包含着${hadoop.tmp.dir}这种高端大气上档次的灵活性写法。但问题就出在了这里,经过实际操作确认,如果我们用这种变量式的方法对hdfs-site文件中的属性进行配置就会出现关于URI的权限问题。个人猜测可能因为Hadoop安装在hdusr目录,所以启动hadoop服务过程中,对hdfs-site文件进行载入时,解析变量式配置信息的中间过程遇到了权限问题(在下对Linux实在是菜鸟中的菜鸟,止步于此,不敢多加妄言)。。

      总而言之,IllegalArgumentException出现在本人的这种配置情况中时,可以通过把hdfs-site.xml修改为如下形式解决。
为了解决这个出现的异常,我们把hdfs-site.xml中的以下两个属性修改为:

	dfs.namenode.name.dir
	file:/home/hdusr/hadoop-2.2.0/tmp/dfs/name(即使用完整的绝对地址)


	dfs.datanode.data.dir
	file:/home/hdusr/hadoop-2.2.0/tmp/dfs/name(即使用完整的绝对地址)

       进过对hdfs-site.xml文件的修改后,终于……namenode成功格式化,并且也能够正常启动Hadoop服务,启动后的进程显示见下图。
       Hadoop启动不了Namenode进程,出现IllegalArgumentException异常_第1张图片

      以上只是本人作为菜鸟的一些不成熟的见解,所言不实之处还请见谅,望各位高人指点,感激不尽。

你可能感兴趣的:(云计算)