关于hosts文件地址映射冲突所造成的影响

我使用的系统是用ubuntu-24.04.1-live-server-amd64创建的虚拟机集群

一切的根源hosts

hadoop01的hosts


127.0.0.1 localhost
127.0.1.1 hadoop01

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

192.168.88.147 hadoop01
192.168.88.148 hadoop02
192.168.88.149 hadoop03

hadoop02的hosts

127.0.0.1 localhost
127.0.1.1 hadoop02

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

192.168.88.147 hadoop01
192.168.88.148 hadoop02
192.168.88.149 hadoop03

hadoop03的hosts

127.0.0.1 localhost
127.0.1.1 hadoop03

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

192.168.88.147 hadoop01
192.168.88.148 hadoop02
192.168.88.149 hadoop03

一切都是因为Ubuntu系统默认的hosts映射与我设定的映射冲突了,一开始我还很奇怪为什么就是跑不起来,明明在

ubuntu-22.04.2-desktop-amd64虚拟机上搭建的集群跑的时候没有这个问题,于是我又跑去查看了它的hosts

果然,它的系统默认127.0.1.1的映射名称是node1-virtual-machine,而不是我设置的node1,这又何尝不是因祸得福?

ps

127.0.1.1 是一个特殊的IP地址,属于回环地址(loopback address)的范围。回环地址用于网络软件和服务在本地主机上的通信,而不经过实际的网络接口。最常见的回环地址是 127.0.0.1,通常对应于 localhost。

回环地址的作用
本地测试:开发人员经常使用回环地址来测试网络应用程序,而不需要连接到外部网络。
本地服务:许多服务和守护进程(如Web服务器、数据库服务器等)会在回环地址上监听,以便本地应用程序可以与其通信。
安全性:回环地址通常只在本地主机上可见,不会路由到外部网络,因此可以用于提高安全性。
127.0.1.1 的特殊性
127.0.0.1:这是最常用的回环地址,通常对应于 localhost。
127.0.1.1:这是一个备用的回环地址,有时用于特定的主机名映射。在某些Linux发行版中,系统会自动将主机名映射到 127.0.1.1,以确保主机名解析在本地有效。

node1的hosts

127.0.0.1       localhost
127.0.1.1       node1-virtual-machine

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback

192.168.88.135 node1
192.168.88.136 node2
192.168.88.137 node3

fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

以上就是困扰我许久的问题,竟然是因为这么一行映射。

错误记录

zookeeper

错误

zookeeper的运行情况,有QuorumPeerMain服务,可是status就是没有成功运行。

root@hadoop02:/home/hadoop/app/apache-zookeeper-3.9.1-bin# bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/hadoop/app/apache-zookeeper-3.9.1-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
root@hadoop02:/home/hadoop/app/apache-zookeeper-3.9.1-bin# bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/hadoop/app/apache-zookeeper-3.9.1-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Error contacting service. It is probably not running.
root@hadoop02:/home/hadoop/app/apache-zookeeper-3.9.1-bin# jps
70624 QuorumPeerMain
70927 Jps

hadoop01节点下zookeeper的日志记录,hadoop02与hadoop03的日志记录也都相似,都提示节点间无法正常通信。

2024-11-21 07:59:02,192 [myid:] - WARN  [QuorumConnectionThread-[myid=1]-1:o.a.z.s.q.QuorumCnxManager@401] - Cannot open channel to 2 at election address hadoop02/192.168.88.148:3888
java.net.ConnectException: Connection refused (Connection refused)
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
	at java.net.Socket.connect(Socket.java:606)
	at org.apache.zookeeper.server.quorum.QuorumCnxManager.initiateConnection(QuorumCnxManager.java:384)
	at org.apache.zookeeper.server.quorum.QuorumCnxManager$QuorumConnectionReqThread.run(QuorumCnxManager.java:458)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:750)
2024-11-21 07:59:02,192 [myid:] - WARN  [QuorumConnectionThread-[myid=1]-2:o.a.z.s.q.QuorumCnxManager@401] - Cannot open channel to 3 at election address hadoop03/192.168.88.149:3888
java.net.ConnectException: Connection refused (Connection refused)
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
	at java.net.Socket.connect(Socket.java:606)
	at org.apache.zookeeper.server.quorum.QuorumCnxManager.initiateConnection(QuorumCnxManager.java:384)
	at org.apache.zookeeper.server.quorum.QuorumCnxManager$QuorumConnectionReqThread.run(QuorumCnxManager.java:458)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:750)

hadoop01的zoo.cfg

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/home/hadoop/app/apache-zookeeper-3.9.1-bin/zkdata
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# https://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

## Metrics Providers
#
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpHost=0.0.0.0
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true

#quorumListenOnAllIPs=true

server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888

解决方法

后来我在zoo.cfg文件中加入了

quorumListenOnAllIPs=true

zookeeper集群就正常运行了

原因

我总结是因为我的hosts文件地址映射冲突,导致节点间的通信找不到其他节点,无法进行选取,因此导致zookeeper集群无法启动。

ps

quorumListenOnAllIPs 是 ZooKeeper 配置中的一个属性,用于指定 ZooKeeper 是否应该在所有可用的网络接口上监听。这个属性对于确保 ZooKeeper 集群中的节点能够正确通信非常重要。

