MAP-减少GDELT的摄取

GeoMesa让您可以轻松开始使用大数据。使用附带的命令行工具,您可以启动map/Reduce作业,以分布式方式获取数据,只需最少的配置。这是一个更高级的教程;您应该已经熟悉了GeoMesa和Geoserver的基础知识。如果您还没有,请花点时间来浏览其中一个快速入门教程。

本教程介绍如何执行以下操作:

  1. 利用GeoMesa命令行工具 GDELT 通过Hadoop映射/还原作业将数据文件放入GeoMesa

  2. 利用Geoserver查询和可视化数据

先决条件

在开始之前,您必须具备以下条件:

  • Java JDK 1.8

  • Apache Maven 3.6 or later

  • GitHub客户端

  • 一个Hadoop 2.8 or later 聚类

备份存储的选择

本教程将使用几个不同的后端。为简单起见,本教程的其余部分将假定使用HBase。或者,您也可以使用Acumulo或(对于最简单的使用情形)GeoMesa文件系统数据存储区来直接摄取HDFS。如果不使用HBase,本教程其余部分中的命令将略有不同。

安装GeoMesa工具

按照相应后端下的说明安装命令行工具:

获取GDELT数据

这个 GDELT Event database 提供从1979年至今全球广播、印刷和网络新闻媒体报道的事件的全面的按时间和地点索引的存档。

GDELT有两种不同的数据格式,原始的1.0和新的2.0。GeoMesa支持这两种格式,具有命名的简单要素类型 gdeltgdelt2 ,分别为。本教程将使用GDELT 2.0。

您可以在https://blog.gdeltproject.org/gdelt-2-0-our-global-world-in-realtime/.下载原始的GDELT数据文件文件每15分钟写入一次。例如,以下Bash命令使用 wget 要下载2018年1月的所有活动文件:

$ mkdir gdelt && cd gdelt
$ for day in {01..31}; do
    mkdir 201801$day && cd 201801$day;
    for hour in {00..23}; do
      for minute in 00 15 30 45; do
        wget "http://data.gdeltproject.org/gdeltv2/201801${day}${hour}${minute}00.export.CSV.zip"
      done
    done
  done

接下来,我们需要将文件转储到HDFS hadoop 指挥部。例如,以下命令将2018年1月的所有文件解压并连接到HDFS中:

$ for day in {01..31}; do
    ls 201801$day/*.zip | xargs -n 1 zcat | hadoop fs -put - /gdelt/uncompressed/201801${day}.tsv
  done

注意:单独的文件在解压缩时具有 *.csv extensions, but the data contained within them are tab-separated values, hence the *.tsv extension. See the GDELT raw data file documentation 有关这些文件格式的详细信息,请参阅。

正在运行摄取

使用命令行工具启动接收。由于目标文件位于HDFS中,因此该作业将自动作为分布式映射/还原运行。我们通过按名称调用GeoMesa附带的GDELT定义来使用它们。您可以查看 SimpleFeatureType 和下面的转换器定义 conf/sfts/gdelt/

$ bin/geomesa-hbase ingest \
    --catalog <table>      \
    --feature-name gdelt   \
    --converter gdelt2     \
    --spec gdelt2          \
    "hdfs://host:port/gdelt/uncompressed/*"

替换 <table> 使用您希望摄取的目录表,并为您的HDFS实例使用正确的主机和端口。确保引用HDFS路径以防止Shell扩展 *

您应该会看到以下输出:

INFO  Creating schema 'gdelt'
INFO  Running ingestion in distributed mode
INFO  Submitting job - please wait...
INFO  Tracking available at https://namenode/proxy/application_xxxxxxx/
[============================================================] 100% complete xxxxxx ingested 0 failed in 00:00:45
INFO  Distributed ingestion complete in 00:00:45
INFO  Ingested xxxxxx features with no failures.

您可以通过使用以下工具查询数据来验证数据是否成功获取:

$ bin/geomesa-hbase export \
    --feature-name gdelt   \
    --catalog <table>      \
    --max-features 10

您应该会看到返回了10条记录。

分析

Geoserver设置

按照相应后端下的说明安装Geoserver插件:

将GeoMesa数据存储区注册到Geoserver

添加指向您获取的数据的新GeoMesa存储,并发布 gdelt 一层。如果您不熟悉如何注册存储和发布层,请参考后端的相关快速入门。

查询

我们来看看美国东部的情况。默认的层预览将返回您接收的所有数据。由于这可能需要一些时间,因此可以使用 cql_filter 查询参数。根据您获取数据的日期,在下面的层预览URL中调整时间范围。URL假定Geoserver工作区名为“geomesa”--如果您使用不同的内容,请调整URL。

http://localhost:8080/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=geomesa:gdelt&styles=&bbox=-85.3,35.4,-68.5,43.7&width=1200&height=600&srs=EPSG:4326&format=application/openlayers&cql_filter=dtg%20DURING%202018-01-01T00:00:00.000Z/2018-01-31T23:59:59.999Z
显示2018年1月的所有GDELT活动

显示2018年1月的所有GDELT活动

上面的地图正在使用 Stamen Watercolor 作为基层。有关将多个图层添加到一个组中的更多信息,请参阅 GeoServer documentation

滤器

让我们缩小我们的结果。GDELT将事件标记为 CAMEO (Conflict and Mediation Event Observations) 密码。“Threat”类型事件的客串代码以“13”开头。我们可以使用Geoserver的OpenLayers预览中的下拉列表来过滤这些事件:

打开Geoserver切换选项工具栏

打开Geoserver切换选项工具栏

在工具栏中输入CQL筛选器

在工具栏中输入CQL筛选器

让我们使用自定义图标来显示威胁事件,方法是添加一个 SLD style 到了这一层。添加SLD文件 threat.sld 转到Geoserver,进入左侧菜单上的“Styles”,然后选择“Add New Style”。SLD引用来自的图标 EmojiOne 。下载表情符号并重命名 1f525.pngfire.png ,然后将文件复制到您的Geoserver Servlet中,以便可以在http://localhost:8080/icons/fire.png.上使用它

现在我们通过添加以下内容来修改层预览 threat 发送到 styles 参数:

http://localhost:8080/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=geomesa:gdelt&CQL_FILTER=EventRootCode=13&styles=threat&bbox=-85.3,35.4,-68.5,43.7&width=1200&height=600&srs=EPSG:4326&format=application/openlayers
显示带有客串根代码威胁的GDELT事件

显示带有客串根代码威胁的GDELT事件

热图

您可以使用热图更清晰地显示同一位置的多个事件,或一般的大容量数据。

备注

热点图样式要求在您的Geoserver中安装Geoserver WPS插件,如中所述 GeoMesa过程

添加SLD文件 heatmap.sld 致Geoserver。

在下面的请求中,GDELT层被引用了两次,一次使用热图样式,一次使用威胁样式。热图层在Points层之前定义,因此这些点将被覆盖而不是隐藏。请注意 &env=radiusPixels:30 在URL中;这是SLD变量替换,并将替换在SLD中分配的默认值。

http://localhost:8080/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=geomesa:gdelt,geomesa:gdelt&CQL_FILTER=EventRootCode=13;EventRootCode=13&styles=heatmap,threat&bbox=-85.3,35.4,-68.5,43.7&width=1200&height=600&srs=EPSG:4326&format=application/openlayers&env=radiusPixels:30
显示带有GDELT事件和客串根代码威胁的事件覆盖的热图

显示带有GDELT事件和客串根代码威胁的事件覆盖的热图