经常在启动hadoop相关服务的时候,发现启动的设备绑定的地址为 子网ip
这是由于在Hadoop中,各个结点先通过getLocalHost()读取host,然后对应到ip,NodeManager开始启动
其中getLocalHost()方法是InetAddress类的静态方法,在getLocalHost()方法中会调用InetAddressImpl接口的getLocalHostName()方法
getLocalHostName()方法的实现是native方法,此native方法中最终会调用linux的gethostname内核函数
linux中的hostname是个变量,由系统初始化的时候在shell启动脚本中 /etc/rc.d/rc.sysinit
中的$HOSTNAME环境变量赋值,$HOSTNAME环境变量由binhostname赋值,主要是读取etcsysconfignetwork中的HOSTNAME的值
所以修改办法为,指定 /etc/sysconfig/network
中的HOSTNAME的值,然后执行 hostname localhost
执行生效
Mac下通过以下命令修改主机名,但不修改局域网主机名 sudo scutil --set HostName 主机名
需要检查一下自己的shell类型 echo $SHELL.
服务器上的为 bash类型, non-interactive + non-login模式下会读取 ~/.bashrc.
如果为 zsh , non-interactive + non-login模式下只会读取 ~/.zshenv 而不会读取 ~/.zshrc.
根据如上规则配置好就行.
hadoop 3.x 可以将环境变量配置在 ~/.hadooprc 中,无需额外配置
这是因为hadoop 发现 运行程序的客户端 和 datanode 在同一台机器上,这样的话 hadoop 就会尝试绕过 datanode 直接去读取磁盘文件。