2017-02-22 72 views
1

我正在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?EC2上的Hadoop配置:为什么公共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

里面VPC,您的实例的公共IP地址的主机名公众的DNS查询做一些有用的东西 - 并记录在案 - 但除此之外,可能意外:它解析为机器的专用 IP地址。当然,来自外部的查询会解析为公开地址。

我们解决公共DNS主机名到该实例的外网实例的公共IPv4地址,并从实例的网络中,以实例的私有IPv4地址。

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

这正是为什么这个工程。

内EC2机器的公网IP地址实际上不绑定到实例的OS的IP栈 - 只有私有IP地址。互联网网关处理公共和私人地址之间的1:1转换,因为流量以往返于实例的方式穿越它。

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

+0

这就是为什么Hadoop的禁止直接在conf使用IP的原因是什么? – sgu

+1

是的,因为服务器实际上并不知道它的公共地址 - 它被网络映射到专用地址。 –

0

我没有工作了Hadoop的一段时间,但是当我与它的工作,没有办法引用名称节点或只用一个IP数据节点(我觉得有一些东西需要与沮丧用户在发生故障时硬编码IP地址,但我可能是错的)。使用原始IP地址是一个不好的做法,但是这种限制会让hadoop变得更加困难。这是我可以找到一个真正的来源最接近的东西:https://issues.apache.org/jira/browse/HADOOP-685

要解决它,您可以主持您自己的DNS服务器(dnsmasq)和我们,或添加条目到/ etc/hosts所有机器制作'假'名称,并在配置中使用它们。对不起,我没有给你一个更好的解决方案...