Spark網絡通訊分析

以前分析過spark RPC的基本流程(spark RPC詳解),其實不管是RPC仍是Spark內部的數據(Block)傳輸,都依賴更底層的網絡通訊,本文將對spark的網絡通訊作一下剖析。html

1,概要

對於大數據相關的基礎組件(Hadoop,HBase,Spark,Kafka),網絡通訊部分主要有兩類:Java NIO和Netty。對於Hadoop,Spark,HBase以及kafka具體使用狀況以下表:api

大數據組件
Java NIO
Netty
Hadoop ✔️  
Spark   ✔️
HBase ✔️(2.0以前) ✔️(2.0以後)
Kafka ✔️  

Hadoop和Kafka是基於Java NIO的,Spark以前是基於Akka,1.6以後全面改爲了Netty。而HBase 2.0以前的實現是借鑑Hadoop也是基於Java NIO,2.0以後纔有了Netty實現。不管是基於Netty框架仍是Java NIO,網絡通訊的線程模型都是基於React。只不過Java NIO是顯示的(從代碼中能夠直接看到Acceptor, Listener,Reader,Responder等相關組件),而Netty是隱形。總的來講, Netty提供了更抽象的封裝,在易用性以及性能上會比Java NIO好一些(經過HBase來看,好像性能提高也不是特別明顯)。緩存

2,Spark實現

Spark網絡通訊實現所涉及的主要類圖及之間的關係以下圖所示:網絡

 

要點以下:app

1,TransportContext是入口,經過TransportContext能夠建立TransportServer和TransportClientFactory,而TransportClientFactory能夠建立TransportClient。這樣負責發送數據的TransportClient和接收請求的TransportServer便建立完畢。框架

2,TransportClientFactory的做用不單單是建立TransportClient,同時它還含有一個緩存池,用來緩存到各個不一樣遠端的TransportClient對象。若是獲取不到,則基於Netty建立Bootstrap,設置相關參數,對應的Handler,最終建立TransportClient對象。oop

3,TransportServer和TransportClient都使用TransportContext中的initializePipeline來初始化一系列的handler。這些handler包括編解碼器,以及TransportChannelHandler。TransportChannelHandler是一個處理輸入消息的handler(Inbound),將根據不一樣的請求(RequestMessage or ResponseMessage)交由對應的handler(TransportRequestHandler or TransportResponseHandler)進行處理。性能

4,在以上圖中,有一個很是重要的類RpcHandler。RpcHandler有不少不一樣的具體實現(如NettyRpcHandler主要實現基於Netty的Rpc實現,ExternalShuffleBlockHandler主要用來在External Shuffle service中發送和接收數據 )。能夠看到不一樣的RpcHandler通過TransportContext→TransportChannelHandler→TransprotRequestHandler嵌入到上面的通訊框架中,從而使得該框架可以適應不一樣的網絡通訊需求。總的來講:總體通訊框架不變,可是經過RpcHandler讓不一樣網絡通訊場景很好的融入了。大數據

除此以外,網絡通訊過程當中還涉及到了一些列的不一樣的消息,以及編碼等,因爲比較簡單,再也不作深刻介紹。編碼

3,小結

在以上基於Netty實現的網絡通訊中,應用主要的邏輯都封裝在不一樣的handler中,而後經過層次感的handler設計便可以很快摸清楚整個網絡通訊的過程。

相關文章
相關標籤/搜索