你对资产跟踪感兴趣吗? 好消息! 使用Elastic 地图应用可以轻松可视化和分析移动的数据。 你可以跟踪 IoT 设备的位置并监控运输途中的包裹或车辆。

在本教程中,你将查看来自俄勒冈州波特兰市的实时城市交通数据。 你将观看城市公交车,使用数据可视化拥堵情况,并在公交车进入施工区时通知调度团队。

你将学会:

  • 使用 Logstash 将 TriMet REST API 摄入到 Elasticsearch。
  • 创建一个地图,其中包含可视化资产轨迹和最后已知位置的图层。
  • 使用符号和颜色来设置数据值的样式并显示资产的前进方向。
  • 设置跟踪警报以监控移动的车辆。当车辆进出一个限定的区域,会发送警报。这种技术称之为 geofencing。

完成本教程后,你将拥有一张如下所示的地图:

es 地理位置排序 scriptSort esl地图_数据

在下面的演示中,我讲使用 Elastic Stack 7.16.2 来进行展示。

前提条件

Elastic Stack

你需要在你的电脑上或者服务器上安装 Elastic  Stack,请参照我的文章:

  • 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch
  • Kibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana

来安装好 Elasticsearch 及 Kibana。你也可以在 Elastic Cloud 上免费试用。你也可以阅读文章 “Elasticsearch:如何在 Docker 容器中安装 Elastic Stack” 进行 Docker 安装。

同时你需要安装 Logstash。你可以参考如下的两篇文章来了解并按照 Logstash:

  • Logstash:Logstash 入门教程 (一) 
  • Logstash:Logstash 入门教程 (二)

Web 服务

https://developer.trimet.org/appid/registration/ 获取 TriMet Web 服务的 API 密钥。针对我的情况,我使用了如下的密钥并进行测试 API 接口:

es 地理位置排序 scriptSort esl地图_big data_02

上面表明我们的接口是成功的。从上面的数据中,我们可以看到交通工具的实时坐标位置信息,方向及是否拥堵等信息。由于一些原因,在有些网络上,上述的调用不成功。你需要自己解决才能进行下面的演示!

什么是资产跟踪呢?

所谓资产跟踪就是运动物体运用 GPS,北斗定位,RFID,WiFi 等其它定位技术发布自己的位置信息并由第三方平台来实时监控这些运动物体。这些跟踪对于一些交通,物流等资产的监控非常重要。它可以有效地提高运行的效率,提升客户的满意度,工作的安全性等。

截止目前,有超过200亿的物联网设备以及超过60亿的具有 GPS 的手持设备。它们每时每刻都在产生大量的位置信息。 Geofencing 是一种基于地图发展而来的技术。当一个运动的物体进入到一个限制的区域,我们可以通过 geofencing 技术来设置警报。当一个物体走出一个限定的区域,我们也可以通过 geofencing 技术来设置警报。你可以看一个详细的例子 “Elastic:Elastic Maps 基于位置的警报 - 7.10”

es 地理位置排序 scriptSort esl地图_big data_03

如何把数据摄入到 Elasticsearch

Elastic Stack 提供了丰富的方法把数据摄入到 Elasticsearch 中。

到目前为止,有如下的3中方式能够把我们所感兴趣的数据导入到 Elasticsearch 中:

es 地理位置排序 scriptSort esl地图_大数据_04

正如上面所显示的那样,我们可以通过:

  • Beats:我们可以通过 Beats 把数据导入到 Elasticsearch中

es 地理位置排序 scriptSort esl地图_数据_05

我们可以使用 Elastic Stack 所提供的丰富的 Beats 来摄入数据。针对 Web 服务的数据摄入,我们可以使用 Filebeat 来进行。有兴趣的开发者可以参考我的另外一篇文章 “Beats:使用 Filebeat 中的 HTTP JSON input 来摄入网络服务数据”。 

  • Logstash:我们可以 Logstash 把数据导入。Logstash 的数据来源也可以是 Beats:

es 地理位置排序 scriptSort esl地图_大数据_06

我们可以运用 Logstash 所提供的丰富的 filters 来对数据进行加工。 在今天的演示中,我们将使用 Logstash 来完成。

  • REST API:我们可以通过 Elastic 所提供的丰富的 API 来把数据导入到 Elasticsearch 中。我们可以通过 Java, Python, Go, Nodejs 等各种 Elasticsearch API 来完成我们的数据导入。如果你对这些感兴趣的话,请阅读 “Elastic:菜鸟上手指南” 中的 “各类语言日志导入”。尽管我们可以使用各类语言进行数据摄入(这个需要一定的人力来完成),但是如果你考虑到背压(back pressure)等情况,在大多数的情况下,我们还是建议使用 Beats 或者 Logstash 来完成。

摄入 Portland 公交车数据

为了在 Portland 巴士上获得可视化和警报的乐趣,我们必须首先创建一个 Logstash 管道,将 TriMet Portland 巴士数据摄取到 Elasticsearch 中。

创建 Elasticsearch 索引

首先,我们打开 Kibana 的 Dev Tools,并打入如下的命令:

PUT tri_met_tracks

上述命令将创建一个叫做 tri_met_tracks 的索引。我们接着打入如下的命令:

PUT tri_met_tracks/_mapping
{
  "properties": {
    "in_congestion": {
      "type": "boolean"
    },
    "location": {
      "type": "geo_point"
    },
    "route": {
      "type": "keyword"
    },
    "time": {
      "type": "date",
      "format": "epoch_millis"
    },
    "type": {
      "type": "keyword"
    },
    "vehicle_id": {
      "type": "keyword"
    }
  }
}

