Amazon EMR
Amazon EMR 版本指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

Apache Phoenix

Apache Phoenix 用于 OLTP 和操作分析,可让您使用标准 SQL 查询和 JDBC API 来处理 Apache HBase 底层存储。有关更多信息,请参阅在 15 分钟或更短时间内运行 Phoenix

注意

如果您从早期版本的 Amazon EMR 升级到 Amazon EMR 版本 5.4.0 或更高版本并使用二级索引,请升级本地索引,如 Apache Phoenix 文档中所述。Amazon EMR 从 hbase-site 分类中删除所需配置,但需要重新填充索引。支持在线和离线升级索引。在线升级为默认值,这意味着,在从版本 4.8.0 或更高版本的 Phoenix 客户端初始化时重新填充索引。要指定离线升级,请在 phoenix-site 分类中将 phoenix.client.localIndexUpgrade 配置设置为 false,然后将 SSH 设置为主节点以运行 psql [zookeeper] -1

适用于此版本 Amazon EMR 的 Phoenix 版本信息

应用程序 Amazon EMR 发行版标签 随此应用程序安装的组件

Phoenix 4.9.0

emr-5.4.0

emrfs、emr-ddb、emr-goodies、emr-kinesis、emr-s3-dist-cp、hadoop-client、hadoop-hdfs-datanode、hadoop-hdfs-library、hadoop-hdfs-namenode、hadoop-httpfs-server、hadoop-kms-server、hadoop-mapred、hadoop-yarn-nodemanager、hadoop-yarn-resourcemanager、hbase-hmaster、hbase-client、hbase-region-server、phoenix-library、phoenix-query-server、zookeeper-client、zookeeper-server

使用 Phoenix 创建集群

您可以通过在控制台中或使用 AWS CLI 创建集群时选择 Phoenix 来安装此应用程序。以下过程和示例说明如何使用 Phoenix 和 HBase 创建集群。有关使用控制台 (包括 Advanced Options) 创建集群的更多信息,请参阅 Amazon EMR 管理指南 中的计划和配置集群

在控制台中通过使用用来创建集群的 Quick Options 安装的 Phoenix 启动集群

  1. Open the Amazon EMR console at https://console.amazonaws.cn/elasticmapreduce/.

  2. 选择 Create cluster 以使用 Quick Create

  3. 对于 Software Configuration,选择适用于应用程序的最新版本。Phoenix 仅在选择 Amazon Release Version emr-4.7.0 或更高版本时显示为选项。

  4. 对于 Applications,选择第二个选项 HBase: HBase ver with Ganglia ver, Hadoop ver, Hive ver, Hue ver, Phoenix ver, and ZooKeeper ver

  5. 根据需要选择其他选项,然后选择 Create cluster

注意

包含了 Linux 行继续符 (\) 以提高可读性。可以在 Linux 命令中删除或使用它们。对于 Windows,请删除它们或将其替换为脱字号 (^)。

以下示例通过使用默认配置设置安装的 Phoenix 启动集群。

使用 AWS CLI 启动安装了 Phoenix 和 HBase 的集群

  • 使用下面的命令创建集群:

    aws emr create-cluster --name "Cluster with Phoenix" --release-label emr-5.4.0 \ --applications Name=Phoenix Name=HBase --ec2-attributes KeyName=myKey \ --instance-type m3.xlarge --instance-count 3 --use-default-roles

在创建集群时自定义 Phoenix 配置

在创建集群时,您可使用 hbase-site.xml 配置分类在 hbase-site 中设置值来配置 Phoenix。

有关更多信息,请参阅 Phoenix 文档中的配置和优化

以下示例说明如何使用存储在 Amazon S3 中的 JSON 文件来为 phoenix.schema.dropMetaData 属性指定值 false。可为一个分类指定多个属性。有关更多信息,请参阅 配置应用程序。随后,create cluster 命令会将 JSON 文件引用为 --configurations 参数。

已保存到 /mybucket/myfolder/myconfig.json 的 JSON 文件的内容如下所示。

[ { "Classification": "hbase-site", "Properties": { "phoenix.schema.dropMetaData": "false" } } ]

引用 JSON 文件的 create cluster 命令如以下示例所示。

aws emr create-cluster --release-label emr-5.4.0 --applications Name=Phoenix \ Name=HBase --instance-type m3.xlarge --instance-count 2 \ --configurations https://s3.amazonaws.com/mybucket/myfolder/myconfig.json

Phoenix 客户端

使用内置了完全依赖项的 JDBC 客户端或使用已采用 Phoenix Query Server 且只能在集群的主节点上运行的“瘦客户端” (例如,通过使用 SQL 客户端、步骤、命令行、SSH 端口转发等) 连接到 Phoenix。使用“胖”JDBC 客户端时,仍需具有对集群的所有节点的访问权限,因为它将直接连接到 HBase 服务。“瘦”Phoenix 客户端只需能通过默认端口 8765 访问 Phoenix Query Server。Phoenix 中有多个使用这些客户端的脚本

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

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

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

    aws emr create-cluster --name "Cluster with Phoenix" --log-uri s3://myBucket/myLogFolder --release-label emr-5.4.0 \ --applications Name=Phoenix Name=HBase --ec2-attributes KeyName=myKey \ --instance-type m3.xlarge --instance-count 3 --use-default-roles
  2. 创建后,将以下文件上传到 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://myBucket/phoenixQuery.sql /home/hadoop/ /usr/lib/phoenix/bin/sqlline-thin.py http://localhost:8765 /home/hadoop/phoenixQuery.sql

    phoenixQuery.sql

    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); 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://myBucket/ aws s3 cp runQuery.sh s3://myBucket/ aws s3 cp phoenixQuery.sql s3://myBucket/
  3. 使用以下步骤创建提交给您在步骤 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
  4. 使用 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://myBucket/copySnapshot.sh"]

    这将运行 MapReduce 作业以将快照数据复制到集群 HDFS。

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

    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
  6. 使用 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://myBucket/runQuery.sh"]

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

  7. 在步骤 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 | +------------------------------------------+-----------------------------------+