1. 程式人生 > >Hadoop入門-3.HDFS的簡單API(demo)(基於hadoop-2.7.3)

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);
		
		
	}
	

}