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

如何閱讀百萬行 Hadoop 的源碼?

大數據 Hadoop
首先 hadoop 是用 java 寫的,所以一些 java 基礎知識必不可少,比如鎖,線程,設計模式,java 虛擬機,java io,不求很深入,基礎得知道。

[[387391]]

本文轉載自微信公眾號「KK架構師」,作者wangkai。轉載本文請聯系KK架構師公眾號。

一、閱讀 HDFS 源碼的緣由

HDFS 是大數據的最基礎的設施了,幾乎所有的離線存儲都在 HDFS 上。

但是在大規模 HDFS 集群中,下面的問題通常會讓我們無比頭疼:

  • 元數據的量級超過億級之后,NameNode 的內存也會變得非常巨大,啟動和維護都變的異常困難;
  • 如何保障 HDFS 的高可用?
  • NameNode 里面發生長時間的 GC 之后,導致 NameNode 進程退出,該如何解決?
  • 如何優化 DataNode 的鎖粒度,讓其性能更高效?

以上種種問題,都需要我們閱讀源碼,甚至要修改它的源碼才能解決。

所以雖然閱讀源碼非常痛苦,但是這個坎還是得過的。

二、如何閱讀 Hadoop 這樣的百萬行代碼的開源項目

首先 hadoop 是用 java 寫的,所以一些 java 基礎知識必不可少,比如鎖,線程,設計模式,java 虛擬機,java io,不求很深入,基礎得知道。

其次,不能一行行的讀代碼,這樣很容易迷失在無邊際的代碼中,逃不出來,最后很容易就放棄了。

最后,以具體場景來驅動代碼閱讀。比如本文就是以 NameNode 的啟動過程,來驅動代碼閱讀的。并且把關鍵的流程節點和類用流程圖記錄下來。

三、源碼走讀

找到 NameNode 類

從 main 方法開始,創建 NameNode

進入這個方法:

有很多的 switch case ,由于我們啟動命令是 hadoop-daemon.sh start namenode,所以直接運行到 default 里面:

這是個比較重要的方法,實例化:

實例化方法里,有個比較重要的操作,startHttpServer(conf),啟動 50070 端口,就是我們 50070 那個界面:

進去,使用 ip 和 端口創建了 HttpServer

再來看這個 start 方法

進入 start 方法,發現創建了一個 HttpServer2,這是 Hadoop 自己封裝的服務

然后綁定了很多 Servlet,每個 Servlet 都是一個功能

可以看到畫紅線的,就是每個功能的地址。如果想看每個功能怎么實現的,可以點進去 Servlet,看它的 doGet 或者 doPost 或者 doPut 方法。

看完了這個,再退回到 NameNode 類中,然后就是去加載元數據(先不細看)

然后是創建 RPC 服務端,啟動一個服務端,給別的組件調用

看這個方法:

看這個地方,這個就是使用 hadoop 的 RPC ,來創建一個 RPC 服務端了。此時我們在 NameNodeRpcServer 類中。

創建了之后,再回到 NameNode 中,發現這個 NameNodeRpcServer 是 NameNode 類的一個屬性,意思是,NameNode 委托這個類去啟動了 NameNodeRpcServer,在設計模式中,屬于組合。

然后我們再來看這個 NameNodeRpcServer ,實現了很多的協議:

我們嘗試在 ClientProtocol 中,找一找是否有創建目錄的方法。

發現是有的,所以 NameNodeRpcServer 會去實現這個方法的。

到時候 NameNode 啟動之后,就會往外提供服務了。

然后我們再回到 NameNode 類,看最后一些功能:

startCommonServices,主要做了兩件事情,進行資源監察,檢查磁盤夠不夠;檢查是否可以退出安全模式。

這個方法會檢查配置文件中 fsimage 的目錄 和 editlog 的目錄磁盤資源是否充足。

最終會把磁盤是否足夠的布爾值賦值給這個變量。

  1. private volatile boolean hasResourcesAvailable = false

然后會判斷是否進入安全模式:

進入這個方法中:

這個 getCompleteBlocksTotal() 返回的是能正常使用的 Block 個數。

這個是怎么算的呢?

