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的命令
5、Warning: $HADOOP_HOME is deprecated. hadoop1.0.4解决方法
启动Hadoop时报了一个警告信息,我安装的Hadoop版本是hadoop1.0.4,具体警告信息如下:
- [root@localhost hadoop-1.0.4]# ./bin/start-all.sh
- Warning: $HADOOP_HOME is deprecated.
网上的说法是因为Hadoop本身对HADOOP_HOME做了判断,具体在bin/hadoop和bin/hadoop-config.sh里。在hadoop-config.sh里有如下的配置:
- if [ "$HADOOP_HOME_WARN_SUPPRESS" ="" ] && [ "$HADOOP_HOME" !="" ]; then
- echo "Warning: \$HADOOP_HOME is deprecated."1>&2
- echo 1>&2
- fi
对于这个警告问题,解决方法如下:
1.注释掉hadoop-config.sh里的上面给出的这段if fi配置(不推荐)
2.在当前用户home/.bash_profile里增加一个环境变量:
vi .bash_profile
在文件中输入:
export HADOOP_HOME_WARN_SUPPRESS=1 / true ?自己试试
注:修改完.bash_profile后需要执行source操作使其生效
- [root@localhost ~]# source .bash_profile
执行完后我们可以检验一下配置是否成功,重新执行start-all.sh脚本:
- [root@localhost hadoop-1.0.4]# ./bin/start-all.sh
- starting namenode, logging to /root/hadoop-1.0.4/libexec/../logs/hadoop-root-namenode-localhost.out
- localhost: starting datanode, logging to /root/hadoop-1.0.4/libexec/../logs/hadoop-root-datanode-localhost.out
- localhost: starting secondarynamenode, logging to /root/hadoop-1.0.4/libexec/../logs/hadoop-root-secondarynamenode-localhost.out
- starting jobtracker, logging to /root/hadoop-1.0.4/libexec/../logs/hadoop-root-jobtracker-localhost.out
- 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);
--转自