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;
}
- GitHub:Source Code
- Nuget:Microsoft .NET API For Hadoop WebClient
嘗試將自己的理解寫成文字紀錄,資料來源均來自於網路。
如有理解錯誤、引用錯誤或侵權,請多加指正與告知,讓我有更多的進步與改進的空間,謝謝!