quorumListenOnAllIPs=true:表示 ZooKeeper 将在所有可用的网络接口上监听,这意味着它可以接受来自任何网络接口的连接请求。
quorumListenOnAllIPs=false:表示 ZooKeeper 只在特定的网络接口上监听,通常是指配置文件中指定的 IP 地址。

最后

最后当我修改掉冲突的hosts文件后我发现注释掉quorumListenOnAllIPs=true

zookeeper集群仍然可以正常运行

HDFS

没错当我使用quorumListenOnAllIPs=true解决掉了zookeeper的问题后,但此时我还是没有发现hosts这个惊喜,于是我进入了下一个坑。

错误

namenode初始化时

STARTUP_MSG:   java = 1.8.0_411
************************************************************/
24/11/21 07:24:45 INFO namenode.NameNode: registered UNIX signal handlers for [TERM, HUP, INT]
24/11/21 07:24:45 INFO namenode.NameNode: createNameNode [-foramt]
Usage: hdfs namenode [-backup] | 
        [-checkpoint] | 
        [-format [-clusterid cid ] [-force] [-nonInteractive] ] | 
        [-upgrade [-clusterid cid] [-renameReserved<k-v pairs>] ] | 
        [-upgradeOnly [-clusterid cid] [-renameReserved<k-v pairs>] ] | 
        [-rollback] | 
        [-rollingUpgrade <rollback|downgrade|started> ] | 
        [-finalize] | 
        [-importCheckpoint] | 
        [-initializeSharedEdits] | 
        [-bootstrapStandby [-force] [-nonInteractive] [-skipSharedEditsCheck] ] | 
        [-recover [ -force] ] | 
        [-metadataVersion ]

24/11/21 07:24:45 INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at hadoop01/127.0.1.1
************************************************************/
root@hadoop01:/home/hadoop/app/hadoop-2.9.1#

hadoop01节点的namenode启动日志

2024-11-20 12:24:20,696 WARN org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Encountered exception loading fsimage
java.io.IOException: NameNode is not formatted.
	at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:236)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:1048)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:681)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:666)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:728)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:953)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:932)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1673)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1741)
2024-11-20 12:24:20,702 INFO org.mortbay.log: Stopped HttpServer2$SelectChannelConnectorWithSafeStartup@hadoop01:50070
2024-11-20 12:24:20,804 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Stopping NameNode metrics system...
2024-11-20 12:24:20,805 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: NameNode metrics system stopped.
2024-11-20 12:24:20,805 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: NameNode metrics system shutdown complete.
2024-11-20 12:24:20,805 ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: Failed to start namenode.
java.io.IOException: NameNode is not formatted.
	at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:236)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:1048)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:681)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:666)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:728)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:953)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:932)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1673)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1741)

以上的所有用一句话总结,namenode根本没有初始化,此时你用jps看不到namenode

root@hadoop01:/home/hadoop/app/hadoop-2.9.1# jps
6673 DataNode
2066 QuorumPeerMain
7331 DFSZKFailoverController
8149 Jps
6970 JournalNode

那么为什么呢?其实我那时也不太懂。后来我一顿搜索查找。

在Hadoop集群中,NameNode是HDFS(Hadoop Distributed File System)的核心组件之一,负责管理文件系统的命名空间和客户端对文件的访问。当提到hosts地址映射冲突时,这通常意味着存在两个或多个主机名映射到了同一个IP地址,或者相反地,一个主机名被错误地映射到了不同的IP地址上。这种冲突可能会导致以下几种问题,从而影响NameNode的初始化:

网络通信问题:NameNode需要与集群中的其他节点(如DataNode)进行通信。如果hosts文件配置错误,可能导致NameNode无法正确解析这些节点的主机名,进而无法建立必要的网络连接。
身份验证失败:在某些安全设置下,Hadoop集群可能使用主机名来进行身份验证。如果主机名映射不正确,可能会导致身份验证失败,阻止NameNode和其他节点之间的正常交互。
配置文件中的主机名匹配问题:Hadoop的配置文件(如core-site.xml、hdfs-site.xml等)中可能会指定使用特定的主机名。如果这些主机名在/etc/hosts文件中没有正确解析到相应的IP地址,那么NameNode在尝试启动时可能会遇到问题,因为它找不到正确的节点来执行任务。
服务注册与发现问题:在一些情况下,NameNode需要向集群中的其他服务注册自己,或者发现其他服务的位置。如果主机名解析出现问题,这一过程可能会失败,导致NameNode无法完成初始化。
解决这类问题的方法通常是检查并修正/etc/hosts文件中的条目,确保每个主机名都唯一地映射到正确的IP地址,并且所有相关的Hadoop配置文件中使用的主机名都能正确解析。此外,还需要确保所有节点上的/etc/hosts文件保持一致,以避免由于主机名解析不一致而引起的问题。如果是在多数据中心或多子网环境中部署Hadoop,还需要特别注意不同网络环境下的主机名解析问题。

简单来说,找不到其他节点了。

后来我一修改hosts后,全部运行一次通过。

最后还要感谢这些帮助我的博客

[解决ZooKeeper集群搭建 [myid:1] - WARN [QuorumPeer[myid=1]:QuorumCnxManager@685] - Cannot open channel_2023-12-06 09:43:22,695 [myid:1] - info quorumpee-优快云博客

第一次启动时格式化namenode 第二次格式化会出错_namenode格式化两次-优快云博客

以及通义千问

通义tongyi.ai_你的全能AI助手-通义千问

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值