我正在EC2上设置Hadoop。对于fs.default.name
,fs.defaultFS
,如果我使用DNS作为名称节点,一切正常。但是,如果我使用公共IP,则名称节点不能以Problem binding to [54.210.86.207:9000] java.net.BindException: Cannot assign requested address;
除外。公共DNS工作的原因是什么,而不是公共IP?
<property>
<name>fs.default.name</name>
<value>hdfs://54.210.86.207:9000</value>
<!-- <value>hdfs://ec2-54-210-86-207.compute-1.amazonaws.com:9000</value> -->
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://54.210.86.207:9000</value>
<!-- <value>hdfs://ec2-54-210-86-207.compute1.amazonaws.com:9000</value> -->
</property>
答案 0 :(得分:2)
在VPC内部,对您实例的公共IP地址的公共主机名进行DNS查询会执行一些有用的操作并进行记录 - 但是否则可能会出现意外情况:它会解析为计算机的私有 IP地址。当然,来自外部的查询会解析为公共地址。
我们将公共DNS主机名解析为实例网络外部实例的公共IPv4地址,并从实例网络中解析实例的私有IPv4地址。
http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-dns.html
这正是为什么这样做的原因。
EC2内部机器的公共IP地址实际上并不绑定到实例操作系统的IP堆栈 - 只有私有IP地址。 Internet网关处理公共和私有地址之间的1:1转换,因为流量在进出实例的过程中遍历它。
并且,这是理想的行为,因为您不希望实例使用其公共地址与其他实例(或自己!)交谈,因为您需要为通过Internet网关发送和重新发送的数据支付运输费用。在单个可用区域内,使用私有IP地址时,不会为实例之间的流量付费。此外,当两个实例通过公共IP相互通信时,源安全组的身份必然会丢失,这意味着您无法使用source security-group-id进行入口控制。
答案 1 :(得分:0)
我有一段时间没有为hadoop工作,但是当我使用它时,没有办法只用IP来引用namenode或datanode(我认为它与阻止用户硬编码有关)发生故障时的IP地址,但我可能是错的)。使用原始IP地址是一种不好的做法,但是这种限制确实会让hadoop变得更加困难。这是我能找到真正来源的最接近的东西:https://issues.apache.org/jira/browse/HADOOP-685
为了解决这个问题,您可以托管自己的DNS服务器(dnsmasq)和我们,或者将条目添加到所有机器的/ etc / hosts中以制作“假名”,并在配置中使用这些名称。对不起,我没有更好的解决方案......