Hadoop序列化中的工廠設(shè)計模式_第1頁
Hadoop序列化中的工廠設(shè)計模式_第2頁
Hadoop序列化中的工廠設(shè)計模式_第3頁
Hadoop序列化中的工廠設(shè)計模式_第4頁
Hadoop序列化中的工廠設(shè)計模式_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、Hadoop 序列化中的工廠設(shè)計模式最近學(xué)習(xí)Hadoop技術(shù)內(nèi)幕,簡單研究了部分Hadoop源碼。綜合以前了解的一些開源項目,發(fā)現(xiàn)高端代碼乍一看上去有一個共同特性:到處都是泛型,到處都是反射。直接打開一個方法的定義,基本找不到它的實現(xiàn)邏輯,只能找到接口。后來結(jié)合書上的介紹稍作了解,出現(xiàn)這種現(xiàn)象,說明源碼很多都用到了抽象工廠模式。故再次查閱了抽象工廠的定義。相信這對于今后開發(fā)中定義一個優(yōu)秀的架構(gòu)是很有幫助的。拋出問題:Hadoop的序列化在Hadoop中有序列化的概念。簡單搞清楚序列化:1, 序列化是什么?就是把對象轉(zhuǎn)化成二進制的流。反序列化就是把二進制流轉(zhuǎn)化成對象。2, 為什么要序列化?三點:

2、持久化格式用于存儲;通信數(shù)據(jù)格式用于傳輸;對象深拷貝;Hadoop中主要用前兩點。3, 為什么不用Java內(nèi)建的序列化?Java序列化非常強大。序列化的時候把什么類描述,各種版本號,父類的信息都寫到流中。一個簡單的類能寫出一大推數(shù)據(jù)來,對于強烈需要減少傳輸量提高效率的分布式計算就不適應(yīng)。故Hadoop自己搞了一套。搞清楚了序列化的概念,然后再說一下有哪些東西需要序列化:Java中不是有個Serializable接口嗎?同樣:在hadoop中有Writable接口,實現(xiàn)Writable的類都是要序列化的類。簡單舉例幾個:IntWritable,LongWritable,Text。在java中就是

3、int,Long,String,只是在hadoop要適應(yīng)新的序列化給改了。好了,那么Hadoop既然是java寫的,不可能原來的序列化完全拋開不用了吧,所以原來的實現(xiàn)Serializable的也要序列化然后,序列化系列操作肯定有兩個方法是相互依賴不可分割的:序列化和反序列化。那么總結(jié)一下:操作有兩種:序列化和反序列化操作對象分兩類:實現(xiàn)了Serializable的對象和實現(xiàn)了Writable的對象工廠系列的模式是干什么的?工廠類的模式,說穿了:調(diào)用一個工廠的工廠方法,可以產(chǎn)生諸多相互關(guān)聯(lián)的對象。程序員靈活的選擇創(chuàng)建哪個對象,這樣就避免的在程序中反復(fù)創(chuàng)建各種對象,使創(chuàng)建對象和業(yè)務(wù)解耦,增加了程序

4、的可擴展性。工廠系列模式的簡單總結(jié)工廠系列的模式有:1, 簡單工廠;2, 工廠方法;3, 抽象工廠;應(yīng)該說:越往下,越抽象,越解耦。簡單總結(jié)下各工廠的實現(xiàn),重點說hadoop中抽象工廠。為了使文檔完整,對于1、2,我簡單得列舉了幾個網(wǎng)上的例子,自己加了一點說明,沒仔細(xì)分析,需有需要可再次上網(wǎng)搜索。簡單工廠有三個元素:1, 工廠類角色:具體類實現(xiàn),用于判斷要創(chuàng)建哪個產(chǎn)品對象2, 抽象產(chǎn)品角色:一個抽象類或接口,為一系列相關(guān)產(chǎn)品的父類3, 具體產(chǎn)品角色:一個或多個實現(xiàn)或繼承抽象產(chǎn)品的具有共性的類簡單例子:/抽象產(chǎn)品角色 public interface Car public void drive(

5、); /具體產(chǎn)品角色 public class Benz implements Car public void drive() System.out.println("Driving Benz "); public class Bmw implements Car public void drive() System.out.println("Driving Bmw "); /工廠類角色 public class Driver /工廠方法 /注意 返回類型為抽象產(chǎn)品角色 public static Car driverCar(String s)throw

