您的位置:首页 > 运维架构

hadoop集群报错日志整理和总结

2015-08-27 10:58 267 查看
用CentOS7.0做集群,发现了许多问题,主要总结如下:

1.配置文件的配置参数有错误。

2.操作系统的环境没有设置好。

3.文件的权限没有分配好。

常见的错误如下:

1.环境问题

centos7关闭防火墙

当时一直认为关闭防火墙的命令是:systemctl iptables stop

直接命令:service firewalld stop

CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙

firewall:

systemctl start firewalld.service#启动firewall

systemctl stop firewalld.service#停止firewall

systemctl disable firewalld.service#禁止firewall开机启动

可以替换为iptables

firewall:

systemctl start iptables.service

总结:

CentOS7用firewall命令“替代”了iptables。在这里我们需要区分“iptables服务”和“iptables命令”。虽然firewalld是替代提供的防火墙管理iptables服务,但是它仍然使用iptables对内核命令动态通信包过滤。所以它只是iptables服务代替,而不是iptables命令。

1. Disable Firewalld Service.

[root@rhel-centos7-linux ~]# systemctl mask firewalld

2. Stop Firewalld Service.

[root@rhel-centos7-linux ~]# systemctl stop firewalld

3. Install iptables service related packages.

[root@rhel-centos7-linux ~]# yum -y install iptables-services

4. Make sure service starts at boot:

[root@rhel-centos7-linux ~]# systemctl enable iptables

# If you do not want ip6tables, You can skip following command.

[root@rhel-centos7-linux ~]# systemctl enable ip6tables

5. Now, Finally Let’s start the iptables services.

[root@rhel-centos7-linux ~]# systemctl start iptables

# If you do not want ip6tables, You can skip following command.

[root@rhel-centos7-linux ~]# systemctl start ip6tables

Firewalld Service is now disabled and stop, You can use iptables.

检查防火墙状态

firewall-cmd --stat

临时开放ftp服务

firewall-cmd --add-service=ftp

永久开放ftp服务

firewall-cmd --add-service=ftp --permanent

关闭ftp服务

firewall-cmd --remove-service=ftp --permanent

配置防火墙在public区域永久开放http服务

firewall-cmd --permanent --zone=public --add-service=http

加入指定开放端口

firewall-cmd --add-port=1324/tcp

为了让之前的设定生效当然要重启服务咯

systemctl restart firewalld

或者使用下面的命令免去重启服务(防火墙策略配置后重新载入)

firewall-cmd --complete-reload

firewall-cmd --reload (这两句功能相同)

检查ftp服务的21端口是否开放

iptables -L -n | grep 21

ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:21 ctstate NEW

查询ftp服务启用状态

firewall-cmd --query-service ftp

查看当前规则

firewall-cmd --list-all

仅允许部分IP访问本机服务配置

firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" \

source address="192.168.0.4/24" service name="http" accept"

仅允许部分IP访问本机端口配置

firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" \

source address="192.168.0.4/24" \

port protocol="tcp" port="8080" accept"

异常

RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1 SECONDS)

2014-03-13 11:10:32,676 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: Linux-hadoop-38/10.10.208.38:9000. Already tried 9 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1 SECONDS)

2014-03-13 11:10:32,677 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Problem connecting to server: Linux-hadoop/10.10.208.38:9000

问题定位:

master端hosts文件配置或slave端环境

问题原因:

1)hosts文件配置出错

2)开启了防火墙

解决办法:

1)如果你已经检查了datanode以及namenode的连通性,ip都正确,但是仍然没法解决问题, 其实根本原因可能是无法连接到192.168.1.2:9000相应ip的相应端口。

查看一下namenode的端口坚挺情况:

[root@hadoop 桌面]$ netstat -an | grep 9000

tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN

tcp 0 0 127.0.0.1:37072 127.0.0.1:9000 TIME_WAIT

其实问题就在这里,hadoop启动的时候只监听了127.0.0.1一个端口,而不是192.168.1.2:9000。这种情况下,也就只有本机才能连通127.0.0.1:9000。

看来是ip解析的问题,看一下namenode的hosts文件:

127.0.0.1 master localhost.localdomain

::1 localhost6.localdomain6 localhost6

其实主要问题就在标红的部分,只要将master去掉即可。

重启dfs后检查一下端口监听情况:

[root@hadoop 桌面]# netstat -an | grep 9000

tcp 0 0 192.168.1.2:9000 0.0.0.0:* LISTEN

tcp 0 0 192.168.1.2:9000 192.168.1.3:52465 ESTABLISHED

tcp 0 0 192.168.1.2:56294 192.168.1.2:9000 TIME_WAIT

修改后datanode就可以正常连接namenode了。

2)ping hadoop能通,telnet Linux-hadoop 9000不能通,说明开启了防火墙。

关闭防火墙。

2.配置文件

Master节点Log篇

1.WARN org.apache.hadoop.hdfs.server.common.Util: Path /usr/hadoop/name should be specified as a URI in configuration files. Please update hdfs configuration.

问题定位:hdfs-site.xml

问题原因:

1) 不合规范的URI格式

解决办法:

2) 把dfs.namenode.name.dir、dfs.datanode.data.dir的原路径格式如/usr/hadoop/name改成file:/usr/hadoop/name,即使用完全路径。

2.INFO org.apache.hadoop.ipc.Server: IPC Server handler 2 on 9000, call org.apache.hadoop.hdfs.protocol.ClientProtocol.addBlock from 192.168.8.184:39050 Call#6 Retry#0 java.io.IOException: File /hbase/.tmp/hbase.version could only be replicated to 0 nodes instead of minReplication (=1). There are 0 datanode(s) running and no node(s) are excluded in this operation.

问题定位:datanode

问题原因:

1) datanode没有启动

解决办法:

2) 去Slave节点查看Log,排除错误,确保datanode正确启动起来(可通过jps命令查看启动状态)。

3. WARN org.apache.hadoop.hdfs.server.common.Storage: Storage directory /hadoop/name does not exist 2014-11-24 08:19:02,555 WARN org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Encountered exception loading fsimage org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /hadoop/name is in an inconsistent state: storage directory does not exist or is not accessible.

问题定位:hdfs-site.xml

问题原因:

1) 错误的URI格式

解决办法:

2) 把dfs.namenode.name.dir、dfs.datanode.data.dir的原路径格式如file://usr/hadoop/name改成file:/usr/hadoop/name,即使用完全路径。

Slave节点Log篇

1. WARN org.apache.hadoop.hdfs.server.common.Util: Path /usr/hadoop/data should be specified as a URI in configuration files. Please update hdfs configuration.

问题定位:hdfs-site.xml

问题原因:

1) 不合规范的URI格式

解决办法:

2) 把dfs.namenode.name.dir、dfs.datanode.data.dir的原路径格式如/usr/hadoop/name改成file:/usr/hadoop/name,即使用完全路径。

2. WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Problem connecting to server: slave1.hadoop.com.cn/192.168.1.2:9000

问题定位:core-site.xml

问题原因:

1) 不正确的HDFS地址

2) Master节点或者Slave节点防火墙没有关闭

解决办法:

1) 把core-site.xml中的fs.defaultFS的value的IP或域名改成主节点的IP地址或域名。

2) 使用telnet master 9000命令测试一下主节点的端口是否可以连接,如果不可以连接,则可能是主节点或者从节点的防火墙启用了,需要把它关闭。

3) 要是没有telnet命令,需要用yum install telnet命令下载安装包

3. FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool (Datanode Uuid unassigned) service to master/192.168.8.184:9000. Exiting. java.io.IOException: Incompatible clusterIDs in /usr/hadoop/data: namenode clusterID = CID-e6addb58-7fe2-47ea-9592-0033053a90f9; datanode clusterID = CID-d5961300-954e-4860-96b5-95b2b9634b77

