大數據組件性能調優文檔整理(集群、HDFS、Hive)


 

12.1 配置原則

如何發揮集群最佳性能

原則1:CPU核數分配原則
數據節點:建議預留2~4個核給OS和其他進程(數據庫,HBase等)外,其他的核分配給YARN。
控制節點:由於運行的進程較多,建議預留6~8個核。
原則2:內存分配
除了分配給OS、其他服務的內存外,剩余的資源應盡量分配給YARN。
原則3:虛擬CPU個數分配
節點上YARN可使用的虛擬CPU個數建議配置為邏輯核數的1.5~2倍之間。如果上層計算應用對CPU的計算能力要求不高,可以配置為2倍的邏輯CPU。
原則4:提高磁盤IO吞吐率
盡可能掛載較多的盤,以提高磁盤IO吞吐率。

影響性能的因素

因素1:文件服務器磁盤I/O
一般磁盤順序讀寫的速度為百兆級別,如第二代SATA盤順序讀的理論速度為300Mbps,只從一個盤里讀,若想達到1Gbps每秒的導入速度是不可能的。並且若從一個磁盤讀,單純依靠增加map數來提高導入速率也不一定可以。因為隨着map數變多,對於一個磁盤里的文件讀,相當由順序讀變成了隨機讀,map數越多,磁盤讀取文件的隨機性越強,讀取性能反而越差。如隨機讀最差可變成800Kbps。 因此需要想辦法增大文件服務器的磁盤IO讀效率,可以使用專業的文件服務器,如NAS系統,或者使用更簡單的方法,把多個磁盤進行Raid0或者Raid5。
因素2:文件服務器網絡帶寬
單個文件服務器的網絡帶寬越大越好,建議在10000Mb/s以上。
因素3:集群節點硬件配置
集群節點硬件配置越高,如CPU核數和內存都很多,可以增大同時運行的map或reduce個數,如果單個節點硬件配置難以提升,可以增加集群節點數。
因素4:SFTP參數配置
不使用壓縮、加密算法優先選擇aes128-cbc,完整性校驗算法優先選擇umac-64@openssh.com
因素5:集群參數配置
因素6:Linux文件預讀值
設置磁盤文件預讀值大小為16384,使用linux命令:
echo 16384 > /sys/block/sda/queue/read_ahead_kb
 
說明:
sda表示當前磁盤的磁盤名。

  

12.2 Manager

12.2.1 提升Manager配置服務參數的效率

操作場景
在安裝集群或者擴容節點以后,集群中可能添加了較多數量的節點。此時如果系統管理員在CDH Manager上修改服務參數、保存新配置並重啟服務時,Manager的Controller進程可能占用大量內存,增加了CPU工作負荷,用戶需要等待一段時間才能完成參數修改。系統管理員可以根據實際業務使用情況,手動增加Controller的JVM啟動參數中內存參數,提升配置服務參數的效率。
對系統的影響
該操作需要在主管理節點重新啟動Controller,重啟期間會造成CDH Manager暫時中斷。備管理節點Controller無需重啟。
前提條件
已確認主備管理節點IP。
操作步驟
1. 使用PuTTY,以omm用戶登錄主管理節點。
2. 執行以下命令,切換目錄。
cd ${BIGDATA_HOME}/om-server/om/sbin
3. 執行以下命令修改Controller啟動參數文件“controller.sh”,並保存退出。
vi controller.sh
修改配置項“JAVA_HEAP_MAX”的參數值。例如,集群中包含了400個以上的節點,建議修改如下,表示Controller最大可使用8GB內存:
JAVA_HEAP_MAX=-Xmx8192m
4. 執行以下命令,重新啟動Controller。
sh ${BIGDATA_HOME}/om-server/om/sbin/restart-controller.sh
提示以下信息表示命令執行成功:
End into start-controller.sh
執行sh ${BIGDATA_HOME}/om-server/om/sbin/status-oms.sh,查看Controller的“ResHAStatus”是否為“Normal”,並可以重新登錄CDH
Manager表示重啟成功。
5. 使用PuTTY,以omm用戶登錄備管理節點,並重復步驟 2~步驟 3。

12.2.2 根據集群節點數優化Manager配置

操作場景
CDH集群規模不同時,Manager相關參數差異較大。在集群容量調整前或者安裝集群時,用戶可以手動指定Manager集群節點數,系統將自動調整相關進程參
數。
說明:
在安裝集群時,可以通過Manager安裝配置文件中的“cluster_nodes_scale”參數指定集群節點數。

  

操作步驟
1. 使用PuTTY,以omm用戶登錄主管理節點。
2. 執行以下命令,切換目錄。
cd ${BIGDATA_HOME}/om-server/om/sbin
3. 執行以下命令查看當前集群Manager相關配置。
sh oms_confifig_info.sh -q
4. 執行以下命令指定當前集群的節點數。
命令格式:sh oms_confifig_info.sh -s 節點數
例如:
sh oms_confifig_info.sh -s 10
根據界面提示,輸入“y”:
The following confifigurations will be modifified:
Module Parameter Current Target
Controller controller.Xmx 4096m => 8192m
Controller controller.Xms 1024m => 2048m
...
Do you really want to do this operation? (y/n):
界面提示以下信息表示配置更新成功:
...
Operation has been completed. Now restarting OMS server. [done]
Restarted oms server successfully.
說明:
配置更新過程中,OMS會自動重啟。
相近數量的節點規模對應的Manager相關配置是通用的,例如100節點變為101節點,並沒有新的配置項需要刷新。

  

12.3 HBase

12.3.1 提升BulkLoad效率

