同事架設了 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 >