2017-02-22 91 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所有機器製作'假'名稱,並在配置中使用它們。對不起,我沒有給你一個更好的解決方案...