1. 程式人生 > >Hadoop管理員的十個最佳實踐

Hadoop管理員的十個最佳實踐

宣告

以下內容轉自 http://www.infoq.com/cn/articles/hadoop-ten-best-practice

前言

接觸Hadoop有兩年的時間了,期間遇到很多的問題,既有經典的NameNode和JobTracker記憶體溢位故障,也有HDFS儲存小檔案問題,既有任務排程問題,也有MapReduce效能問題.遇到的這些問題有些是Hadoop自身的缺陷(短板),有些則是使用的不當。

在解決問題的過程中,有時需要翻原始碼,有時會向同事、網友請教,遇到複雜問題則會通過mail list向全球各地Hadoop使用者,包括Hadoop Committer(Hadoop開發者)求助。在獲得很多人幫助後,自己將遇到問題和心得整理成文,希望本文可以對那些焦頭爛額的Hadoop新手們有所幫助,少走筆者的彎路。

PS. 本文基於 Cloudera CDH 3u4(同Apache Hadoop 1.0)編寫。相關推薦配置為官方推薦值或者筆者經驗數值,它不是絕對的,可能會因為不同的應用場景和硬體環境有所出入。

1. 選擇Cloudera CDH部署你的Cluster

動機

大多數管理員都是從Apache Hadoop開始學習。筆者最開始也使用Apache版本Hadoop進行開發和部署工作,但接觸到Cloudera CDH後,我發現它可以使管理員的工作更簡單,不僅可以獲得最新的特性和Bug修復,有時也會帶來令人驚喜的效能改善。

CDH為什麼更好?筆者羅列了以下幾點:

  1. CDH基於穩定版Apache Hadoop,並應用了最新Bug修復或者Feature的Patch。Cloudera常年堅持季度發行Update版本,年度發行Release版本,更新速度比Apache官方快,而且在實際使用過程中CDH表現無比穩定,並沒有引入新的問題。
  2. Cloudera官方網站上安裝、升級文件詳細,省去Google時間。
  3. CDH支援Yum/Apt包,Tar包,RPM包,Cloudera Manager四種方式安裝,總有一款適合您。官方網站推薦Yum/Apt方式安裝,筆者體會其好處如下:
    1. 聯網安裝、升級,非常方便。當然你也可以下載rpm包到本地,使用Local Yum方式安裝。
    2. 自動下載依賴軟體包,比如要安裝Hive,則會級聯下載、安裝Hadoop。
    3. Hadoop生態系統包自動匹配,不需要你尋找與當前Hadoop匹配的Hbase,Flume,Hive等軟體,Yum/Apt會根據當前安裝Hadoop版本自動尋找匹配版本的軟體包,並保證相容性。
    4. 自動建立相關目錄並軟鏈到合適的地方(如conf和logs等目錄);自動建立hdfs, mapred使用者,hdfs使用者是HDFS的最高許可權使用者,mapred使用者則負責mapreduce執行過程中相關目錄的許可權。

推薦指數:★★★

推薦理由:獲取最新特性和最新Bug修復;安裝維護方便,節省運維時間。

2. Hadoop叢集配置與管理

安裝和維護Hadoop叢集涉及大量的管理工作,包括軟體安裝,裝置管理(crontab、iptables等)、配置分發等。

對於小型叢集軟體分發和節點管理可以使用PDSH這款軟體,它可以通過免金鑰的SSH將檔案分發到目標伺服器,以及為一組目標裝置傳送命令並獲得反饋。如果是大型叢集或者硬體配置差別很大的叢集,推薦使用puppet這樣的工具幫助你維護配置檔案,或者通過Cloudera Manager以GUI的方式的管理叢集(注意:Clodera Manager不是開源軟體,免費版最多支援50個節點)。

推薦指數:★★★

推薦理由:提高運維效率

3. 開啟SecondaryNameNode

SecondaryNameNode(下稱SNN)的主要功能是工作是幫助NameNode(下稱NN)合併編輯日誌,然後將合併後的映象檔案copy回NN,以減少NN重啟時合併編輯日誌所需的時間。SNN不是NN的熱備,但是通過以下步驟可以實現將SNN切換為NN的目的。首先,SNN節點上匯入從NN Copy過來的映象檔案,然後修改SNN機器名和IP與NN一致,最後重啟叢集。

特別注意的是SNN的記憶體配置要與NN一致,因為合併編輯日誌的工作需要將metadata載入到記憶體完成。另外,不僅僅是SNN,任何儲存NN映象的節點都可以通過上面步驟變為NN,只是SNN更適合罷了。

推薦指數:★★★

推薦理由:減少NN重啟導致叢集服務中斷時間;NN節點故障後,SNN充當NN角色

