大資料元件效能調優文件整理
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說明: sda表示當前磁碟的磁碟名。
12.2 Manager
12.2.1 提升Manager配置服務引數的效率
12.2.2 根據叢集節點數優化Manager配置
操作場景 FusionInsight叢集規模不同時,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命令行中加入如下引數。 表121 增強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中。 操作步驟 寫資料服務端調優 引數入口: 在FusionInsight Manager系統中,選擇“服務管理 > HBase > 服務配置”,“引數類別”型別設定為“全部配置”。在搜尋框中輸入引數名稱。 表126 影響實時寫資料配置項
配置引數 |
描述 |
預設值 |
配置引數 |
描述 |
預設值 |
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(單位:位元組) |
配置引數 |
描述 |
預設值 |
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中實時讀取資料。 操作步驟 讀資料服務端調優 引數入口: 在FusionInsight Manager系統中,選擇“服務管理 > HBase > 服務配置”,“引數類別”型別設定為“全部配置”。在搜尋框中輸入引數名稱。 表128 影響實時寫資料配置項
配置引數 |
描述 |
預設值 |
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操作,讀資料客戶端調優 Scan資料時需要設定caching(一次從服務端讀取的記錄條數,預設是1),若使用預設值讀效能會降到極低。 當不需要讀一條資料所有的列時,需要指定讀取的列,以減少網路IO。 只讀取RowKey時,可以為Scan新增一個只讀取RowKey的fifilter(FirstKeyOnlyFilter或KeyOnlyFilter)。 讀資料表設計調優 表129 影響實時讀資料相關引數
從而影響 讀取的效能。如果寫入導致阻塞較多的Compaction操作,就會出現Region中存在多個HFile的情況,從而影響讀取的效能。
所以如果讀取的效能不理 想的時候,也要考慮寫入的配置是否合理。
配置引數 |
描述 |
預設值 |
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。 表1210 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的寫效能。 操作步驟 引數入口: 在FusionInsight Manager系統中,選擇“服務管理 > HDFS > 服務配置”,“引數類別”型別設定為“全部配置”。在搜尋框中輸入引數名稱。 表1211 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。 表1212 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程序。 |
12.4.3 使用客戶端元資料快取提高讀取效能
操作場景 通過使用客戶端快取元資料塊的位置來提高HDFS讀取效能。說明: 此功能僅用於讀取不經常修改的檔案。因為在服務器端由某些其他客戶端完成的資料修改,對於快取記憶體的客戶端將是不可見的,操作步驟 設定引數的路徑: 在FusionInsight Manager頁面中,選擇“服務管理 > HDFS > 服務配置”,將“引數類別”設定為“全部配置”,並在搜尋框中輸入引數名稱。 表1213 引數配置
這可能導致從快取中拿到的元資料是過期的。
引數 |
描述 |
預設值 |
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的資訊。 操作步驟 設定引數的路徑如下:在FusionInsight Manager頁面中,選擇“服務管理 > HDFS > 服務配置”,將“引數類別”設定為“全部配置”,並在搜尋框中輸入引數名稱。 表1214 配置引數
引數 |
描述 |
預設值 |
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。