Elasticsearch: una canalización de datos de perfil de usuario en tiempo real de Kafka a Elasticsearch

Hoy en día, se genera una gran cantidad de datos a partir de numerosas fuentes, como servicios web, medios digitales, datos de registro de sensores, y solo una fracción de ellos se administra o aprovecha adecuadamente para crear valor. Leer grandes cantidades de datos, procesarlos y actuar en consecuencia es más desafiante que nunca.

En este post trato de mostrar:

  • Genere datos de perfil de usuario simulados en Python
  • Envíe datos simulados al tema de Kafka a través de Kafka Producer
  • Use Logstash para leer datos y subirlos a Elasticsearch
  • Visualice la transmisión de datos con Kibana

En mi artículo anterior " Elástico: implementación de Elastic Stack con Kafka ", implementé una canalización de datos de la siguiente manera:

 En el artículo de hoy, implementaré una canalización de datos de la siguiente manera:

En la presentación de hoy, usaré el último Elastic Stack 8.6.1 para demostrarlo. Usaré la siguiente configuración:

Como se muestra arriba, estoy usando dos máquinas: se usará macOS para instalar Elastic Stack, mientras que se usará otra máquina con Ubuntu para instalar Kafka y Logstash. Escribiré datos en Kafka usando Python en una máquina con sistema operativo Ubuntu.

Instalar

Elasticsearch y Kibana

Usaré docker compose para instalar Elasticsearch y Kibana. Podemos consultar el artículo " Elasticsearch: use Docker compose para implementar Elastic Stack 8.x con un clic " para la implementación. Por supuesto, también podemos consultar los siguientes artículos para la implementación:

在默认的情况下,Elasticsearch 的访问是带有 HTTPS 的安全访问。

我们可以在电脑的 terminal 中打入如下的命令来检查:

curl -k -u elastic:password https://192.168.0.3:9200
复制代码

 上述命令是在 Ubuntu OS 的机器上运行。它表明,我们可以在 Ubuntu OS 的机器上成功地访问 Elasticsearch。

安装 Kafka

我们安装涉及设置 Apache Kafka(我们的消息代理)。Kafka 使用 ZooKeeper 来维护配置信息和同步,因此在设置 Kafka 之前,我们需要先安装 ZooKeeper:

sudo apt-get install zookeeperd
复制代码

接下来,让我们下载并解压缩 Kafka:



1.  wget https://apache.mivzakim.net/kafka/2.4.0/kafka_2.13-2.4.0.tgz
2.  tar -xzvf kafka_2.13-2.4.0.tgz
3.  sudo cp -r kafka_2.13-2.4.0 /opt/kafka


复制代码

现在,我们准备运行 Kafka,我们将使用以下脚本进行操作:

sudo /opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties
复制代码

你应该开始在控制台中看到一些 INFO 消息:

Kafka 的配置如下

  • Kafka 正在监听 9092 端口
  • Zookeeper 正在监听 2181 端口
  • Kafka Manager 正在监听 9000 端口

我们接下来打开另外一个控制台中,并为 registered_user 创建一个主题:

/opt/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic registered_user
复制代码

我们创建了一个叫做 registered_user 的 topic。上面的命令将返回如下的结果:



1.  $ /opt/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic registered_user
2.  WARNING: Due to limitations in metric names, topics with a period ('.') or underscore ('_') could collide. To avoid issues it is best to use either, but not both.
3.  Created topic registered_user.


复制代码

我们现在已经完全为开始管道做好了准备。

有关 kafka 的安装,我们也可以使用 docker-compose 来进行安装。具体安装步骤请参考 “Elastic:Data pipeline:使用 Kafka => Logstash => Elasticsearch”。

Logstash

我们接下来安装 Logstash。我们到 Elastic 的官方网站来下载时候我们平台的安装包:

 wget https://artifacts.elastic.co/downloads/logstash/logstash-8.6.1-amd64.deb?_gl=1*1b5e8ui*_ga*MTEyNjEzOTY5Ni4xNjQ3MDY1ODMx*_ga_Q7TEQDPTH5*MTY3NDk3MjkzNS4zODAuMS4xNjc0OTcyOTQ4LjAuMC4w
复制代码


