2020/10/11
Viser: --Construire avec Docker --Elasticsearch: Commencez avec 3 nœuds --Logstash: Obtenez des données Twitter --Kibana: visualisation des données Twitter
La source finale est stockée ci-dessous.
https://github.com/sugasaki/elasticsearch-multinode-docker
Suivez les étapes ci-dessous
Install Elasticsearch with Docker | Elasticsearch Reference [7.9] | Elastic
Make sure Docker Engine is allotted at least 4GiB of memory. In Docker Desktop, you configure resource usage on the Advanced tab in Preference (macOS) or Settings (Windows).
Assurez-vous que le moteur Docker dispose d'au moins 4 Gio de mémoire allouée. Dans Docker Desktop, configurez l'utilisation des ressources dans l'onglet Avancé de Paramètres (macOS) ou Paramètres (Windows).
Si la mémoire allouée est faible, le nœud peut ne pas démarrer.
Elasticsearch
Il existe divers autres articles d'introduction, je vais donc les omettre.
Lancer Elastic Search et tester l'opération avec docker --Qiita
Localisation japonaise de Docker's Kibana --Qiita
Exécutez un cluster à 3 nœuds à l'aide de Docker Compose.
docker-compose.yml
Préparez un dossier de travail et créez docker-compose.yml
directement en dessous.
Démarrez un cluster Elasticsearch à 3 nœuds. Le nœud es01 écoute sur localhost: 9200, et es02 et es03 communiquent avec es01 sur le réseau Docker.
docker-compose.yml
version: "2.2"
services:
# 1st node port=9200
elasticsearch01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- elasticsearch_multinode_data01:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- elastic
healthcheck:
interval: 20s
retries: 10
test: curl -s http://localhost:9200/_cluster/health | grep -vq '"status":"red"'
# 2nd node
elasticsearch02:
image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
container_name: es02
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- elasticsearch_multinode_data02:/usr/share/elasticsearch/data
networks:
- elastic
# 3rd node
elasticsearch03:
image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
container_name: es03
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- elasticsearch_multinode_data03:/usr/share/elasticsearch/data
networks:
- elastic
volumes:
elasticsearch_multinode_data01:
driver: local
elasticsearch_multinode_data02:
driver: local
elasticsearch_multinode_data03:
driver: local
networks:
elastic:
driver: bridge
Notez que dans cette configuration, le port 9200 est ouvert et accessible au public.
Si vous ne voulez pas exposer le port 9200 et que vous voulez utiliser un proxy inverse à la place, remplacez 9200: 9200 par 127.0.0.1: 9200: 9200 dans le fichier docker-compose.yml
. Elasticsearch ne sera accessible qu'à partir de la machine hôte elle-même.
Les volumes elasticsearch_multinode_data01 à 03 sont conservés même après le redémarrage. S'ils n'existent pas déjà, ils seront créés par docker-compose lorsque vous démarrez le cluster.
docker-compose up
$ curl -X GET "localhost:9200/_cat/health?v&pretty"
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1602390892 04:34:52 es-docker-cluster green 3 3 0 0 0 0 0 0 - 100.0%
$ curl -X GET "localhost:9200/_cat/nodes?v&pretty"
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
172.19.0.4 37 63 47 2.44 1.47 1.18 dilmrt - es03
172.19.0.3 18 63 46 2.44 1.47 1.18 dilmrt * es01
172.19.0.2 24 63 48 2.44 1.47 1.18 dilmrt - es02
$ docker volume ls
DRIVER VOLUME NAME
local docker_elasticsearch_multinode_data01
local docker_elasticsearch_multinode_data02
local docker_elasticsearch_multinode_data03
Confirmation détaillée des données01
$ docker volume inspect docker_elasticsearch_multinode_data01
[
{
"CreatedAt": "2020-10-11T04:20:26Z",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "docker",
"com.docker.compose.version": "1.27.4",
"com.docker.compose.volume": "elasticsearch_multinode_data01"
},
"Mountpoint": "/var/lib/docker/volumes/docker_elasticsearch_multinode_data01/_data",
"Name": "docker_elasticsearch_multinode_data01",
"Options": null,
"Scope": "local"
}
]
Lancez le terminal et entrez dans le docker avec la commande suivante pour vérifier
$ docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
Vérifiez avec la commande ls
/ # ls -ll /var/lib/docker/volumes/
total 44
drwxr-xr-x 3 root root 4096 Oct 11 04:20 docker_elasticsearch_multinode_data01
drwxr-xr-x 3 root root 4096 Oct 11 04:20 docker_elasticsearch_multinode_data02
drwxr-xr-x 3 root root 4096 Oct 11 04:20 docker_elasticsearch_multinode_data03
-rw------- 1 root root 65536 Oct 11 04:20 metadata.db
Lorsque vous êtes satisfait, quittez avec la commande ʻexit`
[Docker pour Mac] J'ai recherché l'état réel de Docker Volume | w0o0ps | note
Je ne trouve pas le volume de données réel sur le bureau du docker | t11o
Créez un index appelé client, saisissez des données et vérifiez. Après avoir quitté Elasticsearch au milieu, réexécutez pour vérifier si les données sont persistantes.
curl -X PUT "localhost:9200/customer?pretty&pretty"
$ curl -X GET "localhost:9200/_cat/indices?v&pretty"
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open customer FIT3eS3YSR2UEE0np3BnwA 1 1 0 0 416b 208b
Saisissez les données en spécifiant 1 pour _id
Effectuez les opérations suivantes en vrac
curl --include -XPOST "http://localhost:9200/customer/_doc/1?pretty" \
-H 'Content-Type: application/json' \
-d '{
"name": "John Doe",
"message": "The night was young, and so was he. But the night was sweet, and he was sour."
}'
$ curl -X GET 'localhost:9200/customer/_doc/1?pretty'
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"_seq_no" : 2,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "John Doe",
"message" : "The night was young, and so was he. But the night was sweet, and he was sour."
}
}
Quittez Elasticsearch et réexécutez-le.
$ docker-compose down
$ docker-compose up
Confirmation de la persistance des données
$ curl -X GET "localhost:9200/_cat/indices?v&pretty"
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open customer oD3E_VXqSWy7I0F1NSIlyQ 1 1 1 0 9.6kb 4.8kb
$ curl -X GET 'localhost:9200/customer/_doc/1?pretty'
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"_seq_no" : 2,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "John Doe",
"message" : "The night was young, and so was he. But the night was sweet, and he was sour."
}
}
référence: Install Kibana with Docker | Kibana Guide [7.9] | Elastic
Ajoutez ce qui suit en haut de la section Volumes de docker-compose.yml
.
docker-compose.yml
# kibana
kibana:
image: docker.elastic.co/kibana/kibana:7.9.2
container_name: kibana
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://es01:9200 # container_Se référer au nom
- "I18N_LOCALE=ja-JP" #Afficher en japonais
depends_on:
- elasticsearch01
- elasticsearch02
- elasticsearch03
networks:
- elastic
healthcheck:
interval: 10s
retries: 20
test: curl --write-out 'HTTP %{http_code}' --fail --silent --output /dev/null http://localhost:5601/api/status
restart: always
J'ai également ajouté un paramètre japonais à l'environnement.
Référence: Localisation japonaise de Docker de Kibana --Qiita
$ docker-compose up
Accès à http://localhost:5601/
L'écran Kibana s'affiche dans le navigateur
menu kibana> Gestion> Gestion de la pile
Sélectionnez Gestion des index dans le menu Données.
Vous devriez voir l'index client
que vous avez créé précédemment.
Lorsque vous êtes entièrement satisfait, quittez Elasticsearch et passez à Logstash.
Logstash
référence: Running Logstash on Docker | Logstash Reference [7.9] | Elastic
Ajoutez ce qui suit en haut de la section Volumes après les paramètres Kibana dans docker-compose.yml
.
docker-compose.yml
# logstash
logstash:
image: docker.elastic.co/logstash/logstash:7.9.2
container_name: logstash
networks:
- elastic
depends_on:
- elasticsearch01
- elasticsearch02
- elasticsearch03
restart: always
$ docker-compose up
Vérifiez s'il fonctionne
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
072d509e37f0 docker.elastic.co/kibana/kibana:7.9.2 "/usr/local/bin/dumb…" 16 minutes ago Up 16 minutes (healthy) 0.0.0.0:5601->5601/tcp kibana
7bd68ec00995 docker.elastic.co/logstash/logstash:7.9.2 "/usr/local/bin/dock…" 16 minutes ago Up 16 minutes 5044/tcp, 9600/tcp logstash
7bff0bddb7e1 docker.elastic.co/elasticsearch/elasticsearch:7.9.2 "/tini -- /usr/local…" 16 minutes ago Up 16 minutes 9200/tcp, 9300/tcp es02
e32fcf67c1c3 docker.elastic.co/elasticsearch/elasticsearch:7.9.2 "/tini -- /usr/local…" 16 minutes ago Up 16 minutes 9200/tcp, 9300/tcp es03
60f489bf0dc8 docker.elastic.co/elasticsearch/elasticsearch:7.9.2 "/tini -- /usr/local…" 16 minutes ago Up 16 minutes (healthy) 0.0.0.0:9200->9200/tcp, 9300/tcp es01
Si vous ne vous êtes pas inscrit en tant que développeur de l'API Twitter, veuillez vous inscrire ci-dessous.
https://developer.twitter.com/en/apps/
Je me suis inscrit en faisant référence à ce qui suit.
[Explication détaillée de la phrase d'exemple de l'application d'utilisation de l'API Twitter version 2020 à l'acquisition de la clé API | ITTI, une société de production de sites Web à Shinjuku](https://www.itti.jp/web-direction/how-to-apply- pour-twitter-api /)
Ajoutez une application parmi les suivantes et notez consumer_key, etc.
Nous allons procéder pour que la structure des dossiers soit la suivante.
$ tree --charset=C
.
|-- docker-compose.yml
|-- logstash
| |-- config
| | |-- logstash.yml
| | |-- pipelines.yml
| `-- pipeline
| `-- twitter.conf
Ajoutez des volumes aux paramètres de logstash comme indiqué ci-dessous.
docker-compose.yml
logstash:
image: docker.elastic.co/logstash/logstash:7.9.2
container_name: logstash
volumes:
- ./logstash/pipeline/:/usr/share/logstash/pipeline/
- ./logstash/config/:/usr/share/logstash/config/
networks:
- elastic
depends_on:
- elasticsearch01
- elasticsearch02
- elasticsearch03
restart: always
Créez un dossier . / Logstash / config /
et placez-y ce qui suit
:./logstash/config/logstash.yml
pipeline.ordered: auto
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: ["http://es01:9200"]
:./logstash/config/pipelines.yml
- pipeline.id: twitter_pipeline
path.config: "/usr/share/logstash/pipeline/twitter.conf"
queue.type: persisted
:./logstash/pipeline/twitter.conf
input {
twitter {
consumer_key => "<your_consumer_key>"← Définir la clé obtenue sur l'écran de gestion de l'API Twitter
consumer_secret => "<your_consumer_secret>"
oauth_token => "your_oauth_token"
oauth_token_secret => "your_oauth_token_secret"
keywords => ["Maezawa", "Président Maezawa"]
ignore_retweets => true
full_tweet => true
}
}
output {
elasticsearch {
hosts => ["http://es01:9200/"]
index => "twitter_maezawa"
}
}
Référence: [Analyse des sentiments sur les données Twitter avec ELK | Le blog de Clément](https://clementbm.github.io/elasticsearch/kibana/logstash/elk/sentiment%20analysis/2020/03/02/elk-sentiment-analysis-twitter -coronavirus.html)
Depuis le 11 octobre 2020, le mot-clé "Mr. Maezawa" est [avec la tendance Twitter](https://twitter.com/search?q=%E5%89%8D%E6%BE%A4%E3%81% Puisqu'il était de 95% E3% 82% 93 & src = trend_click & vertical = tendances), ["Mr. Maezawa", "President Maezawa"] est défini comme le mot-clé à acquérir sur Twitter. J'ai aussi essayé le nom d'index comme "twitter_maezawa".
docker-compose up
Allez à Kibana.
Il réussit si Index est ajouté à [Index Management](http: // localhost: 5601 / app / management / data / index_management / index) comme indiqué ci-dessous.
http://localhost:5601/app/management/data/index_management/indices
Créez un modèle d'index pour afficher les données collectées. http://localhost:5601/app/management/kibana/indexPatterns/create
Entrez twitter_maezawa
dans le nom du modèle d'index et appuyez sur l'étape suivante.
Sélectionnez @timestamp pour le champ d'heure et appuyez sur Créer un modèle d'index.
[Discover](http: // localhost: 5601 / app / discover # /? _ G = (filters :! (), RefreshInterval: (pause:! T, value: 0), time: (from: now-1h, to) : now)) & a = (colonnes:! ( source), filtres:! (), index: c9d9ea70-0b90-11eb-be10-f594a95a62f0, intervalle: auto, requête: (langue: kuery, requête: ''), tri Vous pouvez vérifier les détails des données en ouvrant:! ())).
Créé à partir du menu Visualiser
Ajouté au tableau de bord.
Comme c'est un gros problème, je vais essayer d'ajouter les moteurs d'analyse morphologique japonais "kuromoji" et "icu".
Créez un dossier elasticsearch et créez un Dockerfile en dessous. J'essaierai également de lire elasticsearch.yml.
elasticsearch/Dockerfile
FROM docker.elastic.co/elasticsearch/elasticsearch:7.9.2
COPY ./config/elasticsearch.yml /usr/share/elasticsearch/config/elasticsearch.yml
#supprimer le plugin ↓ Activer si une erreur déjà incluse s'affiche
# RUN elasticsearch-plugin remove analysis-icu
# RUN elasticsearch-plugin remove analysis-kuromoji
# install plugin
RUN elasticsearch-plugin install analysis-icu
RUN elasticsearch-plugin install analysis-kuromoji
docker-compose.yml
elasticsearch01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
Changer en ↓
elasticsearch01:
build: ./elasticsearch/
De même, modifiez elasticsearch02 et elasticsearch03.
elasticsearch.yml
Créez ʻelasticsearch.yml dans le dossier ʻelasticsearch / config
. Le contenu est vide et OK
.
|-- docker-compose.yml
|-- elasticsearch
| |-- Dockerfile
| `-- config
| `-- elasticsearch.yml
build
docker-compose build
docker-compose up
Je vais le confirmer au cas où.
$ curl -X GET "localhost:9200/_cat/nodes?v&pretty"
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
172.24.0.2 73 81 51 2.27 2.20 1.23 dilmrt - es03
172.24.0.3 58 81 52 2.27 2.20 1.23 dilmrt * es02
172.24.0.4 49 81 52 2.27 2.20 1.23 dilmrt - es01
Vérifiez si le plug-in est installé avec la commande suivante.
$ curl -X GET "http://localhost:9200/_nodes/es01/plugins?pretty"
...réduction
},
"plugins" : [
{
"name" : "analysis-icu",
"version" : "7.9.2",
"elasticsearch_version" : "7.9.2",
"java_version" : "1.8",
"description" : "The ICU Analysis plugin integrates the Lucene ICU module into Elasticsearch, adding ICU-related analysis components.",
"classname" : "org.elasticsearch.plugin.analysis.icu.AnalysisICUPlugin",
"extended_plugins" : [ ],
"has_native_controller" : false
},
{
"name" : "analysis-kuromoji",
"version" : "7.9.2",
"elasticsearch_version" : "7.9.2",
"java_version" : "1.8",
"description" : "The Japanese (kuromoji) Analysis plugin integrates Lucene kuromoji analysis module into elasticsearch.",
"classname" : "org.elasticsearch.plugin.analysis.kuromoji.AnalysisKuromojiPlugin",
"extended_plugins" : [ ],
"has_native_controller" : false
}
],
Visualisons le forum Elastic --Qiita
[Dashboard](http: // localhost: 5601 / app / dashboards # / list? _G = (filters:! (), RefreshInterval: (pause :! T, value: 0), time: (from: now-1h) , jusqu'à maintenant)))).
J'ai pu le visualiser avec le nuage de tags.
Le résultat final est le suivant.
version: "2.2"
services:
# 1st node port=9200
elasticsearch01:
# image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
build: ./elasticsearch/
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- elasticsearch_multinode_data01:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- elastic
healthcheck:
interval: 20s
retries: 10
test: curl -s http://localhost:9200/_cluster/health | grep -vq '"status":"red"'
# 2nd node
elasticsearch02:
# image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
build: ./elasticsearch/
container_name: es02
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- elasticsearch_multinode_data02:/usr/share/elasticsearch/data
networks:
- elastic
# 3rd node
elasticsearch03:
# image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
build: ./elasticsearch/
container_name: es03
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- elasticsearch_multinode_data03:/usr/share/elasticsearch/data
networks:
- elastic
# kibana
kibana:
image: docker.elastic.co/kibana/kibana:7.9.2
container_name: kibana
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://es01:9200 # container_Se référer au nom
- "I18N_LOCALE=ja-JP"
depends_on:
- elasticsearch01
- elasticsearch02
- elasticsearch03
networks:
- elastic
healthcheck:
interval: 10s
retries: 20
test: curl --write-out 'HTTP %{http_code}' --fail --silent --output /dev/null http://localhost:5601/api/status
restart: always
# logstash
logstash:
image: docker.elastic.co/logstash/logstash:7.9.2
container_name: logstash
volumes:
- ./logstash/pipeline/:/usr/share/logstash/pipeline/
- ./logstash/config/:/usr/share/logstash/config/
networks:
- elastic
depends_on:
- elasticsearch01
- elasticsearch02
- elasticsearch03
restart: always
volumes:
elasticsearch_multinode_data01:
driver: local
elasticsearch_multinode_data02:
driver: local
elasticsearch_multinode_data03:
driver: local
networks:
elastic:
driver: bridge
$ tree --charset=C
.
|-- docker-compose.yml
|-- elasticsearch
| |-- Dockerfile
| `-- config
| `-- elasticsearch.yml
`-- logstash
|-- config
| |-- logstash.yml
| |-- pipelines.yml
`-- pipeline
`-- twitter.conf
La commande suivante
docker-compose down
Lors de la suppression du volume,
docker-compose down --volumes
Lors de la suppression de tout, les éléments suivants (conteneur, image, volume et réseau, tous)
docker-compose down --rmi all --volumes
docker volume prune
[First Elasticsearch with Docker --Qiita](https://qiita.com/kiyokiyo_kzsby/items/344fb2e9aead158a5545#elasticsearch%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF% E3% 81% AE% E5% 81% 9C% E6% AD% A2)
[Une histoire sur la création d'un environnement ElasticStack sur Docker et la conversion de tweets sur "Corona" en un nuage de tags --Qiita](https://qiita.com/kenchan1193/items/9320390d48f3d2ae883c#elasticstack%E7%92%B0%E5% A2% 83% E6% A7% 8B% E7% AF% 89)
Recommended Posts