EC2上的Hadoop配置:为什么公共DNS工作但不是公共IP?

时间:2017-02-22 05:37:45

标签: java amazon-web-services hadoop amazon-ec2 dns

我正在EC2上设置Hadoop。对于fs.default.namefs.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>  

2 个答案:

答案 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中以制作“假名”,并在配置中使用这些名称。对不起,我没有更好的解决方案......