上述命令定义  tri_met_tracks 索引的 mapping。请注意上面的 location 字段。它是一个 geo_point 类型的字段。这是 Maps 应用必不可少的字段类型。

启动 Logstash 摄入数据

我们在自己的电脑创建一个目录,并创建如下的一个 Logstash 配置文件:

trimet-pipeline.conf

input {
  http_poller {
    urls => {
      trimet => "https://developer.trimet.org/ws/v2/vehicles?appID=<tri_met_app_id>"
    }
    request_timeout => 60
    schedule => { cron => "* * * * * UTC"}
    codec => "json"
  }
}

filter {
  split {
    field => "[resultSet][vehicle]"
  }

  if ![resultSet][vehicle][inCongestion] {
    mutate {
      update => {
        "[resultSet][vehicle][inCongestion]" => "false"
      }
    }
  }

  mutate {
    add_field => {
      "bearing" => "%{[resultSet][vehicle][bearing]}"
      "in_congestion" => "%{[resultSet][vehicle][inCongestion]}"
      "location" => "%{[resultSet][vehicle][latitude]},%{[resultSet][vehicle][longitude]}"
      "route" => "%{[resultSet][vehicle][routeNumber]}"
      "time" => "%{[resultSet][vehicle][time]}"
      "type" => "%{[resultSet][vehicle][type]}"
      "vehicle_id" => "%{[resultSet][vehicle][vehicleID]}"
    }
    remove_field => [ "resultSet", "@version", "@timestamp" ]
  }

  mutate {
    convert => {
      "bearing" => "float"
  "in_congestion" => "boolean"
      "time" => "integer"
    }
  }
}

output {
  stdout {
    codec => rubydebug
  }

  elasticsearch {
    hosts => ["localhost:9200"]
    user => "elastic"
    password =>"password"
    index => "tri_met_tracks"
    document_id => "%{[vehicle_id]}_%{[time]}"
  }
}

请注意

  • 你需要使用自己申请的 <tri_met_app_id> 代入到上面的配置文件中
  • 上面定义每隔60秒获取一些数据。这个完全依赖于你自己的实时性要求
  • 你需要依据自己的 Elasticsearch 的访问地址修改上面的 hosts 参数。你如果已经配置安全,那么你需要修改上面的 user 及 password 配置
  • 如果你运行上面的配置,而在 Elasticsearch 中找不到生成的 tri_met_tracks,那么问题极有可能是你的网路问题。请回到上面的 “Web 服务” 章节进行再次确认

我们打开一个 terminal,并键入如下的命令:

./bin/logstash -f ~/data/assets/trimet-pipeline.conf

我们可以在 terminal 中看到如下的画面:

es 地理位置排序 scriptSort esl地图_数据_07

 我们可以在 Kibana 中打入如下的命令:

GET tri_met_tracks/_count

如果我们看到如下类似的结果:

{
  "count" : 1494,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  }
}

它表明我们的 Logstash 的 pipeline 是正常工作的。

创建索引模式

我们打开 Kibana:

es 地理位置排序 scriptSort esl地图_数据_08

es 地理位置排序 scriptSort esl地图_大数据_09

 

es 地理位置排序 scriptSort esl地图_数据_10

 点击上面的  Create index pattern。这样我们就创建了一个叫做 tri_met_tracks* 的索引模式:

es 地理位置排序 scriptSort esl地图_Elastic_11

在 Discover 中查看数据

我们接下来可以在 Kibana 的 Discover 中来查看数据:

es 地理位置排序 scriptSort esl地图_大数据_12

 我们设置时间为最近的 15 分钟。我们打开其中的一个文档并了解其中的一些字段的值:bearing,in_congestion,location 及 vehicle_id 等。

创建一个运营地图

由于事件很多,很难通过查看个别事件来了解波特兰巴士的概况。 让我们创建一张地图来显示每辆巴士的巴士路线和当前位置,以及巴士的行驶方向。

创建一个自己的地图

打开 Kibana Maps 应用:

es 地理位置排序 scriptSort esl地图_Elastic_13

es 地理位置排序 scriptSort esl地图_elasticsearch_14

es 地理位置排序 scriptSort esl地图_数据_15

 

这样就完成了把默认的层设置为 Dark  模式。

添加一个 track 层

添加一个层来显示公交车在过去15分钟之内的路线:

 

由于这个功能是付费功能。我们需要去 Stack Management 中启动试用:

es 地理位置排序 scriptSort esl地图_Elastic_16

 

es 地理位置排序 scriptSort esl地图_big data_17

这样就启动了我们的白金试用。我们再次回到上面的界面:

es 地理位置排序 scriptSort esl地图_数据_18

 这次,我们看到 Tracks 被启动了。选中 Tracks:

es 地理位置排序 scriptSort esl地图_数据_19

 点击上面的  Add layer:

es 地理位置排序 scriptSort esl地图_Elastic_20


 点击上面的 Save & close 按钮:

es 地理位置排序 scriptSort esl地图_数据_21

es 地理位置排序 scriptSort esl地图_elasticsearch_22

es 地理位置排序 scriptSort esl地图_elasticsearch_23

Hooray! 我们终于得到了在过去15分钟内的所有 bus 的路线图。这是我们到目前为止得到的第一个图层。

我将在接下来的文章中继续添加更多的图层。请详细阅读文章 “Elastic:运用 Elastic Maps 实时跟踪,可视化资产分布及地理围栏告警(二)”