一、Eclipse配置時的問題
這裏使用的是Hadoop 2.7.0版本
具體配置問題不再贅述。這裏主要記錄一下配置端口時候遇到的問題。
如下圖所示,M/R Master host 默認的端口是50040,但是這樣配置會導致Connection Refuse問題。
通過以下這個命令可以查看打開的tcp端口,發現並沒有端口50040。
netstat -ntpl
使用jps命令查看JAVA進程,可看到NameNode進程的pid,然後對比上一條命令得到的端口信息,可知NameNode的端口並不是50040。
因此,我們要修改core-site.xml文件,我這裏因爲將core-site.xml文件中的fs.defaultFS設置成了hdfs://localhost:9000,因此造成了無法通過遠程連接上NameNode,只需將以下這個文件修改爲如下所示,即可。其中,在/etc/hosts文件夾中設置好namenode的IP,我這裏設置的是192.168.2.160。
這樣,就可以在你的PC上遠程連接服務器做一些工作了,不再受到噪音的干擾。。
二、使用Java API上傳文件的問題
使用Java代碼進行向HDFS文件操作的例子網上有很多就不詳述了,這裏提幾個自己遇到的問題,因爲我是進行遠程的Hadoop程序開發,因此在代碼中需要添加這行代碼:
conf.set("fs.defaultFS", "hdfs://namenode:50040");
否則會出現如下的錯誤:
java.lang.IllegalArgumentException: Wrong FS: hdfs://namenode:50040/home/storage/xx.pdf, expected: file:///
還有一點,如果要將Hadoop應用程序打成jar包的話,則需要添加如下兩行代碼:
conf.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());
conf.set("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class.getName());
否則會出現如下的錯誤:
java.io.IOException: No FileSystem for scheme: file
package com.cyber_space.hdfs;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
public class HDFSManager {
static Configuration conf = new Configuration();
static {
conf.set("fs.defaultFS", "hdfs://namenode:50040");
conf.set("fs.hdfs.impl",
org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());
conf.set("fs.file.impl",
org.apache.hadoop.fs.LocalFileSystem.class.getName());
}
public static void uploadFiles() throws Exception {
FileSystem fsFileSystem = FileSystem.get(conf);
Path srcPath = new Path("/Users/justyoung/Desktop/RoadMapiOS.pdf");
Path desPath = new Path("hdfs://namenode:50040/home/storage/xx.pdf");
fsFileSystem.copyFromLocalFile(srcPath, desPath);
System.out.println("success");
fsFileSystem.close();
}
public static void main(String args[]) {
try {
uploadFiles();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}