問題描述:
在阿里云服務(wù)器搭建完Hadoop環(huán)境后员帮,在服務(wù)器上用shell命令可以讀取寫入文件
在本地java程序可以連接hadoop,并創(chuàng)建路徑捞高。
Boolean result = fileSystem.mkdirs(path);
但是讀取hdfs上的文件就報(bào)錯(cuò)渣锦。
FSDataInputStream fsDataInputStream =fileSystem.open(new Path("/README.txt"));
IOUtils.copyBytes(fsDataInputStream,System.out,1024);
問題原因:
1.阿里云服務(wù)器Shell 可以正常操作泡挺,排除集群搭建和進(jìn)程沒有啟動(dòng)的問題命浴。
2.HDFS 中的文件夾和文件名都是存放在 NameNode 上贱除,操作不需要和 DataNode 通信,因此可以正常創(chuàng)建文件夾和創(chuàng)建文件說明本地和遠(yuǎn)程 NameNode 通信沒有問題碍讯。
3.那么很可能是本地和遠(yuǎn)程 DataNode 通信有問題扯躺。
4.猜測(cè)問題原因?yàn)椋何募A和文件名都是存放在 NameNode 上的,我本地可以通過公網(wǎng)訪問 NameNode录语,所以創(chuàng)建文件夾和文件都可以,但是當(dāng)我寫數(shù)據(jù)的時(shí)候虽缕,NameNode 和DataNode 是通過內(nèi)網(wǎng)通信的蒲稳,NameNode 會(huì)返回給我 DataNode 的內(nèi)網(wǎng) IP,我本地就訪問不了了江耀。
還有一種可能祥国,云服務(wù)器沒有開放 DataNode 用于數(shù)據(jù)傳輸服務(wù)端口 默認(rèn)是 50010。
解決問題:
1.構(gòu)造HDFS客戶端的時(shí)候加如下配置系宫,使 NameNode 返回 DataNode 的主機(jī)名而不是 IP
configuration = new Configuration();
configuration.set("dfs.client.use.datanode.hostname", "true");
2.阿里云服務(wù)器的host配置如下:
/etc/hosts
172.xx.xx.xx hadoop000
3.阿里云服務(wù)器開放50010端口
問題解決了!扩借!