12.1 配置原則
如何發揮集群最佳性能
影響性能的因素
說明: sda表示當前磁盤的磁盤名。
12.2 Manager
12.2.1 提升Manager配置服務參數的效率
12.2.2 根據集群節點數優化Manager配置
說明: 在安裝集群時,可以通過Manager安裝配置文件中的“cluster_nodes_scale”參數指定集群節點數。
說明: 配置更新過程中,OMS會自動重啟。 相近數量的節點規模對應的Manager相關配置是通用的,例如100節點變為101節點,並沒有新的配置項需要刷新。
12.3 HBase
12.3.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場景性能
參數 |
描述 |
默認值 |
hbase.regionserver.wal.durable.sync |
每一條wal是否持久化到硬盤。 |
true |
hbase.regionserver.hfile.durable.sync |
hfile寫是否立即持久化到硬盤。 |
true |
12.3.3 Put和Scan性能綜合調優
參數 |
描述 |
默認值 |
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.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 提升實時讀數據效率
配置參數 |
描述 |
默認值 |
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的情況,從而影響讀取的性能。
所以如果讀取的性能不理 想的時候,也要考慮寫入的配置是否合理。
配置參數 |
描述 |
默認值 |
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參數優化操作場景
變量名 |
變量影響的角色 |
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 提升寫性能
參數 |
描述 |
默認值 |
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參數優化
變量名 |
變量影響的角色 |
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 使用客戶端元數據緩存提高讀取性能
說明: 此功能僅用於讀取不經常修改的文件。因為在服務器端由某些其他客戶端完成的數據修改,對於高速緩存的客戶端將是不可見的,
這可能導致從緩存中拿到的元數據是過期的。
參數 |
描述 |
默認值 |
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的連接性能
參數 |
描述 |
默認值 |
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 建立表分區
說明: 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優化
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;
12.5.3 Group By優化
操作場景
12.5.4 數據存儲優化
說明: xx為具體使用的Hive表名。
12.5.5 SQL優化
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優化查詢
說明: CBO優化器會基於統計信息和查詢條件,盡可能地使join順序達到最優。但是也可能存在特殊情況導致join順序調整不准確。例如數據存在傾斜,以及查詢條件值在表中不存在等場景,可能調整出非優化的join順序。 開啟列統計信息自動收集時,需要在reduce側做聚合統計。對於沒有reduce階段的insert任務,將會多出reduce階段,用於收集統計信息。
說明: 指定FOR COLUMNS時,收集列級別的統計信息。 指定NOSCAN時,將只統計文件大小和個數,不掃描具體文件。
說明: 列級別統計信息的收集不支持復雜的數據類型,例如Map,Struct等。 表級別統計信息的自動收集不支持Hive on HBase表。