天天看點

hadoop 序列化小案例

上次我們做了簡單的一個wordcount案例,下邊我們在做一個複雜一點的小案例。

例如傳輸一個對象到wordcount中,輸入資料格式如下:

期望輸出的資料格式:

hadoop支援大量資料進行分布式存儲,便于計算向資料移動。但是上邊的資料是多個,但在hadoop中并沒有支援對象這種複雜型資料類型,那該如何進行傳輸呢?

那我們對應上邊的資料進行封裝,那封裝的對象該如何傳遞呢?

這裡是不是會想到RPC架構裡的資料傳遞,使用序列化。對的,hadoop也使用了自己的序列化方案。

那它和我們普通的序列化比較有何不同呢?

1.緊湊:存儲空間更少

2.快速:傳輸速度更快

3.互操作:支援多語言操作

分析:

我們需要将上邊一條資料,利用Tab分隔符進行分割,得到每一個資料,

然後對其進行封裝到我們自定義的一個對象中去。

那自定義的對象要如何,序列化呢?hadoop有沒有現成的序列化和反序列化呢?

我們可以檢視之前小案例中的IntWriteable或者LongWriteable類,

他們可以在hadoop的序列化和反序列化中傳遞,都實作了一個相同的接口WritableComparable接口。

在進入檢視WritableComparable接口,可以看到是繼承了Writable和Comparable接口。這2個接口都有什麼方法呢?

在Writable接口中,我們看到了序列化和反序列化的方法注釋和解釋

在Comparable接口中,我們看到了排序的方法注釋和解釋,針對我們的key進行排序

那我們就仿照這這個來定義一下我們要傳遞的對象

運作我們的driver類,我們可以到我們的輸出路徑上看到我們的結果,是按手機号碼排序的一個結果

如下圖:

輸入檔案:

hadoop 序列化小案例

輸出檔案:

具體實作對象序列化步驟如下:

必須實作WritableComparable接口

反序列化時,需要反射空構造函數,必須有空構造函數

重寫序列化write方法

重寫反序列化readFields方法

注意反序列化的順序和序列化順序完全一緻

要想把結果顯示在檔案中,需要重寫toString(),可用'\t'分開,友善後續使用。

如果需要将自定義的bean放在key中傳輸,則還需要實作Comparable接口的方法,

因為MapReduce架構中有排序的過程,必須要按某一個key進行升序排列

繼續閱讀