大數據(hadoop-HDFS的本地開發環境的配置與常見的HDFS的JAVA API)

HDFS的本地開發環境搭建

1:所需工具java

1)hadoop2.7.3安裝包
2)hadoop-eclipse-plugin插件
https://github.com/winghc/hadoop2x-eclipse-plugingit

2:搭建過程github

1:解壓hadoop2.7.3文件
2:下載hadoop-eclipse-plugin插件
3:解壓hadoop2.7.3
4:設置hadoop的環境變量
    添加系統變量HADOOP_HOME
    添加hadoop的bin目錄到PATH中
5:添加hadoop.dll和winutils.exe 到hadoop的解壓目錄中的bin目錄中
    (hadoop.dll和winutils.ext在hadoop-eclipse-plugin目錄裏面)

6:將hadoop-eclipse的插件放入eclipse的plugins目錄中
7:在eclipse中配置hadoop的安裝目錄
8:配置eclipse的DFS location


HDFS Java API介紹

configuration類:
    該類的對象封裝了配置信息,這些配置信息來自core-*.xml
FileSystem類:
    文件系統類,可以使用該類的方法對文件/目錄進行操做。通常經過FileSystem的靜態方法get得到一個文件系統對象
FSDataInputStream和FSDataOutputStream類:
    HDFS中的輸入輸出流。分別經過FileSystem的Open方法和create方法得到apache

以上類均來自java包:org.apache.hadoop.fs編程

示例代碼,看工程裏的JAVA代碼數組

Configution config=new Configution();
FileSystem hdfs = FileSystem.get(config);
Path srcPath = new Path(srcFile);
Path dstPath = new Path(dstFile);
hdfs.copyFromLocalFile(srcPath, dstPath);eclipse

package com.andy;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;

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.Path;
import org.apache.hadoop.io.IOUtils;