4. 使用Ganglia和Nagios監控你的叢集

當執行一個大型mapreduce 作業時,我們通常非常關心該作業對TaskTracker(下稱TT)CPU、記憶體、磁碟,以及整個網路的頻寬情況,這時候就需要Ganglia這個工具為我們生成相關圖表來診斷、分析問題。

Ganglia可以監控叢集狀態,但當你的伺服器down機或者某個TT掛掉,它卻無法通知到你,這時我們可以使用Nagios這款告警軟體,它可以配置郵件告警和短息告警。通過編寫plugins,可以實現自己的監控功能。我們的叢集目前做了如下監控:

  1. NameNode、JobTracker記憶體
  2. DataNode和TaskTracker執行狀態
  3. NFS服務狀態
  4. 磁碟使用情況
  5. 伺服器負載狀態

推薦指數:★★★

推薦理由:Ganglia可以幫你記錄叢集狀態,方便診斷問題;Nagios可以再遇到問題時第一時間通知你。

5. 設定好記憶體至關重要

Hadoop叢集安裝完畢後,第一件事就是修改bin/hadoop-evn.sh檔案設定記憶體。主流節點記憶體配置為32GB,典型場景記憶體設定如下

NN: 15-25 GB
JT:2-4GB
DN:1-4 GB
TT:1-2 GB,Child VM 1-2 GB 

叢集的使用場景不同相關設定也有不同,如果叢集有大量小檔案,則要求NN記憶體至少要20GB,DN記憶體至少2GB。

推薦指數:★★★★★

推薦理由:幾個元件中NN對記憶體最為敏感,它有單點問題,直接影響到叢集的可用性;JT同樣是單點,如果JT記憶體溢位則所有MapReduce Job都無法正常執行。

6. 管理員玩轉MapReduce

Hadoop原生MapReduce需要Java語言編寫,但是不會Java也沒問題,通過Hadoop streaming框架管理員可以使用Python,Shell,Perl等語言進行MapReduce開發,但更簡單的辦法是安裝和使用Hive或者Pig。

推薦指數:★★★

推薦理由:減少運維時間,快速響應各種ad-hot需求和故障診斷。

7. NameNode HA

前面已經說過,NN是整個叢集可能出現的單點故障。

Hadoop通過在hdfs.site.xml檔案的dfs.name.dir屬性指定保持的metadata路徑,如果希望保持到多個路徑,可以使用逗號分割配置多個路徑。

<property>
    <name>dfs.name.dir</name>
    <value>/data/cache1/dfs/nn,/data/cache2/dfs/nn</value>
</property>

Hadoop官方推薦配置為metadata配置多個path,其中包含一個NFS的路徑。但根據筆者一次叢集嚴重故障經驗,即使這樣,還是導致了所有映象檔案損壞,包括SNN上的映象檔案,所以定期備份一個可用的副本還是很有必要的。

推薦指數:★★★★★

推薦理由:Cloudera3uX和Apache1.0的NN單點問題是大家最頭痛問題之一,多些準備,少許痛苦。

8. 使用firewall阻止壞人進入

Hadoop的安全控制非常簡單,只包含簡單的許可權,即只根據客戶端使用者名稱,決定使用許可權。它的設計原則是:“避免好人做錯事,但不阻止壞人做壞事”。

如果你知道某臺NN的IP和埠,則可以很輕鬆獲取HDFS目錄結構,並通過修改本機機器使用者名稱偽裝成HDFS檔案所屬owner,對該檔案進行刪除操作。

通過配置kerberos,可以實現身份驗證。但很多管理員使用更簡單有效的辦法——通過防火牆對訪問IP進行控制。

推薦指數:★★★★★

推薦理由:安全無小事,防範於未然。

9. 開啟垃圾箱(trash)功能

動機

我曾經犯下一個錯誤,在我加班非常累,大腦稍有混亂的時候,不小心刪除執行了一個命令“hadoop fs -rmr /xxx/xxx”,沒有刪除提示,幾TB的資料,一下子就沒有了。簡直讓我崩潰,後悔莫及。這時你多希望有個時間機器可以讓HDFS恢復到刪除前的狀態。

trash功能就是這個時間機器, 它預設是關閉的,開啟後,被你刪除的資料將會mv到操作使用者目錄的".Trash"資料夾,可以配置超過多長時間,系統自動刪除過期資料。這樣一來,當操作失誤的時候,可以把資料mv回來。開啟垃圾箱步驟如下:

vi core-site.xml ,新增下面配置,value單位為分鐘。

<property>  
  <name>fs.trash.interval</name>  
  <value>1440</value>  
</property>  

