

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Phoenix 用戶端
<a name="emr-phoenix-clients"></a>

您可以使用透過完整相依性建置的 JDBC 用戶端連接到 Phoenix 或使用「精簡用戶端」，其會使用 Phoenix 查詢伺服器和只能在叢集主節點上執行 (例如，使用 SQL 用戶端、一個步驟、命令列、SSH 連接埠轉送等)。當使用「大量」JDBC 用戶端，仍需要存取叢集的所有節點，因為它會直接連接至 HBase 服務。「精簡」Phoenix 用戶端只需要在預設連接埠 8765 存取 Phoenix 查詢伺服器。在使用這些用戶端的 Phoenix 中，有多種[指令碼](https://github.com/apache/phoenix/tree/master/bin)。



**透過 Phoenix 使用 Amazon EMR 步驟進行查詢**

下列程序從 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                              |
   +------------------------------------------+-----------------------------------+
   ```