hadoop1.x 兩大核心hdfs、mapredure,這兩個都存在乙個單點問題。
hadoop2.0的ha 機制有兩個namenode,乙個是active namenode,狀態是active;另外乙個是standby namenode,狀態是standby。兩者的狀態是可以切換的,但不能同時兩個都是active狀態,最多只有1個是active狀態。只有active namenode提供對外的服務,standby namenode是不對外服務的。active namenode和standby namenode之間通過nfs或者jn(journalnode,qjm方式)來同步資料。
active namenode會把最近的操作記錄寫到本地的乙個edits檔案中(edits file),並傳輸到nfs或者jn中。standby namenode定期的檢查,從nfs或者jn把最近的edit檔案讀過來,然後把edits檔案和fsimage檔案合併成乙個新的fsimage,合併完成之後會通知active namenode獲取這個新fsimage。active namenode獲得這個新的fsimage檔案之後,替換原來舊的fsimage檔案。
這樣,保持了active namenode和standby namenode的資料的實時同步,standby namenode可以隨時切換成active namenode(譬如active namenode掛了)。而且還有乙個原來hadoop1.0的secondarynamenode,checkpointnode,buckcupnode的功能:合併edits檔案和fsimage檔案,使fsimage檔案一直保持更新。所以啟動了hadoop2.0的ha機制之後,secondarynamenode,checkpointnode,buckcupnode這些都不需要了。
namenode 初始化啟動,進入 standby 狀態
在 namenode 以 ha 模式啟動的時候,namenode 會認為自己處於 standby 模式,在 namenode 的建構函式中會載入 fsimage 檔案和 editlog segment 檔案來恢復自己的記憶體檔案系統映象。在載入 editlog segment 的時候,呼叫 fseditlog 類的 initsharedjournalsforread 方法來建立只包含了在 journalnode 集群上的共享目錄的 journalset,也就是說,這個時候只會從 journalnode 集群之中載入 editlog,而不會載入本地磁碟上的 editlog。另外值得注意的是,載入的 editlog segment 只是處於 finalized 狀態的 editlog segment,而處於 in-progress 狀態的 segment 需要後續在切換為 active 狀態的時候,進行一次資料恢復過程,將 in-progress 狀態的 segment 轉換為 finalized 狀態的 segment 之後再進行讀取。
載入完 fsimage 檔案和共享目錄上的 editlog segment 檔案之後,namenode 會啟動 editlogtailer 執行緒和 standbycheckpointer 執行緒,正式進入 standby 模式。如前所述,editlogtailer 執行緒的作用是定時從 journalnode 集群上同步 editlog。而 standbycheckpointer 執行緒的作用其實是為了替代 hadoop 1.x 版本之中的 secondary namenode 的功能,standbycheckpointer 執行緒會在 standby namenode 節點上定期進行 checkpoint,將 checkpoint 之後的 fsimage 檔案上傳到 active namenode 節點。
namenode 從 standby 狀態切換為 active 狀態
當 namenode 從 standby 狀態切換為 active 狀態的時候,首先需要做的就是停止它在 standby 狀態的時候啟動的執行緒和相關的服務,包括上面提到的 editlogtailer 執行緒和 standbycheckpointer 執行緒,然後關閉用於讀取 journalnode 集群的共享目錄上的 editlog 的 journalset,接下來會呼叫 fseditlog 的 initjournalsetforwrite 方法重新開啟 journalset。不同的是,這個 journalset 內部同時包含了本地磁碟目錄和 journalnode 集群上的共享目錄。這些工作完成之後,就開始執行「基於 qjm 的共享儲存系統的資料恢復機制分析」一節所描述的流程,呼叫 fseditlog 類的 recoverunclosedstreams 方法讓 journalnode 集群中各個節點上的 editlog 達成一致。然後呼叫 editlogtailer 類的 catchupduringfailover 方法從 journalnode 集群上補齊落後的 editlog。最後開啟乙個新的 editlog segment 用於新寫入資料,同時啟動 active namenode 所需要的執行緒和服務。
namenode 從 active 狀態切換為 standby 狀態
當 namenode 從 active 狀態切換為 standby 狀態的時候,首先需要做的就是停止它在 active 狀態的時候啟動的執行緒和服務,然後關閉用於讀取本地磁碟目錄和 journalnode 集群上的共享目錄的 editlog 的 journalset。接下來會呼叫 fseditlog 的 initsharedjournalsforread 方法重新開啟用於讀取 journalnode 集群上的共享目錄的 journalset。這些工作完成之後,就會啟動 editlogtailer 執行緒和 standbycheckpointer 執行緒,editlogtailer 執行緒會定時從 journalnode 集群上同步 edit log。
內容來自網易微專業課堂來自搜尋內容
大資料實戰之環境搭建 六
這篇我們看如何搭建solr,因為第一篇講述了在windows下如何搭建,所以這裡就簡單的說一下。前面已經提到我們將solr壓縮包拷貝至了usr tmp下。之後我們將solr解壓目錄下面的example solr拷貝到上面solr 4.3.0下 ok,完了之後進行我們的最後一步,在tomcat下面的 ...
大資料實戰 Hive 技巧實戰
select address from test where dt 20210218 union all select address from test where dt 20210218 address m a m a m b m b m b m b select address from te...
大資料實戰 pyspark使用
解壓 tar xvf python 3.6.3.tgz原始碼編譯安裝python3 yum install zlib devel bzip2 devel openssl devel ncurses devel sqlite devel readline devel tk devel gcc make...