CDH優化

一、HDFS
dfs.block.size
HDFS中的數據block大小,默認是64M,對於較大集羣,可以設置爲128或264M

dfs.datanode.socket.write.timeout/dfs.socket.timeout
增加dfs.datanode.socket.write.timeout和dfs.socket.timeout兩個屬性的設置(默認300),比如30000,避免可能出現的IO超時異常

dfs.datanode.max.transfer.threads
增加datanode在進行文件傳輸時最大線程數(默認4096),比如8192,假設集羣中有某臺dataode主機的這個值比其他主機的大,那麼這臺主機上存儲的數據相對別的主機比較多,導致數據分佈不均勻的問題,即使balance仍然會不均勻

dfs.namenode.handler.count
設定 namenode server threads 的數量,默認是10,對於較大集羣,可適當調大,比如64。這些 threads 會用 RPC 跟其他的 datanodes 溝通。當 datanodes 數量太多時會發現很容易出現 RPC timeout,解決方法是提升網絡速度或提高這個值,但要注意的是 thread 數量多也表示 namenode 消耗的內存也隨着增加

dfs.datanode.handler.count
datanode上用於處理RPC的線程數,默認是3,對於較大集羣可適當調大,比如8。

二、YARN

yarn.app.mapreduce.am.resource.mb
ApplicationMaster的container佔用的內存大小,可適當調低

mapreduce.map.memory.mb/mapreduce.reduce.memory.mb
作業的每個 Map/Reduce任務分配的物理內存量,參數大於最小容器內存(yarn.scheduler.minimum-allocation-mb),兩個參數配置的值設置一樣即可

mapreduce.map.java.opts.max.heap/mapreduce.reduce.java.opts.max.heap
每個Map/Reduce的JVM啓動所佔用的內存,正常此參數小於等於Map/Reduce申請的內存(mapreduce.map.memory.mb/mapreduce.reduce.memory.mb)的85%,因爲map任務裏不一定只跑java,比如hadoop streaming程序 io.file.buffer.size SequenceFiles 讀取和寫入操作的緩存區大小,還有map的輸出都用到了這個緩衝區容量, 可減少 I/O 次數。建議設定爲 64KB 到 128KB

mapreduce.task.io.sort.factor
Reduce Task中合併小文件時,一次合併的文件數據,每次合併的時候選擇最小的前N個進行合併,此參數正常與mapreduce.task.io.sort.mb一起配置

mapreduce.task.io.sort.mb
Map Task緩衝區排序文件時要使用的內存緩衝總量,如果mapreduce.task.io.sort.factor設置了較大值,此參數也應相應調大 io.sort.spill.percent
mapreduce.task.io.sort.mb的閾值,默認是80%,當buffer中的數據達到這個閾值,後臺線程會起來對buffer中已有的數據進行排序,然後寫入磁盤

yarn.nodemanager.resource.memory-mb
NodeManager節點上可使用的物理內存總量,默認是8192(MB),根據節點所能分配的最大的內存進行分配即可(扣除其他服務內存、系統內存等)

yarn.scheduler.minimum-allocation-mb
容器可以請求的最小物理內存量,此參數小於等於作業分配的Map\Reduce內存量(mapreduce.map.memory.mb/mapreduce.reduce.memory.mb)

yarn.scheduler.increment-allocation-mb
內存規整化單位,爲容器申請內存增量,最後內存請求數量將四捨五入爲該數字最接近的倍數,比如使用 Fair Scheduler,Container請求資源是1.5GB,容量增量爲1G,則將被調度器規整化爲ceiling(1.5 GB / 1GB) * 1G ≈ 2GB(公式:(請求資源 / 容量增量)*容量增量 )

yarn.scheduler.maximum-allocation-mb
單個任務可申請的最大物理內存量(默認是8192(MB))。默認情況下,YARN採用了線程監控的方法判斷任務是否超量使用內存,一旦發現超量,則直接將其殺死

三、HBASE
zookeeper.session.timeout
RegionServer與Zookeeper間的連接超時時間,默認180000ms(正常維持這個時間)。當超時時間到後,ReigonServer會被Zookeeper從集羣清單中移除,HMaster收到移除通知後,會對這臺server負責的regions重新balance,讓其他存活的RegionServer接管,修改此參數也應該修改Zookeeper對應最大超時時間(maxSessionTimeout)

hbase.hregion.max.filesize
在當前ReigonServer上單個Reigon的最大存儲空間,單個Region超過該值時,這個Region會被自動split成更小的region,一般512M以下的都算小region,根據實際情況可設置成5-10G大小

hbase.regionserver.handler.count
增大RegionServer中啓動的 RPC服務器實例數量(默認10),比如50,此參數正常與hbase.client.write.buffer一起配置

hbase.client.write.buffer
增大htable客戶端寫緩衝區大小(默認是2097152),比如5M,緩衝區是爲了寫數據的臨時存放,設置大了,浪費客戶端和服務端的存儲,設置小了,如果寫的數據多,太多的RPC又帶來網絡開銷,官方給的一個服務端存儲耗費評估計算是:hbase.client.write.buffer*hbase.regionserver.handler.count,服務端的region server的處理handler個數也很關鍵

hbase.hregion.memstore.flush.size
當單個memstore達到指定值時,flush該memstore(一臺ReigonServer可能有成百上千個memstore),CDH5.2.0默認大小爲128M,內存允許情況下,適當調高此參數,可避免過多的flush

hbase.regionserver.global.memstore.upperLimit/lowerLimit
這是一個Heap內存保護參數,默認值已經能適用大多數場景(如非特殊情況,不做修改)。

hbase.regionserver.global.memstore.upperLimit的意思是當ReigonServer內所有的memstore所佔用的內存總和達到heap的hbase.regionserver.global.memstore.upperLimit大小時,HBase會強制block所有的更新並flush這些memstore以釋放所有memstore佔用的內存;

hbase.regionserver.global.memstore.lowserLimit的意思是當全局memstore的內存達到hbase.regionserver.global.memstore.lowserLimit大小時,它不會flush所有的memstore,它會找一些內存佔用較大的 memstore,做個別flush,當然更新還是會被block

hfile.block.cache.size
該值直接影響數據讀的性能,storefile的讀緩存佔用Heap的大小百分比。如果讀比寫少,0.4-0.5,如果讀寫較均衡,0.3左右。如果寫比讀多,默認即可。設置這個值的時候,需要參考

hbase.regionserver.global.memstore.upperLimit,如果兩值加起來超過80-90%,會有OOM的風險

hbase.hstore.blockingStoreFiles
在compaction時,如果一個Store(Coulmn Family)內有超過base.hstore.blockingStoreFiles個storefile需要合併,則block所有的寫請求,進行flush,限制storefile數量增長過快,直到完成壓縮或直到超過爲 hbase.hstore.blockingWaitTime指定的值。但是block寫請求會影響當前region的性能,將值設爲單個region可以支撐的最大store file數量會是個不錯的選擇,即允許comapction時,memstore繼續生成storefile。最大storefile數量可通過 hbase.hregion.max.filesize/hbase.hregion.memstore.flush.size來計算 hbase.hstore.blockingWaitTime
達到由hbase.hstore.blockingStoreFiles指定的 HStoreFile 限制後,HRegion 阻止更新的時間段。此時間段過後,HRegion 將停止阻止更新,即使尚未完成壓縮,即寫請求繼續被處理,可適當增大是參數
hbase.client.scanner.caching
scanner一次緩存多少數據來scan(從服務端一次讀取多少數據回來scan),內存允許情況下,增大此參數

SOLR
Solr Server 的 Java 堆棧大小
Java 進程堆棧內存的最大大小,傳遞到Java -Xmx,內存允許情況下,調高此參數 Solr 服務器的 Java 直接內存大小 由Java進程分配的最大堆棧外內存量。傳遞到 Java -XX:MaxDirectMemorySize。如果未設置,則默認爲堆的大小,內存允許情況下,調高此參數 schema.xml優化

  1. 將所有隻用於搜索的,而不需要作爲結果的field(特別是一些比較大的field)的stored設置爲false
  2. 將不需要被用於搜索的,而只是作爲結果返回的field的indexed設置爲false
  3. 刪除所有不必要的copyField聲明
  4. 使用儘可能高的Log輸出等級,減少日誌量 solrConfig.xml優化
  5. 增大maxBufferedDocs大小,增加服務器接收批量請求數,也可通過增加ramBuffe
    rSizeMB大小來增加服務器buffer
    ZOOKEEPER
    maxClientCnxns
    增大此參數,增加最大客戶端連接數 maxSessionTimeout
    增大此參數,增加最大會話時間
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章