文章目录
  1. 1. 错误集锦
    1. 1.1. HDFS:DataNode不在线,使得出现Namenode in safe mode错误
    2. 1.2. 集群时间不同步问题
  2. 2. References

本文记录Hadoop,HDFS,YARN,HBase,Hive等Hadoop社区的系统使用中的一些问题及解决方案,
包括Hadoop集群构建及使用中的一些问题以及解决方案,
包括各种莫名其妙的安装问题,
配置问题,
运行问题,
运行中问题,
等等等等,
积累以备后查,
也方便后来者参考之。

错误集锦

HDFS:DataNode不在线,使得出现Namenode in safe mode错误

打开Hadoop webUI可以看到类似情况:

1
2
3
4
5
6
7
8
9
Security is off.

Safe mode is ON. The reported blocks 0 needs additional 178895 blocks to reach the threshold 0.9990 of total blocks 179074. The number of live datanodes 0 has reached the minimum number 0. Safe mode will be turned off automatically once the thresholds have been reached.

184051 files and directories, 179074 blocks = 363125 total filesystem object(s).

Heap Memory used 297.78 MB of 1.28 GB Heap Memory. Max Heap Memory is 1.78 GB.

Non Heap Memory used 31.27 MB of 31.81 MB Commited Non Heap Memory. Max Non Heap Memory is 130 MB.

【原因分析】
查看datanode日志出现:

1
2
2017-10-23 09:15:33,336 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: master01/115.212.0.91:9000. Already tried 9 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2017-10-23 09:15:33,337 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Problem connecting to server: master01/115.212.0.91:9000

类似错误

于是使用:netstat -an | grep 9000查看端口

1
2
3
[root@master01 etc]# netstat -an | grep 9000
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:55294 127.0.0.1:9000 TIME_WAIT

这表明,只有127.0.0.1上的9000端口启动了,故只有本机才能访问127.0.0.1:9000了,故datanode无法联通namenode。

查看/etc/hosts文件,如下:

1
2
3
4
127.0.0.1   master01      localhost.localdomain   localhost
::1 master01 localhost6.localdomain6 localhost6

115.212.0.91 master01

由hosts文件可以看到,master01在赋值为114.212.190.91之前被赋值到了127.0.0.1,以及IPv6的::1上。

【解决方案】把前两行的master01删去,得到:

1
2
3
4
127.0.0.1        localhost.localdomain   localhost
::1 localhost6.localdomain6 localhost6

115.212.0.91 master01

这样启动的就会是115.212.0.91:9000,datanode也可以连到namenode了。

最后查看端口监听情况:

1
2
3
4
5
6
7
8
[hadoop@master01 sbin]$ netstat -an | grep 9000
tcp 0 0 115.212.0.91:9000 0.0.0.0:* LISTEN
tcp 0 0 115.212.0.91:9000 115.212.0.91:56574 ESTABLISHED
tcp 0 0 115.212.0.91:9000 192.168.1.18:35381 ESTABLISHED
tcp 0 0 115.212.0.91:9000 192.168.1.15:60196 ESTABLISHED
tcp 0 0 115.212.0.91:56573 115.212.0.91:9000 TIME_WAIT
tcp 0 0 115.212.0.91:9000 192.168.1.6:42243 ESTABLISHED
........

成功。

集群时间不同步问题

集群运行example程序出现时间不一致的问题。

1
2
3
4
17/10/23 10:50:24 INFO mapreduce.Job: Task Id : attempt_1508726229114_0001_m_000000_1, Status                  : FAILED
Container launch failed for container_1508726229114_0001_01_000007 : org.apache.hadoop.yarn.ex ceptions.YarnException: Unauthorized request to start container.
This token is expired. current time is 1508729210138 found 1508728023578
Note: System times on machines may be out of sync. Check system time and time zones.

【解决方案1】手动同步时间,在每台机器上date -s ...设置同样的时间

【解决方案2】使用NTP时间服务器来同步时间(也需要所有机器上运行一次,但是后面可以一直按时同步)

默认master和slaves都安装好了ntpd服务(centOS好像默认有),可以通过如下命令查看:

1
2
[root@node1 ~]# rpm -q ntp
ntp-4.2.4p8-2.el6.x86_64

每个节点都需要配置NTP服务为自启动

1
2
3
[root@master ~]# chkconfig ntpd on
[root@master ~]# chkconfig --list ntpd
ntpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

然后在master上修改配置文件:

1
[root@master ~]# vim /etc/ntp.conf

如下编辑,(如下是conf文件部分信息)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
restrict 127.0.0.1
restrict -6 ::1

# Hosts on local network are less restricted.
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
# server 114.212.190.91 prefer
# server 0.rhel.pool.ntp.org
# server 1.rhel.pool.ntp.org
# server 2.rhel.pool.ntp.org
server 210.72.145.44 perfer
server 202.112.10.36
server 59.124.196.83
server 192.168.1.1 # 局域网NTP服务器的IP
#broadcast 192.168.1.255 autokey # broadcast server
#broadcastclient # broadcast client
#broadcast 224.0.1.1 autokey # multicast server
#multicastclient 224.0.1.1 # multicast client
#manycastserver 239.255.254.254 # manycast server
#manycastclient 239.255.254.254 autokey # manycast client

# Undisciplined Local Clock. This is a fake driver intended for backup
# and when no outside source of synchronized time is available.
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10

主要的修改有:

  • 添加了restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap表示192.168.1.1-192.168.1.255的IP地址都可以访问本NTP服务器。
  • 添加了server 210.72.145.44 perfer开始的4行,尤其最后一个局域网NTP服务器的IP很重要,后面从节点的时间都要与此IP(master)来同步,相当于一个权威时间服务器。

遇到的一些问题:

  • slave上运行ntpdate <masterIP>出现bind() fails: Permission denied【解决方案】没有权限,用root做
  • slave上运行ntpdate <masterIP>出现23 Oct 13:11:05 ntpdate[1454]: the NTP socket is in use, exiting 【解决方案】lsof -i:123 然后 kill -9 pid 再重新尝试即可

crontab自动同步,crontab是自动运行的服务,可以让机器自动按一定周期进行时间同步。
【方法】在每台机器上

1
2
crontab -u root -e   # 新建root的crontab文件并编辑,写入如下语句
* */24 * * * /usr/sbin/ntpdate 192.168.1.1 # 24小时同步一次

这样每24小时,所有的worker都会自动与时间服务器192.168.1.1上的时间同步一次,应该不会再出现时间不同步的问题了,除非机器重启可能会早造成设置改变等,还没有遇到,等遇到了再写。

References