成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Hadoop中IPC的源碼分析

大數(shù)據(jù) Hadoop
最近開始看 Hadoop 的一些源碼,展開 hadoop 的源碼包,各個組件分得比較清楚,于是開始看一下 IPC 的一些源碼。

最近開始看Hadoop的一些源碼,展開 hadoop 的源碼包,各個組件分得比較清楚,于是開始看一下IPC的一些源碼。

IPC模塊,也就是 進程間通信模塊,如果是在不同的機器上,那就可以理解為 RPC 了,也就是遠程調(diào)用。事實上, hadoop 中的 IPC 也就是基于 RPC 實現(xiàn)的。

使用 sloccount 統(tǒng)計一下 ipc 包中代碼的行數(shù),一共是 2884 行。也就是說,IPC 作為hadoop的基礎(chǔ)組件,僅僅用了不到3000行的代碼,就完成得穩(wěn)定且富有效率。

IPC 中的關(guān)鍵類關(guān)系:

 

 

對用戶而言,可以直接使用的就是綠色的類。

通過 RPC 這個門面:

  • 客戶端可以創(chuàng)建相應(yīng)的 proxy,接著就可以進行遠程調(diào)用。
  • 而服務(wù)提供者則可以創(chuàng)建相應(yīng)的 server,并進行相應(yīng)的生命周期管理(start、stop),從而提供服務(wù)。

序列化

從上圖也可以看出,client 和 server 的交互,是通過網(wǎng)絡(luò) connection, 而走網(wǎng)絡(luò)的調(diào)用,是需要走序列化/反序列話的過程的。

這個過程, IPC 使用了 Hadoop 的自己的序列化機制,一切都在 Writable 接口中,只要給定 writable 的 DataOutput 和 DataInput,就可以讓 Writable 自己實現(xiàn)序列化。

一些問題和思考

  • client 是單例的嗎 —— 可以理解為是,但其實不一定。可以跟蹤 getProxy 的代碼,雖然每次都會新建一個代理對象,但底層的 Client 還是和 SocketFactory 對應(yīng)的。一般默認的,都是使用默認的 SocketFactory, 但如果你設(shè)置了 "hadoop.rpc.socket.factory.class.default" ,則會有新的Client與你自定義的 SocketFactory 對應(yīng)。這時候, client 就不是單例的。

  • client 與同一個 server 有幾個連接 —— 一個 client與一個 server 只有一個連接,具體可以看生成的代理中,有一個 remoteId, 這個 remoteId 是和 client關(guān)聯(lián)的,client 進行調(diào)用的使用,會將此 remoteId 作為一個 connectionId。因此,一般一個 client 是一個連接。

  • 如果 client 是一個連接,那么對此 client 的調(diào)用,不都是串行的嗎? —— 看你怎么理解了,在用戶層面,也就是 client 調(diào)用的方法,是可以并發(fā)的。client 底層是使用一個連接來進可能的完成吞吐量。每個 request 和 response 都會有一個 id 關(guān)聯(lián)起來。因此一個連接上可以跑滿請求和相應(yīng)。

  • 由于網(wǎng)絡(luò)問題,client調(diào)用服務(wù)失敗后,有重試機制嗎 —— 在IPC中沒有看到call的重試,需要上層去保證了。但是后面的調(diào)用會重新建立連接。

  • server 是單例的嗎 —— 不一定。如果你只 getServer 一次的話。創(chuàng)建一個 server 的代價是非常重的。通過上圖你也可以知道,他需要有一個線程 (Listener)來 accept socket,同時需要一些 Reader線程 來進行 socket 的 read,還有一個 Responder 來進行 socket 的 write,另外,還有若干個 handler線程 來進行業(yè)務(wù)處理。因此,如果可以減少 server 的個數(shù),就應(yīng)該減少 server 個數(shù)。

  • 暴露出的服務(wù)是否應(yīng)該是線程安全的 —— 是的,一定要線程安全。server 底層是通過 nio 進行 socket 操作的,因此雖然只有一個線程負責(zé) accept,但是能夠支持很多的client連接。這些連接在到達 server 端之后,很有可能就會并發(fā)執(zhí)行同一方法(如果你的業(yè)務(wù)handler不止一個的話)

  • 一個 server 要消耗多少線程資源? —— 讓我們來算一下,一個 Listener 線程,若干個 Reader 線程(默認1個),若干個 Handler 線程(在 getServer 的時候指定,一般1 - 10個),一個 Responder 線程。如果都按照默認值來計算的話。最少需要 1 + 1 + 1 + 1 = 4 個線程。也許,不應(yīng)該算多,如果請求量不大的話,這些線程應(yīng)該都被 blocked 住的。

