在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()