天天看點

外網無法通路HDFS解決方法

原文連結:https://blog.csdn.net/vaf714/article/details/82996860

A 雲主機是 Linux 環境,搭建 Hadoop 僞分布式,公網 IP:49.4.71.xxx,内網 IP:192.168.0.80,主機名:ruixin4。

Hadoop 配置資訊如下:

<property>
    <name>fs.defaultFS</name>
    <value>hdfs://ruixin4:8020</value>
</property>
           

Hosts 檔案配置:

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.80 ruixin4
           

在 A 雲主機上開啟 HDFS,JPS 檢視程序都沒有異常,通過 Shell 操作 HDFS 檔案也沒有問題。

通過浏覽器通路 50070 端口管理界面也沒有問題。

在本地機器上使用 Java API 操作遠端 HDFS 檔案,URI 使用公網 IP,代碼如下:

可以正常建立檔案夾

可以正常建立檔案

往建立完檔案傳回的輸出流中寫入内容是報如下異常

本地 Shell 可以正常操作,排除叢集搭建和程序沒有啟動的問題。

我在另一台雲主機(B 雲主機)中搭建了開發環境,B 主機和 A 主機在同一内網,在 B 中可以正常操作,基本确定了是由于内外網的原因。

查閱資料發現 HDFS 中的檔案夾和檔案名都是存放在 NameNode 上,操作不需要和 DataNode 通信,是以可以正常建立檔案夾和建立檔案說明本地和遠端 NameNode 通信沒有問題。

那麼很可能是本地和遠端 DataNode 通信有問題

檔案夾和檔案名都是存放在 NameNode 上的,我本地可以通過公網通路 NameNode,是以建立檔案夾和檔案都可以,但是當我寫資料的時候,NameNode 和DataNode 是通過内網通信的,NameNode 會傳回給我 DataNode 的内網 IP,我本地就通路不了了。

還有一種可能,雲伺服器沒有開放 DataNode 用于資料傳輸服務端口 預設是 50010。

想辦法使本地可以通路到 DataNode。

添加一句配置,使 NameNode 傳回 DataNode 的主機名而不是 IP:

本地可以拿到了 DataNode 的主機名,要通路還需要配置本地 Hosts 映射:

49.4.71.xxx  ruixin4

           

雲伺服器打開 50010 端口

結果正常通路操作結果正常通路操作

将hdfs.site.xml放到項目目錄的resources中

繼續閱讀