總結(jié)

  • Hadoop 的 IPC 是一個比較輕量級別的 RPC
  • 從代碼來看,只支持 java 進程之間的通信
  • 從沒有重試機制、一個 Client 只有一個連接的機制來看,適合與應(yīng)用網(wǎng)絡(luò)環(huán)境較好的場景,適合同機架或者同機房的集群。

P.S. 看了一下 io 包中,其實有個 retry 的 package,里面就是一個重試機制。奇怪的是為啥這個 package 被包含在 io package 中。

原文鏈接:http://my.oschina.net/zavakid/blog/119020

責(zé)任編輯:林師授 來源: zavakid的博客
相關(guān)推薦

2022-03-30 15:06:25

數(shù)據(jù)傳輸Harmony源碼分析

2012-05-31 02:54:07

HadoopJava

2017-05-15 19:40:40

AndroidIPC機制

2019-12-31 14:59:06

TomcatNIOJava

2023-04-28 08:42:08

Linux內(nèi)核SPI驅(qū)動

2021-03-13 14:08:00

Hadoop 源碼HDFS

2011-03-15 11:33:18

iptables

2014-08-26 11:11:57

AsyncHttpCl源碼分析

2011-05-26 10:05:48

MongoDB

2011-08-31 16:01:33

2018-06-15 20:44:40

Hadoop數(shù)據(jù)分析數(shù)據(jù)

2021-11-11 17:40:08

WatchdogAndroid源碼分析

2015-11-16 11:22:05

Java對象內(nèi)存分配

2021-03-11 08:10:48

JVM對象的創(chuàng)建School

2020-08-26 14:00:37

C++string語言

2011-05-26 16:18:51

Mongodb

2018-07-19 15:57:46

ViewStub源碼方法

2015-03-24 15:08:21

mapreducehadoop

2014-02-12 10:28:50

Hadoop

2020-05-27 11:20:37

HadoopSpark大數(shù)據(jù)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: avhd101在线成人播放 | 国产乱码精品一区二区三区忘忧草 | 91免费在线播放 | 国产午夜精品视频 | 91久久久久| 成人精品一区二区三区中文字幕 | 国内精品视频一区二区三区 | 2018中文字幕第一页 | 免费观看成人性生生活片 | 欧美一级大黄 | 亚洲网在线 | 国产成人精品久久二区二区91 | 九九热国产视频 | 天天操天天拍 | 亚洲国产一区在线 | 日韩精品成人在线 | 亚洲精品中文字幕在线观看 | 精品久久久久久中文字幕 | 日韩午夜| 天天射美女 | 日日干日日操 | 日韩在线小视频 | 亚洲国产精品91 | 久久久免费在线观看 | 中文字幕在线观看精品 | 欧美日韩在线播放 | 特级做a爰片毛片免费看108 | 成人一区二区三区在线观看 | 久久9精品 | 成人妇女免费播放久久久 | 国产乱人伦精品一区二区 | 中文字幕 国产精品 | 国产精品自拍啪啪 | 天天综合永久入口 | 成年人网站免费 | 欧美日韩综合精品 | 久久国产精品久久 | 久久99精品国产麻豆婷婷 | 四虎影视免费观看 | 久久久久国产一级毛片 | 国产精品一区二区三区久久久 |