在 HDFS 中,存在兩種類型的 Block,一種是 Complete 類型,即為正常可用的 Block;另一種是 underconstruction 類型,處于正在構建的 Block,相減,就是正常可用的 Block 個數了。

然后進入 checkMode 方法

進去之后,有一個 needEnter() 方法,這個方法里,判斷了是否進入安全模式

這里面有三個進入安全模式的條件:

我們來看第一個條件:

  1. threshold != 0 && blockSafe < blockThreshold 

threshold 默認配置是 0.999 ,不等于0;

blockSafe 可以在當前類中搜索一下。

這個就表示,DataNode 每次心跳都要和 NameNode 匯報 自己的 Block 個數,每次匯報,這個值都會加 1.

如果 DataNode 匯報上來的 Block 個數小于所有可用的 Block 個數,就進入安全模式。

再來看第二個條件:

  1. datanodeThreshold != 0 && getNumLiveDataNodes() < datanodeThreshold 

這個條件表示,所有可用的 DataNode 小于配置的個數,則進入安全模式。

但是 datanodeThreshold 的默認配置值是 0,所以這個條件不啟用。

第三個條件:

  1. !nameNodeHasResourcesAvailable() 

這個方法就是我們前面檢查資源時,賦值出來的變量:

如果 NameNode 的 images 和 editlogs 所在的目錄,磁盤空間不足,則進入安全模式。

四、流程圖

最后我們用一個流程圖來總結一下 NameNode 啟動流程:

NameNode啟動流程

五、小結

主要有三大塊:

1、啟動 HttpServer ,可以查看 50070 端口;

2、管理和加載元數據;

3、啟動 RPCServer,使其他組件可以調用;

4、檢查磁盤空間;

5、判斷是否進入安全模式;

 

責任編輯:武曉燕 來源: KK架構師
相關推薦

2018-11-16 16:35:19

Java源碼編程語言

2017-04-13 19:26:21

2020-12-07 11:29:24

ReactVueVue3

2017-07-17 09:54:43

代碼C語言功能

2021-08-02 09:50:47

Vetur源碼SMART

2021-12-20 07:58:59

GitHub源碼代碼

2017-03-16 11:39:33

Openstack源碼姿勢

2013-12-24 10:05:04

memcached

2021-11-10 15:10:17

操作系統華為代碼

2018-03-28 16:10:23

閱讀源碼境界

2014-07-29 09:44:58

jQuery源碼

2019-08-14 16:52:23

閱讀源碼工具JDK

2018-07-31 14:49:45

編程語言Java源碼

2021-02-18 22:18:50

TCP 服務器源碼

2023-02-06 21:58:23

2018-12-10 23:19:12

人工智能機器學習技術

2012-02-14 14:05:59

JavaSpring

2017-04-05 16:40:45

2022-10-08 08:01:17

Spring源碼服務

2013-04-02 10:51:09

HadoopHadoop源碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧洲精品在线观看 | 亚洲区一区二区 | 国产成人精品免高潮在线观看 | 国内久久精品 | 91资源在线 | 中文成人在线 | 久久久久久免费精品一区二区三区 | 国产成人精品午夜视频免费 | 亚洲成人一区二区三区 | 日韩电影免费在线观看中文字幕 | 欧美日韩a| 久草在线中文888 | 日韩精品 电影一区 亚洲 | 玖玖操| 日韩精品在线播放 | 国产精品久久久久久久久久久免费看 | a级黄色片视频 | 精品一区二区三区在线观看 | 天堂av在线影院 | 一区二区三区四区av | 国产精品 亚洲一区 | 成人二区| 国产一区二区三区网站 | 久久与欧美 | 成人一区二区三区在线观看 | 欧美xxxx色视频在线观看免费 | 日韩欧美视频在线 | 日本午夜网站 | 亚洲精品一区二区三区 | 久久99精品久久久久 | 四虎在线视频 | 国产亚洲精品久久久久久牛牛 | 91精品国产91久久久久久最新 | 国产乱码精品1区2区3区 | 免费观看av | 成人欧美一区二区三区1314 | 日韩中文字幕 | 精品久久99| 中文字幕av高清 | 在线观看特色大片免费网站 | 亚洲综合久久久 |