1.  liuxg@liuxgu:~/logstash$ wget https://artifacts.elastic.co/downloads/logstash/logstash-8.6.1-amd64.deb?_gl=1*1b5e8ui*_ga*MTEyNjEzOTY5Ni4xNjQ3MDY1ODMx*_ga_Q7TEQDPTH5*MTY3NDk3MjkzNS4zODAuMS4xNjc0OTcyOTQ4LjAuMC4w
2.  --2023-01-29 14:20:31--  https://artifacts.elastic.co/downloads/logstash/logstash-8.6.1-amd64.deb?_gl=1*1b5e8ui*_ga*MTEyNjEzOTY5Ni4xNjQ3MDY1ODMx*_ga_Q7TEQDPTH5*MTY3NDk3MjkzNS4zODAuMS4xNjc0OTcyOTQ4LjAuMC4w
3.  Resolving artifacts.elastic.co (artifacts.elastic.co)... 34.120.127.130, 2600:1901:0:1d7::
4.  Connecting to artifacts.elastic.co (artifacts.elastic.co)|34.120.127.130|:443... connected.
5.  HTTP request sent, awaiting response... 200 OK
6.  Length: 341638094 (326M) [binary/octet-stream]
7.  Saving to: ‘logstash-8.6.1-amd64.deb?_gl=1*1b5e8ui*_ga*MTEyNjEzOTY5Ni4xNjQ3MDY1ODMx*_ga_Q7TEQDPTH5*MTY3NDk3MjkzNS4zODAuMS4xNjc0OTcyOTQ4LjAuMC4w’

9.  logstash-8.6.1-amd64.de 100%[==============================>] 325.81M  10.7MB/s    in 31s     

11.  2023-01-29 14:21:03 (10.6 MB/s) - ‘logstash-8.6.1-amd64.deb?_gl=1*1b5e8ui*_ga*MTEyNjEzOTY5Ni4xNjQ3MDY1ODMx*_ga_Q7TEQDPTH5*MTY3NDk3MjkzNS4zODAuMS4xNjc0OTcyOTQ4LjAuMC4w’ saved [341638094/341638094]

13.  liuxg@liuxgu:~/logstash$ mv 'logstash-8.6.1-amd64.deb?_gl=1*1b5e8ui*_ga*MTEyNjEzOTY5Ni4xNjQ3MDY1ODMx*_ga_Q7TEQDPTH5*MTY3NDk3MjkzNS4zODAuMS4xNjc0OTcyOTQ4LjAuMC4w' logstash-8.6.1-amd64.deb


复制代码

我们使用如下的命令来安装 Logstash:

sudo dpkg -i logstash-8.6.1-amd64.deb 
复制代码


1.  liuxg@liuxgu:~/logstash$ sudo dpkg -i logstash-8.6.1-amd64.deb 
2.  [sudo] password for liuxg: 
3.  (Reading database ... 386953 files and directories currently installed.)
4.  Preparing to unpack logstash-8.6.1-amd64.deb ...
5.  Unpacking logstash (1:8.6.1-1) over (1:8.4.2-1) ...
6.  Setting up logstash (1:8.6.1-1) ...
7.  Installing new version of config file /etc/logstash/jvm.options ...


复制代码

为了能够配置 Logstash 能够正确地访问 Elasticsearch,我们可以参考我之前的文章 “Logstash:如何连接到带有 HTTPS 访问的集群”。我们需要按照文章里的要求创建一个叫做 truststore.p12 的文件。由于我们是以 docker 的形式启动 Elasticsearch 及 Kibana 的,我们在 macOS 的机器上使用如下的命令来拷贝证书。我们先查看容器:



1.  $ docker ps
2.  CONTAINER ID   IMAGE                                                 COMMAND                  CREATED       STATUS                 PORTS                              NAMES
3.  a2374f620b78   docker.elastic.co/kibana/kibana:8.6.1                 "/bin/tini -- /usr/l…"   7 hours ago   Up 7 hours (healthy)   0.0.0.0:5601->5601/tcp             elastic8-kibana-1
4.  e2d6443b8edb   docker.elastic.co/elasticsearch/elasticsearch:8.6.1   "/bin/tini -- /usr/l…"   7 hours ago   Up 7 hours (healthy)   9200/tcp, 9300/tcp                 elastic8-es03-1
5.  a29bbeb4bdf2   docker.elastic.co/elasticsearch/elasticsearch:8.6.1   "/bin/tini -- /usr/l…"   7 hours ago   Up 7 hours (healthy)   9200/tcp, 9300/tcp                 elastic8-es02-1
6.  81de3d45943c   docker.elastic.co/elasticsearch/elasticsearch:8.6.1   "/bin/tini -- /usr/l…"   7 hours ago   Up 7 hours (healthy)   0.0.0.0:9200->9200/tcp, 9300/tcp   elastic8-es01-1


复制代码

我们可以看到有一个叫做 elastic8-es01-1 的容器。

1.  $ pwd
2.  /Users/liuxg/data/elastic8
3.  $ ls
4.  docker-compose.yml http_ca.crt        kibana.yml         write_to_kafka.py
5.  $ docker cp 81de3d45943c:/usr/share/elasticsearch/config/certs/ca/ca.crt .
6.  $ ls
7.  ca.crt             docker-compose.yml http_ca.crt        kibana.yml         write_to_kafka.py
8.  $ ls
9.  ca.crt             docker-compose.yml kibana.yml 
复制代码

运用 ca.crt 文件,我们使用如下的命令来创建一个叫做 truststore.p12 的文件。它的 storepass 是 password:

