Hadoop入門-3.HDFS的簡單API(demo)(基於hadoop-2.7.3)
條件準備
下載部署
下載Hadoop-2.7.3.tar.gz包,可以去官網下載。也可以下載原始碼編譯:點選開啟連結
然後部署在Linux上,可以參考點選開啟連結
win下eclipse開發配置
通常習慣,我們會在win的eclipse下開發,那麼下載下來的是基於Linux的編譯後的包,包下的bin資料夾不相容windows,那麼在呼叫某些API時會報錯:參考後文的報錯。
解決方法:
1、我們需要獲取基於windows下編譯的bin資料夾替換掉Hadoop-2.7.3.tar.gz解壓後中的bin檔案(可以下載原始碼包在windows下編譯獲取bin資料夾,通常我們嫌麻煩,所以直接找資源下載下來:
2、配置環境變數,增加變數HADOOP_HOME,值是下載的zip包解壓的目錄,然後在系統變數path裡增加%HADOOP_HOME%\bin 。
3、壓縮包裡的hadoop.dll,並拷貝到c:\windows\system32目錄中。
報錯:
如果下載的版本與hadoop不對應,或者windows環境沒配置好,會報錯:
1、java.io.IOException: (null) entry in command string: null chmod 0644
2、java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO
如果是在Linux中的eclipse開發可以忽略上面的配置步驟。
Demo開發
1.新建工程,然後新增必要的依賴:
將Hadoop的common模組所需要的依賴(公用模組)在eclipse中打成自定義library :Hadoop-common
將Hadoop的hdfs模組所需要的依賴(HDFS檔案系統模組)在eclipse中打成自定義library :Hadoop-hdfs
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.net.URI; import org.apache.commons.io.IOUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.LocatedFileStatus; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.RemoteIterator; import org.junit.Before; import org.junit.Test; public class HdfsUtil { private FileSystem fs = null; /** * 建立連線 * @throws Exception */ @Before public void init() throws Exception{ Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://server201:9000/"); fs = FileSystem.get(new URI("hdfs://server201:9000/"),conf,"root"); } /** * 快捷上傳檔案的API * @throws IllegalArgumentException * @throws IOException */ @Test public void testUpload() throws IllegalArgumentException, IOException{ fs.copyFromLocalFile(new Path("G:/demo.ktr"), new Path("/demo.ktr")); } /** * 快捷下載檔案的API * (win下呼叫此API如何不配置本地haoop環境就會報異常: * null chmod 0644 * ) * @throws IllegalArgumentException * @throws IOException */ @Test public void testDownload() throws IllegalArgumentException, IOException{ fs.copyToLocalFile(new Path("/demo.ktr"), new Path("G:/demo123.ktr")); } /** * 建立目錄 * @throws IllegalArgumentException * @throws IOException */ @Test public void testMkdir() throws IllegalArgumentException, IOException{ fs.mkdirs(new Path("/aaa/bbb/ccc")); } /** * 刪除目錄或者目錄 * 方法的第二個引數 代表是否遞迴刪除,只有刪除目錄時這個引數有效 * 如果是刪除檔案則該引數無效 * @throws IllegalArgumentException * @throws IOException */ @Test public void testRm() throws IllegalArgumentException, IOException{ fs.delete(new Path("/user"), true); } /** * 重新命名 * @throws IllegalArgumentException * @throws IOException */ @Test public void testRename() throws IllegalArgumentException, IOException{ fs.rename(new Path("/hadoop-2.4.1.tar.gz"), new Path("/hadoop.tar.gz")); } /** * 遍歷hdfs檔案和目錄 * @throws FileNotFoundException * @throws IllegalArgumentException * @throws IOException */ @Test public void testList() throws FileNotFoundException, IllegalArgumentException, IOException{ RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true); while(listFiles.hasNext()){ LocatedFileStatus file = listFiles.next(); System.out.println(file.getPath()); } System.out.println("----------------------------------"); FileStatus[] listStatus = fs.listStatus(new Path("/")); for(FileStatus fileStatus: listStatus){ System.out.println((fileStatus.isDirectory()? "-d- ":"-f- ") + fileStatus.getPath()); } } /** * 通過宣告流來下載檔案 * @throws IllegalArgumentException * @throws IOException */ @Test public void testGet() throws IllegalArgumentException, IOException{ FSDataInputStream is = fs.open(new Path("/demo111.ktr")); FileOutputStream os = new FileOutputStream("G:/demo112.ktr"); IOUtils.copy(is, os); } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://server201:9000/"); FileSystem fs = FileSystem.get(new URI("hdfs://server201:9000/"),conf,"root"); FSDataOutputStream fsDataOutputStream = fs.create(new Path("/demo.ktr")); FileInputStream fileInputStream = new FileInputStream("G:/demo.ktr"); IOUtils.copy(fileInputStream, fsDataOutputStream); } }