[料理佳餚] C# Microsoft.Hadoop.WebClient 執行 HDFS 基本檔案操作

同事架設了 Hadoop 用來測試 HDFS,公司有海量的圖檔需要做永久存放的需求,而且都要是 Online 的,在思考解決方案時先考慮到的就是分散式的儲存系統,Hadoop 正夯,所以就拿它來試試看,Hadoop 有很多功能可以使用,但是我們只需要 HDFS 就好了。

以下介紹如何用 Microsoft.Hadoop.WebClient 做 HDFS 基本的檔案操作,Microsoft.Hadoop.WebClient 在 Nuget 就下載得到。

建立連線

建立連線就直接建立 Microsoft.Hadoop.WebHDFS.WebHDFSClient 實例就可以了,記得重覆利用。

private WebHDFSClient CreateWebHDFSClient()
{
    return new WebHDFSClient(new Uri("HDFS Name Node Uri"), "Hadoop Account");
}

列出目錄清單

private IEnumerable<string> ListDirectories()
{
    // 要操作 /user 底下的目錄及檔案,必須先給予我們的 Hadoop 帳號權限。
    var dirStatus = this.webHDFSClient.GetDirectoryStatus("/user 底下的相對路徑").Result;

    return dirStatus.Directories.Select(d => $"/{d.PathSuffix}");
}

成功列出目錄清單

列出檔案清單

private IEnumerable<string> ListFiles()
{
    var dirStatus = this.webHDFSClient.GetDirectoryStatus("/user 底下的相對路徑").Result;

    return dirStatus.Files.Select(d => $"/{d.PathSuffix}");
}

成功列出檔案清單

建立目錄

目錄如果建立成功後就會收到 True

private bool CreateDirectory()
{
    string targetDirectory = "目錄在 /user 底下欲擺放的相對路徑";

    return this.webHDFSClient.CreateDirectory(targetDirectory).Result;
}

上傳檔案

private string UploadFile()
{
    string targetFilePath = "檔案在 /user 底下欲擺放的相對路徑";

    return this.webHDFSClient.CreateFile("要上傳的檔案路徑", targetFilePath).Result;
}

檔案上傳成功後就會收到一串 hdfs:// 開頭的路徑

下載檔案

下載檔案相對單純許多,找到檔案的路徑後,直接呼叫 OpenFile 就可以得到 Stream,把它儲存下來就行了。

private void DownloadFile()
{
    string fileOpened = "欲下載的檔案在 /user 底下擺放的相對路徑";

    var response = this.webHDFSClient.OpenFile(fileOpened).Result;
    var stream = response.Content.ReadAsStreamAsync().Result;

    using (FileStream fs = File.Create("欲儲存的絕對路徑"))
    {
        stream.CopyTo(fs);
    }
}

刪除檔案

檔案如果刪除成功就會收到 True

private bool DeleteFile()
{
    string targetFilePath = "欲刪除的檔案在 /user 底下擺放的相對路徑";

    // Microsoft.Hadoop.WebHDFS 沒有 DeleteFile 的方法,無論刪除檔案或是資料夾都是透過 DeleteDirectory 來操作。
    return this.webHDFSClient.DeleteDirectory(targetFilePath).Result;
}

刪除目錄

目錄如果刪除成功就會收到 True

private bool DeleteDirectory()
{
    string targetDirectory = "欲刪除的目錄在 /user 底下擺放的相對路徑";

    // 欲刪除非空資料夾,須將 recursive 設為 true,預設為 false。
    return this.webHDFSClient.DeleteDirectory(targetDirectory, true).Result;
}

參考資料

 < Source Code >

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學