環境篇:CDH優化篇
- 為什么出這篇文章?
近期有很多公司開始引入大數據,由於各方資源有限,並不能合理分配服務器資源,和服務器選型,小葉這里將工作中的總結出來,給新入行的小伙伴帶個方向,以下會將企業級測試環境和線上環境的基礎方案給出,不敢說一定對,但是本人親自測試,發現集群使用率穩定提高了3分之1,最高可達到2分之1,有不對的地方歡迎留言指出。
注:可能有些服務沒有設計,使用到的小伙伴可以參照這種方式去規划。
1 測試環境參考方案
1.0 資源:集群服務安排
- 表格方便大家復制修改
服務名稱 | 子服務 | CM-24G | ZK-Kafka(3台)-12G | DataNode(3台)-64G | NameNode1-16G | NameNode2-16G | Resourcemanager1-16G | Resourcemanager2-16G | hive-hbase-24G | hive-hbase-24G |
---|---|---|---|---|---|---|---|---|---|---|
MySQL | MySQL | √ | ||||||||
CM | Activity Monitor Alert Publisher Event Server Host Monitor Service Monitor |
√ √ √ √ √ |
||||||||
HDFS | NameNode DataNode Failover Controller JournalNode |
X X X √ |
X √ X X |
√ X √ X |
√ X √ X |
|||||
Yarn | NodeManager Resourcemanager JobHisoryServer |
√ X X |
X √ √ |
X √ √ |
||||||
Zookeeper | Zookeeper Server | √ | ||||||||
Kafka | Kafka Broker | √ | ||||||||
Hive | Hive Metastore Server HiveServer2 Gateway(安裝對應應用服務器) |
X √ √ |
X X √ |
X X √ |
√ X X |
√ X X |
||||
Hbase | HMaster HRegionServer Thrift Server |
X √ √ |
√ X X |
√ X X |
||||||
Oozie | Oozie Server | √ | ||||||||
Hue | Hue Server Load Balancer |
X √ |
√ X |
|||||||
Spark | History Server Gateway(安裝對應應用服務器) |
X √ |
X √ |
√ X |
||||||
Flume | Flume Agent (安裝對應應用服務器) | |||||||||
Sqoop | Sqoop(安裝對應應用服務器) | |||||||||
sorl | √ |
- 圖
1.1 優化:Cloudera Management
這些服務主要是提供監控功能,目前的調整主要集中在內存放,以便有足夠的資源 完成集群管理。
服務 | 選項 | 配置值 |
---|---|---|
Activity Monitor | Java Heap Size | 2G |
Alert Publisher | Java Heap Size | 2G |
Event Server | Java Heap Size | 2G |
Host Monitor | Java Heap Size | 4G |
Service Monitor | Java Heap Size | 4G |
1.2 優化:Zookeeper
服務 | 選項 | 配置值 |
---|---|---|
Zookeeper | Java Heap Size (堆棧大小) | 2G |
Zookeeper | maxClientCnxns (最大客戶端連接數) | 1024 |
Zookeeper | dataDir (數據文件目錄+數據持久化路徑) | /hadoop/zookeeper (建議獨立目錄) |
Zookeeper | dataLogDir (事務日志目錄) | /hadoop/zookeeper_log (建議獨立目錄) |
Zookeeper | maxSessionTimeout | 180000 |
1.3 優化:HDFS
服務 | 選項 | 配置值 |
---|---|---|
NameNode | Java Heap Size (堆棧大小)10 | 10G |
NameNode | dfs.namenode.handler.count (詳見3.3.2) | 30 |
NameNode | dfs.namenode.service.handler.count (詳見3.3.2) | 30 |
NameNode | fs.permissions.umask-mode (使用默認值022) | 027(使用默認值022) |
DataNode | Java Heap Size (堆棧大小) | 8G |
DataNode | dfs.datanode.failed.volumes.tolerated (詳見3.3.3) | 0 |
DataNode | dfs.datanode.balance.bandwidthPerSec (DataNode 平衡帶寬) | 100M |
DataNode | dfs.datanode.handler.count (服務器線程數) | 64 |
DataNode | dfs.datanode.max.transfer.threads (最大傳輸線程數) | 20480 |
JournalNode | Java Heap Size (堆棧大小) | 512M |
1.3.1 數據塊優化
dfs.blocksize = 128M
- 文件以塊為單位進行切分存儲,塊通常設置的比較大(最小6M,默認128M),根據網絡帶寬計算最佳值。
- 塊越大,尋址越快,讀取效率越高,但同時由於MapReduce任務也是以塊為最小單位來處理,所以太大的塊不利於於對數據的並行處理。
- 一個文件至少占用一個塊(如果一個1KB文件,占用一個塊,但是占用空間還是1KB)
- 我們在讀取HDFS上文件的時候,NameNode會去尋找block地址,尋址時間為傳輸時間的1%時,則為最佳狀態。
- 目前磁盤的傳輸速度普遍為100MB/S
- 如果尋址時間約為10ms,則傳輸時間=10ms/0.01=1000ms=1s
- 如果傳輸時間為1S,傳輸速度為100MB/S,那么一秒鍾我們就可以向HDFS傳送100MB文件,設置塊大小128M比較合適。
- 如果帶寬為200MB/S,那么可以將block塊大小設置為256M比較合適。
1.3.2 NameNode 的服務器線程的數量
- dfs.namenode.handler.count=20*log2(Cluster Size),比如集群規模為16 ,8以2為底的對數是4,故此參數設置為80
- dfs.namenode.service.handler.count=20*log2(Cluster Size),比如集群規模為16 ,8以2為底的對數是4,故此參數設置為80
NameNode有一個工作線程池,用來處理不同DataNode的並發心跳以及客戶端並發的元數據操作。該值需要設置為集群大小的自然對數乘以20,。
1.3.3 DataNode 停止提供服務前允許失敗的卷的數量
DN多少塊盤損壞后停止服務,默認為0,即一旦任何磁盤故障DN即關閉。 對盤較多的集群(例如DN有超過2塊盤),磁盤故障是常態,通常可以將該值設置為1或2,避免頻繁有DN下線。
1.4 優化:YARN + MapReduce
服務 | 選項 | 配置值 | 參數說明 |
---|---|---|---|
ResourceManager | Java Heap Size (堆棧大小) | 4G | |
ResourceManager | yarn.scheduler.minimum-allocation-mb (最小容器內存) | 2G | 給應用程序 Container 分配的最小內存 |
ResourceManager | yarn.scheduler.increment-allocation-mb (容器內存增量) | 512M | 如果使用 Fair Scheduler,容器內存允許增量 |
ResourceManager | yarn.scheduler.maximum-allocation-mb (最大容器內存) | 32G | 給應用程序 Container 分配的最大內存 |
ResourceManager | yarn.scheduler.minimum-allocation-vcores (最小容器虛擬 CPU 內核數量) | 1 | 每個 Container 申請的最小 CPU 核數 |
ResourceManager | yarn.scheduler.increment-allocation-vcores (容器虛擬 CPU 內核增量) | 1 | 如果使用 Fair Scheduler,虛擬 CPU 內核允許增量 |
ResourceManager | yarn.scheduler.maximum-allocation-vcores (最大容器虛擬 CPU 內核數量) | 16 | 每個 Container 申請的最大 CPU 核數 |
ResourceManager | yarn.resourcemanager.recovery.enabled | true | 啟用后,ResourceManager 中止時在群集上運行的任何應用程序將在 ResourceManager 下次啟動時恢復,備注:如果啟用 RM-HA,則始終啟用該配置。 |
NodeManager | Java Heap Size (堆棧大小) | 4G | |
NodeManager | yarn.nodemanager.resource.memory-mb | 10G | 可分配給容器的物理內存數量,參照資源池內存90%左右 |
NodeManager | yarn.nodemanager.resource.cpu-vcores | 20 | 可以為容器分配的虛擬 CPU 內核的數量,參照資源池內存90%左右 |
ApplicationMaster | yarn.app.mapreduce.am.command-opts | 右紅 | 傳遞到 MapReduce ApplicationMaster 的 Java 命令行參數 "-Djava.net.preferIPv4Stack=true " |
ApplicationMaster | yarn.app.mapreduce.am.resource.mb (ApplicationMaster 內存) | 4G | |
JobHistory | Java Heap Size (堆棧大小) | 1G | |
MapReduce | mapreduce.map.memory.mb (Map 任務內存) | 4G | 一個MapTask可使用的資源上限。如果MapTask實際使用的資源量超過該值,則會被強制殺死。 |
MapReduce | mapreduce.reduce.memory.mb (Reduce 任務內存) | 8G | 一個 ReduceTask 可使用的資源上限。如果 ReduceTask 實際使用的資源量超過該值,則會被強制殺死 |
MapReduce | mapreduce.map.cpu.vcores | 2 | 每個 MapTask 可使用的最多 cpu core 數目 |
MapReduce | mapreduce.reduce.cpu.vcores | 4 | 每個 ReduceTask 可使用的最多 cpu core 數目 |
MapReduce | mapreduce.reduce.shuffle.parallelcopies | 20 | 每個 Reduce 去 Map 中取數據的並行數。 |
MapReduce | mapreduce.task.io.sort.mb(Shuffle 的環形緩沖區大小) | 512M | 當排序文件時要使用的內存緩沖總量。注意:此內存由 JVM 堆棧大小產生(也就是:總用戶 JVM 堆棧 - 這些內存 = 總用戶可用堆棧空間) |
MapReduce | mapreduce.map.sort.spill.percent | 80% | 環形緩沖區溢出的閾值 |
MapReduce | mapreduce.task.timeout | 10分鍾 | Task 超時時間,經常需要設置的一個參數,該參數表 達的意思為:如果一個 Task 在一定時間內沒有任何進 入,即不會讀取新的數據,也沒有輸出數據,則認為 該 Task 處於 Block 狀態,可能是卡住了,也許永遠會 卡住,為了防止因為用戶程序永遠 Block 住不退出, 則強制設置了一個該超時時間。如果你的程序對每條輸入數據的處理時間過長(比如會訪問數據庫,通過網絡拉取數據等),建議將該參數調大,該參數過小常出現的錯誤提示是 :AttemptID:attempt_12267239451721_123456_m_00 0335_0 Timed out after 600 secsContainer killed by the ApplicationMaster。 |
1.5 優化:Kafka
服務 | 選項 | 配置值 | 參數說明 |
---|---|---|---|
Kafka Broker | Java Heap Size of Broker | 2G | Broker堆棧大小 |
Kafka Broker | Data Directories | 多塊獨立磁盤 | |
Kafka 服務 | Maximum Message Size | 10M | 服務器可以接收的消息的最大大小。此屬性必須與使用者使用的最大提取大小同步。否則,不守規矩的生產者可能會發布太大而無法消費的消息 |
Kafka 服務 | Replica Maximum Fetch Size | 20M | 副本發送給leader的獲取請求中每個分區要獲取的最大字節數。此值應大於message.max.bytes。 |
Kafka 服務 | Number of Replica Fetchers | 6 | 用於復制來自領導者的消息的線程數。增大此值將增加跟隨者代理中I / O並行度。 |
1.6 優化:HBase
服務 | 選項 | 配置值 | 參數說明 |
---|---|---|---|
HBase | Java Heap Size | 18G | 客戶端 Java 堆大小(字節)主要作用來緩存Table數據,但是flush時會GC,不要太大,根據集群資源,一般分配整個Hbase集群內存的70%,16->48G就可以了 |
HBase | hbase.client.write.buffer | 512M | 寫入緩沖區大小,調高該值,可以減少RPC調用次數,單數會消耗更多內存,較大緩沖區需要客戶端和服務器中有較大內存,因為服務器將實例化已通過的寫入緩沖區並進行處理,這會降低遠程過程調用 (RPC) 的數量。 |
HBase Master | Java Heap Size | 8G | HBase Master 的 Java 堆棧大小 |
HBase Master | hbase.master.handler.count | 300 | HBase Master 中啟動的 RPC 服務器實例數量。 |
HBase RegionServer | Java Heap Size | 15G | HBase RegionServer 的 Java 堆棧大小 |
HBase RegionServer | hbase.regionserver.handler.count | 50 | RegionServer 中啟動的 RPC 服務器實例數量,根據集群情況,可以適當增加該值,主要決定是客戶端的請求數 |
HBase RegionServer | hbase.regionserver.metahandler.count | 30 | 用於處理 RegionServer 中的優先級請求的處理程序的數量 |
HBase RegionServer | zookeeper.session.timeout | 180000ms | ZooKeeper 會話延遲(以毫秒為單位)。HBase 將此作為建議的最長會話時間傳遞給 ZooKeeper 仲裁 |
HBase RegionServer | hbase.hregion.memstore.flush.size | 1G | 如 memstore 大小超過此值,Memstore 將刷新到磁盤。通過運行由 hbase.server.thread.wakefrequency 指定的頻率的線程檢查此值。 |
HBase RegionServer | hbase.hregion.majorcompaction | 7 | 合並周期,在合格節點下,Region下所有的HFile會進行合並,非常消耗資源,在空閑時手動觸發 |
HBase RegionServer | hbase.hregion.majorcompaction.jitter | 0.5 | 抖動比率,根據上面的合並周期,有一個抖動比率,也不靠譜,還是手動好 |
HBase RegionServer | hbase.hstore.compactionThreshold | 6 | 如在任意一個 HStore 中有超過此數量的 HStoreFiles,則將運行壓縮以將所有 HStoreFiles 文件作為一個 HStoreFile 重新寫入。(每次 memstore 刷新寫入一個 HStoreFile)您可通過指定更大數量延長壓縮,但壓縮將運行更長時間。在壓縮期間,更新無法刷新到磁盤。長時間壓縮需要足夠的內存,以在壓縮的持續時間內記錄所有更新。如太大,壓縮期間客戶端會超時。 |
HBase RegionServer | hbase.client.scanner.caching | 1000 | 內存未提供數據的情況下掃描儀下次調用時所提取的行數。較高緩存值需啟用較快速度的掃描儀,但這需要更多的內存且當緩存為空時某些下一次調用會運行較長時間 |
HBase RegionServer | hbase.hregion.max.filesize | 50G | HStoreFile 最大大小。如果列組的任意一個 HStoreFile 超過此值,則托管 HRegion 將分割成兩個 |
HBase Master | hbase.master.logcleaner.plugins | 日志清除器插件 | org.apache.hadoop.hbase.master.cleaner.TimeToLiveLogCleaner |
HBase | hbase.replication | false | 禁用復制 |
HBase | hbase.master.logcleaner.ttl | 10min | 保留 HLogs 的最長時間,加上如上兩條解決oldWALs增長問題 |
1.7 優化:Hive
服務 | 選項 | 配置值 | 參數說明 |
---|---|---|---|
HiveServer2 | Java Heap Size | 4G | |
Hive MetaStore | Java Heap Size | 8G | |
Hive Gateway | Java Heap Size | 2G | |
HiveServer2 | hive.execution.engine | Spark | 執行引擎切換 |
HiveServer2 | hive.fetch.task.conversion | more | Fetch抓取修改為more,可以使全局查找,字段查找,limit查找等都不走計算引擎,而是直接讀取表對應儲存目錄下的文件,大大普通查詢速度 |
Hive | hive.exec.mode.local.auto(hive-site.xml 服務高級配置,客戶端高級配置) | true | 開啟本地模式,在單台機器上處理所有的任務,對於小的數據集,執行時間可以明顯被縮短 |
Hive | hive.exec.mode.local.auto.inputbytes.max(hive-site.xml 服務高級配置,客戶端高級配置) | 50000000 | 文件不超過50M |
Hive | hive.exec.mode.local.auto.input.files.max(hive-site.xml 服務高級配置,客戶端高級配置) | 10 | 個數不超過10個 |
Hive | hive.auto.convert.join | 開啟 | 在join問題上,讓小表放在左邊 去左鏈接(left join)大表,這樣可以有效的減少內存溢出錯誤發生的幾率 |
Hive | hive.mapjoin.smalltable.filesize(hive-site.xml 服務高級配置,客戶端高級配置) | 50000000 | 50M以下認為是小表 |
Hive | hive.map.aggr | 開啟 | 默認情況下map階段同一個key發送給一個reduce,當一個key數據過大時就發生數據傾斜。 |
Hive | hive.groupby.mapaggr.checkinterval(hive-site.xml 服務高級配置,客戶端高級配置) | 200000 | 在map端進行聚合操作的條目數目 |
Hive | hive.groupby.skewindata(hive-site.xml 服務高級配置,客戶端高級配置) | true | 有數據傾斜時進行負載均衡,生成的查詢計划會有兩個MR Job,第一個MR Job會將key加隨機數均勻的分布到Reduce中,做部分聚合操作(預處理),第二個MR Job在根據預處理結果還原原始key,按照Group By Key分布到Reduce中進行聚合運算,完成最終操作 |
Hive | hive.exec.parallel(hive-site.xml 服務高級配置,客戶端高級配置) | true | 開啟並行計算 |
Hive | hive.exec.parallel.thread.number(hive-site.xml 服務高級配置,客戶端高級配置) | 16 | 同一個sql允許的最大並行度,針對集群資源適當增加 |
1.8 優化:Oozie、Hue、Solr、Spark
服務 | 選項 | 配置值 | 參數說明 |
---|---|---|---|
Oozie | Java Heap Size | 1G | 堆棧大小 |
Hue | Java Heap Size | 4G | 堆棧大小 |
solr | Java Heap Size | 2G | 堆棧大小 |
spark | Java Heap Size of History Server in Bytes | 2G | 歷史記錄服務器的Java堆大小 |
2 線上集群參考方案
2.0 資源:集群服務安排
- 如下黑色字體是理論計算資源使用情況,紅色字體是實際使用資源情況,注意理論值已經可以良好保證集群運行。
- 表格方便大家復制修改
服務名稱 | 子服務 | CM-24G-32G | ZK-Kafka(3台)-24G-32G | DataNode(3台)-128G-128G | NameNode1-80G-128G | NameNode2-80G-128G | Resourcemanager1-24G-32G | Resourcemanager2-24G-32G | hive-hbase-24G-32G | hive-hbase-24G-32G |
---|---|---|---|---|---|---|---|---|---|---|
MySQL | MySQL | √ | ||||||||
CM | Activity Monitor Alert Publisher Event Server Host Monitor Service Monitor |
√ √ √ √ √ |
||||||||
HDFS | NameNode DataNode Failover Controller JournalNode |
X X X √ |
X √ X X |
√ X √ X |
√ X √ X |
|||||
Yarn | NodeManager Resourcemanager JobHisoryServer |
√ X X |
X √ √ |
X √ √ |
||||||
Zookeeper | Zookeeper Server | √ | ||||||||
Kafka | Kafka Broker | √ | ||||||||
Hive | Hive Metastore Server HiveServer2 Gateway(安裝對應應用服務器) |
X √ √ |
X X √ |
X X √ |
√ X X |
√ X X |
||||
Hbase | HMaster HRegionServer Thrift Server |
X √ √ |
√ X X |
√ X X |
||||||
Oozie | Oozie Server | √ | ||||||||
Hue | Hue Server Load Balancer |
X √ |
√ X |
|||||||
Spark | History Server Gateway(安裝對應應用服務器) |
X √ |
X √ |
√ X |
||||||
Flume | Flume Agent (安裝對應應用服務器) | |||||||||
Sqoop | Sqoop(安裝對應應用服務器) | |||||||||
sorl | √ |
- 圖
2.1 優化:Cloudera Management
這些服務主要是提供監控功能,目前的調整主要集中在內存放,以便有足夠的資源 完成集群管理。
服務 | 選項 | 配置值 |
---|---|---|
Activity Monitor | Java Heap Size | 2G |
Alert Publisher | Java Heap Size | 2G |
Event Server | Java Heap Size | 2G |
Host Monitor | Java Heap Size | 4G |
Service Monitor | Java Heap Size | 4G |
2.2 優化:Zookeeper
服務 | 選項 | 配置值 |
---|---|---|
Zookeeper | Java Heap Size (堆棧大小) | 4G |
Zookeeper | maxClientCnxns (最大客戶端連接數) | 1024 |
Zookeeper | dataDir (數據文件目錄+數據持久化路徑) | /hadoop/zookeeper (建議獨立目錄) |
Zookeeper | dataLogDir (事務日志目錄) | /hadoop/zookeeper_log (建議獨立目錄) |
Zookeeper | maxSessionTimeout | 180000 |
2.3 優化:HDFS
服務 | 選項 | 配置值 |
---|---|---|
NameNode | Java Heap Size (堆棧大小) | 56G |
NameNode | dfs.namenode.handler.count (詳見3.3.2) | 80 |
NameNode | dfs.namenode.service.handler.count (詳見3.3.2) | 80 |
NameNode | fs.permissions.umask-mode (使用默認值022) | 027(使用默認值022) |
DataNode | Java Heap Size (堆棧大小) | 8G |
DataNode | dfs.datanode.failed.volumes.tolerated (詳見3.3.3) | 1 |
DataNode | dfs.datanode.balance.bandwidthPerSec (DataNode 平衡帶寬) | 100M |
DataNode | dfs.datanode.handler.count (服務器線程數) | 64 |
DataNode | dfs.datanode.max.transfer.threads (最大傳輸線程數) | 20480 |
JournalNode | Java Heap Size (堆棧大小) | 1G |
2.3.1 數據塊優化
dfs.blocksize = 128M
- 文件以塊為單位進行切分存儲,塊通常設置的比較大(最小6M,默認128M),根據網絡帶寬計算最佳值。
- 塊越大,尋址越快,讀取效率越高,但同時由於MapReduce任務也是以塊為最小單位來處理,所以太大的塊不利於於對數據的並行處理。
- 一個文件至少占用一個塊(如果一個1KB文件,占用一個塊,但是占用空間還是1KB)
- 我們在讀取HDFS上文件的時候,NameNode會去尋找block地址,尋址時間為傳輸時間的1%時,則為最佳狀態。
- 目前磁盤的傳輸速度普遍為100MB/S
- 如果尋址時間約為10ms,則傳輸時間=10ms/0.01=1000ms=1s
- 如果傳輸時間為1S,傳輸速度為100MB/S,那么一秒鍾我們就可以向HDFS傳送100MB文件,設置塊大小128M比較合適。
- 如果帶寬為200MB/S,那么可以將block塊大小設置為256M比較合適。
2.3.2 NameNode 的服務器線程的數量
- dfs.namenode.handler.count=20*log2(Cluster Size),比如集群規模為16 ,8以2為底的對數是4,故此參數設置為80
- dfs.namenode.service.handler.count=20*log2(Cluster Size),比如集群規模為16 ,8以2為底的對數是4,故此參數設置為80
NameNode有一個工作線程池,用來處理不同DataNode的並發心跳以及客戶端並發的元數據操作。該值需要設置為集群大小的自然對數乘以20,。
2.3.3 DataNode 停止提供服務前允許失敗的卷的數量
DN多少塊盤損壞后停止服務,默認為0,即一旦任何磁盤故障DN即關閉。 對盤較多的集群(例如DN有超過2塊盤),磁盤故障是常態,通常可以將該值設置為1或2,避免頻繁有DN下線。
2.4 優化:YARN + MapReduce
服務 | 選項 | 配置值 | 參數說明 |
---|---|---|---|
ResourceManager | Java Heap Size (堆棧大小) | 4G | |
ResourceManager | yarn.scheduler.minimum-allocation-mb (最小容器內存) | 2G | 給應用程序 Container 分配的最小內存 |
ResourceManager | yarn.scheduler.increment-allocation-mb (容器內存增量) | 512M | 如果使用 Fair Scheduler,容器內存允許增量 |
ResourceManager | yarn.scheduler.maximum-allocation-mb (最大容器內存) | 32G | 給應用程序 Container 分配的最大內存 |
ResourceManager | yarn.scheduler.minimum-allocation-vcores (最小容器虛擬 CPU 內核數量) | 1 | 每個 Container 申請的最小 CPU 核數 |
ResourceManager | yarn.scheduler.increment-allocation-vcores (容器虛擬 CPU 內核增量) | 1 | 如果使用 Fair Scheduler,虛擬 CPU 內核允許增量 |
ResourceManager | yarn.scheduler.maximum-allocation-vcores (最大容器虛擬 CPU 內核數量) | 16 | 每個 Container 申請的最大 CPU 核數 |
ResourceManager | yarn.resourcemanager.recovery.enabled | true | 啟用后,ResourceManager 中止時在群集上運行的任何應用程序將在 ResourceManager 下次啟動時恢復,備注:如果啟用 RM-HA,則始終啟用該配置。 |
NodeManager | Java Heap Size (堆棧大小) | 4G | |
NodeManager | yarn.nodemanager.resource.memory-mb | 40G | 可分配給容器的物理內存數量,參照資源池內存90%左右 |
NodeManager | yarn.nodemanager.resource.cpu-vcores | 32 | 可以為容器分配的虛擬 CPU 內核的數量,參照資源池內存90%左右 |
ApplicationMaster | yarn.app.mapreduce.am.command-opts | 右紅 | 傳遞到 MapReduce ApplicationMaster 的 Java 命令行參數 "-Djava.net.preferIPv4Stack=true " |
ApplicationMaster | yarn.app.mapreduce.am.resource.mb (ApplicationMaster 內存) | 4G | |
JobHistory | Java Heap Size (堆棧大小) | 2G | |
MapReduce | mapreduce.map.memory.mb (Map 任務內存) | 4G | 一個MapTask可使用的資源上限。如果MapTask實際使用的資源量超過該值,則會被強制殺死。 |
MapReduce | mapreduce.reduce.memory.mb (Reduce 任務內存) | 8G | 一個 ReduceTask 可使用的資源上限。如果 ReduceTask 實際使用的資源量超過該值,則會被強制殺死 |
MapReduce | mapreduce.map.cpu.vcores | 2 | 每個 MapTask 可使用的最多 cpu core 數目 |
MapReduce | mapreduce.reduce.cpu.vcores | 4 | 每個 ReduceTask 可使用的最多 cpu core 數目 |
MapReduce | mapreduce.reduce.shuffle.parallelcopies | 20 | 每個 Reduce 去 Map 中取數據的並行數。 |
MapReduce | mapreduce.task.io.sort.mb(Shuffle 的環形緩沖區大小) | 512M | 當排序文件時要使用的內存緩沖總量。注意:此內存由 JVM 堆棧大小產生(也就是:總用戶 JVM 堆棧 - 這些內存 = 總用戶可用堆棧空間) |
MapReduce | mapreduce.map.sort.spill.percent | 80% | 環形緩沖區溢出的閾值 |
MapReduce | mapreduce.task.timeout | 10分鍾 | Task 超時時間,經常需要設置的一個參數,該參數表 達的意思為:如果一個 Task 在一定時間內沒有任何進 入,即不會讀取新的數據,也沒有輸出數據,則認為 該 Task 處於 Block 狀態,可能是卡住了,也許永遠會 卡住,為了防止因為用戶程序永遠 Block 住不退出, 則強制設置了一個該超時時間。如果你的程序對每條輸入數據的處理時間過長(比如會訪問數據庫,通過網絡拉取數據等),建議將該參數調大,該參數過小常出現的錯誤提示是 :AttemptID:attempt_12267239451721_123456_m_00 0335_0 Timed out after 600 secsContainer killed by the ApplicationMaster。 |
2.5 優化:Kafka
服務 | 選項 | 配置值 | 參數說明 |
---|---|---|---|
Kafka Broker | Java Heap Size of Broker | 2G | Broker堆棧大小 |
Kafka Broker | Data Directories | 多塊獨立磁盤 | |
Kafka 服務 | Maximum Message Size | 10M | 服務器可以接收的消息的最大大小。此屬性必須與使用者使用的最大提取大小同步。否則,不守規矩的生產者可能會發布太大而無法消費的消息 |
Kafka 服務 | Replica Maximum Fetch Size | 20M | 副本發送給leader的獲取請求中每個分區要獲取的最大字節數。此值應大於message.max.bytes。 |
Kafka 服務 | Number of Replica Fetchers | 6 | 用於復制來自領導者的消息的線程數。增大此值將增加跟隨者代理中I / O並行度。 |
2.6 優化:HBase
服務 | 選項 | 配置值 | 參數說明 |
---|---|---|---|
HBase | Java Heap Size | 18G | 客戶端 Java 堆大小(字節)主要作用來緩存Table數據,但是flush時會GC,不要太大,根據集群資源,一般分配整個Hbase集群內存的70%,16->48G就可以了 |
HBase | hbase.client.write.buffer | 512M | 寫入緩沖區大小,調高該值,可以減少RPC調用次數,單數會消耗更多內存,較大緩沖區需要客戶端和服務器中有較大內存,因為服務器將實例化已通過的寫入緩沖區並進行處理,這會降低遠程過程調用 (RPC) 的數量。 |
HBase Master | Java Heap Size | 8G | HBase Master 的 Java 堆棧大小 |
HBase Master | hbase.master.handler.count | 300 | HBase Master 中啟動的 RPC 服務器實例數量。 |
HBase RegionServer | Java Heap Size | 31G | HBase RegionServer 的 Java 堆棧大小 |
HBase RegionServer | hbase.regionserver.handler.count | 100 | RegionServer 中啟動的 RPC 服務器實例數量,根據集群情況,可以適當增加該值,主要決定是客戶端的請求數 |
HBase RegionServer | hbase.regionserver.metahandler.count | 60 | 用於處理 RegionServer 中的優先級請求的處理程序的數量 |
HBase RegionServer | zookeeper.session.timeout | 180000ms | ZooKeeper 會話延遲(以毫秒為單位)。HBase 將此作為建議的最長會話時間傳遞給 ZooKeeper 仲裁 |
HBase RegionServer | hbase.hregion.memstore.flush.size | 1G | 如 memstore 大小超過此值,Memstore 將刷新到磁盤。通過運行由 hbase.server.thread.wakefrequency 指定的頻率的線程檢查此值。 |
HBase RegionServer | hbase.hregion.majorcompaction | 0 | 合並周期,在合格節點下,Region下所有的HFile會進行合並,非常消耗資源,在空閑時手動觸發 |
HBase RegionServer | hbase.hregion.majorcompaction.jitter | 0 | 抖動比率,根據上面的合並周期,有一個抖動比率,也不靠譜,還是手動好 |
HBase RegionServer | hbase.hstore.compactionThreshold | 6 | 如在任意一個 HStore 中有超過此數量的 HStoreFiles,則將運行壓縮以將所有 HStoreFiles 文件作為一個 HStoreFile 重新寫入。(每次 memstore 刷新寫入一個 HStoreFile)您可通過指定更大數量延長壓縮,但壓縮將運行更長時間。在壓縮期間,更新無法刷新到磁盤。長時間壓縮需要足夠的內存,以在壓縮的持續時間內記錄所有更新。如太大,壓縮期間客戶端會超時。 |
HBase RegionServer | hbase.client.scanner.caching | 1000 | 內存未提供數據的情況下掃描儀下次調用時所提取的行數。較高緩存值需啟用較快速度的掃描儀,但這需要更多的內存且當緩存為空時某些下一次調用會運行較長時間 |
HBase RegionServer | hbase.hregion.max.filesize | 50G | HStoreFile 最大大小。如果列組的任意一個 HStoreFile 超過此值,則托管 HRegion 將分割成兩個 |
HBase Master | hbase.master.logcleaner.plugins | 日志清除器插件 | org.apache.hadoop.hbase.master.cleaner.TimeToLiveLogCleaner |
HBase | hbase.replication | false | 禁用復制 |
HBase | hbase.master.logcleaner.ttl | 10min | 保留 HLogs 的最長時間,加上如上兩條解決oldWALs增長問題 |
2.7 優化:Hive
服務 | 選項 | 配置值 | 參數說明 |
---|---|---|---|
HiveServer2 | Java Heap Size | 4G | |
Hive MetaStore | Java Heap Size | 8G | |
Hive Gateway | Java Heap Size | 2G | |
Hive | hive.execution.engine | Spark | 執行引擎切換 |
Hive | hive.fetch.task.conversion | more | Fetch抓取修改為more,可以使全局查找,字段查找,limit查找等都不走計算引擎,而是直接讀取表對應儲存目錄下的文件,大大普通查詢速度 |
Hive | hive.exec.mode.local.auto(hive-site.xml 服務高級配置,客戶端高級配置) | true | 開啟本地模式,在單台機器上處理所有的任務,對於小的數據集,執行時間可以明顯被縮短 |
Hive | hive.exec.mode.local.auto.inputbytes.max(hive-site.xml 服務高級配置,客戶端高級配置) | 50000000 | 文件不超過50M |
Hive | hive.exec.mode.local.auto.input.files.max(hive-site.xml 服務高級配置,客戶端高級配置) | 10 | 個數不超過10個 |
Hive | hive.auto.convert.join | 開啟 | 在join問題上,讓小表放在左邊 去左鏈接(left join)大表,這樣可以有效的減少內存溢出錯誤發生的幾率 |
Hive | hive.mapjoin.smalltable.filesize(hive-site.xml 服務高級配置,客戶端高級配置) | 50000000 | 50M以下認為是小表 |
Hive | hive.map.aggr | 開啟 | 默認情況下map階段同一個key發送給一個reduce,當一個key數據過大時就發生數據傾斜。 |
Hive | hive.groupby.mapaggr.checkinterval(hive-site.xml 服務高級配置,客戶端高級配置) | 200000 | 在map端進行聚合操作的條目數目 |
Hive | hive.groupby.skewindata(hive-site.xml 服務高級配置,客戶端高級配置) | true | 有數據傾斜時進行負載均衡,生成的查詢計划會有兩個MR Job,第一個MR Job會將key加隨機數均勻的分布到Reduce中,做部分聚合操作(預處理),第二個MR Job在根據預處理結果還原原始key,按照Group By Key分布到Reduce中進行聚合運算,完成最終操作 |
Hive | hive.exec.parallel(hive-site.xml 服務高級配置,客戶端高級配置) | true | 開啟並行計算 |
Hive | hive.exec.parallel.thread.number(hive-site.xml 服務高級配置,客戶端高級配置) | 16 | 同一個sql允許的最大並行度,針對集群資源適當增加 |
2.8 優化:Oozie、Hue、solr、spark
服務 | 選項 | 配置值 | 參數說明 |
---|---|---|---|
Oozie | Java Heap Size | 2G | 堆棧大小 |
Hue | Java Heap Size | 4G | 堆棧大小 |
solr | Java Heap Size | 8G | 堆棧大小 |
spark | Java Heap Size of History Server in Bytes | 4G | 歷史記錄服務器的Java堆大小 |