6、s Exception /判斷邏輯,返回具體的產(chǎn)品角色給Client if(s.equalsIgnoreCase("Benz") return new Benz(); else if(s.equalsIgnoreCase("Bmw") return new Bmw(); . else throw new Exception(); . /歡迎暴發(fā)戶出場. public class Magnate public static void main(String args) try /告訴司機我今天坐奔馳 Car car = Driver.driverCar(&

7、quot;benz"); /下命令:開車 car.drive(); . 這個例子我從網(wǎng)上抓下來的,先搞清楚什么是簡單工廠模式,這里,他的缺點很明顯:雖然業(yè)務(wù)與對象創(chuàng)建解耦了,但是具體工廠里涉及到了一部分業(yè)務(wù),萬一這部分判斷比較復(fù)雜,這不僅寫起來復(fù)雜麻煩,可擴展性還非常差,不實用工廠方法模式有四個元素:抽象產(chǎn)品和具體產(chǎn)品和簡單工廠模式是一樣,把原有的具體工廠元素改為抽象工廠和具體工廠。/抽象產(chǎn)品角色 public interface Car public void drive(); /具體產(chǎn)品角色 public class Benz implements Car public void

8、 drive() System.out.println("Driving Benz "); public class Bmw implements Car public void drive() System.out.println("Driving Bmw "); /抽象工廠角色 public interface Driver public Car driverCar(); public class BenzDriver implements Driver public Car driverCar() return new Benz(); public

9、 class BmwDriver implements Driver public Car driverCar() return new Bmw(); /應(yīng)該和具體產(chǎn)品形成對應(yīng)關(guān)系. /有請暴發(fā)戶先生 public class Magnate public static void main(String args) try Driver driver = new BenzDriver(); Car car = driver.driverCar(); car.drive(); . 這個例子比開始那個結(jié)構(gòu)要清晰一點了,可擴展性也好了一些,特定工廠生產(chǎn)特定產(chǎn)品,業(yè)務(wù)選擇工廠來創(chuàng)建想要的產(chǎn)品。而且具體

10、工廠類可隨時增刪,非常方便。抽象工廠方法上述兩種模式我認(rèn)為只能應(yīng)付簡單的場景,因為都是處理一維的情況,就是車分很多品牌。一個二層的樹結(jié)構(gòu)就能搞定他們的關(guān)系,假設(shè)出現(xiàn)二維的復(fù)雜度,情況又不一樣了這種產(chǎn)品是一個樹形的結(jié)構(gòu),當(dāng)然實在不行也可以把它當(dāng)做一維樹處理,畢竟是四種車嘛。但我們注意到:Benz和Bmw都分別有Buessiness和Sports的分類,可以說Buessiness的車相互相關(guān),而Sports的車又相互相關(guān),這里就有一種更好的處理這種情況的模式:抽象工廠模式。抽象工廠模式把一堆共性的產(chǎn)品稱為產(chǎn)品族,比如Benz系列的車是一個產(chǎn)品族,Bmw系列的是一個產(chǎn)品族,而同是做Buessines

11、s的是一個等級的,同是做Sports的是一個等級的??匆粋€草圖: 網(wǎng)上的說明把等級和產(chǎn)品族搞反了。這里一個抽象工廠是處理一個等級上的產(chǎn)品,最后,網(wǎng)上找不到最后一種模式怎么寫,我把它補充進來:我們假設(shè)上述例子中的主人公去買車,他需要進行比較。首先抽象工廠處理的就是一個等級里的不同產(chǎn)品族的產(chǎn)品,那么就是開寶馬和開奔馳/抽象工廠public interface DriveFactory public Car driveBenz(); public Car driveBmw();/具體工廠public class BuessinessDriveFactory implements DriveFacto

12、ry public Car driveBenz () return new BenzforBuessiness (); public Car driveBmw () return new BmwforBuessiness (); public class SportsDriveFactory implements DriveFactory public Car driveBenz () return new BenzforSports (); public Car driveBmw () return new BmwforSports (); 抽象產(chǎn)品應(yīng)該根據(jù)不同的產(chǎn)品族來進行區(qū)分/抽象產(chǎn)品p

13、ublic interface Benzpublic interface Bmw public void compareWith(Benz bCar);public class BenzforBuessiness implements Benzpublic class Benzfor Buessiness implements Benz public void compareWith(Benz bCar); System.out.println(this.class.getSimpleName + “is larger than” + bCar.getSimpleName);public cl

14、ass BmwforSports implements Bmwpublic class BmwforSports implements Bmw public void compareWith(Bmw bCar); System.out.println(this.class.getSimpleName + “is faster than” + bCar.getSimpleName);最后搞一個功能性類class ChooseCar private Benz benzCar; private Benz bmwCar; public chooseCar(DriveFactory factory) b

15、enzCar = factory. driveBenz();bmwCar = factory. driveBmw();public void compare() bmwCar. compareWith(benzCar);應(yīng)用工廠模式就不寫了Hadoop中如何使用抽象工廠模式這里花了大量的篇幅來描述工廠系列的模式,現(xiàn)在開始正題,hadoop中是如何用抽象工廠模式還解決序列化的問題的。序列化里面的產(chǎn)品就是對對象進行序列化,這里也這么劃分。目前一共有四種產(chǎn)品兩個產(chǎn)品族位于同一個等級的不同產(chǎn)品是相互依賴的,抽象工廠就負(fù)責(zé)生產(chǎn)這兩種同等級的產(chǎn)品,參照上面的描述,抽象產(chǎn)品應(yīng)該如下:抽象產(chǎn)品就是執(zhí)行序列化和

16、反序列化的對象:public interface Serializer<T> /為輸出(序列化)對象做準(zhǔn)備void open(InputStream in) throws IOException;/將對象序列化到底層的流中T serialize(T t) throws IOException;void close() throws IOException;public interface Deserializer<T> /為輸出(序列化)對象做準(zhǔn)備void open(InputStream in) throws IOException;/從底層的流中讀取并給t賦值T d

17、eserialize(T t) throws IOException;void close() throws IOException;針對抽象產(chǎn)品的抽象工廠如下:public interface Serialization<T> boolean accept(Class<?> c);/這個用來判斷序列化是否支持該對象Serializer<T> getSerializer(Class<T> c);/具體的序列化邏輯交給具體的產(chǎn)品類來完成,這里只負(fù)責(zé)生產(chǎn)產(chǎn)品 Deserializer<T> getDeserializer(Class<

18、;T> c);這里我們用到了泛型,因為java內(nèi)建序列化要處理的是一批類,這些類都實現(xiàn)了一個共同的接口Serializable,而Hadoop序列化處理的都是實現(xiàn)了Writable接口的類,那么這個業(yè)務(wù)邏輯就是一個三維的對象了。如下圖所示:到具體工廠的實現(xiàn)時,我們就會進一步指明泛型T。在具體工廠中,也應(yīng)該進一步說明執(zhí)行序列化功能類定義,下面是具體工廠類public class JavaSerialization implements Serialization< Serializable>static class JavaSerializationDeserializer&l

19、t;T extends Serializable> implements Deserializer<T> /具體產(chǎn)品,執(zhí)行序列化的類,怎么實現(xiàn)的太長就不貼了public boolean accept(Class<?> c) return Serializable.class.isAssignableFrom(c);public Deserializer<Serializable> getDeserializer(Class<Serializable> c) return new JavaSerializationDeserializer&l

20、t;Serializable>();public Serializer<Serializable> getSerializer(Class<Serializable> c) return new JavaSerializationSerializer();public class WritableSerialization extends Configured implements Serialization<Writable> static class WritableDeserializer extends Configured implement

21、s Deserializer<Writable> /具體產(chǎn)品,執(zhí)行序列化的類public boolean accept(Class<?> c) return Writable.class.isAssignableFrom(c);public Deserializer<Writable> getDeserializer(Class<Writable> c) return new WritableDeserializer(getConf(), c);public Serializer<Writable> getSerializer(Cla

22、ss<Writable> c) return new WritableSerializer();這里我們注意到,Java里面用了<T extends Serializable>,而Hadoop里直接用了<Writable>,究其原因,是因為Serializable接口里面壓根沒有方法,而Writable里是有方法可以直接調(diào)用的。Hadoop中的工廠類和產(chǎn)品類就已經(jīng)創(chuàng)建好了。那么還需要創(chuàng)建一個應(yīng)用類,相當(dāng)于API,相當(dāng)于前面提到的ChooseCarpublic class SerializationFactory extends Configured priv

23、ate List<Serialization<?>> serializations = new ArrayList<Serialization<?>>(); /隊列的增刪改不貼了 public <T> Serializer<T> getSerializer(Class<T> c) return getSerialization(c).getSerializer(c); public <T> Deserializer<T> getDeserializer(Class<T> c) return getSerialization(c).

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論