问题定位:

所有namenode目录、所有datanode目录、从节点临时目录

问题原因:

1) 主节点的namenode clusterID与从节点的datanode clusterID不一致

2) 多次格式化了namenode跟datanode之后的结果,格式化之后从节点生成了新的ID,造成不一致。

每次namenode format会重新创建一个namenodeId,而tmp/dfs/data下包含了上次format下的id,namenode format清空了namenode下的数据,但是没有晴空datanode下的数据,导致启动时失败,所要做的就是每次fotmat前,清空tmp一下的所有目录。

解决办法:

1) 在格式化之前,先把所有的服务停掉(stop-dfs.sh、stop-yarn.sh或者stop-all.sh),确保都停掉了。

2) 在hdfs-site.xml配置文件中,配置了dfs.namenode.name.dir,在master中,该配置的目录下有个current文件夹,里面有个VERSION文件。

3) 在core-site.xml配置文件中,配置了hadoop.tmp.dir,在slave中,该配置的目录下有个dfs/data/current目录,里面也有一个VERSION文件。

4) 两个内容不一样,删除slave中的错误内容,重启。

5) 要是还不行,分别到所有节点的namenode目录、datanode目录、临时目录,把以上目录里面的所有内容都删除掉。然后再重新启动就可以了。

4. 2014-03-1312:34:46,828FATALorg.apache.hadoop.yarn.server.nodemanager.containermanager.AuxServices: Failed to initialize mapreduce_shuffle

java.lang.RuntimeException: No class defiend for mapreduce_shuffle

atorg.apache.hadoop.yarn.server.nodemanager.containermanager.AuxServices.init(AuxServices.java:94)at org.apache.hadoop.yarn.service.CompositeService.init(CompositeService.java:58)

2014-03-13 12:34:46,830 FATAL org.apache.hadoop.yarn.server.nodemanager.NodeManager: Error starting NodeManagerjava.lang.RuntimeException: No class defiend for mapreduce_shuffleatorg.apache.hadoop.yarn.server.nodemanager.containermanager.AuxServices.init(AuxServices.java:94)atorg.apache.hadoop.yarn.service.CompositeService.init(CompositeService.java:58)

问题定位:

yarn-site.xml

问题原因:

yarn-site.xml文件里的属性配置,在hadoop2.x有改动

解决办法:

1、yarn-site.xml配置错误:

<property>

<name>yarn.nodemanager.aux-services</name>

<value>mapreduce_shuffle</value>

</property>

2、修改为:

<property>

<name>yarn.nodemanager.aux-services</name>

<value>mapreduce.shuffle</value>

</property>

3、重启服务

5.WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

问题定位:

hadoop目录下的lib里的native没有库文件

问题原因:

native里没有库文件

解决方法:

将hadoop-2.0.0+1518-1.cdh4.5.0.p0.24.el6.x86_64.rpm在PC上使用压缩工具打开后,取出\usr\lib\hadoop\lib\native 下面的代码,上传到主机 ${HADOOP_HOME}/lib/native 下面

cd ${HADOOP_HOME}/lib/native

rm libhadoop.so

rm libsnappy.so

rm libsnappy.so.1

ln -s libhadoop.so.1.0.0 libhadoop.so

ln -s libsnappy.so.1.1.3 libsnappy.so.1

ln -s libsnappy.so.1.1.3 libsnappy.so

cd ..

tar -zcf native.tar.gz native

scp native.tar.gz 用户@IP地址:${HADOOP_HOME}/lib

cd ${HADOOP_HOME}/lib;

tar -zxf native.tar.gz;"

重启hadoop即可。

3.文件权限

在建立hadoop的name目录和data目录的时候,没有给相应的目录分配足够的权限,hadoop集群启动的时候,就会报错,需要chmod给目录赋权限。

最终,还是要仔细看master和slave的日志文件,定位问题,具体问题具体分析,找到对应的解决方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: