Hadoop性能调优概要说明
Hadoop容易遇到的問題有:Namenode/jobtracker單點故障、HDFS小文件問題、數據處理性能等。為此 “Hadoop Performance Optimization”(HPO)是必要的。本文試著從性能調優的總體原則入手來了解概要,實際生產中遇到的問題也會在這個框架下處理。
Hadoop運行環境:
下面大致給出這四個層次的調優原則。
1、硬件選型原則
?
2、操作系統調優
1)避免使用swap分區 將hadoop守護進程的數據交換到硬盤的行為可能會導致操作超時。
在Linux系統當中,如果一個進程的內存不足,其內存中的部分數據會暫時寫到磁盤上,在需要的時候,會再將磁盤中的數據動態的置換到內存當中,這樣一來,一些不必要的流程就會顯現出來。通常,這會導致進程的執行效率降低。再分布式環境當中,使用MapReduce這樣的計算模型時,可以通過控制每個Job的處理數量和每個Task運行過程使用的緩沖區的大小,避免我們去使用Swap分區。通過/etc/sysctl.conf文件中的vm.swappiness參數來達到目的。
2)調整內存分配策略:操縱系統內核根據vm.oversommit_memory 的值來決定分配策略,并且通過vm.overcommit_ratio的值來設定超過物理內存的比例。
3)修改net.core.somaxconn參數:
該參數表示socker監聽backlog的上限,默認為128,socker的服務器會一次性處理backlog中的所有請求,hadoop的ipc.server.listen.queue.size參數和linux的net.core.somaxconn
參數控制了監聽隊列的長度,需要調大。
4)增大同時打開文件描述符的上限
對內核來說,所有打開的文件都通過文件描述符引用,文件描述符是一個非負整數,hadoop的作業經常會讀寫大量文件,需要增大同時打開文件描述符的上限。
5)選擇合適的文件系統,并禁用文件的訪問時間
ext4 xfs ,文件訪問時間可以讓用戶知道那些文件近期被查看或修改,但對hdfs來說, 獲取某個文件的某個塊 被修改過,沒有意義,可以禁用。
6)關閉THP(transparent Huge Pages)
THP 是一個使管理Huge Pages自動化的抽象層, 它會引起cpu占用率增大, 需要關閉。
echo never> /sys/kernel/mm/redhat_transparent_hugepage/defrag
echo never> /sys/kernel/mm/redhat_transparent_hugepage/enabled
echo never> /sys/kernel/mm/transparent_hugepage/enabled
echo never> /sys/kernel/mm/transparent_hugepage/defrag
7)增大網絡連接上限
在Hadoop集群當中,其內部的一些通信依賴網絡,需調整Linux參數net.core.somaxconn,讓其處于一個足夠大的狀態。
8)預讀取
磁盤IO性能沒有CPU和內存這樣發展迅猛,因而它成為OS當中一個主要的性能瓶頸。改進磁盤IO性能也是重要的優化手段之一。可以使用Linux的blockdev命令來設置預讀取的緩沖區大小,以便提高Hadoop的文件讀取性能。
3、JVM調優
JVM本身的調優,實際還是和OS以及Hadoop結合,如mapreduce作業的堆內存執行設置。
在YARN里面,可以啟用JVM的重用機制來得到性能的提升。啟用該功能能夠讓一些Task的執行效率提高2~3倍。
YARN的默認配置會禁用該組件,即不允許重用JVM。首先,我們需要明白YARN是如何執行一個MapReduce的Job。其步驟如下所示:
1)RM(Resource Manager)里面的AM(Application Manager)會為每個Application(一個MR的Job)在NM(NodeManager)里面申請一個Container
2)在申請到的Container里面啟動一個Application Master,Container在YARN中分配資源的容器(內存、CPU、磁盤空間等),它啟動便會對應的啟動一個JVM
3)ApplicationMaster會持續為Application包含的每一個Task(一個Map Task或者Reduce Task)向RM申請一個Container
4)每得到一個Container,該Container所屬的NM將此Container啟動
5)該Container執行對應的Task
6)對應的Task執行完畢,該Container被NM回收,而Container所擁有的JVM相應的推出
通過上述的流程可以看出,這種情況下,每一個JVM僅只執行了一個Task,JVM并未被重用。
因而,用戶可以通過啟用ubertask屬性來重用JVM,在同一個Container里面一次執行多個Task,可以在mapred-site.xml中配置對應的參數即可,內容如下所示:
<property>
<name>mapreduce.job.ubertask.enable</name>
<value>true</value>
</property>
如果啟用該功能,會將一個Application中的所有子Task在同一個JVM里面執行,到達JVM重用的目的。該JVM負責Application中的Application Master中所用的JVM,即運行在Container當中。
最后,當ubertask功能被啟用的時候,YARN是如何執行一個application的。首先,RM里的AM會為每一個Application在NM里面申請一個Container,然后在該container里面啟動一個Application Master。Containe啟動時便會相應啟動一個JVM。此時,如果ubertask功能被啟用,Application Master會在JVM中按照順序依次在Container中執行每一個Task,這樣Application Master便不用再為每一個Task向RM去申請一個單獨的Container,從而達到了重用JVM(資源重用)的目的。
4、Hadoop調優
4.1 HDFS調優
1)設置合理的塊大小(dfs.block.size)
2)將中間結果目錄設置為分布在多個硬盤以提升寫入速度(mapred.local.dir)
3)設置datanode處理RPC的線程數,大集群可以適當加大(dfs.datanode.handler.count),默認為3,可以適當加大為10
4)設置namenode能同時處理的請求數,(dfs.namenode.handler.count),為集群模式的自然對數(lnN)的20倍。
?
4.2 YARN調優
yarn的資源表示模型為ceontainer(容器),container 將資源抽象為兩個維度,內存和虛擬cpu(vcore)
1)兼容各種計算框架
2)動態分配資源,減少資源浪費
容器內存yarn.nodemanager.resource.memory-mb
最小容器內存yarn.scheduler.minimum-allocation-mb
容器內存增量yarn.scheduler.increment-allocation-mb
最大容器內存yarn.scheduler.maximum-allocation-mb
容器虛擬cpu內核yarn.nodemanager.resource.cpu-vcores
最小容器虛擬cpu內核數量yarn.scheduler.minimum-allocation-vcores
容器虛擬cpu內核增量yarn.scheduler.increment-allocation-vcores
最大容器虛擬cpu內核數量yarn.scheduler.maximum-allocation-vcores
?
4.3 MapReduce調優,調優三大原則
1)增大作業并行程度
2)給每個任務足夠的資源
3)在滿足前2個條件下,盡可能的給shuffle預留資源。
參考hadoop官網對參數配置的說明,結合實際問題做調優。在對Hadoop調優時,這是一個龐大的任務,這里進行分解來看,按Hadoop的組成模塊來分,比如HDFS、MapReduce、YARN等模塊去優化對應的模塊。若是在細分,我們可以優化其各個組件的相關配置文件,其每個模塊都有對應的XML文件,在系統啟動時,會通過Configure加載到系統當中,而對應的XML文件當中,配置的參數和屬性比較多,有些參數是根據業務本身去優化,如:心跳間隔、緩沖區大小、JVM子進程最大內存、小文件的合并數、歸并map輸出數據占比等等。
另外,在處理一些IO密集的應用,會在執行MapReduce時產生大量的中間輸出數據(Map Task執行階段),而產生的這些數據對于使用者來說是并不關心的(透明化)。這里,可以思考一下,有木有一種辦法能夠集中處理這些輸出數據。答案是肯定的,在MapReduce中支持壓縮算法,我們可以在執行這部分流程時,將中間輸出數據壓縮存儲,這樣在IO性能方面有會有明顯的提升。然而,萬物皆有因果,在選擇壓縮算法時,需考慮壓縮比和壓縮效率,在一些壓縮算法當中,有的壓縮比非常可觀,然而其壓縮效率卻非常低下;反之,有的壓縮比較差,然其壓縮效率非常理想。因為,我們需要在壓縮比和壓縮效率之間做一個平衡,選擇合適的算法,去平衡二者的關系。
目前,存在許多的壓縮格式,如:GZIP,ZIP,LZO,Snappy等等,測試表明其中LZO和Snappy較為可觀(具體量化指標圖不方便給出)。當然,這個也不是絕對的,是當下業務去測試,然后選擇合適的壓縮格式。
上面提點過預讀取機制,可以通過預讀取機制來有效的提升磁盤IO的讀性能。通過改機制提高HDFS的讀性能以及MapReduce作業的執行效率。
當然,從應用程序也是有優化的空間的,處理應用程序當中配置必要的作業參數之外,其本身的編寫方式對性能也是有影響的。在執行一大批MapReduce作業時,若是設置一個Combiner,對于提供作業的性能大有裨益。在了解MapReduce(其分兩部分,其一為計算模型,其二為運行環境,盡管Hadoop版本升級到2.x,然其計算模型不變,變得只是其運行環境。其運行環境是基于YARN的資源管理)的計算模型時,在弄明白Combiner階段的好處后,會發現,我們在編寫相關作業時,添加Combiner可減少Map Task的中間輸出結果,從而減少各個Reduce Task的遠程Copy數據量,最終帶來的益處是縮短了Map和Reduce兩者的執行時間。
同樣,我們在選擇Hadoop的相關類型時,如Writeable。在MapReduce中,Map Task和Reduce Task的輸入和輸出的數據類型均為Writable的衍生類型,其包含IntWritable、LongWriteable、FloatWritable等。在編寫相關代碼時,選擇合適的類型可以大大提升其性能。例如在處理整型數據之時,直接采用IntWritable比先以Text類型讀取在通過對應的方法轉化為整型來的高效。
總結
以上是生活随笔為你收集整理的Hadoop性能调优概要说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java经典面试题(N人循环报M个数出列
- 下一篇: 软件架构设计原则和大数据平台架构层