《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 基于NIO的高速數據傳輸技術的實現
基于NIO的高速數據傳輸技術的實現
2016年微型機與應用第13期
郭金磊,,張玉生,,胡愛蘭
(華北計算機系統(tǒng)工程研究所,,北京 100083)
摘要: 隨著大數據技術的發(fā)展,,多線程高并發(fā)等技術已經越來越成為大數據處理中的關鍵技術,。非阻塞式I/O(new I/O,NIO)技術作為一種分布式高并發(fā)技術被廣泛應用,,但對于大數據量的通信往往需要很多的時間才能完成,。Google提出的Protocol Buffer序列化壓縮技術相對于傳統(tǒng)序列化效率高,、時間短,、使用簡單。文章將傳統(tǒng)NIO技術與Protocol Buffer相結合,,在分布式系統(tǒng)不同節(jié)點通信中,,極大地降低了分布式系統(tǒng)的網絡負載,大大節(jié)省了數據傳輸時間,。
Abstract:
Key words :

  郭金磊,,張玉生,胡愛蘭

 ?。ㄈA北計算機系統(tǒng)工程研究所,,北京 100083)

  摘要:隨著大數據技術的發(fā)展,多線程高并發(fā)等技術已經越來越成為大數據處理中的關鍵技術,。非阻塞式I/O(new I/O,NIO)技術作為一種分布式高并發(fā)技術被廣泛應用,,但對于大數據量的通信往往需要很多的時間才能完成。Google提出的Protocol Buffer序列化壓縮技術相對于傳統(tǒng)序列化效率高,、時間短,、使用簡單。文章將傳統(tǒng)NIO技術與Protocol Buffer相結合,,在分布式系統(tǒng)不同節(jié)點通信中,,極大地降低了分布式系統(tǒng)的網絡負載,大大節(jié)省了數據傳輸時間,。

  關鍵詞NIO(new I/O) ,;Protocol Buffer ;分布式系統(tǒng),;序列化

0引言

  隨著大數據技術的發(fā)展,,多線程高并發(fā)等技術已經越來越成為大數據處理中的關鍵技術,同一個節(jié)點中的不同線程和不同節(jié)點的線程間的通信越來越密切,。Java NIO作為一種分布式數據傳輸技術在多線程高并發(fā)[1]的實際應用中扮演著至關重要的角色,。為減小網絡負載,加速分布式系統(tǒng)中網絡通信,迫切需要一種高效率壓縮序列化技術,。

1研究現狀

  Java NIO的核心是Channel,、Buffer 和 Selector。NIO基于通道(Channel)和緩沖區(qū)(Buffer)進行操作,,通道先在選擇器注冊讀寫事件,,讀數據時,當選擇器發(fā)現該通道準備讀完成,,通道直接將數據從底層網卡隊列讀進緩沖區(qū),。寫數據時,當選擇器發(fā)現該通道準備寫完成,,通道將數據寫進緩沖區(qū),。通道可以實現在緩沖區(qū)中對每個字節(jié)類似于指針對數據操作,可以來回移動讀取數據,。選擇器可以用一個單獨的線程同時監(jiān)聽管理多個通道,。

  傳統(tǒng)的NIO[2]都是使用Java自帶的序列化形式對傳輸數據和對象進行序列化壓縮。這種情況下,,數據壓縮率[3]較低,,需要傳輸的對象數據流很大時,尤其在分布式系統(tǒng)中,,容易造成網絡擁堵,。本文在傳統(tǒng)NIO技術的基礎上結合Google Protocol Buffer技術實現了數據對象的高效序列化壓縮傳輸。

2Protocol Buffer優(yōu)點

  Google Protocol Buffer(簡稱Protobuf)是Google公司提出的混合語言數據標準,,用于 RPC 系統(tǒng)和持續(xù)數據存儲系統(tǒng),。同時也可用于通信協(xié)議、數據存儲等領域的語言無關,、平臺無關,、可擴展的序列化結構數據格式。目前提供了C++,、Java,、Python三種語言的API。Protobuf 具有很多優(yōu)點:實現簡單,,壓縮速度快,,傳輸速度快,存儲空間小,。用Protobuf與Java自帶的序列化工具實現的對象壓縮相比,,存儲空間大了一個數量級,時間上快了一個數量級,,尤其是可以自動生成遠程過程調用協(xié)議(Remote Procedure Call Protocol, RPC)的數據結構,特別是service業(yè)務邏輯,,是一種很好地實現RPC的自動化工具。Protobuf 編譯器會將.proto文件編譯生成對應的數據結構以對Protobuf數據進行序列化、反序列化操作,。

  以最簡單的一個對象Person(僅有三個屬性:姓名,、年齡和住址)為例,,用Java自帶的序列化工具與Protobuf來對比,。使用Java自帶的序列化工具,經過壓縮后的數據是181 B,,如圖1所示,。  

001.jpg

  而當采用Protobuf時,,如圖2所示,,占用空間僅有20 B,而且實現簡單,,壓縮速度快,,傳輸速度快,反序列化也快,??梢院芎玫貙崿F分布式高并發(fā)式的數據傳輸,大大降低了網絡傳輸負載,。

  