操作場景
批量加載功能采用了MapReduce jobs直接生成符合HBase內部數據格式的文件,然后把生成的StoreFiles文件加載到正在運行的集群。使用批量加載相比直接使用
HBase的API會節約更多的CPU和網絡資源。
ImportTSV是一個HBase的表數據加載工具。
前提條件
在執行批量加載時需要通過“Dimporttsv.bulk.output”參數指定文件的輸出路徑。
操作步驟
參數入口:執行批量加載任務時,在BulkLoad命令行中加入如下參數。
表12­1 增強BulkLoad效率的配置項

參數

描述

配置的值

-

Dimporttsv.mapper.class

用戶自定義mapper通過把鍵值對的構造從mapper移動到reducer以幫助提高性能。mapper只需要把每一行的原始文本發送給reducer, reducer解析每一行的每一條記錄並創建鍵值對。

org.apache.hadoop.hbase.mapreduce.TsvImporterByteMapper  和org.apache.hadoop.hbase.mapreduce.TsvImporterTextMapper

 

說明:

 

 

當該值配置

 

 

為“org.apache.hadoop.hbase.mapreduce.TsvImporterByteMapper”時,只在執行沒有HBASE_CELL_VISIBILITY OR HBASE_CELL_TTL選項的批

量加載命令時使用。使

 

 

用“org.apache.hadoop.hbase.mapreduce.TsvImporterByteMapper”時可以得到更好的性能。

 

12.3.2 提升連續put場景性能

操作場景
對大批量、連續put的場景,配置下面的兩個參數為“false”時能大量提升性能。
“hbase.regionserver.wal.durable.sync”
“hbase.regionserver.hfifile.durable.sync”
當提升性能時,缺點是對於DataNode(默認是3個)同時故障時,存在小概率數據丟失的現象。對數據可靠性要求高的場景請慎重配置。
操作步驟
 

參數

描述

默認值

hbase.regionserver.wal.durable.sync

每一條wal是否持久化到硬盤。

true

hbase.regionserver.hfile.durable.sync

hfile寫是否立即持久化到硬盤。

true

12.3.3 Put和Scan性能綜合調優

操作場景
HBase有很多與讀寫性能相關的配置參數。讀寫請求負載不同的情況下,配置參數需要進行相應的調整,本章節旨在指導用戶通過修改RegionServer配置參數進行讀寫
性能調優。
操作步驟
JVM GC參數
RegionServer GC_OPTS參數設置建議:
-Xms與-Xmx設置相同的值,需要根據實際情況設置,增大內存可以提高讀寫性能,可以參考參數“hfifile.block.cache.size”(見表12-4)和參數“hbase.regionserver.global.memstore.size”(見表12-3)的介紹進行設置。
-XX:NewSize與-XX:MaxNewSize設置相同值,建議低負載場景下設置為“512M”,高負載場景下設置為“2048M”。
-XX:CMSInitiatingOccupancyFraction建議設置為“100 * (hfifile.block.cache.size + hbase.regionserver.global.memstore.size + 0.05)”,最大值不
超過90。-XX:MaxDirectMemorySize表示JVM使用的堆外內存,建議低負載情況下設置為“512M”,高負載情況下設置為“2048M”。
Put相關參數
RegionServer處理put請求的數據,會將數據寫入memstore和hlog,
當memstore大小達到設置的“hbase.hregion.memstore.flflush.size”參數值大小時,memstore就會刷新到HDFS生成HFile。
當當前region的列簇的HFile數量達到“hbase.hstore.compaction.min”參數值時會觸發compaction。
當當前region的列簇HFile數達到“hbase.hstore.blockingStoreFiles”參數值時會阻塞memstore刷新生成HFile的操作,導致put請求阻塞。

參數

描述

默認值

hbase.regionserver.wal.durable.sync

每一條wal是否持久化到硬盤。參考 升連續put場景性能

true

hbase.regionserver.hfile.durable.sync

hfile寫是否立即持久化到硬盤。參考 升連續put場景性能

true

hbase.hregion.memstore.flush.size

建議設置為HDFS塊大小的整數倍,在內存足夠put負載大情況下可以調整增大。單位:字節。

134217728

hbase.regionserver.global.memstore.size

建議設置為“hbase.hregion.memstore.flush.size * 寫活躍 region數 / RegionServer GC -Xmx”。默認值為“0.4”,表示使用RegionServer GC -Xmx的40%。

0.4

hbase.hstore.flusher.count

memstore的flush線程數,在put高負載場景下可以適當調大。

2

hbase.regionserver.thread.compaction.small

HFile compaction線程數,在put高負載情況下可以適當調大。

10

hbase.hstore.blockingStoreFiles

當列簇的HFile數達到該閾值,阻塞該region的所有操作,直到compcation完成,在put高負載場景下可以適當調大。

15

 

 

 

參數

描述

默認值

hbase.client.scanner.timeout.period

客戶端和RegionServer端參數,表示scan租約的時間,建議設置為60000ms的整數倍,在讀高負載情況下可以適當調大。單位:毫秒。

60000

hfile.block.cache.size

數據緩存所占的RegionServer GC -Xmx百分比,在讀高負載情況下可以適當調大以增大緩存命中率以提高性能。默認值為“0.25”,表示使用RegionServer GC -Xmx的25%。

0.25

 

 

 

參數

描述

默認值

hbase.regionserver.handler.count

RegionServer上的RPC服務器實例數,建議設置為200 ~ 400 之間。

200

hbase.regionserver.metahandler.count

RegionServer中處理優先請求的程序實例的數量,建議設置為200 ~ 400之間。

100

 

12.3.4 提升實時寫數據效率

操作場景
需要把數據實時寫入到HBase中或者對於大批量、連續put的場景。
前提條件
調用HBase的put或delete接口,把數據保存到HBase中。
操作步驟
寫數據服務端調優
參數入口:
在CDH Manager系統中,選擇“服務管理 > HBase > 服務配置”,“參數類別”類型設置為“全部配置”。在搜索框中輸入參數名稱。
表12­6 影響實時寫數據配置項