public class HdfsTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			System.setProperty("HADOOP_USER_NAME","hadoop") ;
//			downFromHdfs() ;
//			uploadFileToHdfs() ;
//			mkdirToHdfs() ;
//			createFile() ;
//			renameFileOrDir() ;
//			listDir() ;
			delFile() ;
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//下載文件
	public static void downFromHdfs() throws Exception{
		String path = "hdfs://192.168.153.111:9000" ;
		URI uri = new URI(path) ;
		FileSystem fs = FileSystem.get(uri, new Configuration()) ;
		
		//Hadoop文件系統中經過Hadoop Path對象來表明一個文件
		Path src = new Path("/tfiles/a.txt") ;
		FSDataInputStream in = fs.open(src);
		
		File targetFile = new File("d://aa.txt") ;
		FileOutputStream out = new FileOutputStream(targetFile) ;
		//IOUtils是Hadoop本身提供的工具類,在編程的過程當中用的很是方便
		//最後那個參數就是是否使用完關閉的意思
		IOUtils.copyBytes(in, out, 4096, true);
		System.out.println("=========文件下載成功=========");
	}
	
	//2:上傳文件
	public static void uploadFileToHdfs() throws Exception{
		//針對這種權限問題,有集中解決方案,這是一種,還能夠配置hdfs的xml文件來解決
		//System.setProperty("HADOOP_USER_NAME","hadoop") ;
		
		//FileSystem是一個抽象類,咱們能夠經過查看源碼來了解
		String path = "hdfs://192.168.153.111:9000" ;
		URI uri = new URI(path) ;//建立URI對象  
		FileSystem fs = FileSystem.get(uri, new Configuration()) ;//獲取文件系統
		//建立源地址
		Path src = new Path("d://aa.txt") ;
		//建立目標地址
		Path dst = new Path("/") ;
		//調用文件系統的複製函數,前面的參數是指是否刪除源文件,true爲刪除,不然不刪除 
		fs.copyFromLocalFile(false, src, dst);
		//最後關閉文件系統
		System.out.println("=========文件上傳成功==========");
		fs.close();//固然這裏咱們在正式書寫代碼的時候須要進行修改,在finally塊中關閉
	}
	
	//3:建立文件夾
	public static void mkdirToHdfs(){
		
		String path = "hdfs://192.168.153.111:9000" ;
		URI uri = null ;
		FileSystem fs = null ;
		try {
			//建立URI對象  
			uri = new URI(path);
			fs = FileSystem.get(uri, new Configuration()) ;//獲取文件系統
			Path dirPath = new Path("/mktest") ;
			fs.mkdirs(dirPath) ;
		} catch (Exception e) {			
			e.printStackTrace();
		}finally{
		  try {
				fs.close();
		  } catch (IOException e) {
				e.printStackTrace();
		  }
		}
		System.out.println("==========建立目錄成功=========");
	}
	
	//4:建立文件
	public static void createFile(){
		
		String path = "hdfs://192.168.153.111:9000" ;
		//建立URI對象  
		URI uri = null ;
		FileSystem fs = null ;
		FSDataOutputStream out = null ;
		try {
			uri = new URI(path);
			fs = FileSystem.get(uri, new Configuration()) ;//獲取文件系統
			Path dst = new Path("/mktest/aa.txt") ;//要建立的文件的路徑
			byte[] content = "我愛大家".getBytes() ;
			//建立文件
			out = fs.create(dst) ;
			//寫數據
			out.write(content);
			System.out.println("=======文件建立成功========");
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				//關閉流
				out.close();
				fs.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}
	
	//5:文件重命名
	public static void renameFileOrDir(){
		
		String path = "hdfs://192.168.153.111:9000" ;
		//建立URI對象  
		URI uri = null ;
		FileSystem fs = null ;
		
		//舊文件名稱的path
//			Path oldName = new Path("/mktest/aa.txt") ;
//			Path newName = new Path("/mktest/bb") ;		
		Path oldName = new Path("/mktest") ;
		Path newName = new Path("/mktest2") ;	
		try {
			uri = new URI(path);
			fs = FileSystem.get(uri, new Configuration()) ;//獲取文件系統
			fs.rename(oldName, newName) ;
			System.out.println("=========重命名成功========");
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				fs.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	//遍歷文件系統的某個目錄
	public static void listDir(){
		
		String path = "hdfs://192.168.153.111:9000" ;
		//建立URI對象  
		URI uri = null ;
		FileSystem fs = null ;
		try {
			uri = new URI(path) ;
			fs = FileSystem.get(uri, new Configuration()) ;
			//輸入要遍歷的目錄路徑
			Path dst = new Path("/tfiles") ;
			//調用listStatus()方法獲取一個文件數組  
			//FileStatus對象封裝了文件的和目錄的元數據,包括文件長度、塊大小、權限等信息
			FileStatus[] liststatus = fs.listStatus(dst) ;
			for (FileStatus ft : liststatus) {
				//判斷是不是目錄
				String isDir = ft.isDirectory()?"文件夾":"文件" ;
				//獲取文件的權限
				String permission = ft.getPermission().toString() ;
				//獲取備份塊
				short replication = ft.getReplication() ;
				//獲取數組的長度
				long len = ft.getLen() ;
				//獲取文件的路徑
				String filePath = ft.getPath().toString() ;
				System.out.println("文件信息:");
				System.out.println("是不是目錄? "+isDir);
				System.out.println("文件權限 "+permission);
				System.out.println("備份塊 "+replication);
				System.out.println("文件長度  "+len);
				System.out.println("文件路勁  "+filePath);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				fs.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}
	
	//刪除文件
	public static void delFile(){
		
		String path = "hdfs://192.168.153.111:9000" ;
		//建立URI對象  
		URI uri = null ;
		FileSystem fs = null ;
		try {
			uri = new URI(path) ;
			fs = FileSystem.get(uri, new Configuration()) ;
//				Path dst = new Path("/job.txt") ;
			Path dst = new Path("/mktest2") ;
			
			//永久性刪除指定的文件或目錄,若是目標是一個空目錄或者文件,那麼recursive的值就會被忽略。
			//只有recursive=true時,一個非空目錄及其內容纔會被刪除
			boolean flag = fs.delete(dst, true) ;
			if(flag){
				System.out.println("==========刪除成功=========");
			}else{
				System.out.println("==========刪除失敗=========");
			}			
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				fs.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}
}
相關文章
相關標籤/搜索