Hadoop入門(3)Shell和JAVA的簡單演示+代碼實現基礎雲盤功能

目錄

一、Shell的使用

二、JAVA api的使用

(一)配置xml文件

(二)簡單代碼demo(創建、查看、上傳、下載)

三、Python的使用

四、參考與推薦


一、Shell的使用

  • 平時的linux指令是針對本地電腦進行的,而HDFS是分佈式的,它針對的是通過網絡連接的計算機集羣,因此在指令上有所區別。
  • 在大部分普通linux指令前加上“hdfs dfs -”即可。
  • 例如我們想要創建一個文件夾,平時都是用“mkdir /test1”指令在本地虛擬機上創建"test1"目錄,但是如果想要在HDFS中創建一個“test1”目錄,就需要在普通linux指令前加上“hdfs dfs -”,如下。
hdfs dfs -mkdir /test1

 

  • 在web網頁上可以看到我們的確已經創建好了目錄test1。 

二、JAVA api的使用

  • 由上面的例子可以看到,我們可以通過shell操縱我們的HDFS,通過shell創建了一個目錄,那如何用java api進行同樣的操作呢?

(一)配置xml文件

1、創建項目

  • 在本機電腦上用ecplise創建JAVA項目,不贅述。

2、導包

  • 找到hadoop的路徑,進入“..hadoop-2.7.0\share\hadoop\common”路徑,看到有三個Jar包,將它導入到JAVA項目中。 
  • 同樣的,再將“..hadoop-2.7.0\share\hadoop\common\lib”下的所有jar包導入。
  • 再將“..hadoop-2.7.0\share\hadoop\hdfs”下的3個jar包導入。
  • 再將“..hadoop-2.7.0\share\hadoop\hdfs\lib”下的所有jar包導入。

3、導入虛擬機的配置文件

  • 利用xftp進入到虛擬機的“.../hadoop-2.7.0/etc/hadoop”目錄下,找到兩個文件“hdfs-site.xml”和"core-site.xml",導出並放到項目的/src根目錄下。 

  • 要修改“core-site.xml”裏面的“localhost”爲虛擬機的IP地址,不然本機無法找到虛擬機,它不知道這個“localhost”是誰。(其實也可以在本機上配置host的,使得別名和IP對應,繼續使用別名) 

  • 修改 

  • 同樣的也要修改"hdfs-site.xml"中的虛擬機名爲IP地址。 

  • 運行如下代碼,創建目錄:
package com.bigdata.yunpan;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;


public class YunPanDemo {
		public static void main(String[] args) {
			Configuration conf=new Configuration();  //負責獲取相應虛擬機的配置文件信息
			try {
				FileSystem fs=FileSystem.get(conf);  //文件系統的管理類
				Path path=new Path("/yunpan");
				fs.mkdirs(path);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
}

在這過程中可能出現的兩個問題。

一、報錯ConnnectionRefuse。

我的解決方法:從僞分佈式改成完全分佈式模式。 所以最好參考官方文檔提示,一一排除錯誤。或者也可以參考別的博客:9000端口拒絕訪問

二、報錯AccessControlException。

是因爲權限不夠大,執行修改權限命令chmod,改權限即可。

hdfs dfs -chmod -R 777 /

R是遞歸遍歷子目錄的意思,這句話的意思就是修改根目錄/下的所有文件權限爲777

  • 在web上可以發現,和shell命令的使用效果一樣,的確多了一個目錄叫做"yunpan"。 

  • 接下來我們參考API文檔寫程序,就可以在雲盤上創建/上傳/下載新文件了,就像一個自用的百度網盤一樣。

(二)簡單代碼demo(創建、查看、上傳、下載)

package com.bigdata.yunpan;

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

/**
 *	一個簡易的示例demo2
 */
public class HdfsDemo {
    public static void main(String[] args) {
    	createList("/yunpan");
    	//createFolder("/yunpan");
        //uploadFile("/yunpan/upload.doc ","e://upload.doc");
	//downloadFile("/yunpan/download.doc","e:// download.doc");
        //listFile(new Path("/"));
    }
    
    /**
     * 列出所有文件的名字
     * @param path 待查詢路徑
     */
    public static void listFile(Path path) {
    	Configuration conf = new Configuration();
	    try {
	    FileSystem fs = FileSystem.get(conf);
	    //傳入路徑,表示對某個路徑下的文件夾列表進行顯示
	    //將給定路徑下所有的文件元數據放到一個FileStatus的數組中。
	    //FileStatus對象封裝了文件的和目錄的元數據,包括文件長度、塊大小、權限等信息
	    	    FileStatus[] fileStatusArray = fs.listStatus(path);
	    	    for (int i = 0; i < fileStatusArray.length; i++) {
	    	         FileStatus fileStatus = fileStatusArray[i];
	    	       //首先檢測當前檢測是否是文件夾,如果“是”則進行遞歸 
	    		    if (fileStatus.isDirectory()) {
	    		        System.out.println("當前路徑是:" + fileStatus.getPath());
	    			   listFile(fileStatus.getPath());
	    		    } else {
	    		        System.out.println("當前路徑是:"  + fileStatus.getPath());
	    		    }
	    	    }
	    } catch (IOException e) {
	    e.printStackTrace();
	    }
    }
    
    /**
     * 在路徑下創建一個文件夾
     * @param p 路徑
     */
    public static void createFolder(String p) {
    	// 定義一個配置對象
    	Configuration conf = new Configuration();
    	try {
    		// 通過配置信息得到文件系統的對象
    		FileSystem fs = FileSystem.get(conf);
    		//在指定的路徑下創建文件夾
    		Path path = new Path(p);
    		fs.mkdirs(path);
    	} catch (IOException e) {
    		e.printStackTrace();
    	}
    }

   /**
    * 上傳文件
    * @param webPath  要放置在web上的路徑
    * @param localPath 待上傳文件的路徑
    */
    public static void uploadFile(String webPath,String localPath) {
    	Configuration conf = new Configuration();
    	try {
    		FileSystem fs = FileSystem.get(conf);
    		//定義文件的路徑和上傳的路徑
    		Path src = new Path(localPath);
    		Path dest = new Path(webPath);
    		//從本地上傳文件到服務器
    		fs.copyFromLocalFile(src, dest);
    	} catch (IOException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
    }
    
    /**
     * 下載文件
     * @param webPath  在web上,待下載文件的路徑
     * @param localPath 待下載的本地路徑
     */
    public static void downloadFile(String webPath,String localPath) {
    	Configuration conf = new Configuration();
    	try {
    		FileSystem fs = FileSystem.get(conf);
    		//定義下載文件的路徑和本地下載路徑
    		Path src = new Path(webPath);
    		Path dest = new Path(localPath);
    		//從服務器下載文件到本地
    		fs.copyToLocalFile(src, dest);
    	} catch (IOException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
    }
    
    /**
     * 創建目錄
     * @param p  創建目錄的路徑
     */
    public static void createList(String p) {
		Configuration conf=new Configuration();  //負責獲取相應虛擬機的配置文件信息
		try {
			FileSystem fs=FileSystem.get(conf);  //文件系統的管理類
			Path path=new Path(p);   
			fs.mkdirs(path);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

三、Python的使用

自行查看官方文檔。 python-api

四、參考與推薦

  1. hadoop-java-api官方文檔
  2. Shell使用指南(中文)
  3. python-api
  4. hadoop中端口號的含義
  5. Hadoop中JAVA的常用操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章