Hadoop版本:1.0.4,jdk:1.7.0_25 64bit。
在進行mahout算法分析的時候有時會遇到算法最後的輸出文件是序列文件的情況下,這樣就不能直接通過HDFS文件系統看到最終的結果了(亂碼,因為是序列文件)。以前編寫過一個可以直接把序列文件<key,value>讀入到一個map變量中的java文件,叫做ReadArbiKV ,可以在下面的地址下載。
免費下載地址在 http://linux.linuxidc.com/
用戶名與密碼都是www.linuxidc.com
具體下載目錄在 /2013年資料/10月/25日/Hadoop解析序列文件並可視化輸出
下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm
ReadArbiKV是讀取任務序列文件到一個map變量裡面,可以啟動調試模式進行變量查看; ReadAndWritePatterns是讀取序列文件,並解析其key和value,然後可視化輸出,所謂可視化輸出是指不是亂碼的輸出。
但是上面的有個問題,就是當數據很大的時候,如果讀不到一個map變量裡面怎麼辦?
所以就可以使用下面的思路:一邊讀一邊寫。怎麼個意思?直接讀取序列文件的<key,value>,然後對key和value分別進行解析,最後直接進行輸出。即每讀取一行記錄,解析一行,然後再輸出一行。這樣就不會有上面的問題了。
主程序是ReadAndWritePatterns,其中需要實現IKVRegex接口,這個接口是解析key和value的標准。給出的代碼中的AKVRegex、ImplAKVRegex是這個接口的兩個實現,可以參考,其中AKVRegex是什麼都不做的,只是把原始的類.toString()而已,ImplAKVRegex是有一些操作的,原來是針對fpg算法的最後輸出的解析的,但是好像有點不是很對。
下面給出一個調用demo:
package mahout.fansy.fpg;
import java.io.IOException;
import junit.framework.TestCase;
import mahout.fansy.utils.fpg.AKVRegex;
import mahout.fansy.utils.fpg.ImplAKVRegex;
import mahout.fansy.utils.fpg.ReadAndWritePatterns ;
public class TestReadAndWritePatterns extends TestCase {
public void testReadAndWrite() throws IOException{
String input="hdfs://Ubuntu:9000/user/mahout/fp/output/frequentpatterns/part-r-00000";
String output="hdfs://ubuntu:9000/user/mahout/fp/output_/01.txt";
String jobtracker="ubuntu:9001";
// AKVRegex regex=;
ReadAndWritePatterns.readAndWritePatterns(input, output, jobtracker, new AKVRegex());
}
}
推薦閱讀:
基於Hadoop集群的Hive安裝 http://www.linuxidc.com/Linux/2013-07/87952.htm
Hadoop環境配置過程中可能遇到問題的解決方案 http://www.linuxidc.com/Linux/2013-07/87905.htm
基於Ubuntu 12.04+Hadoop1.2.0 的Hadoop集群搭建 http://www.linuxidc.com/Linux/2013-07/87583.htm
Hadoop Eclipse 插件編譯安裝1.2.0 http://www.linuxidc.com/Linux/2013-07/87428.htm
Hadoop在Eclipse中的插件編譯 http://www.linuxidc.com/Linux/2013-04/83295.htm
更多Hadoop相關信息見Hadoop 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=13