Phoenix的索引構建有兩類方法:
- 同步構建,直接通過sqlline.py create index構建
在雲HBase Phoenix 5.x之後,同步構建可以通過輕客戶端或重客戶端來構建。 - 異步構建,先create index ... async, 然後通過MR提交build索引job。
因此我們有三種方式構建索引:輕客戶端、重客戶端、MR異步構建,我們依次介紹下各種方案的優缺點、適用場景和使用方法。
同步構建-輕客戶端
適用與數據量比較小,一般構建耗時在10分鐘以內。
使用方式: 直接使用輕客戶端, sqlline-thin.py , create index 即可。
如果數據量較大,我們很可能會遇到索引build超時,我們釋放調整Phoenix hbase.rpc.timeout、hbase.client.scanner.timeout.period、phoenix.query.timeoutMs 配置,重啟Queryserver生效。
優點:
- 簡單,不佔用客戶端資源,整個build過程是在服務端完成的。
缺點:
- 調整參數需要重啟queryserver生效,重啟過程會導致線上服務臨時中斷
- 調整參數會對線上服務造成影響
如果有異常SQL導致的大請求會導致服務端負載高,調整了RPC超時時間, 一旦遇到這種請求,無法及時中斷,可能對線上業務產生的影響。 - 無法控制併發,可能因為索引構建打爆服務器
同步構建-重客戶端
重客戶端適用於中小規模的數據構建,一般索引構建時間在10小時以內。
使用方式:
-
下載重客戶端工具
- 部署在用戶VPC下,機器配置大於等於4c8g;重客戶端構建索引的過程中流量會經過這個節點,如果需要更快的索引構建,可以升級節點配置。
- 調整配置 bin/hbase-site.xml後,使用bin/sqline.py
-
集群地址
- hbase.zookeeper.quorum
zk 連接地址,注意使用VPC鏈接地址。
- hbase.zookeeper.quorum
-
併發數
- phoenix.query.threadPoolSize
併發數,越大對目標集群讀寫壓力,可以從1開始逐步增加
- phoenix.query.threadPoolSize
-
超時配置
- phoenix.query.keepAliveMs
- hbase.rpc.timeout
- hbase.client.scanner.timeout.period
- phoenix.query.timeoutMs
超時時間單位是ms, 可以按需調整。
for ex:
<property>
<name>hbase.zookeeper.quorum</name>
<value>master1-1,master2-1,master3-1:2181</value>
</property>
<property>
<name>phoenix.query.threadPoolSize</name>
<value>1</value>
</property>
<property>
<name>phoenix.query.keepAliveMs</name>
<value>60000000</value>
</property>
<property>
<name>hbase.rpc.timeout</name>
<value>60000000</value>
</property>
<property>
<name>hbase.client.scanner.timeout.period</name>
<value>60000000</value>
</property>
<property>
<name>phoenix.query.timeoutMs</name>
<value>60000000</value>
</property>
優點:
- 靈活,併發、超時時間可以按需調整,無需重啟Phoenix集群,對線上服務影響小
缺點:
- 需要單獨build索引的資源機器
- 受制於build索引機器的單機性能,擴展性差。
異步構建-MR
MR索引構建適用於超大規模數據的情況。
使用方式:
-
異步索引構建方案
- 創建異步索引
CREATE INDEX async_index ON my_schema.my_table (v) ASYNC - 提交MR JOB build 索引
- 創建異步索引
hadoop --config /mr-phoenix-conf jar \
/mr-phoenix-conf/ali-phoenix-5.2.4.1-HBase-2.x-client.jar \
org.apache.phoenix.mapreduce.index.IndexTool \
--data-table {DATA_TABLE_XXXX} \
--index-table {INDEX_XXX} \
--output-path hdfs://hbase-cluster/ASYNC_INDEX_TMP
ps: ali-phoenix-client獲取,先下載重客戶端包,解壓後,取ali-phoenix-xxxx-HBase-2.x-client.jar
- 索引Build MR環境準備
- 自建Hadoop或者購買EMR Hadoop集群
- 在MR環境中創建mr-phoenix-conf目錄
- 配置雲HBASE的zk到hbase-site.xml,並此配置文件添加到mr-phoenix-conf目錄
雲HBase的zk地址可以從控制檯獲取。 - 拷貝以下hadoop配置文件到mr-phoenix-conf目錄下,包括: core-site.xml、mapred-site.xml、yarn-site.xml、hdfs-site.xml
- 修改hdfs-site.xml(mr-phoenix-conf目錄下) 增加hbase hdfs訪問能力。
雲HBase HDFS開端口和NN地址獲取,找@雲HBase答疑協助。
- 修改dfs.nameservices 增加hbase-cluster
- 增加hbase-cluster hdfs相關配置
EMR集群打通HBase集群參考配置
<property>
<name>dfs.nameservices</name>
<value>emr-cluster,hbase-cluster</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.hbase-cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled.hbase-cluster</name>
<value>true</value>
</property>
<property>
<name>dfs.ha.namenodes.hbase-cluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hbase-cluster.nn1</name>
<value>${nn1-host}:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hbase-cluster.nn2</name>
<value>${nn2-host}:8020</value>
</property>
優點:
- 可以對任意規模數據進行索引構建, 擴展性強
缺點:
- 需要準備單獨build資源
- 相對複雜
總結
適用數據量 | 優點 | 缺點 | |
---|---|---|---|
輕客戶端 | 0~10GB | 簡單,無需額外資源 | 配置參數調整會影響線上服務 |
重客戶端 | 10GB-512GB | 可以靈活配置併發、超時參數,無需重啟Phoenix集群 | 需要單獨的構建索引的機器,受制於單機性能 |
MR異步構建 | 512GB~TB級 | 適用於任意規模索引構建,擴展性強 | 額外MR資源、MR集群配置複雜 |
一般少量數據直接用輕客戶端來做索引構建,對於中小規模的數據推薦用重客戶端來構建索引,而大規模數據則推薦用MR進行索引構建。
參考文檔: