文章转载自:https://blog.csdn.net/UbuntuTouch/article/details/106498568

需要掌握的知识点:

1.使用docker-compose方式部署一套zk+kafka+logstash+elasticsearch+kibana

2.logstash中处理经纬度等地理数据参数用法

3.Elasticsearch索引生命周期使用:先创建索引生命周期,再创建索引模板,最后使用别名创建一个索引

4.使用python方式从Kafka中拉取数据

5.maps 地图制作

你是否考虑分析和可视化地理数据? 为什么不尝试 Elastic Stack? 也就是所谓的 ELK(Elasticsearch + Logstash + Kibana)或Elatic Stack 不仅是NoSQL数据库。 它是一个整体系统,可以实时存储,搜索,分析和可视化来自任何来源的数据。 在这种情况下,我们将使用有关华沙公共交通位置的开放数据。

在今天的文章中,我将介绍如何使用 Elastic Stack 和 Kafka 来监控公共交通的车辆。我们将使用 Docker 来部署所有需要的组件。下面是整个系统的框架图:

整个应用的框架如上:

汽车或公交的数据上传到一个数据平台。它提供 REST API 接口来被调用。
Python 应用定时从 data portal 进行抓取数据,并同时发送到 Kafka
Kafaka 的数据发送到 Logstash 进行加工,并导入到 Elasticsearch 中
在 Kibana 中对数据进行呈现,展示

安装

Python

我们有一个应用是用 python 语言写的。你需要安装 python3 来运行该应用。

API key

为了测试这个应用,我们必须得到相应的华沙公共交通信息的 API key。我们可以在地址 https://api.um.warszawa.pl/# 进行申请。由于是我们不懂的文字,需要翻译中文才可以了:

点击上面的 “登录” 链接,并进行脑力测试:

最终得到如上所示的 API key:86882ed9-4533-4630-b03b-47b3d68ae5e5。这个 key 将在一下的 python 应用中使用。

Elastic Stack 及 Kafka

你需要安装 Docker 来实现 Elastic Stack 及 Kafka 的安装。

本展示的所有的源码可以在地址 https://github.com/liu-xiao-guo/wiadro-danych-kafka-to-es-ztm 进行下载。

docker-compose 包含 Elasticsearch,Kibana,Zookeeper,Kafka,Logstash 和应用程序 Kafka Streams (由于一些原因,在本展示中将不被采用)。

docker-compose.yml

version: '3.3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.7.0
restart: unless-stopped
environment:
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata:/usr/share/elasticsearch/data
ports:
- 9200:9200 kibana:
image: docker.elastic.co/kibana/kibana:7.7.0
restart: unless-stopped
depends_on:
- elasticsearch
ports:
- 5601:5601
volumes:
- kibanadata:/usr/share/kibana/data zookeeper:
image: 'bitnami/zookeeper:3'
ports:
- '2181:2181'
volumes:
- 'zookeeper_data:/bitnami'
environment:
- ALLOW_ANONYMOUS_LOGIN=yes kafka:
image: 'bitnami/kafka:2'
ports:
- '9092:9092'
- '29092:29092'
volumes:
- 'kafka_data:/bitnami'
environment:
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,PLAINTEXT_HOST://:29092
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
depends_on:
- zookeeper ztm_kafka_streams:
image: "maciejszymczyk/ztm_stream:1.0"
environment:
- APPLICATION_ID_CONFIG=awesome_overrided_ztm_stream_app_id
- BOOTSTRAP_SERVERS_CONFIG=kafka:9092
depends_on:
- kafka logstash:
image: docker.elastic.co/logstash/logstash:7.7.0
volumes:
- "./pipeline:/usr/share/logstash/pipeline"
environment:
LS_JAVA_OPTS: "-Xmx256m -Xms256m"
depends_on:
- elasticsearch
- kafka volumes:
esdata:
driver: local
kibanadata:
driver: local
zookeeper_data:
driver: local
kafka_data:
driver: local

我们在自己电脑的 console 中打入如下的命令:

docker-compose up

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

从上面我们可以看出来 Logstash 已经被成功地启动。

我们在浏览器的地址栏中输入地址 http://localhost:5601

我们可以看到 Kibana 已经成功启动,这也意味着 Elasticsearch 被成功地运行起来了。

配置及运行

Logstash

我们使用如下的 pipeline 来实现对数据的处理:

pipeline/kafka_to_es.conf

input {
kafka {
topics => "ztm-input"
bootstrap_servers => "kafka:9092"
codec => "json"
}
} filter {
mutate {
convert => {"Lat" => "float"}
convert => {"Lon" => "float"} add_field => ["location", "%{Lat},%{Lon}"]
remove_field => ["Lat", "Lon"]
}
}
output {
stdout {
codec => rubydebug
} elasticsearch {
hosts => ["elasticsearch:9200"]
index => "ztm"
}
}

