hadoop各個元件之間的通訊

2022-06-06 21:03:09 字數 4009 閱讀 4379

文章**:

在hadoop中為了方便集群中各個元件之間的通訊,它採用了rpc,當然為了提高元件之間的通訊效率以及考慮到元件自身的負載等情況,hadoop在其內部實現了乙個基於ipc模型的rpc。關於這個rpc元件的整體情況我已紹經在前面的博文中介紹過了。而在本文,我將結合源**詳細地介紹它在客戶端的實現。

先來看看與rpc客戶端相關聯的一些類吧!

1.client類

private hashtableconnections = new hashtable(); //與遠端伺服器連線的快取池

private class extends writable> valueclass; //遠端方法呼叫發回後返回值解析器

final private int maxidletime; //連線的最大空閒時間

final private int maxretries; //socket連線時,最大retry次數

private boolean tcpnodelay; //設定tcp連線是否延遲

private int pinginterval; //ping服務端的間隔

在client中,因為與伺服器的每一次連線不僅會產生網路延遲,而且也會占用大量的系統資源,所以在client內部設計了乙個連線池,用來快取與不同服務端的連線,通過物件connectionid來表示每一連線。當然,每乙個連線有乙個最大空閒期maxidletime,如果乙個連線在時間maxidletime內沒有被使用的話,該連線將自動關閉與server的連線,以此來釋放該連線在伺服器端和客戶端的系統資源。這個最大空閒期maxidletime的值可以通過客戶端的配置檔案來設定,對應的配置項為:ipc.client.connection.maxidletime。同時為了維護該連線的有效性,該連線設定了基於tcp的socket的網路超時時間,當該連線發生sockettimeoutexception時,會自動的向伺服器端傳送ping包,來測試當前客戶端與伺服器端的連線是否正常,同時也來告訴伺服器自己現在還是在正常工作的,若果處理來了就可以把結果傳送回來,這個超時時間的值為pinginterval,該值的預設大小是60000ms,不過也可以通過 客戶端的配置檔案來配置,對應的配置項為:ipc.ping.interva l。另外,當該連線向伺服器發起連線請求失敗的時候,可以不斷的重新嘗試,嘗試的次數由maxretries決定,當嘗試的次數超過該值時,就將該連線視為徹底的失敗,客戶端的這一次rpc也就失敗了。maxretries預設的值為10,但也可以客戶端的配置檔案來配置,對應的配置選項為:ipc.client.connect.max.retries。底層的基於tcp的socket網路連線還可以通過配置檔案來設定是否延遲,對應的配置項為:ipc.client.tcpnodelay。其實,對於上面client內部的四個引數,我們可以根據具體的應用場景來設定適當的值,已達到提高hadoop集群效能的目的。當乙個rpc成果返回之後,client還需要把此次呼叫的返回結果解析成使用者真正需要的資料型別(畢竟,網路返回的都是0/1序列),所以cleint在其內部還需要乙個解析器,該解析器的型別為valuesclass,在hadoop的0.20.2.0版本中,這個解析器的型別為objectwritable。但是令人不解的是,每一次rpc呼叫返回之後,都會利用jdk的反射機制來建立該類的乙個例項,然後利用這個解析器例項來解析返回結果,這樣做的後果想必熟悉jdk反射機制的人都很清除了。

2.call類

int id; // 呼叫標示id

writable param; // 呼叫引數

writable value; // 呼叫返回的值

ioexception error; // 異常資訊

boolean done; // 呼叫是否完成

客戶端的一次rpc所涉及到的所有引數資訊(方法名、輸入引數、返回值)都被抽象到乙個call物件中,不過在這裡所要說的是,call的param屬性包含了此次rpc呼叫的方法名和所有的輸入引數,它的具體型別是org.apache.hadoop.ipc.rpc.invocation,它主要屬性有:

private string methodname; //方法名

private class parameterclasses; //引數型別集合

private object parameters; //引數值

3.connectionid類

inetsocketaddress address;//連線例項的socket位址