配置參數

描述

默認值


配置參數

描述

默認值

hbase.regionserver.wal.durable.sync

控制HLog文件在寫入到HDFS時的同步程度。如果為true,HDFS在把數據寫入到硬盤后才返回;如果為false,HDFS在把數據寫入OS的緩存后就返回。

把該值設置為false比true在寫入性能上會更優。

true

hbase.regionserver.hfile.durable.sync

控制HFile文件在寫入到HDFS時的同步程度。如果為true,HDFS在把數據寫入到硬盤后才返回;如果為false,HDFS在把數據寫入OS的緩存后就返回。

把該值設置為false比true在寫入性能上會更優。

true

GC_OPTS

HBase利用內存完成讀寫操作。提高HBase內存可以有效提高HBase 性能。GC_OPTS主要需要調整HeapSize的大小和NewSize的大小。調  整HeapSize大小的時候,建議將Xms和Xmx設置成相同的值,這樣可以避免JVM動態調整HeapSize大小的時候影響性能。調整NewSize大小的時候,建議把其設置為HeapSize大小的1/9。

HMaster:當HBase集群規模越大、Region數量越多時,可以適當調大HMaster的GC_OPTS參數。RegionServer:RegionServer需要的內存一般比HMaster要

大。在內存充足的情況下,HeapSize可以相對設置大一些。

 

說明:

主HMaster的HeapSize為4G的時候,HBase集群可以支持100000Region 數的規模。根據經驗值,單個RegionServer的HeapSize不建議超過20GB。

HMaster:

-Xms2G -Xmx2G - XX:NewSize=256M - XX:MaxNewSize=256M

RegionServer:

-Xms4G -Xmx4G - XX:NewSize=512M - XX:MaxNewSize=512M

hbase.regionserver.handler.count

表示RegionServer在同一時刻能夠並發處理多少請求。如果設置過高會導致激烈線程競爭,如果設置過小,請求將會在RegionServer長時間等待,降低處理能力。根據資源情況,適當增加處理線程數。

建議根據CPU的使用情況,可以選擇設置為100至300之間的值。

200

hbase.hregion.max.filesize

表示HBase中Region的文件總大小的最大值。當Region中的文件大於該參數時,將會導致Region分裂。 該參數設置過小時,可能會導致Split操作過於頻繁。當設置過大時,可能導致Compact需要處理的文件大小增加,影響Compact執行效率。

10737418240(單位:字節)

hbase.hregion.memstore.flush.size

在RegionServer中,當寫操作內存中存在超過memstore.flush.size大小的memstore,則MemStoreFlusher就啟動flush操作將該memstore 以hfile的形式寫入對應的store中。

如果RegionServer的內存充足,而且活躍Region數量也不是很多的時候,可以適當增大該值,可以減少compaction的次數,有助於提升系統性能。

同時,這種flush產生的時候,並不是緊急的flush,flush操作可能會有一定延遲,在延遲期間,寫操作還可以進行,Memstore還會繼續增大,最大值為“memstore.flush.size”  * “hbase.hregion.memstore.block.multiplier”。當超過最大值時,將會阻塞操作。適當增大“hbase.hregion.memstore.block.multiplier”可以減少阻塞,減少性能波動。

134217728(單位:字節)

hbase.regionserver.global.memstore.size

RegionServer中,負責flush操作的是MemStoreFlusher線程。該線程定期檢查寫操作內存,當寫操作占用內存總量達到閾值, MemStoreFlusher將啟動flush操作,按照從大到小的順序,flush若干相對較大的memstore,直到所占用內存小於閾值。

閾值 = “hbase.regionserver.global.memstore.size”  * “hbase.regionserver.global.memstore.size.lower.limit”  * “HBase_HEAPSIZE”

說明:

該配置與“hfile.block.cache.size”的和不能超過0.8,也就是寫和讀操作的內存不能超過HeapSize的80%,這樣可以保證除讀和寫外其它操作的正常運行。

0.4

hbase.hstore.blockingStoreFiles

在region flush前首先判斷file文件個數,是否大於hbase.hstore.blockingStoreFiles。

如果大於需要先compaction並且讓flush延時90s(這個值可以通過hbase.hstore.blockingWaitTime進行配置),在延時過程中,將會繼續寫從而使得Memstore還會繼續增大超過最大值“memstore.flush.size”  * “hbase.hregion.memstore.block.multiplier”,導致寫操作阻塞。當完成compaction后,可能就會產生大量寫入。這樣就導致性能激烈震盪。

增加hbase.hstore.blockingStoreFiles,可以減低BLOCK幾率。

15

hbase.regionserver.thread.compaction.throttle

控制一次Minor Compaction時,進行compaction的文件總大小的閾值。Compaction時的文件總大小會影響這一次compaction的執行時間,如果太大,可能會阻塞其它的compaction或flush操作。

1610612736(單位:字節)

 


配置參數

描述

默認值

hbase.hstore.compaction.min

當一個Store中文件超過該值時,會進行compact,適當增大該值,可以減少文件被重復執行compaction。但是如果過大,會導致Store中文件數過多而影響讀取的性能。

6

hbase.hstore.compaction.max

控制一次compaction操作時的文件數量的最大值。

與“hbase.hstore.compaction.max.size”的作用基本相同,主要是控制一次compaction操作的時間不要太長。

10

hbase.hstore.compaction.max.size

如果一個HFile文件的大小大於該值,那么在Minor Compaction操作中不會選擇這個文件進行compaction操作,除非進行Major  Compaction操作。

9223372036854775807(單

位:字節)

 

這個值可以防止較大的HFile參與compaction操作。在禁止Major Compaction后,一個Store中可能存在幾個HFile,而不會合並成為一個HFile,這樣不會對數據讀取造成太大的性能影響。

 

hbase.hregion.majorcompaction

設置Major Compaction的執行周期。默認值為604800000毫秒。由於執行Major Compaction會占用較多的系統資源,如果正在處於系統繁忙時期,會影響系統的性能。

如果業務沒有較多的更新、刪除、回收過期數據空間時,可以把該值設置為0,以禁止Major Compaction。

如果必須要執行Major Compaction,以回收更多的空間,可以適當增加該值,同時配置參

數“hbase.offpeak.end.hour”和“hbase.offpeak.start.hour”以控制 Major Compaction發生在業務空閑的時期。

604800000(單位:毫秒)

hbase.regionserver.maxlogs hbase.regionserver.hlog.blocksize

 

表示一個RegionServer上未進行Flush的Hlog的文件數量的閾 值,如果大於該值,RegionServer會強制進行flush操作。

表示每個HLog文件的最大大小。如果HLog文件大小大於該值,就會滾動出一個新的HLog文件,舊的將被禁用並歸檔。

這兩個參數共同決定了RegionServer中可以存在的未進行Flush的hlog 數量。當這個數據量小於MemStore的總大小的時候,會出現由於HLog文件過多而觸發的強制flush操作。這個時候可以適當調整這兩個參數的大小,以避免出現這種強制flush的情況。

32

134217728(單位:字節)

 

寫數據客戶端調優
寫數據時,在場景允許的情況下,最好使用Put List的方式,可以極大的提升寫性能。每一次Put的List的長度,需要結合單條Put的大小,以及實際環境的一些參數進行設定。建議在選定之前先做一些基礎的測試。
寫數據表設計調優
表12­7 影響實時寫數據相關參數 

配置參數

描述

默認值

COMPRESSION

配置數據的壓縮算法,這里的壓縮是HFile中block 級別的壓縮。對於可以壓縮的數據,配置壓縮算法可以有效減少磁盤的IO,從而達到提高性能的目 的。

 

說明:

並非所有數據都可以進行有效壓縮。例如一張圖片的  數據,因為圖片一般已經是壓縮后的數據,所以壓縮 效果有限。 常用的壓縮算法是SNAPPY,因為它有較好的Encoding/Decoding速度和可以接受的壓縮率。

NONE

BLOCKSIZE

配置HFile中block塊的大小,不同的block塊大小, 可以影響HBase讀寫數據的效率。越大的block

塊,配合壓縮算法,壓縮的效率就越好;但是由於HBase的讀取數據是以block塊為單位的,所以越大的block塊,對於隨機讀的情況,性能可能會比較差。

如果要提升寫入的性能,一般擴大到128KB或者256KB,可以提升寫數據的效率,也不會影響太大的隨機讀性能。

65536(單位:字節)

IN_MEMORY

配置這個表的數據優先緩存在內存中,這樣可以有效提升讀取的性能。對於一些小表,而且需要頻繁進行讀取操作的,可以設置此配置項。

false

 

12.3.5 提升實時讀數據效率

操作場景
需要讀取HBase數據場景。
前提條件
調用HBase的get或scan接口,從HBase中實時讀取數據。
操作步驟
讀數據服務端調優
參數入口:
在CDH Manager系統中,選擇“服務管理 > HBase > 服務配置”,“參數類別”類型設置為“全部配置”。在搜索框中輸入參數名稱。
表12­8 影響實時寫數據配置項 

配置參數

描述

默認值

GC_OPTS

HBase利用內存完成讀寫操作。提高HBase內存可以有效提高HBase性能。

HMaster:

-Xms2G -Xmx2G - XX:NewSize=256M - XX:MaxNewSize=256M RegionServer:

-Xms4G -Xmx4G - XX:NewSize=512M - XX:MaxNewSize=512M

 

GC_OPTS主要需要調整HeapSize的大小和NewSize的大小。調整HeapSize大小的時候,建議將Xms和Xmx設置成相同的值,這樣可以避免JVM動態調整HeapSize大小的時候影響性能。調整NewSize大小的時候,建議把其設置為HeapSize大小的1/9。

 

HMaster:當HBase集群規模越大、Region數量越多時,可以適當調大HMaster的GC_OPTS參數。

 

RegionServer:RegionServer需要的內存一般比HMaster要 大。在內存充足的情況下,HeapSize可以相對設置大一些。

 

說明:

 

主HMaster的HeapSize為4G的時候,HBase集群可以支持100000Region 數的規模。根據經驗值,單個RegionServer的HeapSize不建議超過20GB。

hbase.regionserver.handler.count

表示RegionServer在同一時刻能夠並發處理多少請求。如果設置過高會導致激烈線程競爭,如果設置過小,請求將會在RegionServer長時間等待,降低處理能力。根據資源情況,適當增加處理線程數。

建議根據CPU的使用情況,可以選擇設置為100至300之間的值。

200

hfile.block.cache.size

HBase緩存區大小,主要影響查詢性能。根據查詢模式以及查詢記錄分布情況來決定緩存區的大小。如果采用隨機查詢使得緩存區的命中率較低,可以適當降低緩存區大小。

0.25

 
說明: 如果同時存在讀和寫的操作,這兩種操作的性能會互相影響。如果寫入導致的flush和Compaction操作頻繁發生,會占用大量的磁盤IO操作,
從而影響 讀取的性能。如果寫入導致阻塞較多的Compaction操作,就會出現Region中存在多個HFile的情況,從而影響讀取的性能。
所以如果讀取的性能不理 想的時候,也要考慮寫入的配置是否合理。
讀數據客戶端調優
Scan數據時需要設置caching(一次從服務端讀取的記錄條數,默認是1),若使用默認值讀性能會降到極低。
當不需要讀一條數據所有的列時,需要指定讀取的列,以減少網絡IO。
只讀取RowKey時,可以為Scan添加一個只讀取RowKey的fifilter(FirstKeyOnlyFilter或KeyOnlyFilter)。
讀數據表設計調優
表12­9 影響實時讀數據相關參數

