在AWS S3上引导GeoMesa HBase

使用S3作为底层存储引擎,可以在HBase上运行GeoMesa。这种运行GeoMesa的模式非常经济高效,因为您可以根据计算和内存需求而不是存储需求来调整数据库集群。以下指南介绍了如何以这种方式引导GeoMesa。本指南假定您已经配置了Amazon Web Services帐户以及IAM密钥对。

EMR集群可以通过AWS Web控制台(建议新用户使用)引导,也可以通过AWS CLI从另一个EC2实例引导。

创建电子病历集群(Web控制台)

首先,请登录到AWS Web控制台。在开始之前,请确保您已经创建了密钥对。从服务列表中选择EMR,然后选择创建集群开始。进入向导后,切换到“高级视图”,并为您的软件包选择HBase、Spark和Hadoop。取消选择所有其他选项。选择HBase后,您将看到一个“HBase存储设置”配置区,您可以在其中输入一个存储桶以用作HBase根目录。出于性能和成本的原因,您需要确保此存储桶与您的HBase集群位于同一区域。在接下来的页面上,您可以选择和定制您的硬件,并给您的集群起个好名字。

在您的群集启动后,您可以查看与您的群集相关联的硬件。找到主服务器的公网IP,通过SSH连接:

$ ssh -i /path/to/key ec2-user@<your-master-ip>

创建电子病历集群(AWS CLI)

本部分面向高级用户。如果您已经通过Web控制台引导了一个集群,则可以跳过本部分,继续安装GeoMesa。以下说明是在运行Amazon Linux的AWS EC2计算机上执行的。要设置AWS命令行工具,请按照AWS中的说明操作 online documentation

首先,您需要配置一个供HBase使用的S3存储桶。请务必更换 <bucket-name> 写着你的水桶名字。如果您愿意,您也可以为HBase使用不同的根目录。如果您使用的是AWS CLI,您可以创建一个存储桶和根目录,如下所示:

$ aws s3 mb s3://<bucket-name>
$ aws s3api put-object --bucket <bucket-name> --key hbase-root/

现在,您应该能够列出桶中的内容:

$ aws s3 ls s3://<bucket-name>/
                            PRE hbase-root/

接下来,创建一个名为的本地json文件 geomesa-hbase-on-s3.json 内容如下。请务必更换 <bucket-name>/hbase-root 使用您在上一步中配置的HBase的唯一根目录。

[
   {
     "Classification": "hbase-site",
     "Properties": {
       "hbase.rootdir": "s3://<bucket-name>/hbase-root"
     }
   },
   {
     "Classification": "hbase",
     "Properties": {
       "hbase.emr.storageMode": "s3"
     }
   }
]

然后,使用以下命令引导带有HBase的EMR集群。你将需要改变 __KEY_NAME__ 添加到您打算用于此群集的IAM密钥对,并且 __SUBNET_ID__ 设置为该子网的ID(如果该密钥与特定的子网相关联)。您还可以将实例类型编辑为适合您的用例的大小。指定您在上一步中创建的json文件的适当路径。

你可能想要跑 aws configure 在运行此命令之前。如果不是,则需要指定一个区域,如下所示 --region us-west-2 。此外,您还需要确保您的EC2实例具有IAM角色来执行 elasticmapreduce:RunJobFlow 行动。下面的配置将创建一个主节点和3个工作节点。您可能希望增加或减少工作节点的数量,或者更改实例类型以满足您的查询需要。

备注

在下面的代码中, $VERSION = 2.12-4.0.2

$ export CID=$(
aws emr create-cluster                                                         \
--name "GeoMesa HBase on S3"                                                   \
--release-label emr-5.5.0                                                      \
--output text                                                                  \
--use-default-roles                                                            \
--ec2-attributes KeyName=__KEY_NAME__,SubnetId=__SUBNET_ID__                   \
--applications Name=Hadoop Name=Zookeeper Name=Spark Name=HBase                \
--instance-groups                                                              \
  Name=Master,InstanceCount=1,InstanceGroupType=MASTER,InstanceType=m4.2xlarge \
  Name=Workers,InstanceCount=3,InstanceGroupType=CORE,InstanceType=m4.xlarge   \
--configurations file:///path/to/geomesa-hbase-on-s3.json                      \
)

在执行该命令之后,您可以通过转到 Management Console 。或通过运行以下命令:

watch 'aws emr describe-cluster --cluster-id $CID | grep MasterPublic | cut -d "\"" -f 4'

一旦配置了集群,您就可以运行以下代码来检索其主机名。

export MASTER=$(aws emr describe-cluster --cluster-id $CID | grep MasterPublic | cut -d "\"" -f 4)

或者,您可以在AWS管理控制台上找到主节点的主机名。查找名称(如 aws emr 命令),并点击进入其详细信息页面。在.之下 Hardware 部分,您可以找到主节点及其IP地址。复制IP地址,然后运行以下命令。

export MASTER=<ip_address>

要配置GeoMesa,请使用以下命令远程进入新AWS EMR群集的主节点:

$ ssh -i /path/to/key ec2-user@$MASTER

安装GeoMesa

现在您已经通过SSH连接到主服务器,您可以通过运行以下命令来测试您的HBase和Hadoop安装:

hbase version
hadoop version

如果一切正常,请下载GeoMesa HBase发行版,替换 ${VERSION} 使用适当的GeoMesa Plus Scala版本(例如 2.12-4.0.2 )和 ${TAG} 具有对应的标签版本(例如 4.0.2 ):

$ wget "https://github.com/locationtech/geomesa/releases/download/geomesa-${TAG}/geomesa-hbase_${VERSION}-bin.tar.gz" \
    -o /tmp/geomesa-hbase_${VERSION}-bin.tar.gz
$ cd /opt
$ sudo tar zxvf /tmp/geomesa-hbase_${VERSION}-bin.tar.gz

然后,通过执行提供的脚本在S3上的HBase上引导GeoMesa。该脚本设置所需的环境变量,将Hadoop JAR复制到GeoMesa的lib目录中,将GeoMesa分布式运行时复制到HBase可以使用的S3中,设置GeoMesa协处理器注册以及其他管理任务。

$ sudo /opt/geomesa-hbase_${VERSION}/bin/bootstrap-geomesa-hbase-aws.sh

现在,注销并重新登录,您的环境将得到适当设置。

接收公共GDELT数据

GeoMesa附带了许多开放时空数据集的预定义数据模型,例如GDELT。摄取最近7天的 GDELT 从Amazon的公共S3存储桶中,用户可以将文件本地复制到集群或使用分布式接收:

本地摄取:

mkdir gdelt
cd gdelt
for i in `seq 1 7`; do aws s3 cp s3://gdelt-open-data/events/2019080$i.export.csv .; done

# you'll need to ensure the hbase-site.xml is provided on the classpath...by default it is picked up by the tools from standard locations
geomesa-hbase ingest -c geomesa.gdelt -C gdelt -f gdelt -s gdelt \*.csv

分布式接收:

# we need to package up the hbase-site.xml for use in the distributed classpath
# zip and jar files found in GEOMESA_EXTRA_CLASSPATHS are picked up for the distributed classpath
cd /etc/hadoop/conf
zip /tmp/hbase-site.zip hbase-site.xml
export GEOMESA_EXTRA_CLASSPATHS=/tmp/hbase-site.zip

# now lets ingest 7 days of data from August 2019
files=$(for i in `seq 1 7`; do echo s3://gdelt-open-data/events/2019080$i.export.csv; done)
geomesa-hbase ingest -c geomesa.gdelt -C gdelt -f gdelt -s gdelt $files

然后可以使用GeoMesa命令行导出工具查询数据。

geomesa-hbase export -c geomesa.gdelt -f gdelt -m 50

设置GeoMesa和SparkSQL

要开始在S3集群上HBase上的GeoMesa上使用Spark执行SQL查询,请设置以下变量 ${VERSION} 使用适当的Scala Plus GeoMesa版本(例如 2.12-4.0.2 ):

$ JARS=file:///opt/geomesa/dist/spark/geomesa-hbase-spark-runtime-hbase1_${VERSION}.jar,file:///usr/lib/hbase/conf/hbase-site.xml

然后,启动SparkShell

$ spark-shell --jars $JARS

在SparkShell中,您可以连接到GDELT并发出一些查询。

scala> val df = spark.read.format("geomesa").option("hbase.catalog", "geomesa.gdelt").option("geomesa.feature", "gdelt").load()

scala> df.createOrReplaceTempView("gdelt")

scala> spark.sql("SELECT globalEventId,geom,dtg FROM gdelt LIMIT 5").show()