【问题标题】:Hadoop config on EC2: why public DNS works but not public IP?EC2 上的 Hadoop 配置:为什么公共 DNS 有效但公共 IP 无效?
【发布时间】:2017-02-22 19:04:51
【问题描述】:

我正在 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>  

【问题讨论】:

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


    【解决方案1】:

    在 VPC 内部,对您实例的公共 IP 地址的公共主机名的 DNS 查询会做一些有用的事情 - 并记录在案 - 但否则可能会出乎意料:它解析为机器的 私有 IP 地址。来自外部的查询当然会解析到公共地址。

    我们将公共 DNS 主机名解析为实例网络外的实例的公共 IPv4 地址,以及实例网络内的实例的私有 IPv4 地址。

    http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-dns.html

    这正是它起作用的原因。

    EC2 内机器的公共 IP 地址实际上并未绑定到实例操作系统的 IP 堆栈——只有私有 IP 地址是绑定的。互联网网关处理公共地址和私有地址之间的 1:1 转换,因为流量在进出实例的过程中穿过它。

    而且,这是可取的行为,因为您不希望实例使用它们的公共地址与其他实例(或它们自己!)通信,因为您需要为通过 Internet 网关输出和返回的数据支付传输费用.在单个可用区内,使用私有 IP 地址时,您无需为实例之间的流量付费。此外,当两个实例通过公共 IP 相互通信时,源安全组的身份必然会丢失,这意味着您不能使用源安全组 ID 进行入口控制。

    【讨论】:

    • 这就是hadoop禁止在conf中直接使用ip的原因吗?
    • 是的,因为服务器实际上并不知道它的公共地址——它被网络映射到私有地址。
    【解决方案2】:

    我已经有一段时间没有为 hadoop 工作了,但是当我使用它时,无法仅使用 IP 来引用 namenode 或 datanodes(我认为这与不鼓励用户进行硬编码有关发生故障时的 IP 地址,但我可能是错的)。使用原始 IP 地址是一种不好的做法,但是有这个限制确实会让使用 hadoop 变得更加困难。这是我能找到的最接近真实来源的东西:https://issues.apache.org/jira/browse/HADOOP-685

    要解决这个问题,您可以托管您自己的 dns 服务器 (dnsmasq) 和我们,或者将条目添加到所有机器的 /etc/hosts 以制作“假”名称,并在配置中使用这些名称。对不起,我没有更好的解决方案给你...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      • 2014-09-28
      • 2014-01-23
      • 1970-01-01
      • 2015-12-01
      • 2023-03-03
      相关资源
      最近更新 更多