

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Phoenix 클라이언트
<a name="emr-phoenix-clients"></a>

모든 종속 조건으로 빌드된 JDBC 클라이언트를 사용하거나 Phoenix Query Server를 사용하고 클러스터의 마스터 노드에서만 실행할 수 있는(예를 들면 SQL 클라이언트, 단계 명령줄, SSH 포트 전달 등을 통해) "씬(thin) 클라이언트"를 사용하여 Phoenix에 연결할 수 있습니다. "팻(fat)" JDBC 클라이언트를 사용하는 경우 HBase 서비스에 직접 연결되므로 여전히 클러스터의 모든 노드에 액세스할 수 있어야 합니다. "씬" Phoenix 클라이언트는 기본 포트 8765에서만 Phoenix Query Server에 액세스할 수 있으면 됩니다. 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                              |
   +------------------------------------------+-----------------------------------+
   ```