

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Phoenix 客户端
<a name="emr-phoenix-clients"></a>

您可以通过以下方式连接到 Phoenix：使用内置了完全依赖项的 JDBC 客户端，或使用已采用 Phoenix Query Server 且只能在集群的主节点上运行的“瘦客户端”（例如，通过使用 SQL 客户端、步骤、命令行、SSH 端口转发等）。使用 “fat” JDBC 客户端时，它仍然需要访问集群的所有节点，因为它直接连接到 HBase 服务。“瘦”Phoenix 客户端只需要通过默认端口 8765 访问 Phoenix 查询服务器。Phoenix 中有几个[脚本](https://github.com/apache/phoenix/tree/master/bin)使用这些客户端。



**使用 Amazon EMR 步骤通过 Phoenix 进行查询**

以下过程从中恢复快照， HBase 并使用该数据运行 Phoenix 查询。您可以扩展此示例或创建一个新脚本，以利用 Phoenix 的客户端来满足您的需求。

1. 使用以下命令创建安装了 Phoenix 的集群：

   ```
   aws emr create-cluster --name "Cluster with Phoenix" --log-uri s3://amzn-s3-demo-bucket/myLogFolder --release-label emr-7.12.0 \
   --applications Name=Phoenix Name=HBase --ec2-attributes KeyName=myKey \
   --instance-type m5.xlarge --instance-count 3 --use-default-roles
   ```

1. 创建后，将以下文件上传到 Amazon S3：

   copySnapshot.sh

   ```
   sudo su hbase -s /bin/sh -c 'hbase snapshot export \
    -D hbase.rootdir=s3://us-east-1.elasticmapreduce.samples/hbase-demo-customer-data/snapshot/ \
   -snapshot customer_snapshot1 \
   -copy-to hdfs://masterDNSName:8020/user/hbase \
   -mappers 2 -chuser hbase -chmod 700'
   ```

   runQuery.sh

   ```
   aws s3 cp s3://amzn-s3-demo-bucket/phoenixQuery.sql /home/hadoop/
   /usr/lib/phoenix/bin/sqlline-thin.py http://localhost:8765 /home/hadoop/phoenixQuery.sql
   ```

   phoenixQuery.sql
**注意**  
在使用 Amazon EMR 5.26.0 及更高版本时，只需在以下示例中添加 `COLUMN_ENCODED_BYTES=0`。

   ```
   CREATE VIEW "customer" (
   pk VARCHAR PRIMARY KEY, 
   "address"."state" VARCHAR,
   "address"."street" VARCHAR,
   "address"."city" VARCHAR,
   "address"."zip" VARCHAR,
   "cc"."number" VARCHAR,
   "cc"."expire" VARCHAR,
   "cc"."type" VARCHAR,
   "contact"."phone" VARCHAR)
   COLUMN_ENCODED_BYTES=0;
   
   CREATE INDEX my_index ON "customer" ("customer"."state") INCLUDE("PK", "customer"."city", "customer"."expire", "customer"."type");
   
   SELECT "customer"."type" AS credit_card_type, count(*) AS num_customers FROM "customer" WHERE "customer"."state" = 'CA' GROUP BY "customer"."type";
   ```

   使用 AWS CLI 将文件提交到 S3 存储桶：

   ```
   aws s3 cp copySnapshot.sh s3://amzn-s3-demo-bucket/
   aws s3 cp runQuery.sh s3://amzn-s3-demo-bucket/
   aws s3 cp phoenixQuery.sql s3://amzn-s3-demo-bucket/
   ```

1. 使用以下步骤创建提交给您在步骤 1 中创建的集群的表：

   createTable.json

   ```
   [
     {
       "Name": "Create HBase Table",
       "Args": ["bash", "-c", "echo $'create \"customer\",\"address\",\"cc\",\"contact\"' | hbase shell"],
       "Jar": "command-runner.jar",
       "ActionOnFailure": "CONTINUE",
       "Type": "CUSTOM_JAR"
     }
   ]
   ```

   ```
   aws emr add-steps --cluster-id j-2AXXXXXXGAPLF \
   --steps file://./createTable.json
   ```

1. 使用 `script-runner.jar` 运行您之前上传到 S3 存储桶的 `copySnapshot.sh` 脚本：

   ```
   aws emr add-steps --cluster-id j-2AXXXXXXGAPLF \
   --steps Type=CUSTOM_JAR,Name="HBase Copy Snapshot",ActionOnFailure=CONTINUE,\
   Jar=s3://region.elasticmapreduce/libs/script-runner/script-runner.jar,Args=["s3://amzn-s3-demo-bucket/copySnapshot.sh"]
   ```

   这将运行一项 MapReduce 任务，将您的快照数据复制到集群 HDFS。

1. 使用以下步骤还原复制到集群的快照：

   restoreSnapshot.json

   ```
   [
     {
       "Name": "restore",
       "Args": ["bash", "-c", "echo $'disable \"customer\"; restore_snapshot \"customer_snapshot1\"; enable \"customer\"' | hbase shell"],
       "Jar": "command-runner.jar",
       "ActionOnFailure": "CONTINUE",
       "Type": "CUSTOM_JAR"
     }
   ]
   ```

   ```
   aws emr add-steps --cluster-id j-2AXXXXXXGAPLF \
   --steps file://./restoreSnapshot.json
   ```

1. 使用 `script-runner.jar` 运行您之前上传到 S3 存储桶的 `runQuery.sh` 脚本：

   ```
   aws emr add-steps --cluster-id j-2AXXXXXXGAPLF \
   --steps Type=CUSTOM_JAR,Name="Phoenix Run Query",ActionOnFailure=CONTINUE,\
   Jar=s3://region.elasticmapreduce/libs/script-runner/script-runner.jar,Args=["s3://amzn-s3-demo-bucket/runQuery.sh"]
   ```

   查询运行并将结果返回到步骤的 `stdout`。完成此步骤可能需要几分钟时间。

1. 通过您在步骤 1 中创建集群时使用的日志 URI 检查步骤的 `stdout` 的结果。结果应该类似以下内容：

   ```
   +------------------------------------------+-----------------------------------+
   |             CREDIT_CARD_TYPE             |              NUM_CUSTOMERS        |
   +------------------------------------------+-----------------------------------+
   | american_express                         | 5728                              |
   | dankort                                  | 5782                              |
   | diners_club                              | 5795                              |
   | discover                                 | 5715                              |
   | forbrugsforeningen                       | 5691                              |
   | jcb                                      | 5762                              |
   | laser                                    | 5769                              |
   | maestro                                  | 5816                              |
   | mastercard                               | 5697                              |
   | solo                                     | 5586                              |
   | switch                                   | 5781                              |
   | visa                                     | 5659                              |
   +------------------------------------------+-----------------------------------+
   ```