跳到主要內容

C# WebHDFS Client 操作



一、在操作Hadoop時通常都以Java語言來撰寫居多,因為Hadoop就是Base on Java,故library的使用較為方便,那如果今天希望藉由C#來操作HDFS的話,那麼Hadoop也提供了HDFS RESTful 的介面,又稱為WebHDFS,因此可以藉由這樣的方式來進行操作。


二、首先說明一下開發環境為Microsoft Visual Studio Express 2013,並藉由NuGet套件來下載WebHDFS相關library。


三、我們可以看到Microsoft .NET SDK For Hadoop:http://hadoopsdk.codeplex.com/,其中我們只需要安裝WebClient,利用Express 2013內建的NuGet套件,

TOOLS->NuGet Package Manager-> Package Manager Console


install-package Microsoft.Hadoop.WebClient

四、引用命名空間

using Microsoft.Hadoop.WebHDFS;

五、操作HDFS     

      (一)首先創建一個HDFSOperation的類來進行操作,那建構子的部分由外部傳入WebHDFS的路徑及使用者帳號。

using System.Threading.Tasks;

namespace HDFSProject_CSharp
{
    class HDFSOperation
    {       
        private WebHDFSClient myClient;
        public HDFSOperation(string uriPath,string userName){
            Uri myUri = new Uri(uriPath);
            myClient = new WebHDFSClient(myUri, userName);
        }
    }
}

      (二)撰寫上傳、下載、查看目錄等方法

/**
        * 取得HDFS資料夾下所有檔案
        * @param destFolderName 目的端路徑(HDFS)
        */
      public string GetDirectoryStatus(string destFolderName)
        {
            StringBuilder sbResult = new StringBuilder();
            //myClient.GetDirectoryStatus(destFolderName).ContinueWith(ds => ds.Result.Files.ToList().ForEach(f => sbResult.Append(f.PathSuffix).Append("\n")));
            var fileLists = myClient.GetDirectoryStatus(destFolderName).Result.Files.ToList();
            foreach (var f in fileLists){
                sbResult.Append(f.PathSuffix).Append("\n");
            }
            return sbResult.ToString();
        }
        /**
        * 將本地文件(src)上傳到HDFS服務器指定路徑(desc)
        * @param srcPath 來源端路徑(本地)
        * @param descPath 目的端路徑(HDFS)
        */
        public void CopyFromLocal(string srcPath,string descPath)
        {
            Console.WriteLine("Start Upload....");
            if (Directory.Exists(srcPath))
            {
                var files = Directory.GetFiles(srcPath);
                files.ToList().ForEach(file => myClient.CreateFile(file, descPath + "/" +file.Substring(file.LastIndexOf("\\") + 1)).Wait());
            }
            else
            {
                myClient.CreateFile(srcPath, descPath).Wait();
            }
            Console.WriteLine("End Upload....");
        }
        /**
        * 從HDFS路徑下載至本地路徑
        * @param srcPath 來源端路徑(HDFS)
        * @param descPath 目的端路徑(本地)
        */
        public void DownloadFromHDFS(string srcPath, string descPath)
        {
            Console.WriteLine("Start Upload....");
            FileStream output = File.Create(descPath);
            myClient.OpenFile(srcPath)
           .ContinueWith(r => r.Result.Content.ReadAsStreamAsync()
             .ContinueWith(c => CopyStream(c.Result,output)));
            Console.WriteLine("End Upload....");
        }
        /**
        * 使用串流方式進行下載
        * @param input HDFS輸入串流
        * @param output 本地輸出串流
        */
        public static void CopyStream(Stream input, Stream output)
        {
            byte[] buffer = new byte[input.Length];
            int len;
            while ((len = input.Read(buffer, 0, buffer.Length)) > 0)
            {
                output.Write(buffer, 0, len);
            }
            output.Flush();
            output.Close();
        }

留言

  1. Hi, thanks for sharing this which is really useful! Now I meet a problem, do you know how to set up timeout for WebHDFSClient? It seems the default timeout is 60 seconds, I would like to set it to a much larger number.

    回覆刪除
  2. 作者已經移除這則留言。

    回覆刪除
  3. Sorry for the delay in responding to your question.
    You can pass timespan parameter when you're declaring the constructor, such as new WebHDFSClient (uri, userName, timespan).
    If you are interested in this issue,you can fllow it:

    https://hadoopsdk.codeplex.com/SourceControl/network/forks/olivier1234/WebHDFSLargeFileFix/contribution/5762#!/tab/changes

    回覆刪除

張貼留言

這個網誌中的熱門文章

java西元民國轉換_各種不同格式

C#資料庫操作(新增、修改、刪除、查詢)

【Excel好好玩】 自己的資產自己管!善用Google Sheet來幫我們評估貸款

這次介紹的主題是關於Excel的貸款還款計畫試算,我們人生中總會遇到需要大筆金額的花費,但當資金不夠時就得進行貸款,而貸款之前如果我們能夠審慎評估,並分析自己的還款能力之後在進行凍作,相信風險會小很多,因此就自己動動手來使用Google Sheet進行試算吧! 基本資料 ● 貸款總額: 1000000 ● 貸款期數: 84月 ● 年利率: 2.11% ● 月利率: 0.18% P.S 月利率 = 年利率 / 12 重要函式 PMT : 這是Google Sheet內建的重要年金計算公式,我們可以善用這個公式來計算固定利率及期數的固定攤還本息。因為PMT函式計算出的結果為負數,所以前面加上-號轉成正數。 動手做 首先我們在Excel表上列出我們的基本資料 圖片來源 其中月利率的部分就使用公式「=B4/12」 接著我們填上第一列的期數跟餘額 圖片來源 =B2 =B3 使用關鍵PMT函數來計算本息的部分 因為PMT函式計算出的結果為負數,所以前面加上-號轉成正數。 -PMT(貸款利率(月利率), 貸款期數, 貸款總額) =-PMT($B$5,$B$3,$B$2) 圖片來源 計算利息 利息 = 貸款餘額 x 月利率 =B8*$B$5 圖片來源 計算本金 本金 = 本息 - 利息 =C8-D8 圖片來源 製作第二列餘額的部分 餘額的部分 = 上一期的餘額 - 上一期的本金 圖片來源 接著拖曳該兩列往下拉,即可查看每一期的利息與本金 圖片來源 結語 雖然市面上已經有很多貸款銀行都提供了試算功能,但如果我們想要進一步管理自己的資產時,就需要將每一期的金額給計算出來,因此才會將公式運用在Excel表,讓我們的資產管理表能夠結合負債,進一步評估我們理財行動的下一步,希望這樣的經驗可以幫助到正在理財道路上打拼的夥伴,讓我們透過有效的管理,幫助荷包長大吧! 喜歡撰寫文章的你,不妨來了解一下: Web3.0時代下為創作者、閱讀者打造的專屬共贏平台 — 為什麼要加入? 歡迎加入一起練習寫作,賺取知識,累積財富!