1. 程式人生 > >上傳檔案到HDFS,對檔案進行壓縮

上傳檔案到HDFS,對檔案進行壓縮

hadoop計算需要在hdfs檔案系統上進行,檔案上傳到hdfs上通常有三種方法:a hadoop自帶的dfs服務,put;b hadoop的API,Writer物件可以實現這一功能;c 呼叫OTL可執行程式,資料從資料庫直接進入hadoop

  hadoop計算需要在hdfs檔案系統上進行,因此每次計算之前必須把需要用到的檔案(我們稱為原始檔案)都上傳到hdfs上。檔案上傳到hdfs上通常有三種方法:

    a hadoop自帶的dfs服務,put;

    b hadoop的API,Writer物件可以實現這一功能;

    c 呼叫OTL可執行程式,資料從資料庫直接進入hadoop

  由於存在ETL層,因此第三種方案不予考慮

  將a、b方案進行對比,如下:

    1 空間:方案a在hdfs上佔用空間同本地,因此假設只上傳日誌檔案,則儲存一個月日誌檔案將消耗掉約10T空間,如果加上這期間的各種維表、事實表,將佔用大約25T空間

                  方案b經測試,壓縮比大約為3~4:1,因此假設hdfs空間為100T,原來只能儲存約4個月的資料,現在可以儲存約1年

    2 上傳時間:方案a的上傳時間經測試,200G資料上傳約1小時

                            方案b的上傳時間,程式不做任何優化,大約是以上的4~6倍,但存在一定程度提升速度的餘地

    3 運算時間:經過對200G資料,大約4億條記錄的測試,如果程式以IO操作為主,則壓縮資料的計算可以提高大約50%的速度,但如果程式以記憶體操作為主,則只能提高5%~10%的速度

    4 其它:未壓縮的資料還有一個好處是可以直接在hdfs上檢視原始資料。壓縮資料想看原始資料只能用程式把它導到本地,或者利用本地備份資料

    壓縮格式:按照hadoop api的介紹,壓縮格式分兩種:BLOCK和RECORD,其中RECORD是隻對value進行壓縮,一般採用BLOCK進行壓縮。

    對壓縮檔案進行計算,需要用SequenceFileInputFormat類來讀入壓縮檔案,以下是計算程式的典型配置程式碼:

JobConf conf = new JobConf(getConf(), log.class);
    conf.setJobName(”log”);
    conf.setOutputKeyClass(Text.class);//set the map output key type
    conf.setOutputValueClass(Text.class);//set the map output value type

    conf.setMapperClass(MapClass.class);
    //conf.setCombinerClass(Reduce.class);//set the combiner class ,if havenot, use Recuce class for default
    conf.setReducerClass(Reduce.class);
    conf.setInputFormat(SequenceFileInputFormat.class);//necessary if use compress

    接下來的處理與非壓縮格式的處理一樣