1、环境及配置问题
1.1 每次运行程序都提示Warning: Unable to load native-hadoop library。
- 原因:机器为64位,hadoop-2.x.tar.gz安装包在32位机器上编译的,加载本地库.so文件是出错,不影响使用。
- 解决:
: 在网上找编译好的相应hadoop版本的、编译好的64位的lib包,比如http://dl.bintray.com/sequenceiq/sequenceiq-bin/
,下载。然后将准备好的64位的lib包解压到已经安装好的hadoop安装目录的lib/native和lib目录下
$ tar -xvf ~/Downloads/hadoop-native-2.x.tar.gz -C /usr/local/hadoop/lib/native
$ tar -xvf ~/Downloads/hadoop-native-2.x.tar.gz -C /usr/local/hadoop/lib
: 增加环境变量并生效
$ sudo vim ~/.bashrc
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
$ source ~/.bashrc
参考来源:chengjunde的博客园
1.2 执行hadoop namenode -format后的一系列问题
- 执行此命令后,会破坏整个集群数据,慎用!!!
- 在格式化前必须清楚DataNode节点dfs/name下的内容,否则在启动hadoop时DN的守护进程会启动失败。这是由于,每一次format主节点namenode,dfs/name/current目录下的VERSION文件会产生新的clusterID、namespaceID。但是如果子节点的dfs/name/current仍存在,hadoop格式化时就不会重建该目录,因此形成子节点的clusterID、namespaceID与主节点(即namenode节点)的clusterID、namespaceID不一致。最终导致hadoop启动失败。
- 解决:删除
HADOOP_HOME/tmp/dfs/name/
(主节点)和HADOOP_HOME/tmp/dfs/data
(从节点)下的内容,再执行namenode -format命令,则会在从节点中生成同主节点一样的文件。
1.3 在编译hadoop0.20源码后,进行namenode -format时报错format aborted in /path
- 原因:在namenode格式化之前,dfs.name.dir指定的目录已存在,就会中止,防止错误的将已存在的集群格式化了;
- 解决:将dfs.name.dir指定的目录内清空。
1.4 集群中的IP地址变了怎么办
帮公司了…所以以前搭的集群的ip地址一下就全变了。
解决办法不难,就是有点麻烦,把每个节点的/etc/hosts
中的ip对应地址改一下就行了,注意,是每个节点,包括master和slave节点
2 程序运行问题
2.1 WordCount运行时显示WordCount$TokenizerMapper not found
- 原因:原教程说,将所有修改过的
/usr/local/hadoop/etc/hadoop
中的文件放到eclipse工程的src目录下,但是教程使用的是伪分布式,我使用的是虚拟机搭建的完全分布式,将core-site.xml
、hdfs-site.xml
、yarn-site.xml
、mapred-site.xml
、slavers
这五个文件还有log4j.properties
全都放在了src目录下,但实际上只要core-site.xml
、hdfs-site.xml
、log4j.properties
这三个文件就行了。具体为啥尚不清楚。 - 解决:删除src中多余的三个文件,运行成功。
参考来源:摘果子的人的CSDN博客
2.2 eclipse上运行程序操作HDFS时,出现call from master/xx to localhost:9000 failed on connection exception
这个问题困扰了很久,查了很多博客也没解决,主要有以下几种可能原因及解决方案,千万不要看了一条就开始操作,要看符不符合自己的情况。不然回头很难啊。
-
本地用户administrator(本机windows用户)想要远程操作hadoop系统,没有权限。
此时可以取消hdfs的用户权限检查,在配置文件core-site.xml
中,找到(没有就自己新建)dfs.permissions
属性,默认为true
,修改为false
就可以了,重启hadoop,重启eclipse。
-
重新格式化
namenode
执行,(慎用!)
$ hdfs dfs namenode -format
-
主节点9000端口没有打开,或者没有允许远程访问
-
对于本例来说,上述都不是,而是因为。。。教程中是伪分布式,我这是分布式,在配置
Hadoop location
时参数不一样。
按照参考的两个教程来说,在配置Hadoop-Eclipse-Plugin
的Map/Reduce开发视图时,选择 Window 菜单下选择 Open Perspective -> Other,从中选择 Map/Reduce 选项。
第一次新建Hadoop location时,教程的参数配置都是:
而这里的DFS Master选项,他们勾选了Use M/R Master host
,其实在本例中,应该是这样:
就是因为这个配置不一样,所以在使用eclipse对HDFS进行操作时,一直报这样的错误!
n 一些解释
n.1 为什么要将修改过的配置文件放在项目的src目录下?
-在使用eclipse运行MapReduce程序时,会读取Hadoop-Eclipse-Plugin的Advanced parameters作为Hadoop运行参数,如果未修改,则默认是单机模式参数,程序运行时读取的是本地目录,而非HDFS目录,就会提示input等目录不存在(在HDFS中)。
- 而log4j用于记录程序的输出日记,需要log4j.properties这个配置文件,若无,虽然不影响程序运行,但运行时无法看到任何提示消息。