開發與維運

雲HBase Phoenix索引構建最佳實踐

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生效。

優點:

  1. 簡單,不佔用客戶端資源,整個build過程是在服務端完成的。

缺點:

  1. 調整參數需要重啟queryserver生效,重啟過程會導致線上服務臨時中斷
  2. 調整參數會對線上服務造成影響
    如果有異常SQL導致的大請求會導致服務端負載高,調整了RPC超時時間, 一旦遇到這種請求,無法及時中斷,可能對線上業務產生的影響。
  3. 無法控制併發,可能因為索引構建打爆服務器

同步構建-重客戶端

重客戶端適用於中小規模的數據構建,一般索引構建時間在10小時以內。

使用方式:

  1. 下載重客戶端工具

    1. 部署在用戶VPC下,機器配置大於等於4c8g;重客戶端構建索引的過程中流量會經過這個節點,如果需要更快的索引構建,可以升級節點配置。
  2. 調整配置 bin/hbase-site.xml後,使用bin/sqline.py
  • 集群地址

    • hbase.zookeeper.quorum

      zk 連接地址,注意使用VPC鏈接地址。

  • 併發數

    • phoenix.query.threadPoolSize

      併發數,越大對目標集群讀寫壓力,可以從1開始逐步增加

  • 超時配置

    • 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環境準備
  1. 自建Hadoop或者購買EMR Hadoop集群
  2. 在MR環境中創建mr-phoenix-conf目錄
  3. 配置雲HBASE的zk到hbase-site.xml,並此配置文件添加到mr-phoenix-conf目錄
    雲HBase的zk地址可以從控制檯獲取。
  4. 拷貝以下hadoop配置文件到mr-phoenix-conf目錄下,包括: core-site.xml、mapred-site.xml、yarn-site.xml、hdfs-site.xml
  5. 修改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進行索引構建。

參考文檔:

Leave a Reply

Your email address will not be published. Required fields are marked *