一、搭建Hadoop 開發環境
我們在工作中寫完的各種代碼是在伺服器中運行的,HDFS 的操作代碼也不例外。 在開發階段,我們使用windows 下的eclipse 作為開發環境,訪問運行在虛擬機器中的HDFS。 也就是通過在本地的eclipse 中的java 代碼訪問遠端linux 中的hdfs。
要使用宿主機中的java 代碼訪問客戶機中的hdfs,需要保證以下幾點:
(1)確保宿主機與客戶機的網路是互通的
(2)確保宿主機和客戶機的防火牆都關閉,因為很多埠需要通過,為了減少防火牆配置,直接關閉.
(3)確保宿主機與客戶機使用的jdk 版本一致。 如果客戶機為jdk6,宿主機為jdk7,那麼代碼運行時會報不支援的版本的錯誤。
(4)宿主機的登錄使用者名必須與客戶機的使用者名一直。 比如我們linux 使用的是root 使用者,那麼windows 也要使用root 使用者,否則會報許可權異常
&HTTP://www.aliyun.com/zixun/aggregation/37954.html">nbsp;在eclipse 專案中覆蓋hadoop 的org.apache.hadoop.fs.FileUtil 類的checkReturnValue 方法,如圖1.1,目的是為了避免許可權錯誤。
圖1.1
如果讀者在開發過程中出現許可權等問題,請按照本節的提示檢查自己的環境。
二、使用FileSystem api 讀寫資料 在hadoop 的HDFS 操作中,有個非常重要的api,是org.apache.hadoop.fs.FileSystem,這是我們使用者代碼操作HDFS 的直接入口, 該類含有操作HDFS 的各種方法,類似于jdbc 中運算元據庫的直接入口是Connection 類。
那我們怎麼獲得一個FileSystem 物件?
View Code
以上代碼中,要注意調用的是FileSystem 的靜態方法get,傳遞兩個值給形式參數,第一個訪問的HDFS 位址,該位址的協定是hdfs,ip 是10.1.14.24,埠是9000。 這個位址的完整資訊是在設定檔core-site.xml 中指定的,讀者可以使用自己環境的設定檔中的設置。 第二個參數是一個設定物件。
1. 創建資料夾
使用HDFS 的shell 命令查看一下根目錄下的檔情況,如圖2.1所示。
圖2.1
我們在HDFS 的根目錄下創建資料夾,代碼如下
------------------------------------------------------------------------------------------------------
final String pathString = "/d1";
boolean exists = fs.exists(new Path(pathString));
if(!exists){
boolean result = fs.mkdirs(new Path(pathString));
System.out.println(result);
}
------------------------------------------------------------------------------------------------------
以上代碼中要放在Main函數中,
第一行決定創建的資料夾完整路徑是「/d1」。 第二行代碼是使用方法exitst判斷資料夾是否存在;如果不存在,執行創建操作。 第三行創建資料夾,調用的是mkdirs 方法,傳回值是布林值,如果是true,表示創建成功;如果是false,表示創建失敗。
現在查看一下是否成功了,如圖3.2,3.3可見創建成功了。
圖3.2
圖 3.3
2. 寫檔
我們可以向HDFS 寫入檔,代碼如下:
-----------------------------------------------------------------------------------------------------
final String pathString = "/d1/f1";
final FSDataOutputStream fsDataOutputStream = fs.create(new Path(pathString));//寫出去
IOUtils.copyBytes(new ByteArrayInputStream("my name is Sunddenly".getBytes()),
fsDataOutputStream, conf, true);
------------------------------------------------------------------------------------------------------
第一行代碼表示創建的檔是在剛才創建的d1 資料夾下的檔f1;
第二行是調用create 方法創建一個通向HDFS 的輸出流;
第三行是通過調用hadoop 的一個工具類IOUtils 的靜態方法copyBytes 把一個字串發送給輸出流中。
該靜態方法有四個參數:
第一個參數輸入流。 第二個參數是輸出流。 第三個參數是設定物件。 第四個參數是布林值,如果是true 表示資料傳輸完畢後關閉流。
現在看一下是否創建成功了,如圖3.4所示。
圖3.4
3. 讀檔
現在我們把剛才寫入到HDFS 的檔「/d1/f1」讀出來,代碼如下:
------------------------------------------------------------------------------------------------------
final String pathString = "/d1/f1";
final FSDataInputStream fsDataInputStream = fs.open(new Path(pathString));//讀進來
IOUtils.copyBytes(fsDataInputStream, System.out, conf, true);
-------------------------------------------------------------------------------------------------------
第一行指定所讀檔的路徑。 第二行表示調用方法open 打開一個指定的檔,傳回值是一個通向該檔的輸入流;第三行還是調用IOUtils.copyBytes 方法,輸出的目的地是主控台。
見圖3.5
圖3.5
4. 查看目錄清單和檔詳細資訊
我們可以把根目錄下的所有檔和目錄顯示出來,代碼如下
--------------------------------------------------------------------------------------------------------
final String pathString = "/";
final FileStatus[] listStatus = fs.listStatus(new Path(pathString));
for (FileStatus fileStatus : listStatus) {
final String type = fileStatus.isDir()?" 目錄":"檔";
final short replication = fileStatus.getReplication();
final String permission = fileStatus.getPermission() .toString();
final long len = fileStatus.getLen();
final Path path = fileStatus.getPath();
System.out.println(type+"\t"+permission+"\t"+replication+"\t"+len+"\t"+path);
}
-----------------------------------------------------------------------------------------------------------
調用listStatus方法會得到一個指定路徑下的所有檔和資料夾,每一個用FileStatus表示。 我們使用for迴圈顯示每一個 FileStatus物件。 FileStatus物件表示檔的詳細資訊,裡面含有類型、副本數、許可權、長度、路徑等很多資訊,我們只是顯示了一部分。 結 果如圖3.6所示。
圖 3.6
5. 刪除檔或目錄
我們可以刪除某個檔或者路徑,代碼如下
-----------------------------------------------------------------------------------------------------
final String pathString = "/d1/f1";
fs.delete(new Path("/d1"), true);
fs.deleteOnExit(new Path(pathString));
-----------------------------------------------------------------------------------------------------
第三行代碼表示刪除檔「/d1/f1」,注釋掉的第二行代碼表示遞迴刪除目錄「/d1」及下面的所有內容。 除了上面列出的fs 的方法外,還有很多方法,請讀者自己查閱api。
原文連結:HTTP://www.cnblogs.com/sunddenly/p/3983090.html