Livy探究(三) -- 核心架構細節探索

在前兩篇中,咱們經過官網的example體驗了livy的功能,留下了一個疑問,究竟livy是如何作到的呢?這一篇從源碼裏面找一下答案。網絡

在直接分析源碼前,先把結論經過時序圖畫出來,有個直觀的映像:session

image.png

  1. 客戶端建立session,LivyServer收到請求後啓動一個RpcServer。RpcServer會順序選擇一個從10000~10010之間的可用端口啓動監聽,假設此時是10000
  2. LivyServer隨後經過SparkSubimit提交Application。Application在遠端,最終會啓動RSCDrvier
  3. RSCDrvier首先也從10000~10010之間順序選擇一個可用的端口,啓動RpcServer。圖中打出了關鍵的日誌,第二篇中曾經提到過這個日誌。
  4. RSCDrvier完成bind後,反向鏈接到LivyServer端的RpcServer。圖中打出了關鍵的日誌,第二篇中一樣提到過。
  5. RSCDrvier主要向LivyServer所在的RpcServer上報本身bind的端口和ip。這一步其實就是最關鍵的步驟。
  6. RpcServer收到請求後將RSCDrvier的端口和ip封裝成ContextInfo返回給LivyServer。同時關閉RpcServer
  7. LivyServer經過RSCDrvier的端口和ip鏈接到RSCDriver,從而完成tcp鏈接。至此session創建完成

以上就是簡化的核心工做原理,能夠經過netstat證明一下網絡鏈接關係。vm3198是livyServer,vm3196是driver所在機器tcp

下圖是driver上的相關鏈接:spa

image.png

能夠看到driver啓用了10000端口的監聽日誌

下圖是livyServer上的相關鏈接:code

image.png

能夠看到livyServer有一條鏈接到driver的鏈路,端口是能夠對應上的ip

讀者可能注意到,這裏Driver的監聽端口並非10001,而是10000。這是由於雖然livyServer會率先佔用10000,但因爲Driver與livyServer不在一臺機器上,因此對於Driver來講,10000當時並無被佔用,因此就使用10000端口了

注意到,咱們在livyServer上並無找到10000端口的監聽。這是由於,一旦driver將本身的地址回發過來(經過回發RemoteDriverAddress消息),livyServer的Rpc監聽就關閉了。rpc

讀者可能會考慮,RSCDrvier是如何知道livyServer的Rpc監聽端點的呢?答案在啓動Spark任務時上送的配置文件,咱們摘取其中關鍵的配置項:get

spark.__livy__.livy.rsc.launcher.address=vm3198
spark.__livy__.livy.rsc.launcher.port=10000

launcher.address/port;就是livyServer啓動的Rpc監聽端點。從RSCDriver的源碼能夠看到,程序從配置文件中讀取了信息:源碼

...
// Address for the RSC driver to connect back with it's connection info.
LAUNCHER_ADDRESS("launcher.address", null)
LAUNCHER_PORT("launcher.port", -1)
...

String launcherAddress = livyConf.get(LAUNCHER_ADDRESS);
int launcherPort = livyConf.getInt(LAUNCHER_PORT);
...
LOG.info("Connecting to: {}:{}", launcherAddress, launcherPort);

總結

本篇咱們探究了livy的核心工做機制,瞭解了創建session時,在livyServer和Driver之間是如何創建鏈接關係的。更多關於rpc通訊的細節有機會還會再基於源碼詳細展開分析

相關文章
相關標籤/搜索