繼上一篇實做的code generation,發現run完整個procedure已經要吐之後,接下來就是要介紹一下如何在不使用code generation的情況下來玩Avro。
PS. 後輩是使用Hadoop 1.0.3的版本,執行的時候出現了paranamer的error,所以有請google大神幫後輩抓了一下paranamer的jar包,請前輩們自行抓取囉^_^~
那麼接下來就是要使用MapReduce搭配Avro來做well-known"排序"的工作。
行前準備:
1. 設計相應的avro schema。
2. 序列化(serialize)資料後,並放在hdfs上做為input。
3. 設計MapReduce的code並執行。
4. 反序列化後顯示於CLI上。
=================================
1. 設計相應的avro schema。
{
"type": "record",
"name": "User",
"fields": [
{"name": "left", "type": "string", "order": "ignore"},
{"name": "right", "type": "int", "order": "descending"}
]
}
值得注意的是"order"的部分,ignore表示忽略排序,descending表示依照降冪做排序,ascending表示依照升冪做排序。這樣的schema的意義表示我只對"right"的部分做降冪排序。
2. 序列化資料後,並上在hdfs上做為input。
File file = new File(avroFilePath);
// ---- Avro schema parser ---- //
Schema.Parser parser = new Schema.Parser();
Schema schema = parser.parse(new File("SortedStringPair.avsc")); //上述的avro schema
// ---- Using Generic API to build a Avro record instance ---- //
GenericRecord datum1 = new GenericData.Record(schema);
datum1.put("left", "A");
datum1.put("right", 1);
GenericRecord datum2 = new GenericData.Record(schema);
datum2.put("left", "C");
datum2.put("right", 2);
GenericRecord datum3 = new GenericData.Record(schema);
datum3.put("left", "B");
datum3.put("right", 3);
GenericRecord datum4 = new GenericData.Record(schema);
datum4.put("left", "B");
datum4.put("right", 2);
DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<GenericRecord>(schema);
DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<GenericRecord>(datumWriter);
dataFileWriter.create(schema, file);
dataFileWriter.append(datum1);
dataFileWriter.append(datum2);
dataFileWriter.append(datum3);
dataFileWriter.append(datum4);
dataFileWriter.close();
OK~上述2.做完後會產生一個檔案在local端,而這個檔案就是序列化後的檔案,可以先Deserialize看一下是不是與上述code中的順序一致。
{"left": "A", "right": 1}
{"left": "C", "right": 2}
{"left": "B", "right": 3}
{"left": "B", "right": 2}
請在把這個檔案上傳至HDFS上,但也是可以把輸出檔案直接導到HDFS上(有需要code請在發信或留言^_^~感謝)。
3. MapReduce的code。
---- mapper ----
{"left": "B", "right": 3}
{"left": "C", "right": 2}
{"left": "B", "right": 2}
{"left": "A", "right": 1}
看的出來是有成功的做到降冪的排序。
接下來後輩會將HBase與Avro與MapReduce做個結合,若是能成功的結合,那麼就會有第三篇或以上的產生^.^,最近公司有夠忙,後輩實在是抽不出時間來寫blog...。