它从 Kafaka 的 "ztm-input" topic 获取数据,并把相应的 Lat 及 Lon 字段合并成为一个 location 字段。在 output 的部分,我们把数据导入到 Elasticsearch 之中。

Elasticsearch

我们使用了索引生命周期管理机制, 而不是将记录放入诸如ztm-2020.05.24之类的索引中。 它使你可以自动执行索引的寿命。 它会自动进行汇总,并根据你配置策略的方式更改索引属性(热-热-冷架构)。 假设我希望在索引达到1GB或30天过去后进行 rollover,我们在 Kibana 中执行如下的命令:

PUT _ilm/policy/ztm_policy
{
"policy": {
"phases": {
"hot":{
"actions": {
"rollover": {
"max_size": "1gb",
"max_age": "30d"
}
}
}
}
}
}

你还需要一个模板,该模板具有 ztm_policy 将连接到的适当 mapping。 如果没有 mapping,Elasticsearch 将不会猜测到 location 字段为 geo_point 的数据类型,并且时间字段将是纯文本。

PUT _template/ztm_template
{
"index_patterns": ["ztm-*"],
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0,
"index.lifecycle.name":"ztm_policy",
"index.lifecycle.rollover_alias": "ztm"
},
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
},
"@version": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"bearing": {
"type": "float"
},
"brigade": {
"type": "keyword"
},
"distance": {
"type": "float"
},
"lines": {
"type": "keyword"
},
"location": {
"type": "geo_point"
},
"speed": {
"type": "float"
},
"time": {
"type": "date",
"format":"MMM dd, yyyy K:mm:ss a"
},
"vehicleNumber": {
"type": "keyword"
}
}
}
}

现在该使用适当的别名创建第一个索引了。

PUT ztm-000001
{
"aliases": {
"ztm": {
"is_write_index":true
}
}
}

我们在 Kibana 中运行上面的三个命令。

Python 脚本

首先,我们必须获得所需要的 API key。这个在上面我们已经讲述了。

ztm.py

import requests
import json
import time
from kafka import KafkaProducer token = '86882ed9-4533-4630-b03b-47b3d68ae5e5'
url = 'https://api.um.warszawa.pl/api/action/busestrams_get/'
resource_id = 'f2e5503e927d-4ad3-9500-4ab9e55deb59'
sleep_time = 15 bus_params = {
'apikey':token,
'type':1,
'resource_id': resource_id
}
tram_params = {
'apikey':token,
'type':2,
'resource_id': resource_id
} while True:
try:
r = requests.get(url = url, params = bus_params)
data = r.json()
producer = KafkaProducer(bootstrap_servers=['localhost:29092'],
value_serializer=lambda x: json.dumps(x).encode('utf-8'),
key_serializer=lambda x: x
) print('Sending records...')
for record in data['result']:
print(record)
future = producer.send('ztm-input', value=record, key=record["VehicleNumber"].encode('utf-8'))
result = future.get(timeout=60)
except:
print("¯\_(ツ)_/¯")
time.sleep(sleep_time)

上面的代码其实是蛮简单的。它定时从 API portal 获取公交系统的位置信息,并转发到 Kafka。

我们使用如下的命令来运行上面的应用:

python3 ztm.py

这个时候,我们可以在屏幕上看到所获得很多的关于公交系统车辆的信息。

我们可以转到运行 docker-compopse up 命令的那个 console,我们可以看到如下的信息:

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

在 Kibana 中展示

打开 Kibana,并使用如下的命令:

GET _cat/indices

从上面,我们可以看到一个叫做 ztm-000001 的索引,并且它里面含有已经收集上来的车辆信息。

为了分析这个索引,我们必须创建一个 index pattern:

点击 Create index pattern:

点击 Next step:

点击上面的 Create index pattern 按钮。这样就完成了创建 index pattern。

为了对数据可视化,我们点击 Visualization:

点击上面的 Create new visualization:

点击 Maps:

点击 Add layer:

点击 Documents:

点击 Add layer:

向下滚动:

点击上面的 Save & close 按钮:

在上面,我们配置每隔2秒自动获取数据。点击 Apply 按钮。

我们聚焦华沙地区:

这样在地图上,我们可以清楚地看到每个车辆的运行情况。

我们甚至可以针对一个 Brigade 进行搜索:

参考:

【1】https://medium.com/@zorteran/how-to-visualize-public-transport-using-kibana-elasticserach-logstash-elastic-stack-and-kafka-eabc6975255a