groupinformation ticket;//客戶端使用者資訊

class> protocol;//連線的協議

前面剛說過,在client內部設計了乙個rpc連線池,避免與伺服器端頻繁的連線於關閉,以此來提高整個系統的工作效率,所以就需要乙個標識來表示乙個唯一的rpc連線,在這裡是通過伺服器位址、使用者資訊、協議型別三個資訊來唯一標識乙個rpc連線的。

4.connection類

private inetsocketaddress server; // 服務端ip:port

private connectionheader header; // 連線頭資訊,該實體類封裝了連線協議與使用者資訊usergroupinformation

private connectionid remoteid; // 連線id

private socket socket = null; // 客戶端已連線的socket

private datainputstream in;

private dataoutputstream out;

private hashtablecalls = new hashtable(); //待處理的rpc佇列

private atomiclong lastactivity = new atomiclong();// 最後i/o活躍的時間

private atomicboolean shouldcloseconnection = new atomicboolean(); //連線是否關閉

private ioexception closeexception; //連線關閉原因

在client內部,把每乙個rpc連線connection設計成了乙個後台執行緒,它的內部放置了乙個任務佇列來儲存待處理的rpc呼叫,當乙個 rpc連線的空閒時間超過設定的最大空閒值時就會自動的關閉,從而及時地釋放自己在客戶端和伺服器端所占用的系統資源。為了保證客戶端和伺服器端底層通訊協議的一致性,客戶端在與伺服器端建立網路連線之後會馬上向伺服器端傳送乙個頭部資訊,以確保c/s兩端所用的協議版本號是相同的,當伺服器端發現自己與客戶端所使用的通訊協議版本號不一致時,會立馬關閉與客戶單的網路連線,而客戶端之後會丟擲eofexception異常資訊。這個頭部資訊如下:

hrpc:hadoop的rpc實現標識;

version:協議的版本號;

length:剩餘首席資訊官度;

protocol:協議型別;

flag:是否有客戶端資訊;

ugi:客戶端資訊;

客戶端的一次rpc呼叫的處理過程如下圖:

client為客戶設計了兩種呼叫介面,一種是單個rpc呼叫介面,一種是批量的rpc呼叫,如下:

public writable call(writable param, inetsocketaddress addr, class> protocol, usergroupinformation ticket) throws interruptedexception, ioexception

public writable call(writable params, inetsocketaddress addresses, class> protocol, usergroupinformation ticket) throws ioexception

不過這種批量的rpc呼叫的本質只是對單個rpc呼叫介面的迴圈呼叫,基本上沒有做出任何的優化。個人認為可以對批量的rpc呼叫進行改進來優化呼叫的執行效率,如:在一次批量的rpc呼叫中,對於所有相同的server,可以一次性全部傳送到該server,然後呼叫的所有執行結果根據該server當前的具體情況一次性全部返回或者分批次返回。總體說來,hadoop的rpc過程是乙個同步的過程。

元件之間通訊

一 父元件向子元件傳遞資料 在 vue 中,可以使用 props 向子元件傳遞資料。子元件部分 這是 header.vue 的 html 部分,logo 是在 data 中定義的變數。如果需要從父元件獲取 logo 的值,就需要使用props logo 在 props 中新增了元素之後,就不需要在 ...

父子元件之間的通訊

父向子元件傳參 父元件直接定義屬性 msg 和屬性值 something interesting 子元件想要取得父元件中定義的屬性值 something interesting 在子元件中定義props,屬性名 msg 在陣列中 子元件即可得到該引數 this.msg 子向父元件傳參 在compon...

vue元件之間的通訊

區域性元件 區域性元件必須手動掛載,不然無法生效。全劇元件 全域性元件不需要手動掛載,但不常用,盡量不要在全域性上掛載變數或者元件 影響瀏覽器效能 配合模板實現元件之間的巢狀。元件是vue.js最強大的功能之一,核心目標是擴充套件htnl元素,封裝可重用 元件可按照template,style,sc...