002.jpg

  壓縮person對象時間和大小對比如表1所示,。

004.jpg

3簡單實例實現

  本文根據Protobuf的優(yōu)點在NIO的基礎上實現了一個分布式的高并發(fā)、高傳輸效率的項目,。系統(tǒng)采用多個一級引擎來處理原始日志數據,,讀取后進行分段,分段后采用Hash映射到多個二級引擎(可以任意臺Hash映射)中進行數據融合,融合后的數據再匯總到一臺服務器上,,客戶端可以通過遠程Web訪問這個服務器上的數據,。其中一級引擎與二級引擎之間的數據傳輸就是使用的NIO與Protobuf相結合的技術,如圖3所示,。

003.jpg

  圖3分布式NIO結構示意圖客戶端使用Protobuf對數據序列化壓縮發(fā)送,。

  ListrpcList = new ArrayList ();//實例化發(fā)送數據

  for(HTTPAPPHost hah : list){

  RPCHah rpchah = RPCHah.newBuilder()

  .setCellid(hah.getCellid()).setAppType(hah

  .getAppType()).build();

  rpcList.add(rpchah);//將原始list轉化為RPCList完成

  RPCReq req = RPCReq.newBuilder()

  .addAllHahs(rpcList).build();//序列化壓縮完成

  if(e2info.getDataQueue().offer(req.toByteArray())){//調用網絡模塊,將數據發(fā)送到二級引擎

  NIOClientRunner.sendData(e2info); }//發(fā)送數據

  服務器端采用NIO接收數據并使用Protobuf反序列化及處理,。

  Selector selector=Selector.open();//開啟選擇器

  ServerSocketChannel ssc=

  ServerSocketChannel.open();

  ssc.configureBlocking(false);//配置為非阻塞模式

  ssc.register(selector, SelectionKey.OP_WRITE);

  while(isRunning){

  selector.select(1);//阻塞延時1ns

  Set set=selector.selectedKeys();

  Iterator<SelectionKey> it=set.iterator();

  while(it.hasNext()){

  SelectionKey skey=it.next();

  if(skey.isReadable()){//選擇讀數據通道

  SocketChannel sct = skey.channel();

  ByteBuffer tempBuf=

  ByteBuffer.allocate(1);

  String dataStr="";

  while(!dataStr.endsWith("\\r\\n")){

  sct.read(tempBuf);

  dataStr +=new String (tempBuf.array());

  tempBuf.clear();}//防止粘包

  byte[] data= dataStr.array();

  recoverData2List.handlerData(engine1Info, data); }

  下面服務器端把data數據反序列化,。

  List<RPCHah> pcList=request.getHahsList();

  for(RPCHah rpchah : rpcList){

  HTTPAPPHost hah = new HTTPAPPHost();

  hah.setCellid(rpchah.getCellid());

  hah.setAppType(rpchah.getAppType());

  Global.getDataQueue().put(hah);//將反序列化的對象存儲到dataQueue中,反序列化完成

  }

005.jpg

  表2是一級引擎向二級引擎發(fā)送17 980條實例HTTPAPPHost對象數據與Java自帶序列化的數據傳輸這些數據量的效率對比,。

  本文在傳統(tǒng)NIO的基礎上結合了Proto Buffer,,使得壓縮后的數據量大致是原來的1/9,壓縮時間上大致是原來表2實際環(huán)境序列化rpcList對象

  時間和大小對比ProtobufSerializable序列化時間/ns7466 687反序列化時間/ns95141 083數據大小/B2 084 93918 707 213的1/8,,反序列化時間大致是原來的1/40,,極大地提高了傳輸的效率,降低了網絡負載[4]。

4結論

  本文在傳統(tǒng)NIO的基礎上應用Protobuf后,,能夠使得分布式高并發(fā)下性能極大提升,,網絡負載大大減小,優(yōu)化性能明顯,,尤其在以Map Reduce[5]為核心技術的大數據處理應用中性能更為突出,。

  參考文獻

  [1] GOETZ B,PEIERLS T,,BIOCH J,,等.Java并發(fā)編程實戰(zhàn)[M].童云蘭,譯.北京:機械工業(yè)出版社,,2012.

 ?。?] 李林鋒.Netty權威指南[M].北京:電子工業(yè)出版社,2014.

 ?。?] 程超,楊風召.基于Java非阻塞I/O開發(fā)高性能網絡應用程序[J].電子工程師,,2006,32(10):7173.

 ?。?] 徐忠勝,沈蘇彬.一種云計算資源的多目標優(yōu)化的調度方法[J].微型機與應用, 2015, 34(13):1720.

 ?。?] 元二菊,郭進偉,皮建勇,等.基于MapReduce的序列規(guī)則在推薦系統(tǒng)中的研究[J].微型機與應用,2014,33(6):6870,73.


此內容為AET網站原創(chuàng),,未經授權禁止轉載,。