HDFS操做——使用 FileSystem api 讀寫數據

在 hadoop 的 HDFS 操做中,有個很是重要的 api,是 org.apache.hadoop.fs.FileSystem
這是咱們用戶代碼操做 HDFS 的直接入口,該類含有操做 HDFS 的各類方法,相似於 jdbc 中
操做數據庫的直接入口是 Connection 類。
那咱們怎麼得到一個 FileSystem 對象哪?
java

String uri = "hdfs://192.168.1.240:9000/";
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(uri), configuration);

以上代碼中,要注意調用的是 FileSystem 的靜態方法 get,傳遞兩個值給形式參數,第
一個訪問的 HDFS 地址,該地址的協議是 hdfs,ip 是 192.168.1.240,端口是 9000.。這個地
址的完整信息是在配置文件 core-site.xml 中指定的,讀者可使用本身環境的配置文件中的
設置。第二個參數是一個配置對象。
shell

1.建立文件夾

使用 HDFS 的 shell 命令查看一下根目錄下的文件狀況,如圖1所示。
這裏寫圖片描述
         圖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);
}

以上代碼中,咱們決定建立的文件夾完整路徑是「/d1」 。第二行代碼是使用方法 exitst
判斷文件夾是否存在;若是不存在,執行建立操做。建立文件夾,調用的是 mkdirs 方法,
返回值是布爾值,若是是 true,表示建立成功;若是是 false,表示建立失敗。
如今查看一下是否成功了,如圖2,可見建立成功了。
這裏寫圖片描述
            圖2
apache

2.寫文件

咱們能夠向 HDFS 寫入文件,代碼以下:api

final String pathString = "/d1/f1";
final FSDataOutputStream fsDataOutputStream = fs.create(new Path(pathString));
IOUtils.copyBytes(new ByteArrayInputStream("my name is ## ##".getBytes()),
fsDataOutputStream, configuration, true);

第一行代碼表示建立的文件是在剛纔建立的 d1 文件夾下的文件 f1;
第二行是調用 create 方法建立一個通向 HDFS 的輸出流;
第三行是經過調用 hadoop 的一個工具類 IOUtils 的靜態方法 copyBytes 把一個字符串發
送給輸出流中。該靜態方法有四個參數,第一個參數輸入流,第二個參數是輸出流,第三個
參數是配置對象,第四個參數是布爾值,若是是 true 表示數據傳輸完畢後關閉流。
如今看一下是否建立成功了,如圖3所示。
這裏寫圖片描述
           圖 3
markdown

3. 讀文件

如今咱們把剛纔寫入到 HDFS 的文件「/d1/f1」讀出來,代碼以下:
final String pathString = 「/d1/f1」;
final FSDataInputStream fsDataInputStream = fs.open(new Path(pathString));
IOUtils.copyBytes(fsDataInputStream, System.out, configuration, true);
第二行表示調用方法 open 打開一個指定的文件,返回值是一個通向該文件的輸入流;
第三行仍是調用 IOUtils.copyBytes 方法,輸出的目的地是控制檯。見圖 4
這裏寫圖片描述
            圖4
工具

4. 查看目錄列表和文件詳細信息

咱們能夠把根目錄下的全部文件和目錄顯示出來,代碼以下:oop

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對象表示文件的詳細信息,裏面含有類型、
副本數、權限、長度、路徑等不少信息,咱們只是顯示了一部分。結果如圖5所示。
這裏寫圖片描述
           圖5
ui

5. 刪除文件或目錄

咱們能夠刪除某個文件或者路徑,代碼以下spa

final String pathString = "/d1/f1";
//fs.delete(new Path("/d1"), true);
fs.deleteOnExit(new Path(pathString));

第三行代碼表示刪除文件「/d1/f1」 ,註釋掉的第二行代碼表示遞歸刪除目錄「/d1」及 下面的全部內容。 除了上面列出的 fs 的方法外,還有不少方法,請讀者本身查閱 api。

相關文章
相關標籤/搜索