1. 程式人生 > >hadoop--hdfs基礎功能實現

hadoop--hdfs基礎功能實現

package hadoop;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.commons.io.IOUtils;
import org.apache.hadoop.conf.Configuration;
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 {
	FileSystem fs = null;
	
	@Before
	public void init() throws IOException, InterruptedException, URISyntaxException{
		//建立配置檔案物件  用來讀取classpath下的配置檔案
		Configuration conf = new Configuration();
		//由於沒有匯入配置檔案,此處使用set方法直接設定這個引數
		conf.set("fs.dafaultFS", "hdfs://192.168.245.129:9000/");
		//獲取一個具體檔案系統的客戶端的操作例項物件,指定URL和使用者名稱 ,在非hadoop伺服器中必須要指定hadoop伺服器的使用者名稱
		fs = FileSystem.get(new URI("hdfs://192.168.245.129:9000/"), conf, "hadoop");
		
		
	}

	//上傳檔案
	@Test
	public void upload() throws IOException, InterruptedException, URISyntaxException{
		//建立path物件。此處指定的是檔案上傳後存放的位置
		Path path = new Path("/txt/122.txt");
		//建立檔案寫入到伺服器的流
		FSDataOutputStream os = fs.create(path);
		//建立本地的讀取檔案的流
		FileInputStream is = new FileInputStream("c:/aaa.txt");
		//呼叫工具類中的放大將本地的檔案寫入到遠端伺服器內
		IOUtils.copy(is, os);
		
		
	}
	//使用fs裡面封裝的方法進行上傳
	@Test
	public void uploadeasy() throws IllegalArgumentException, IOException{
		//前面的引數是本地地址   後面引數是伺服器地址     本方法是直接將本地檔案複製到伺服器裡面去
		//         即前面的是來源  後面的是目標
		fs.copyFromLocalFile(new Path("c:/aaa.txt"), new Path("/txt/ghj/132.txt"));
	}
	
	//下載檔案
	@Test
	public void download() throws IllegalArgumentException, IOException{
		//fs.copyToLocalFile(new Path("/txt/132.txt"), new Path("f:/aa1.txt"))  使用該方法可能會出現
		//空指標異常,可能原因是Windows上出現相容性問題,可以用一下方法代替
		// 引數意義: 是否刪除源目錄   源地址     目標地址   是否使用本地檔案系統
		fs.copyToLocalFile(false,new Path("/txt/132.txt"), new Path("f:/aa1.txt"),true);
	}

	//檢視檔案資訊
	@Test
	public void listFile() throws FileNotFoundException, IllegalArgumentException, IOException{
		//該方法只能檢視到目錄下的檔案的名稱,目錄名稱看不到
		                                                //引數  路徑    是否迴圈遍歷目錄裡面的檔案
		RemoteIterator<LocatedFileStatus> files = fs.listFiles(new Path("/"), true);
		while (files.hasNext()) {
			LocatedFileStatus file =  files.next();
			Path filePath = file.getPath();
			//通過path來獲取到檔案的名稱
			String name = filePath.getName();
			System.out.println(name);
			
		}
		System.out.println("===========================");
		
		//該方法能看到當前目錄下的檔案和目錄  如果需要檢視目錄裡面的檔案,需要自己遞迴呼叫
		FileStatus[] listStatus = fs.listStatus(new Path("/"));	
		for (FileStatus status : listStatus) {
			Path path = status.getPath();
			String name = path.getName();
			System.out.println(name);		
		}
	}
	
	//建立目錄
	@Test
	public void mkdir() throws IllegalArgumentException, IOException{
		fs.mkdirs(new Path("/bbb/ccc"));
	}
	
	//刪除目錄或檔案
	@Test
	public void delete() throws IllegalArgumentException, IOException{
		//刪除指定的目錄
		//引數意義:  路徑   是否遞迴刪除裡面的內容
		fs.delete(new Path("/text"), true);
	}
}

記得需要匯入相應的jar包