HDFS的java訪問介面

來源:互聯網
上載者:User
一、搭建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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.