hadoop 常见问题记录

1、运行  :hadoop namenode -format 报错误信息如下:
14/05/15 17:13:35 INFO common.Storage: Cannot lock storage /usr/hadoop/dfs/name. The directory is already locked.
14/05/15 17:13:35 ERROR namenode.NameNode: java.io.IOException: Cannot lock storage /usr/hadoop/dfs/name. The directory is already locked.
        at org.apache.hadoop.hdfs.server.common.Storage$StorageDirectory.lock(Storage.java:602)
        at org.apache.hadoop.hdfs.server.namenode.FSImage.format(FSImage.java:1321)
        at org.apache.hadoop.hdfs.server.namenode.FSImage.format(FSImage.java:1339)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.format(NameNode.java:1164)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1271)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1288)

解决方法:
[root@localhost hadoop-1.0.3]# chown -R root:123456 /usr/hadoop

 root为当前登录用户名,123456:为登录密码

其中:cat conf/core-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/usr/hadoop</value>
        </property>
        <property>
                <name>fs.default.name</name>
                <value>hdfs://192.168.0.109:9000</value>
        </property>

</configuration>

 

 

2、 DataNode不能启动:

在客户端日志显示 namenode namespaceID = 1713611278; datanode namespaceID = 596511341

这个问题基本上是因为在namenode端多次运行hadoop namenode –format 导致的。在hadoop的core-site.xml文件中(不同的hadoop版本名字会有不同)找到<name>hadoop.tmp.dir</name>,清空对应的文件夹。举例:

[hadoop@hadoop-datanode1 hadoop]$ cat core-site.xml<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="configuration.xsl"?><!-- Put site-specific property overrides in this file. --><configuration><!--global properties --><property><name>hadoop.tmp.dir</name><value>/usr/hadoop/tmp</value></property>

清空

[hadoop@hadoop-datanode1 tmp]$ rm -rf /usr/hadoop/tmp/*

然后重新启动hadoop,在datanode端用jps看是否datanode已经启动了。

 

3、通过命令和查看日志文件查看hadoop启动和运行情况

在NameNode端,可以通过

tail -100 /var/log/hadoop/hadoop/hadoop-hadoop-namenode-hadoop-namenode.log

查看NameNode的运行日志

在DataNode端也可以通过

cat /var/log/hadoop/hadoop/hadoop-hadoop-datanode-hadoop-datanode1.log

查看DataNode的运行日志。

通过jps命令分别在datanode和namenode端运行,查看已启动的服务。

 

 


 4、ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs in


 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs in /usr/hadoop/dfs/data: namenode namespaceID = 1988494166; datanode namespaceID = 1906089544

 

导致datanode启动不了。

原因:每次namenode format会重新创建一个namenodeId,而dfs.data.dir参数配置的目录中包含的是上次format创建的id,和dfs.name.dir参数配置的目录中的id不一致。namenode format清空了namenode下的数据,但是没有清空datanode下的数据,导致启动时失败,所要做的就是每次fotmat前,清空dfs.data.dir参数配置的目录.
格式化hdfs的命令

Shell代码 
  1. hadoop namenode -format 

 

5、Warning: $HADOOP_HOME is deprecated. hadoop1.0.4解决方法

启动Hadoop时报了一个警告信息,我安装的Hadoop版本是hadoop1.0.4,具体警告信息如下:

Shell代码 
  1. [root@localhost hadoop-1.0.4]# ./bin/start-all.sh  
  2. Warning: $HADOOP_HOME is deprecated. 

网上的说法是因为Hadoop本身对HADOOP_HOME做了判断,具体在bin/hadoop和bin/hadoop-config.sh里。在hadoop-config.sh里有如下的配置:

Shell代码 
  1. if [ "$HADOOP_HOME_WARN_SUPPRESS" ="" ] && [ "$HADOOP_HOME" !="" ]; then 
  2.   echo "Warning: \$HADOOP_HOME is deprecated."1>&2 
  3.   echo 1>&2 
  4. fi 

对于这个警告问题,解决方法如下:

1.注释掉hadoop-config.sh里的上面给出的这段if fi配置(不推荐)

2.在当前用户home/.bash_profile里增加一个环境变量:

vi .bash_profile

在文件中输入:

export HADOOP_HOME_WARN_SUPPRESS=1 / true  ?自己试试

注:修改完.bash_profile后需要执行source操作使其生效

Shell代码 
  1. [root@localhost ~]# source .bash_profile 

执行完后我们可以检验一下配置是否成功,重新执行start-all.sh脚本:

Shell代码 
  1. [root@localhost hadoop-1.0.4]# ./bin/start-all.sh  
  2. starting namenode, logging to /root/hadoop-1.0.4/libexec/../logs/hadoop-root-namenode-localhost.out 
  3. localhost: starting datanode, logging to /root/hadoop-1.0.4/libexec/../logs/hadoop-root-datanode-localhost.out 
  4. localhost: starting secondarynamenode, logging to /root/hadoop-1.0.4/libexec/../logs/hadoop-root-secondarynamenode-localhost.out 
  5. starting jobtracker, logging to /root/hadoop-1.0.4/libexec/../logs/hadoop-root-jobtracker-localhost.out 
  6. localhost: starting tasktracker, logging to /root/hadoop-1.0.4/libexec/../logs/hadoop-root-tasktracker-localhost.out 

没有出现Warning: $HADOOP_HOME is deprecated,说明问题已经解决。

 

6、Hadoop MapReduce输出结果中文乱码问题解决

  在Reduce程序的

public void reduce(Text key, Iterable<Text> values, Context context)    throws IOException, InterruptedException

的方法最后写入文件时, 对内容进行转码为GBK,如下程序代码:

       Text record = new Text();
    record.set(line.toString().getBytes("GBK"));// 输出为中文
    context.write(record, null);

 

 

你可能感兴趣的:(hadoop 常见问题记录)