筆者 在CDH3u4下不用重啟Namenode就可以生效。開啟垃圾箱後,如果希望檔案直接被刪除,可以在使用刪除命令時新增“–skipTrash” 引數,如下:

hadoop fs –rm –skipTrash /xxxx

推薦指數:★★★★★

推薦理由:想要時間機器嗎?

10. 去社群尋找幫助

Hadoop是一個非常優秀的開源專案,但它仍存有很多尚未解決的問題,諸如,NN,JT單點問題,JT掛死問題,Block在小檔案下彙報效率低下等問題。此時可以通過如下渠道找到可以幫助你的人,筆者幾次叢集嚴重故障都是通過Cloudera公司的google user group直接獲得幾位 committer的幫助。通常前一天提問,第二天就會有反饋。下面是兩個能夠幫助的你的社群,當然你也可以幫助其他人:

Apache hadoop的mail list :

Cloudera CDH google group:

推薦指數:★★★★★

推薦理由:沒有人比軟體作者更熟悉Hadoop本身,去社群求助,幫你解決很多自己無法跨越的問題。

Cloudera簡介:

公司是一家Hadoop軟體服務公司,提供免費軟體CDH和Cloudera Manager Free Edition,同時提供Hadoop相關資訊、培訓、技術支援等服務。Hadoop創始人Dong Cutting在該公司任架構師,同時該公司擁有多名Apache Committer。

作者介紹:

張月, Java程式設計師,7年工作經驗,2007年加入藍汛chinacache至今,目前從事Hadoop相關工作,關注敏捷和海量資料領域,關注軟體開發過程。 他擁有Cloudera Certified Administrator for Apache Hadoop CCAH)和Cloudera Certified Developer for Apache Hadoop CCDH)證書,部落格:heipark.iteye.com

感謝鄭柯對本文的審校。

給InfoQ中文站投稿或者參與內容翻譯工作,請郵件至[email protected]。也歡迎大家通過新浪微博(@InfoQ)或者騰訊微博(@InfoQ)關注我們,並與我們的編輯和其他讀者朋友交流。


相關推薦

Hadoop管理員最佳實踐

宣告 以下內容轉自 http://www.infoq.com/cn/articles/hadoop-ten-best-practice 前言 接觸Hadoop有兩年的時間了,期間遇到很多的問題,既有經典的NameNode和JobTracker記憶體溢位故障,也有HDFS儲存

抵禦GandCrab勒索軟件的最佳實踐

策略 解密 都在 官網 員工 top 下載文件 方案 完全訪問 勒索軟件軟件越來越盛行,特別是在2017年的WannaCry之後,勒索軟件已經成為讓企業憂心的主要網絡威脅。隨著勒索軟件的演進,企業需要不斷關註他們的網絡生態,特別是近來勒索軟件開始出現了不同的變體。GandC

Laravel 的最佳實踐

這篇文章並不是什麼由 Laravel 改編的 SOLID 原則、模式等。 只是為了讓你注意你在現實生活的 Laravel 專案中最常忽略的內容。 單一責任原則 一個類和一個方法應該只有一個職責。 錯誤的做法: public functi

MySQL性能優化的21最佳實踐 和 mysql使用索引

