【Hortonworks Ambari】研究筆記(五):使用 .NET 存取 HDFS 檔案與資料夾

  cluster 建立完成後,就可以開始使用 .NET 存取 HDFS。

  本篇使用 Nuget 套件:Microsoft .NET API For Hadoop WebClient 進行存取。

  這次研究的主要目的是為了存放海量的圖檔,並不會對檔案內容進行修改。

  思考所需要的操作,發現只需要取得目錄列表、取得檔案列表、建立目錄、刪除目錄、上傳檔案、刪除檔案、下載檔案這幾個功能就夠了。

1、建立連線

  建立一個 HDFSAccess 類別,並在建構式時傳入 HDFS 的客戶端進入端點及 HDFS 帳號。

  • 預設端點:http://[HDFS cluster Client 主機名稱]:50070
  • 預設帳號:hdfs
public sealed class HDFSAccess
{
    private readonly WebHDFSClient webHDFSClient;

    public HDFSAccess(string uriString, string userName)
    {
        this.webHDFSClient = new WebHDFSClient(new Uri(uriString), userName);
    }
}

2、取得目錄列表

  使用 GetDirectoryStatus 方法取得目錄列表。

public List<string> GetDirectories(string path)
{
    var directoryStatus = this.webHDFSClient.GetDirectoryStatus(path).Result;

    return directoryStatus.Directories.Select(d => d.PathSuffix).ToList();
}

3、取得檔案列表

  使用 GetDirectoryStatus 方法取得檔案列表。

public List<string> GetFiles(string path)
{
    var directoryStatus = this.webHDFSClient.GetDirectoryStatus(path).Result;

    return directoryStatus.Files.Select(d => d.PathSuffix).ToList();
}

4、建立目錄

  使用 CreateDirectory 方法建立目錄。

public bool CreateDirectory(string path)
{
    // 傳入路徑不包含根目錄時,預設會在根目錄「/」底下
    return this.webHDFSClient.CreateDirectory(path).Result;
}

5、刪除目錄

  使用 DeleteDirectory 方法刪除目錄。

public bool DeleteDirectory(string path)
{
    // 傳入路徑不包含根目錄時,預設會在根目錄「/」底下
    return this.webHDFSClient.DeleteDirectory(path).Result;
}

6、上傳檔案

  使用 CreateFile 方法上傳檔案至 HDFS。

回傳值為 HDFS 檔案 uri。
public string CreateFile(string localFile, string remotePath)
{
    // 傳入遠端路徑不包含根目錄時,預設會在根目錄「/」底下
    return this.webHDFSClient.CreateFile(localFile, remotePath).Result;
}

7、刪除檔案

  使用 DeleteDirectory 方法刪除檔案。

public bool DeleteFile(string path)
{
    // 傳入路徑不包含根目錄時,預設會在根目錄「/」底下
    return this.webHDFSClient.DeleteDirectory(path).Result;
}

8、下載檔案

  使用 OpenFile 方法得到檔案 Stream,再轉存成實體檔案即可。

回傳值為 HttpResponseMessage,其中的 Content 為檔案 Stream,可轉存成實體檔案。
public HttpResponseMessage OpenFile(string path)
{
    // 傳入路徑不包含根目錄時,預設會在根目錄「/」底下
    return this.webHDFSClient.OpenFile(path).Result;
}

嘗試將自己的理解寫成文字紀錄,資料來源均來自於網路。

如有理解錯誤、引用錯誤或侵權,請多加指正與告知,讓我有更多的進步與改進的空間,謝謝!