
# HBase Phoenix API接口介绍
#### 版本关系
若使用Phoenix，需下载与当前使用MRS集群相对应的Phoenix版本，具体请参见[https://phoenix.apache.org](https://phoenix.apache.org/)。其对应关系如[表1]所示：
 表1MRS与Phoenix版本对应关系一览表 
| MRS版本     | Phoenix版本        | 备注                  |
|:---|:---|:---|
| MRS 1.9.2 | x.xx.x-HBase-1.3 | 例如，4.14.1-HBase-1.3 |
   
#### 配置方式
MRS 3.x之前的版本需要去官网下载第三方的phoenix包，然后进行如下配置，MRS 3.x版本已支持Phoenix，可直接在已安装HBase客户端的节点使用Phoenix，开启了Kerberos认证的集群相关操作请参见[Phoenix命令行](https://support.huaweicloud.com/devg3-mrs/mrs_07_080073.html)，未开启Kerberos认证的集群相关操作请参见[Phoenix命令行](https://support.huaweicloud.com/devg3-mrs/mrs_07_290069.html)：
1. 从官网(<https://phoenix.apache.org/download.html>)下载phoenix二进制包上传至集群的任一Master节点，解压后修改相应权限并切换到omm用户下（例如，apache-phoenix-4.14.1-HBase-1.3-bin.tar.gz）。
   ```
   tar -xvf apache-phoenix-4.14.1-HBase-1.3-bin.tar.gz
   chown omm:wheel apache-phoenix-4.14.1-HBase-1.3-bin -R
   su - omm
   ```
   
2. 进入apache-phoenix-4.14.1-HBase-1.3-bin中，在该目录中编辑如下脚本，例如，脚本名称为"installPhoenixJar.sh"，则需执行命令为："sh installPhoenixJar.sh \<PHOENIX_HBASE_VERSION\> \<MRS_VERSION\> \<IPs\>"(IP为HBase安装节点的IP，即所有Master和Core节点的IP，并以当前集群实际IP为准)。例如脚本如下所示：
   ```
   #!/bin/bash
   PHOENIX_HBASE_VERSION=$1
   shift
   MRS_VERSION=$1
   shift
   IPs=$1
   shift
   check_cmd_result() {
       echo "executing command: $*"
       str="$@"
       if [ $ -eq 7 ]; then
           echo "please check input args, such as, sh installPhoenixJar.sh 5.0.0-HBase-2.0 2.0.1 xx.xx.xx.xx,xx.xx.xx.xx,xx.xx.xx.xx"
           exit 1
       fi
       if ! eval $*
       then
           echo "Failed to execute: $*"
           exit 1
       fi
   }
   check_cmd_result [ -n "$PHOENIX_HBASE_VERSION" ]
   check_cmd_result [ -n "$MRS_VERSION" ]
   check_cmd_result [ -n "$IPs" ]
   if [ ${MRS_VERSION}X = "1.8.5"X ]; then
       MRS_VERSION="1.8.3"
   fi
   if [[ ${MRS_VERSION} =~ "1.6" ]]; then
       WORKDIR="FusionInsight"
   elif [[ ${MRS_VERSION} =~ "1.7" ]]; then
       WORKDIR="MRS"
   else
       WORKDIR="MRS_${MRS_VERSION}/install"
   fi
   check_cmd_result HBASE_LIBDIR=$(ls -d /opt/Bigdata/${WORKDIR}/FusionInsight-HBase-*/hbase/lib)
   # copy jars to local node.
   check_cmd_result cp phoenix-${PHOENIX_HBASE_VERSION}-server.jar ${HBASE_LIBDIR}
   check_cmd_result cp phoenix-core-${PHOENIX_HBASE_VERSION}.jar ${HBASE_LIBDIR}
   check_cmd_result chmod 700 ${HBASE_LIBDIR}/phoenix-${PHOENIX_HBASE_VERSION}-server.jar
   check_cmd_result chmod 700 ${HBASE_LIBDIR}/phoenix-core-${PHOENIX_HBASE_VERSION}.jar
   check_cmd_result chown omm:wheel ${HBASE_LIBDIR}/phoenix-${PHOENIX_HBASE_VERSION}-server.jar
   check_cmd_result chown omm:wheel ${HBASE_LIBDIR}/phoenix-core-${PHOENIX_HBASE_VERSION}.jar
   if [[ "$MRS_VERSION" =~ "2." ]]; then
       check_cmd_result rm -rf ${HBASE_LIBDIR}/htrace-core-3.1.0-incubating.jar
       check_cmd_result rm -rf /opt/client/HBase/hbase/lib/joda-time-2.1.jar
       check_cmd_result ln -s /opt/share/htrace-core-3.1.0-incubating/htrace-core-3.1.0-incubating.jar \
   ${HBASE_LIBDIR}/htrace-core-3.1.0-incubating.jar
       check_cmd_result ln -s /opt/share/joda-time-2.1/joda-time-2.1.jar /opt/client/HBase/hbase/lib/joda-time-2.1.jar    
   fi
   # copy jars to other nodes.
   localIp=$(hostname -i)
   ipArr=($(echo "$IPs" | sed "s|\,|\ |g"))
   for ip in ${ipArr[@]}
   do
       if [ "$ip"X = "$localIp"X ]; then
           echo "skip copying jar to local node."
           continue
       fi
       check_cmd_result scp ${HBASE_LIBDIR}/phoenix-${PHOENIX_HBASE_VERSION}-server.jar ${ip}:${HBASE_LIBDIR} 2>/dev/null
       check_cmd_result scp ${HBASE_LIBDIR}/phoenix-core-${PHOENIX_HBASE_VERSION}.jar ${ip}:${HBASE_LIBDIR} 2>/dev/null
       if [[ "$MRS_VERSION" =~ "2." ]]; then
           check_cmd_result ssh $ip "rm -rf ${HBASE_LIBDIR}/htrace-core-3.1.0-incubating.jar" 2>/dev/null
           check_cmd_result ssh $ip "rm -rf /opt/client/HBase/hbase/lib/joda-time-2.1.jar" 2>/dev/null
           check_cmd_result ssh $ip "ln -s /opt/share/htrace-core-3.1.0-incubating/htrace-core-3.1.0-incubating.jar \
   ${HBASE_LIBDIR}/htrace-core-3.1.0-incubating.jar" 2>/dev/null
           check_cmd_result ssh $ip "ln -s /opt/share/joda-time-2.1/joda-time-2.1.jar /opt/client/HBase/hbase/lib/joda-time-2.1.jar" 2>/dev/null
       fi
   done
   echo "installing phoenix jars to hbase successfully..."
   ```
   ![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
   - 请使用txt文本格式复制导入如上脚本，以避免导入格式错误问题。
   
   - \<PHOENIX_HBASE_VERSION\>：当前使用的phoenix版本。例如MRS 3.x之前可使用的phoenix版本为4.14.1-HBase-1.3。
   
   - \<MRS_VERSION\>：当前使用的MRS版本。
   
   - \<IPs\>：hbase的安装节点ip，以逗号分隔，即当前集群的Master节点和Core节点ip。
   
   - 执行脚本后，打印出"installing phoenix jars to hbase successfully..."字样则表示phoenix已安装成功。
     
3. 登录[MRS Manager](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0102.html)界面，重启HBase服务。
4. 配置phoenix客户端参数(未开启Kerberos认证集群可跳过此步骤)。
   1. 配置phoenix连接时使用的认证信息。进入$PHOENIX_HOME/bin，编辑hbase-site.xml文件，需配置参数如[表 1 Phoenix参数配置]所示。
       表2Phoenix参数配置 
      | 参数                                    | 描述                         | 默认值      |
      |:---|:---|:---|
      | hbase.regionserver.kerberos.principal | 当前集群regionserver的principal | 未设置      |
      | hbase.master.kerberos.principal       | 当前集群hmaster的principal      | 未设置      |
      | hbase.security.authentication         | 初始化Phoenix连接时所采用的认证方式      | kerberos |
         
      可配置参数。如下所示，
      ```
      <property>
      <name>hbase.regionserver.kerberos.principal</name>
      <value>hbase/hadoop.hadoop.com@HADOOP.COM</value>
      </property>
      <property>
      <name>hbase.master.kerberos.principal</name>
      <value>hbase/hadoop.hadoop.com@HADOOP.COM</value>
      </property>
      <property>
      <name>hbase.security.authentication</name>
      <value>kerberos</value>
      </property>
      ```
      ![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
      其中参数"hbase.master.kerberos.principal"和"hbase.regionserver.kerberos.principal"为开启Kerberos认证的安全集群中hbase的kerberos用户，可搜索客户端中hbase-site.xml文件得到参数值。例如，客户端安装在master节点的/opt/client下，则可使用命令"grep "kerberos.principal" /opt/client/HBase/hbase/conf/hbase-site.xml -A1"获取，如[图1]所示。
      图1获取hbase的principal   
      ![](https://support.huaweicloud.com/devg-mrs/zh-cn_image_0250982452.png) 
   
   2. 修改Phoenix路径的bin目录下的sqlline.py脚本（例如：apache-phoenix-4.14.1-HBase-1.3-bin/bin/sqlline.py），添加hbase客户端的相关依赖信息如[图2]所示。
      图2Phoenix依赖及zookeeper认证   
      ![](https://support.huaweicloud.com/devg-mrs/zh-cn_image_0250982276.png)
      详细配置。如下所示，
      ```
      添加hbase client的lib包(eg，$HBASE_HOME/lib/*:)
      添加相关认证（eg，$HBASE_OPTS）
      ```
      
    
 
#### 使用方法
Phoenix支持SQL的方式来操作HBase。以下简单介绍使用SQL语句建表/插入数据/查询数据/删表等操作，Phoenix同样支持以JDBC的方式来操作HBase，具体请参见[HBase SQL查询样例代码说明](https://support.huaweicloud.com/devg-mrs/mrs_06_0035.html)。
1. 连接Phoenix:
   ```
   source /opt/client/bigdata_env
   kinit MRS集群用户（MRS集群用户可以是内置用户hbase，或者已加入hbase组中的其他用户，未开启Kerberos认证集群略过该命令）
   cd $PHOENIX_HOME
   bin/sqlline.py ZooKeeperIP地址:2181
   ```
   ![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
   1. MRS 1.9.2之前版本ZooKeeper端口号为24002，详见MRS Manager在的ZooKeeper组件配置。
   
   2. 若使用phoenix的索引功能，需在HBase服务端(包括HMaster和RegionServer)添加如下配置（详情请参见<https://phoenix.apache.org/secondary_indexing.html>）：
      ```
      <property>
      <name>hbase.regionserver.wal.codec</name>
      <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
      </property>
      ```
      
     
2. 建表：
   ```
   CREATE TABLE TEST (id VARCHAR PRIMARY KEY, name VARCHAR);
   ```
   
3. 插入数据：
   ```
   UPSERT INTO TEST(id,name) VALUES ('1','jamee');
   ```
   
4. 查询数据：
   ```
   SELECT * FROM TEST;
   ```
   
5. 删表：
   ```
   DROP TABLE TEST;
   ```
   
 