配置參數

描述

默認值

COMPRESSION

配置數據的壓縮算法,這里的壓縮是HFile中block 級別的壓縮。對於可以壓縮的數據,配置壓縮算法可以有效減少磁盤的IO,從而達到提高性能的目 的。

 

說明:

並非所有數據都可以進行有效壓縮。例如一張圖片的  數據,因為圖片一般已經是壓縮后的數據,所以壓縮 效果有限。 常用的壓縮算法是SNAPPY,因為它有較好的Encoding/Decoding速度和可以接受的壓縮率。

NONE

BLOCKSIZE

配置HFile中block塊的大小,不同的block塊大小, 可以影響HBase讀寫數據的效率。越大的block

塊,配合壓縮算法,壓縮的效率就越好;但是由於HBase的讀取數據是以block塊為單位的,所以越大的block塊,對於隨機讀的情況,性能可能會比較差。

如果要提升寫入的性能,一般擴大到128KB或者256KB,可以提升寫數據的效率,也不會影響太大的隨機讀性能。

65536(單位:字節)

DATA_BLOCK_ENCODING

配置HFile中block塊的編碼方法。當一行數據中存在多列時,一般可以配置為“FAST_DIFF”,可以有效的節省數據存儲的空間,從而提供性能。

NONE

12.3.6 JVM參數優化操作場景

當集群數據量達到一定規模后,JVM的默認配置將無法滿足集群的業務需求,輕則集群變慢,重則集群服務不可用。所以需要根據實際的業務情況進行合理的JVM參數
配置,提高集群性能。
操作步驟
參數入口:
HBase角色相關的JVM參數需要配置在“${HBASE_HOME}/conf”目錄下的“hbase-env.sh”文件中。
每個角色都有各自的JVM參數配置變量,如表12-10。
表12­10 HBase相關JVM參數配置變量

變量名

變量影響的角色

HBASE_OPTS

該變量中設置的參數,將影響HBase的所有角色。

SERVER_GC_OPTS

該變量中設置的參數,將影響HBase Server端的所有角色,例如:Master、RegionServer 等。

CLIENT_GC_OPTS

該變量中設置的參數,將影響HBase的Client進程。

HBASE_MASTER_OPTS

該變量中設置的參數,將影響HBase的Master。

HBASE_REGIONSERVER_OPTS

該變量中設置的參數,將影響HBase的RegionServer。

HBASE_THRIFT_OPTS

該變量中設置的參數,將影響HBase的Thrift。

12.4 HDFS

12.4.1 提升寫性能

操作場景
在HDFS中,通過調整屬性的值,使得HDFS集群更適應自身的業務情況,從而提升HDFS的寫性能。
操作步驟
參數入口:
在CDH Manager系統中,選擇“服務管理 > HDFS > 服務配置”,“參數類別”類型設置為“全部配置”。在搜索框中輸入參數名稱。
表12­11 HDFS寫性能優化配置

參數

描述

默認值

dfs.datanode.drop.cache.behind.reads

設置為true表示丟棄緩存的數據(需要在DataNode中配置)。

當同一份數據,重復讀取的次數較少時,建議設置為true,使得緩存能夠被其他操作使用。重復讀取的次數較多時,設置為false能夠提升重復讀取的速度。

true

dfs.client-write-packet-size

當HDFS Client往DataNode寫數據時,將數據生成一個包。然后將這個包在網絡上傳出。此參數指定傳輸數據包的大小,可以通過各Job來指定。單位:字節。

在萬兆網部署下,可適當增大該參數值,來提升傳輸的吞吐量。

262144

12.4.2 JVM參數優化

操作場景
當集群數據量達到一定規模后,JVM的默認配置將無法滿足集群的業務需求,輕則集群變慢,重則集群服務不可用。所以需要根據實際的業務情況進行合理的JVM參數
配置,提高集群性能。
操作步驟
參數入口:
HDFS角色相關的JVM參數需要配置在“${HADOOP_HOME}/etc/hadoop”目錄下的“hadoop-env.sh”文件中。
JVM各參數的含義請參見其官網:http://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
每個角色都有各自的JVM參數配置變量,如表12-12。
表12­12 HDFS相關JVM參數配置變量

變量名

變量影響的角色

HADOOP_OPTS

該變量中設置的參數,將影響HDFS的所有角色。

HADOOP_NAMENODE_OPTS

該變量中設置的參數,將影響HDFS的NameNode。

HADOOP_DATANODE_OPTS

該變量中設置的參數,將影響HDFS的DataNode。

HADOOP_JOURNALNODE_OPTS

該變量中設置的參數,將影響HDFS的JournalNode。

變量名

變量影響的角色

HADOOP_ZKFC_OPTS

該變量中設置的參數,將影響HDFS的ZKFC。

HADOOP_SECONDARYNAMENODE_OPTS

該變量中設置的參數,將影響HDFS的SecondaryNameNode。

HADOOP_CLIENT_OPTS

該變量中設置的參數,將影響HDFS的Client進程。

HADOOP_BALANCER_OPTS

該變量中設置的參數,將影響HDFS的Balancer進程。

HADOOP_MOVER_OPTS

該變量中設置的參數,將影響HDFS的Mover進程。

 

配置方式舉例:
export HADOOP_NAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,N

12.4.3 使用客戶端元數據緩存提高讀取性能

操作場景
通過使用客戶端緩存元數據塊的位置來提高HDFS讀取性能。
說明:
此功能僅用於讀取不經常修改的文件。因為在服務器端由某些其他客戶端完成的數據修改,對於高速緩存的客戶端將是不可見的,
這可能導致從緩存中拿到的元數據是過期的。 
操作步驟
設置參數的路徑:
在CDH Manager頁面中,選擇“服務管理 > HDFS > 服務配置”,將“參數類別”設置為“全部配置”,並在搜索框中輸入參數名稱。
表12­13 參數配置

參數

描述

默認值

dfs.client.metadata.cache.enabled

啟用/禁用塊位置元數據的客戶端緩存。將此參數設置為“true”,搭配“dfs.client.metadata.cache.pattern”參數以啟用緩存。

false

dfs.client.metadata.cache.pattern

需要緩存的文件路徑的正則表達式模式。只有這些文件的塊位置元數據被緩存,直到這些元數據過期。此配置僅在參數“dfs.client.metadata.cache.enabled”設置為“true”時有效。

示例:“/test.*”表示讀取其路徑是以“/test”開頭的所有文件。

 

說明:

為確保一致性,配置特定模式以僅緩存其他客戶端不經常修改的文件。

正則表達式模式將僅驗證URI的path部分,而不驗證在Fully Qualified路徑情況下的schema和authority。

<empty>

dfs.client.metadata.cache.expiry.sec

緩存元數據的持續時間。緩存條目在該持續時間過期后失效。即使在緩存過程中經常使用的元數 據也會發生失效。

配置值可采用時間后綴s/m/h表示,分別表示秒,分鍾和小時。

 

說明:

若將該參數配置為“0s”,將禁用緩存功能。

60s

dfs.client.metadata.cache.max.entries

緩存一次最多可保存的非過期數據條目。

65536

 

說明:
要在過期前完全清除客戶端緩存,可調用DFSClient#clearLocatedBlockCache()。
用法如下所示。
FileSystem fs = FileSystem.get(conf);
DistributedFileSystem dfs = (DistributedFileSystem) fs;
DFSClient dfsClient = dfs.getClient();
dfsClient.clearLocatedBlockCache();

  

12.4.4 使用當前活動緩存提升客戶端與NameNode的連接性能

操作場景
HDFS部署在具有多個NameNode實例的HA(High Availability)模式中,HDFS客戶端需要依次連接到每個NameNode,以確定當前活動的NameNode是什么,並將其用於客戶端操作。
一旦識別出來,當前活動的NameNode的詳細信息就可以被緩存並共享給在客戶端機器中運行的所有客戶端。這樣,每個新客戶端可以首先嘗試從緩存加載活動的
Name Node的詳細信息,並將RPC調用保存到備用的NameNode。在異常情況下有很多優勢,例如當備用的NameNode連接長時間不響應時。
當發生故障,將另一個NameNode切換為活動狀態時,緩存的詳細信息將被更新為當前活動的NameNode的信息。
操作步驟
設置參數的路徑如下:在CDH Manager頁面中,選擇“服務管理 > HDFS > 服務配置”,將“參數類別”設置為“全部配置”,並在搜索框中輸入參數名稱。
表12­14 配置參數

參數

描述

默認值

dfs.client.failover.proxy.provider.[nameservice ID]

配置客戶端Failover proxy provider類,該類使用傳遞的協議創建NameNode proxy。該參數可以被配置

為“org.apache.hadoop.hdfs.server.namenode.ha.BlackListingFailoverProxyProvider”或者“org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider”。

org.apache.hadoop.hd

dfs.client.failover.activeinfo.share.flag

啟用緩存並將當前活動的NameNode的詳細信息共享給其他客戶端。若要啟用緩存,需將其設置為“true”。

false

dfs.client.failover.activeinfo.share.path

指定將在機器中的所有客戶端創建的共享文件的本地目錄。如果要為不同用戶共享緩存, 該文件夾應具有必需的權限(如在給定目錄中創建,讀寫緩存文件)。

/tmp

dfs.client.failover.activeinfo.share.io.timeout.sec

控制超時的可選配置。用於在讀取或寫入緩存文件時獲取鎖定。如果在該時間內無法獲取 緩存文件上的鎖定,則放棄嘗試讀取或更新緩存。單位為秒。

5

說明:
由HDFS客戶端創建的緩存文件必須由其他客戶端重新使用。因此,這些文件永遠不會從本地系統中刪除。若禁用該功能,可能需要進行手動清理。  

12.5 Hive

12.5.1 建立表分區

操作場景
Hive在做Select查詢時,一般會掃描整個表內容,會消耗較多時間去掃描不關注的數據。此時,可根據業務需求及其查詢維度,建立合理的表分區,從而提高查詢效
率。
操作步驟
1. 使用PuTTY工具,以root用戶登錄已安裝Hive客戶端的節點。
2. 執行以下命令,進入客戶端安裝目錄,例如“/opt/client”。
cd /opt/client
3. 執行source bigdata_env命令,配置客戶端環境變量。
4. 在客戶端中執行如下命令,執行登錄操作。
kinit 用戶名
5. 執行以下命令登錄客戶端工具。
beeline
6. 指定靜態分區或者動態分區。
靜態分區:
靜態分區是手動輸入分區名稱,在創建表時使用關鍵字PARTITIONED BY指定分區列名及數據類型。應用開發時,使用ALTER TABLE ADD
PARTITION語句增加分區,以及使用LOAD DATA INTO PARTITON語句將數據加載到分區時,只能靜態分區。
動態分區:通過查詢命令,將結果插入到某個表的分區時,可以使用動態分區。
動態分區通過在客戶端工具執行如下命令來開啟:
set hive.exec.dynamic.partition=true
動態分區默認模式是strict,也就是必須至少指定一列為靜態分區,在靜態分區下建立動態子分區,可以通過如下設置來開啟完全的動態分區:
set hive.exec.dynamic.partition.mode=nonstrict
說明:
1. 動態分區可能導致一個DML語句創建大量的分區,對應的創建大量新文件夾,對系統性能可能帶來影響。
2. 在文件數量大的情況下,執行一個SQL語句啟動時間較長,可以在執行SQL語句之前執行“set mapreduce.input.fifileinputformat.list-status.num
threads = 100;”語句來縮短啟動時間。“mapreduce.input.fifileinputformat.list-status.num-threads”參數需要先添加到Hive的白名單才可設置。 

12.5.2 Join優化

操作場景
使用Join語句時,如果數據量大,可能造成命令執行速度和查詢速度慢,此時可進行Join優化。
Join優化可分為以下方式:
Map Join
Sort Merge Bucket Map Join
Join順序優化
Map Join
Hive的Map Join適用於能夠在內存中存放下的小表(指表大小小於25MB),通過“hive.mapjoin.smalltable.fifilesize”定義小表的大小,默認為25MB。Map Join的方法有兩種:
使用/*+ MAPJOIN(join_table) */。
執行語句前設置如下參數,當前版本中該值默認為true。
set hive.auto.convert.join=true
使用Map Join時沒有Reduce任務,而是在Map任務前起了一個MapReduce Local Task,這個Task通過TableScan讀取小表內容到本機,在本機以HashTable的形式
保存並寫入硬盤上傳到DFS,並在distributed cache中保存,在Map Task中從本地磁盤或者distributed cache中讀取小表內容直接與大表join得到結果並輸出。
使用Map Join時需要注意小表不能過大,如果小表將內存基本用盡,會使整個系統性能下降甚至出現內存溢出的異常。
Sort Merge Bucket Map Join
使用Sort Merge Bucket Map Join必須滿足以下2個條件:
1. join的兩張表都很大,內存中無法存放。
2. 兩張表都按照join key進行分桶(clustered by (column))和排序(sorted by(column)),且兩張表的分桶數正好是倍數關系。
通過如下設置,啟用Sort Merge Bucket Map Join:
set hive.optimize.bucketmapjoin=true
set hive.optimize.bucketmapjoin.sortedmerge=true
這種Map Join也沒有Reduce任務,是在Map任務前啟動MapReduce Local Task,將小表內容按桶讀取到本地,在本機保存多個桶的HashTable備份並寫入HDFS,並保存在Distributed Cache中,在Map Task中從本地磁盤或者Distributed Cache中按桶一個一個讀取小表內容,然后與大表做匹配直接得到結果並輸出。
Join順序優化
當有3張及以上的表進行Join時,選擇不同的Join順序,執行時間存在較大差異。使用恰當的Join順序可以有效縮短任務執行時間。
Join順序原則:
Join出來結果較小的組合,例如表數據量小或兩張表Join后產生結果較少,優先執行。
Join出來結果大的組合,例如表數據量大或兩張表Join后產生結果較多,在后面執行。
例如,customer表的數據量最多,orders表和lineitem表優先Join可獲得較少的中間結果。
原有的Join語句如下:
select
l_orderkey,
sum(l_extendedprice * (1 - l_discount)) as revenue,
o_orderdate,
o_shippriority
from
customer,
orders,
lineitem
where
c_mktsegment = 'BUILDING'
and c_custkey = o_custkey
and l_orderkey = o_orderkey
and o_orderdate < '1995-03-22'
and l_shipdate > '1995-03-22'
limit 10;
Join順序優化后如下:
select
l_orderkey,
sum(l_extendedprice * (1 - l_discount)) as revenue,
o_orderdate,
o_shippriority
from
orders,
lineitem,
customer
where
c_mktsegment = 'BUILDING'
and c_custkey = o_custkey
and l_orderkey = o_orderkey
and o_orderdate < '1995-03-22'
and l_shipdate > '1995-03-22'
limit 10;

  

注意事項
Join數據傾斜問題
執行任務的時候,任務進度長時間維持在99%,這種現象叫數據傾斜。
數據傾斜是經常存在的,因為有少量的Reduce任務分配到的數據量和其他Reduce差異過大,導致大部分Reduce都已完成任務,但少量Reduce任務還沒完成的情況。
解決數據傾斜的問題,可通過設置set hive.optimize.skewjoin=true並調整hive.skewjoin.key的大小。hive.skewjoin.key是指Reduce端接收到多少個key即認為數據是
傾斜的,並自動分發到多個Reduce。

12.5.3 Group By優化

操作場景

優化Group by語句,可提升命令執行速度和查詢速度。
Group by的時候, Map端會先進行分組, 分組完后分發到Reduce端, Reduce端再進行分組。可采用Map端聚合的方式來進行Group by優化,開啟Map端初步聚
合,減少Map的輸出數據量。
操作步驟
在Hive客戶端進行如下設置:
set hive.map.aggr=true
注意事項
Group By數據傾斜
Group By也同樣存在數據傾斜的問題,設置hive.groupby.skewindata為true,生成的查詢計划會有兩個MapReduce Job,第一個Job的Map輸出結果會隨機的分布到Reduce中,每個Reduce做聚合操作,並輸出結果,這樣的處理會使相同的Group By Key可能被分發到不同的Reduce中,從而達到負載均衡,第二個Job再根據預處理的結果按照Group By Key分發到Reduce中完成最終的聚合操作。
Count Distinct聚合問題
當使用聚合函數count distinct完成去重計數時,處理值為空的情況會使Reduce產生很嚴重的數據傾斜,可以將空值單獨處理,如果是計算count distinct,可以通過where字句將該值排除掉,並在最后的count distinct結果中加1。如果還有其他計算,可以先將值為空的記錄單獨處理,再和其他計算結果合並。

12.5.4 數據存儲優化

操作場景
“ORC”是一種高效的列存儲格式,在壓縮比和讀取效率上優於其他文件格式。
建議使用“ORC”作為Hive表默認的存儲格式。
前提條件
已登錄Hive客戶端,具體操作請參見《管理員指南》的“使用Hive客戶端”。
操作步驟
推薦:使用“SNAPPY”壓縮,適用於壓縮比和讀取效率要求均衡場景。
Create table xx stored as orc tblproperties ("orc.compress"="SNAPPY")
可用:使用“ZLIB”壓縮,適用於壓縮比要求較高場景。
Create table xx stored as orc tblproperties ("orc.compress"="ZLIB")
說明:
xx為具體使用的Hive表名。 

12.5.5 SQL優化

操作場景
在Hive上執行SQL語句查詢時,如果語句中存在“(a&b) or (a&c)”邏輯時,建議將邏輯改為“a & (b or c)”。
樣例
假設條件a為“p_partkey = l_partkey”,優化前樣例如下所示:
select
sum(l_extendedprice* (1 - l_discount)) as revenue
from
lineitem,
part
where
(
p_partkey = l_partkey
and p_brand = 'Brand#32'
and p_container in ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG')
and l_quantity >= 7 and l_quantity <= 7 + 10
and p_size between 1 and 5
and l_shipmode in ('AIR', 'AIR REG')
and l_shipinstruct = 'DELIVER IN PERSON'
)
or
( p_partkey = l_partkey
and p_brand = 'Brand#35'
and p_container in ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK')
and l_quantity >= 15 and l_quantity <= 15 + 10
and p_size between 1 and 10
and l_shipmode in ('AIR', 'AIR REG')
and l_shipinstruct = 'DELIVER IN PERSON'
)
or
( p_partkey = l_partkeyand p_brand = 'Brand#24'
and p_container in ('LG CASE', 'LG BOX', 'LG PACK', 'LG PKG')
and l_quantity >= 26 and l_quantity <= 26 + 10
and p_size between 1 and 15
and l_shipmode in ('AIR', 'AIR REG')
and l_shipinstruct = 'DELIVER IN PERSON'
)

  

優化后樣例如下所示:
select
sum(l_extendedprice* (1 - l_discount)) as revenue
from
lineitem,
part
where
(
p_partkey = l_partkey
and p_brand = 'Brand#32'
and p_container in ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG')
and l_quantity >= 7 and l_quantity <= 7 + 10
and p_size between 1 and 5
and l_shipmode in ('AIR', 'AIR REG')
and l_shipinstruct = 'DELIVER IN PERSON'
)
or
( p_partkey = l_partkey
and p_brand = 'Brand#35'
and p_container in ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK')
and l_quantity >= 15 and l_quantity <= 15 + 10
and p_size between 1 and 10
and l_shipmode in ('AIR', 'AIR REG')
and l_shipinstruct = 'DELIVER IN PERSON'
)
or
( p_partkey = l_partkeyand p_brand = 'Brand#24'
and p_container in ('LG CASE', 'LG BOX', 'LG PACK', 'LG PKG')
and l_quantity >= 26 and l_quantity <= 26 + 10
and p_size between 1 and 15
and l_shipmode in ('AIR', 'AIR REG')
and l_shipinstruct = 'DELIVER IN PERSON'
)

  

12.5.6 使用Hive CBO優化查詢

操作場景
在Hive中執行多表Join時,Hive支持開啟CBO(Cost Based Optimization),系統會自動根據表的統計信息,例如數據量、文件數等,選出最優計划提高多表Join的
效率。Hive需要先收集表的統計信息后才能使CBO正確的優化。
說明:
CBO優化器會基於統計信息和查詢條件,盡可能地使join順序達到最優。但是也可能存在特殊情況導致join順序調整不准確。例如數據存在傾斜,以及查詢條件值在表中不存在等場景,可能調整出非優化的join順序。
開啟列統計信息自動收集時,需要在reduce側做聚合統計。對於沒有reduce階段的insert任務,將會多出reduce階段,用於收集統計信息。 
前提條件
已登錄Hive客戶端,具體操作請參見《管理員指南》的“使用Hive客戶端”。
操作步驟
1. 在Manager界面Hive組件的服務配置中搜索“hive.cbo.enable”參數,選中“true”永久開啟功能或者通過以下命令臨時開啟功能:
set hive.cbo.enable=true;
2. 手動收集Hive表已有數據的統計信息。
執行以下命令,可以手動收集統計信息。僅支持統計一張表,如果需要統計不同的表需重復執行。
ANALYZE TABLE [db_name.]tablename [PARTITION(partcol1[=val1], partcol2[=val2], ...)]
COMPUTE STATISTICS
[FOR COLUMNS]
[NOSCAN];
說明:
指定FOR COLUMNS時,收集列級別的統計信息。
指定NOSCAN時,將只統計文件大小和個數,不掃描具體文件。 
例如:
analyze table table_name compute statistics;
analyze table table_name compute statistics for columns;3. 配置Hive自動收集統計信息。開啟配置后,執行insert overwrite/into命令插入數據時才自動統計新數據的信息。
在Hive客戶端執行以下命令臨時開啟收集:
set hive.stats.autogather = true; 開啟表/分區級別的統計信息自動收集。
set hive.stats.column.autogather = true; 開啟列級別的統計信息自動收集。
說明:
列級別統計信息的收集不支持復雜的數據類型,例如Map,Struct等。
表級別統計信息的自動收集不支持Hive on HBase表。
在Manager界面Hive的服務配置中,搜索參數“hive.stats.autogather”和“hive.stats.column.autogather”,選中“true”永久開啟收集功能。
4. 執行以下命令可以查看統計信息。
DESCRIBE FORMATTED table_name[.column_name] PARTITION partition_spec;
例如:
desc formatted table_name;
desc formatted table_name.id;
desc formatted table_name.id partition(time='2016-05-27');
說明:
分區表僅支持分區級別的統計信息收集,因此分區表需要指定分區來查詢統計信息。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM