1.hadoop启动时datanode报错Shutting down DataNode at java.net.UnknownHostException: master1.hadoop: master1.hadoop: 未知的名称或服务
2.java.net.UnknownHostException: localhost.localdomain: localhost.localdomain
很明显无法解析用户DataNode中所配置的hostname名称无法在/etc/hosts中找到对应的DNS(ip对地址的映射),实质就是hostname和/etc/hosts矛盾的问题。就是hostname配置的名字无法在/etc/hosts里面找到对应的DNS解析。
Linux操作系统的hostname是一个kernel变量,可以通过hostname命令来查看本机的hostname。也可以直接cat /proc/sys/kernel/hostname查看。
Linux 的/etc/hosts是配置ip地址和其对应主机名的文件,这里可以记录本机的或其他主机的ip及其对应主机名。
Hosts - The static table lookup for host name(主机名查询静态表)
hosts文件是Linux系统中一个负责IP地址与域名快速解析的文件,以ASCII格式保存在“/etc”目录下,文件名为“hosts”(不同的linux版本,这个配置文件也可能不同。比如Debian的对应文件是/etc/hostname)。hosts文件包含了IP地址和主机名之间的映射,还包括主机名的别名。在没有域名服务器的情况下,系统上的所有网络程序都通过查询该文件来解析对应于某个主机名的IP地址,否则就需要使用DNS服务程序来解决。通常可以将常用的域名和IP地址映射加入到hosts文件中,实现快速方便的访问。
这个文件可以配置主机ip及对应的主机名,对于服务器类型的linux系统其作用还是不可忽略的。在局域网或是INTERNET上,每台主机都有一个IP地址,它区分开每台主机,并可以根据ip进行通讯。但IP地址不方便记忆,所以又有了域名。在一个局域网中,每台机器都有一个主机名,用于区分主机,便于相互访问。
Linux主机名的相关配置文件就是/etc/hosts;这个文件告诉本主机哪些域名对应那些ip,那些主机名对应哪些ip:
一般/etc/hosts 的内容一般有如下类似内容:
127.0.0.1 localhost.localdomain localhost
22.106.102.22 ftpserver ftp120
一般情况下hosts文件的每行为一个主机,每行由三部份组成,每个部份由空格隔开。其中#号开头的行做说明,不被系统解释。
hosts文件的格式如下:
IP地址 主机名/域名
第一部份:网络IP地址;
第二部份:主机名或域名;
第三部份:主机名别名;
当然每行也可以是两部份,即主机IP地址和主机名;比如 22.106.102.22 ftpserver
主机名(hostname)和域名(Domain)的区别:主机名通常在局域网内使用,通过hosts文件,主机名就被解析到对应ip;域名通常在internet上使用,但如果本机不想使用internet上的域名解析,这时就可以更改hosts文件,加入自己的域名解析。
如果从我上面的实验来看,其实hostname跟/etc/hosts下的配置是没有关系的。hostname的修改、变更完全不依赖hosts文件。 其实hosts文件的作用相当如DNS,提供IP地址到hostname的对应。早期的互联网计算机数量少,单机hosts文件里足够存放所有联网计算机。不过随着互联网的发展,这就远远不够了。于是就出现了分布式的DNS系统。由DNS服务器来提供类似的IP地址到域名的对应。具体可以man hosts查看相关信息。
Linux系统在向DNS服务器发出域名解析请求之前会查询/etc/hosts文件,如果里面有相应的记录,就会使用hosts里面的记录。/etc/hosts文件通常里面包含这一条记录
127.0.0.1 localhost.localdomain localhost
127.0.0.1到localhost这一条建议不要修改,因为很多应用程序会用到这个,比如sendmail,修改之后这些程序可能就无法正常运行。
但是呢在特殊条件下hostname和/etc/hosts会保持一致。在/etc/rc.d/rc.sysinit中,有如下逻辑判断,当hostname为localhost或者localhost.localdomain时,将会使用接口IP地址对应的hostname来重新设置系统的hostname。这相当于linux系统为了保持本地dns解析的一致性做的自动化操作,等于默认替用户执行了这个操作。
# In theory there should be no more than one network interface active
# this early in the boot process -- the one we're booting from.
# Use the network address to set the hostname of the client. This
# must be done even if we have local storage.
ipaddr=
if [ "$HOSTNAME" = "localhost" -o "$HOSTNAME" = "localhost.localdomain" ]; then
ipaddr=$(ip addr show to 0/0 scope global | awk '/[[:space:]]inet / { print gensub("/.*","","g",$2) }')
if [ -n "$ipaddr" ]; then
eval $(ipcalc -h $ipaddr 2>/dev/null)
hostname ${HOSTNAME}
fi
fi
我们来实验一下吧,修改hosts、network文件,修改后的值如下所示:
[root@localhost ~]# more /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
::1 localhost.localdomain localhost
127.0.0.1 localhost.localdomain localhost
192.168.244.128 DB-Server.localdomain DB-Server
[root@localhost ~]# more /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=localhost.localdomain
重启系统后,我们再截图看看情况
所以这也是有时候人们以为hostname的值跟hosts文件有关系的缘故
vim /etc/hosts
127.0.0.1 yourname #hostname映射
然后reboot系统生效。
这种方法比较直接,但往往localhost等名字不是我们自己想要的,也缺乏名称的辨识度,所以是不大好的一种解决方案;
命令语法为:
sudo hostnamectl set-hostname
这条命令会删除/etc/hostname文件中的主机名,然后替换为新的主机名。和第一种方法一样,我们也需要更新/etc/hosts文件。这两种方法的本质都是一样的。
然后可以用hostname 或者hostnamectl查看hostname相关信息,其中hostnamectl显示的更为全面
root@localhost12 logs]# hostnamectl
Static hostname: slave1.hadoop
Icon name: computer-desktop
Chassis: desktop
Machine ID: 76547338655241a2b56abe659fe05dc1
Boot ID: 2d0f564b16f24bd7959ff4608d790223
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-862.11.6.el7.x86_64
Architecture: x86-64
本文部分内容参考:https://blog.csdn.net/dufufd/article/details/75330423