oct 靜態 state zid 希望 lte 適合 實踐 打開 今天,數據庫的操作越來越成為整個應用的性能瓶頸了,這點對於Web應用尤其明顯。關於數據庫的性能,這並不只是DBA才需要擔心的事,而這更是我 們程序員需要去關註的事情。當我們去設計數據庫表結構,對操作數據庫時(

MySQL性能優化的21最佳實踐

明顯 架構 crash 其它 string 簡單的 nts arch 網絡 當我們去設計數據庫表結構,對操作數據庫時(尤其是查表時的SQL語句),我們都需要註意數據操作的性能。這裏,我們不會講過多的SQL語句的優化,而只是針對MySQL這一Web應用最多的數據庫。 1. 為

完美CSS文檔的8最佳實踐

風格 產品經理 sta war support display 主題 ucd 發生 在css的世界,文檔沒有被得到充分的利用。由於文檔對終端用戶不可見,因此它的價值常常被忽視。另外,如果你第一次為css編寫文檔,可能很難確定哪些內容值得記錄,以及如何能夠高效完

數據湖是一種方法 數據湖的四最佳實踐

發出 就是 arc 而不是 程序集 image new 裏的 子郵件 轉載自:http://bigdata.chinabyte.com/311/13871811.shtml數據湖聽起來很簡單:把數據或信息匯集到一個結合處理速度和存儲空間的大數據系統――Hadoop集群或內存

[轉] Jenkins Pipeline插件最佳實踐

而是 成員 file 腳本 定義 兼容 存檔 NPU mit [From] http://blog.didispace.com/jenkins-pipeline-top-10-action/ Jenkins Pipeline 插件對於 Jenkins 用戶來說可以讓用

Java 中處理異常的 9 最佳實踐

lan method 永遠 是否 res ati 是你 dex mes 在本文中,作者介紹了9個處理異常的最佳方法與實踐,以舉例與代碼展示結合的方式,讓開發者更好的理解這9種方式,並指導讀者在不同情況下選擇不同的異常處理方式。 以下為譯文: Java中的異常處理不是一個簡單

編寫 Node.js Rest API 的 10 最佳實踐

Node.js 除了用來編寫 WEB 應用之外,還可以用來編寫 API 服務,我們在本文中會介紹編寫 Node.js Rest API 的最佳實踐,包括如何命名路由、進行認證和測試等話題,內容摘要如下: 正確使用 HTTP Method 和路由 正確的使用 HTTP 狀態碼 使用 HTTP H

Java 程式設計中關於異常處理的10最佳實踐

        異常處理是Java 開發中的一個重要部分。它是關乎每個應用的一個非功能性需求,是為了處理任何錯誤狀況,比如資源不可訪問,非法輸入,空輸入等等。Java提供了幾個異常處理特性,以try,catch 和 finally 關鍵字的形式內建於語言自

有效資料湖攝取的5最佳實踐

在不斷波動的技術環境和客戶市場政策的世界中,資料已成為最大的商業資產之一。它加強並提高了組織在競爭中取得領先地位的能力。因此,它是一個關鍵的價值創造者,其管理,定期維護和儲存對於規劃未來持續成功的企業來說非常重要。多年來技術的進步在資料建立和儲存方面都是有利的,但它們永遠不足以進行有效的資料管理。有時,企

Hadoop資料遷移MaxCompute最佳實踐

本文向您詳細介紹如何通過使用DataWorks資料同步功能,將Hadoop資料遷移到阿里雲MaxCompute大資料計算服務上。 1.  環境準備 1.1 Hadoop叢集搭建 本文使用的EMR Hadoop版本資訊如下: EMR版本: EMR-3.11.0 叢

Java異常處理的9最佳實踐

無論你是新手還是資深程式設計師,複習下異常處理的實踐總是一件好事,因為這能確保你與你的團隊在遇到問題時能夠處理得了它。 在 Java 中處理異常並不是一件易事。新手覺得處理異常難以理解,甚至是資深開發者也會花上好幾個小時來討論是應該丟擲拋異常還是處理異常。 這就是為何大多

規模化敏捷開發的10最佳實踐(上)

【編者按】軟體開發和採購人員經常會對現有軟體開發方法、技巧和工具產生一些疑問。針對這些疑問,Kevin Fall 整理了五個軟體方面的話題:Agile at Scale,Safety-Critical Systems,Monitoring Software-In

編寫 Dockerfile 的五最佳實踐

此文適合Docker初學入門讀者,大師請繞行!,遵守最佳實踐可少踩坑、提升效能體驗及可移植性,期望對讀者有所幫助! 什麼是Dockerfile Dockerfile 是一個文字檔案,裡面包含了打包Docker映象所需要用到的命令。Docker 可以通

Jenkins Pipeline外掛最佳實踐

Jenkins Pipeline 外掛對於 Jenkins 使用者來說可以讓使用者能夠改變遊戲規則。基於 Groovy 中的領域特定語言(DSL),Pipeline 外掛使 Pipelines 可以有指令碼來定義,並且提供了非常強大的方法來開發複雜的、多步 DevOps Pipeline 。本文記錄了編寫

Java中處理異常的9最佳實踐

【譯者注】在本文中,作者介紹了9個處理異常的最佳方法與實踐,以舉例與程式碼展示結合的方式,讓開發者更好的理解這9種方式,並指導讀者在不同情況下選擇不同的異常處理方式。 以下為譯文:Java中的異常處理不是一個簡單的話題。初學者很難理解,甚至有經驗的開發人員也會

極限程式設計(XP)12最佳實踐

現場客戶 ( On-site Customer ) 程式碼規範 ( Code Standards ) 每週40小時工作制 ( 40-hour Week ) 計劃博弈 ( Planning Game ): 要求結合專案進展和技術情況,確定下一階段要開發與釋出的系統範圍。 系統隱喻 ( System Meta

針對雲遷移的 21 最佳實踐

熟能生巧。-Bobby Robson 在過去幾個月裡,我花了很多時間與各種 AWS 客戶和團隊合作來打造幫助企業加快雲遷移工作的全面計劃。此計劃包含許多方面,包括 (但不限於) AWS 服務 (例如,AWS Database Migration Service、AWS Sno