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
接下來的處理與非壓縮格式的處理一樣
文章來自:http://www.cnblogs.com/tangtianfly/archive/2012/12/19/2825353.html