keytool -import -file ca.crt -keystore truststore.p12 -storepass password -noprompt -storetype pkcs12
复制代码


1.  $ keytool -import -file ca.crt -keystore truststore.p12 -storepass password -noprompt -storetype pkcs12
2.  Certificate was added to keystore
3.  $ ls
4.  ca.crt             docker-compose.yml kibana.yml         truststore.p12


复制代码

从上面,我们可以看出来它创建了 truststore.p12 这个文件。我们接下来把这个文件拷贝到 Ubuntu OS 机器下的 /etc/logstash/conf.d 目录中。



1.  liuxg@liuxgu:/etc/logstash/conf.d$ ls
2.  truststore.p12


复制代码

我们接下来在地址 /etc/logstash/conf.d 创建一个叫做叫做 kafka_to_logstash.conf 的配置文件:

kafka_to_logstash.conf

`

1.  input {
2.    kafka {
3.      bootstrap_servers => "192.168.0.4:9092"
4.      topics => ["registered_user"]
5.    }
6.  }

8.  filter {
9.    json {
10.      source => "message"
11.    }
12.  }

14.  output {
15.    elasticsearch {
16.        hosts => ["https://192.168.0.3:9200"]
17.        index => "registered_user"
18.        workers => 1
19.        user => "elastic"
20.        password => "password"
21.        ssl_certificate_verification => true
22.        truststore => "/etc/logstash/conf.d/truststore.p12"
23.        truststore_password => "password"
24.    }
25.  }

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
复制代码

在上面,请注意的是:

  • 我们使用 Elasticsearch 的超级用户 elastic 来连接 Elasticsearch。它的密码是 password。在实际的使用中,我们可以创建一个合适权限的用户来进行连接。

这样我们的 Logstash 的配置就完成了。

sudo service logstash start
复制代码

我们可以通过如下的命令来检查 Logstash 是否已经成功地运行起来了。

service logstash status
复制代码


1.  liuxg@liuxgu:~$ service logstash status
2.  ● logstash.service - logstash
3.       Loaded: loaded (/lib/systemd/system/logstash.service; disabled; vendor preset: enabled)
4.       Active: active (running) since Sun 2023-01-29 15:25:57 CST; 7s ago
5.     Main PID: 60841 (java)
6.        Tasks: 33 (limit: 18977)
7.       Memory: 508.6M
8.       CGroup: /system.slice/logstash.service
9.               └─60841 /usr/share/logstash/jdk/bin/java -Xms1g -Xmx1g -Djava.awt.headless=true ->

11.  1月 29 15:25:57 liuxgu systemd[1]: Started logstash.
12.  1月 29 15:25:57 liuxgu logstash[60841]: Using bundled JDK: /usr/share/logstash/jdk


复制代码

上面表明我们的 logstash 服务已经被成功地运行起来了。我们还可以通过如下的命令来查看 logstash 服务的日志:

journalctl -u logstash
复制代码

向 Kafka topic 写入数据

Usamos la siguiente aplicación de Python para escribir datos en nuestro tema de Kafka "usuario_registrado":

escribir_a_kafka.py

`

1.  from faker import Faker
2.  from kafka import KafkaProducer
3.  import json
4.  fake = Faker()
5.  import time

7.  def get_registered_data():
8.      return {
9.          'first name': fake.first_name(),
10.          'last name': fake.last_name(),
11.          'age': fake.random_int(0, 60),
12.          'address': fake.address(),
13.          'register_year': fake.year(),
14.          'register_month': fake.month(),
15.          'register_day': fake.day_of_month(),
16.          'monthly_income': fake.random_int(28000, 100000)
17.      }

19.  def json_serializer(data):
20.      return json.dumps(data).encode('utf-8')

22.  producer = KafkaProducer(bootstrap_servers=['192.168.0.4:9092'],
23.                           value_serializer=json_serializer)

25.  if __name__ == '__main__':
26.      while True:
27.          registered_data = get_registered_data()
28.          print(registered_data)
29.          producer.send('registered_user', registered_data)
30.          time.sleep(3)

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
复制代码

Para ejecutar la aplicación anterior, debemos instalar los siguientes dos paquetes:



1.  pip3 install Faker
2.  pip3 install kafka-python


复制代码

Ejecutamos el código anterior en una máquina con sistema operativo Ubuntu:

python write_to_kafka.py 
复制代码

 Volvamos a la interfaz de Kibana para comprobar:

GET _cat/indices
复制代码

El comando anterior muestra:

Podemos buscar este archivo:

GET registered_user/_search
复制代码

 Podemos ver los siguientes resultados:

De lo anterior, podemos ver que nuestros datos han sido estructurados.

Podemos visualizar este índice. Puedes leer el artículo correspondiente en mi blog para saber más.

Supongo que te gusta

Origin juejin.im/post/7194046000711860283
Recomendado
Clasificación