2017-07-24 139 views
1

我有兩個在Ubuntu上運行的碼頭集裝箱,其中一個是hadoop namenode,另一個是hadoop datanode。無法連接到Docker主機以外的碼頭集裝箱

現在我有我在Windows上運行的java代碼使用Hadoop FileSystem api將文件從我的Windows文件系統複製到遠程docker hdfs。

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.FileUtil; 
import org.apache.hadoop.fs.Path; 
import org.junit.Test; 

import java.io.File; 

public class HadoopTest { 

    @Test 
    public void testCopyFileToHDFS() throws Exception { 
     Configuration configuration = new Configuration(); 
     configuration.addResource(getClass().getClassLoader().getResourceAsStream("hadoop/core-site.xml")); 
     configuration.addResource(getClass().getClassLoader().getResourceAsStream("hadoop/yarn-site.xml")); 
     FileSystem fileSystem = FileSystem.get(configuration); 
     FileUtil.copy(new File("c:\\windows-version.txt"),fileSystem, new Path("/testsa"), false,configuration); 
    } 
} 

,但我得到了以下錯誤:

16:57:05.669 [Thread-4] DEBUG org.apache.hadoop.hdfs.DFSClient - Connecting to datanode 172.18.0.2:50010 
16:57:15.654 [IPC Client (547201549) connection to /192.168.56.102:9000 from ignis] DEBUG org.apache.hadoop.ipc.Client - IPC Client (547201549) connection to /192.168.56.102:9000 from ignis: closed 
16:57:15.655 [IPC Client (547201549) connection to /192.168.56.102:9000 from ignis] DEBUG org.apache.hadoop.ipc.Client - IPC Client (547201549) connection to /192.168.56.102:9000 from ignis: stopped, remaining connections 0 
16:57:26.670 [Thread-4] INFO org.apache.hadoop.hdfs.DFSClient - Exception in createBlockOutputStream 
java.net.ConnectException: Connection timed out: no further information 
    at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) 
    at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717) 
    at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206) 
    at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:531) 
    at org.apache.hadoop.hdfs.DFSOutputStream.createSocketForPipeline(DFSOutputStream.java:1533) 
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.createBlockOutputStream(DFSOutputStream.java:1309) 
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1262) 
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:448) 
16:57:26.673 [Thread-4] INFO org.apache.hadoop.hdfs.DFSClient - Abandoning BP-53577818-172.18.0.2-1500882061263:blk_1073741827_1003 

你可以看到第一行錯誤,說:「連接到數據節點172.18.0.2:50010」是一個碼頭工人的內部IP地址。

我的Java代碼運行在Docker主機之外的真正的Windows機器上。

我已將Hadoop HDFS端口(例如9000和50010)映射到我的docker主機(ubuntu)。因此,我可以通過docker主機ip地址和HDFS端口訪問HDFS名稱節點。

下面是我的java代碼的邏輯:

1)Java代碼在Windows機器

2)Java代碼使用文件系統API運行從Windows到遠程複製HDFS文件。

3)客戶端可以通過使用搬運工主機的IP地址和從搬運工容器(例如9000)

4)HDFS的Namenode服務器將處理該請求從客戶端發送和返回數據節點的映射端口連接到HDFS名稱節點IP地址到客戶端。

5)客戶端嘗試通過使用數據節點的IP地址

6)客戶拿到這表示,這些數據節點的IP地址不能訪問錯誤從本地拷貝文件,因爲它的碼頭工人容器內的IP地址

enter image description here

+0

哪裏你的Java代碼是在運行嗎?爲什麼不能將這兩種服務的端口映射到主機? – Grimmy

+0

請看看我的更新。 –

+0

爲什麼不試試你指向'''192.168.1.25:50010''的java代碼,你應該在你的Docker容器中啓用端口。例如'''docker run -p 50010:50010''' –

回答

2

最後,我發現通過介紹主機名的DataNode,使HDFS客戶端使用主機名代替IP地址解決方案時,連接到數據節點,我的客戶也需要地圖數據節點主機名搬運工人主機的IP地址,如下詳細步驟:

  1. 的搬運工數據節點容器添加主機名搬運工,compose.xml

    主機名:datanode.company.com

  2. 啓用HDFS(服務器&客戶端),而不是使用IP地址的主機名。

<configuration> 
 
    <property> 
 
     <name>dfs.client.use.datanode.hostname</name> 
 
     <value>true</value> 
 
    </property> 
 
    <property> 
 
     <name>dfs.datanode.use.datanode.hostname</name> 
 
     <value>true</value> 
 
    </property> 
 
</configuration>

  1. 地圖搬運工數據節點主機名碼頭工人的主機IP地址通過在等文件添加一個條目/主機

    192.168.1.25 datanode.company.com

+0

謝謝。這真的幫了我。 – Zilvinas