如何在 Docker 之上使用 Elastic Stack 和 Kafka 可视化公共交通的更多相关文章

  1. Elastic:用 Docker 部署 Elastic Stack

    文章转载自:https://elasticstack.blog.csdn.net/article/details/100919273 前提条件 首选需要在主机上安装好docker和docker-com ...

  2. 使用 Docker 安装 Elastic Stack 8.0 并开始使用

    文章转载自:https://mp.weixin.qq.com/s/fLnIzbbqYfILS6uCvGctXw 运行 Elasticsearch docker network create elast ...

  3. Elastic Stack

    Elastic Stack 开发人员不能登陆线上服务器查看详细日志 各个系统都有日志,日志数据分散难以查找 日志数据量大,查询速度慢,或者数据不够实时 官网地址:https://www.elastic ...

  4. 使用 Spring Cloud Sleuth、Elastic Stack 和 Zipkin 做微服务监控

    关于迁移微服务架构,最常被提及的挑战莫过于监控.每个微服务应独立于其他服务的运行环境,所以他们之间不会共享如数据源.日志文件等资源. 然而,较容易的查看服务的调用历史,并且能够查看多个微服务的请求传播 ...

  5. SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践

    一. 前言 日志对于一个程序的重要程度不用过多的言语修饰,本篇将以实战的方式讲述开源微服务全栈项目 有来商城 是如何整合当下主流日志解决方案 ELK +Filebeat . 话不多说,先看实现的效果图 ...

  6. Elastic Stack之搜索引擎基础

    Elastic Stack之搜索引擎基础 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.搜索引擎概述 1>.什么是搜索引擎 搜索引擎(Search Engine)是指根 ...

  7. Elastic Stack之ElasticSearch分布式集群yum方式搭建

    Elastic Stack之ElasticSearch分布式集群yum方式搭建 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.搜索引擎及Lucene基本概念 1>.什么 ...

  8. Elastic Stack 安装

    Elastic Stack 是一套支持数据采集.存储.分析.并可视化全面的分析工具,简称 ELK(Elasticsearch,Logstash,Kibana)的缩写. 安装Elastic Stack ...

  9. Spring Boot + Elastic stack 记录日志

    原文链接:https://piotrminkowski.wordpress.com/2019/05/07/logging-with-spring-boot-and-elastic-stack/ 作者: ...

随机推荐

  1. centos7 yum error yum doesn't have enough cached data

    1.vi /etc/resolv.conf,添加下面一行 nameserver 114.114.114.114 修改完成后service network restart进行重启,试一下yum upda ...

  2. 运行Flutter时连接超时

    这个墙不知道浪费了开发者多少的时间!!!!!!!!!!!!!!!!!!! 1.修改仓库地址为阿里仓库: 编辑android/build.gradle,把文件中的两处: google() jcenter ...

  3. 2022年字节跳动基础架构前端实习生凉经(4轮技术面+hr面)

    技术一面 原文链接:https://juejin.cn/post/7120516854203809829 因为我之前的项目经验有开发小程序的,所以一开始就问了小程序的问题 1.小程序onload和on ...

  4. excel网络函数库之谷歌翻译

    不知道看到本篇文章的小伙伴是否被表格翻译所困扰,当面对大量需要被翻译的文件内容,有着三头六臂的孙悟空也难以招架得住,那么有没有一个工具能让我们快速将大量文件进行翻译呢? ExcelApi函数库的横空出 ...

  5. 浅谈spring-createBean

    目录 找到BeanClass并且加载类 实例化前 实例化 Supplier创建对象 工厂方法创建对象 方法一 方法二 推断构造方法 BeanDefionition 的后置处理 实例化后 属性填充 sp ...

  6. HMS Core音频编辑服务音源分离与空间音频渲染,助力快速进入3D音频的世界

    从单声道.立体声.环绕声发展到三维声,音频回放技术的迭代演进是为了还原真实世界的声音.其中,三维声技术使用信号处理的方法对到达两耳的声音信号进行模拟,将声场还原为三维空间,更接近真实世界.凭借这个技术 ...

  7. TensorFlow自定义训练函数

    本文记录了在TensorFlow框架中自定义训练函数的模板并简述了使用自定义训练函数的优势与劣势. 首先需要说明的是,本文中所记录的训练函数模板参考自https://stackoverflow.com ...

  8. 说起分布式自增ID只知道UUID?SnowFlake(雪花)算法了解一下(Python3.0实现)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_155 但凡说起分布式系统,我们肯定会对一些海量级的业务进行分拆,比如:用户表,订单表.因为数据量巨大一张表完全无法支撑,就会对其进 ...

  9. ToString()格式化输出

    C 货币 2.5.ToString("C") ¥2.50 D 十进制数 25.ToString("D5") 00025 E 科学型 25000.ToString ...

  10. 暑期 2021 参与社区:新一代工作流调度——Apache DolphinScheduler

    在众多企业都在进行数字化转型的大背景下,大数据.人工智能等行业有着十分广阔的前景,其发展也可谓如火如荼.发展过程中这其中当然离不开数据采集.数据流通和数据价值挖掘等各种环节,而各环节的打通需要一个坚实 ...