Docker-Compose позволяет нам моделировать довольно сложные настройки программирования в наших местных средах. Очень весело проверить некоторые труднодоступные технологии, такие как Kafka и Spark, с помощью Docker-Compose.
Несколько месяцев назад я создал демонстрационное приложение при использовании Структурированная потоковая передача Spark , Кафка и Прометей В том же файле Docker-Compose. Можно расширить этот список с помощью дополнительного Графана оказание услуг. Кодовая база находилась в Python, и я принимал живые цены на криптовалюту в Kafka и потребляли их через Spark Structured Streaming. В этой статье вместо того, чтобы говорить о Водяные знаки А типы тонущей в структурированной потоковой передаче Spark я буду говорить только о скомпонате Docker и о том, как я настроил свою среду разработки, используя Spark, Kafka, Prometheus и Zookeeper. Чтобы иметь всю кодовую базу для моего демонстрационного проекта, пожалуйста, обратитесь к в репозиторий GitHub Анкет
Сервисные блоки
В Docker-Compose мне нужны были следующие службы, чтобы держать моего производителя потоковых данных и потребителей в прямом эфире, в то же время контролируйте приема в кафку:
Spark Standalone Cluster: Состоящий из одного мастера и кода работника
- Искровой мастер
- Серпечник
- Zookeeper: Требование для Кафки ( скоро это не будет требованием ) для поддержания брокеров и тем. Например, если брокер присоединяется или умирает, Zookeeper информирует кластер.
- Кафка: Ориентированное на сообщение промежуточное программное обеспечение (мама) для работы с большими потоками данных. В этом случае у нас есть потоки цен на криптовалюту.
- Prometheus-jmx-exporter: Экспортер для соединения расширений управления Java (JMX) и переводится на язык, который может понять Прометея. Вспоминая кафку является примером приложения Java, это будет волшебный сервис, который позволит нам автоматически очищать метрики Kafka.
- Прометей: Временные базы данных журнала базы данных и современный инструмент оповещения.
Spark Services
В самой основной настройке для отдельного кластера Spark нам нужен один мастер и один работник. Вы можете использовать объемы Docker-Compose для монтажных папок. Для Spark, пожалуй, наиболее распространенной причиной является совместное использование разъемов ( .jar файлы) или сценарии.
Для получения искра изображения из Docker Hub, как Большие данные Европа Имеет очень стабильный и обширный набор изображений Spark Hadoop, я предпочел использовать их изображения в своем демонстрационном проекте. Это также предотвратило некоторую избыточную работу, например, создание нескольких Dockerfiles на Spark Node.
Мне нужно было позаботиться о сети в настройках Docker-Compose. Следовательно, я создал мостовую сеть с пользовательским названием «крипто-сеть». Сеть Bridge позволяет нам запускать наши автономные контейнеры при общении друг с другом. Для получения дополнительной информации о различных сетевых драйверах в контейнерах Docker, пожалуйста, обратитесь к Документация Docker, очень весело читать. Во время настройки я попытался дать различные перенаправленные хост-порты, а не использовать 8080 для веб-пользовательского интерфейса, чтобы предотвратить конфликты с JMX-экспортером. Кроме того, я хотел, чтобы рабочие узлы зависели от мастер -узла, чтобы настроить порядок творений контейнеров.
Наконец, после примера BDE я переопределяю Spark_master с переменными среды. Здесь я делюсь компонентом Spark демонстрационного приложения.
---
version: "3.2"
services:
spark-master:
image: bde2020/spark-master:2.2.2-hadoop2.7
container_name: spark-master
networks:
- crypto-network
volumes:
- ./connectors:/connectors
- ./:/scripts/
ports:
- 8082:8080
- 7077:7077
environment:
- INIT_DAEMON_STEP=false
spark-worker-1:
image: bde2020/spark-worker:2.2.2-hadoop2.7
container_name: spark-worker-1
networks:
- crypto-network
depends_on:
- spark-master
ports:
- 8083:8081
environment:
- "SPARK_MASTER=spark://spark-master:7077"
networks:
crypto-network:
driver: "bridge"
Вы можете начать услуги с:
docker-compose up
Затем вы можете увидеть настройку мастера Spark Master с:
docker exec -it spark-master bash
Кафка Услуги
Чтобы запустить Кафку в автономном режиме, мне нужны были Zookeeper и сами Кафка с некоторыми причудливыми переменными среды. По сути, Kafka необходимо найти клиент -порт Zookeeper, и ему необходимо рекламировать правильные порты для зажигания приложений.
Чтобы запустить эту настройку, я использовал Слияние картинки. Здесь я делюсь блоком услуг, связанных с Кафкой. Связанное изображение уже позволяет нам настроить:
- Темы Кафки с использованием переменных среды:
Kafka_create_topics: Имена тем быть созданнымKafka_auto_create_topics_enable: Самоэнергетика, возможно,Kafka_offsets_topic_replication_factor: Самоэнергетика, возможно,
- Соединение с Zookeeper с использованием переменной среды
Kafka_zookeeper_connect - С
Kafka_broker_idПредоставление пользовательского идентификатора брокера для конкретного узла - Реклама правильных портов для внутренних услуг или внешних соединений сети Docker:
Kafka_inter_broker_listener_name: Имя слушателя для настройкиKafka_listener_security_protocol_map: Настройка слушателя с помощью картированияKafka_adverted_listeners: Настройка слушателя для внутренней и внешней сети. Это немного сложно, поэтому, если я потребляю или произведу какое -либо сообщение во внутренней сети Docker, приведенным ниже примером мне нужно подключиться кКафка: 29092. Из -за пределов докера я могу использовать потребителя или производителя черезLocalhost: 9092Анкет Для получения дополнительной информации, Вот Удивительное объяснение.
---
version: "3.2"
services:
zookeeper:
image: confluentinc/cp-zookeeper
container_name: zookeeper
networks:
- crypto-network
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
kafka:
image: confluentinc/cp-kafka
container_name: kafka
depends_on:
- zookeeper
networks:
- crypto-network
ports:
- 9092:9092
- 30001:30001
environment:
KAFKA_CREATE_TOPICS: crypto_raw,crypto_latest_trends,crypto_moving_average
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 100
networks:
crypto-network:
driver: "bridge"
Прометея Службы
В этом проекте я хотел автоматически очистить журналы Кафки. Следовательно, помимо самой службы Прометея, мне также нужно было использовать JMX-экспортер. И я понял, что это самый крутой ребенок в докере.
Как для Прометея, так и для этого JMX-Exporter мне нужно было использовать пользовательские Dockerfiles, поскольку они требуют некоторых шаблонов, чтобы знать друг о друге. Я использовал отдельный ./инструменты/ Папка, чтобы сохранить мои настройки, связанные с мониторингом. И внутри ./tools/prometheus-jmx-exporter , У меня был confd Папка для использования и настройки контейнеров Docker во время выполнения. Здесь структура файла заключается в следующем:
.
├── prometheus
│ ├── Dockerfile
│ └── prometheus.yml
└── prometheus-jmx-exporter
├── Dockerfile
├── confd
│ ├── conf.d
│ │ ├── kafka.yml.toml
│ │ └── start-jmx-scraper.sh.toml
│ └── templates
│ ├── kafka.yml.tmpl
│ └── start-jmx-scraper.sh.tmpl
└── entrypoint.sh
Давайте начнем с изображения Прометея, так как оно более просто. Нам нужно использовать пользовательский DockerFile, чтобы получить конфигурацию с пользовательскими настройками скребка.
Dockerfile будет:
FROM prom/prometheus:v2.8.1 ADD ./prometheus.yml /etc/prometheus/prometheus.yml CMD [ "--config.file=/etc/prometheus/prometheus.yml","--web.enable-admin-api" ]
И Prometheus.yml будет указывать на следующее, с интервалом царапины 5 секунд. В Prometheus.yml , Prometheus нацелен на услугу под названием Kafka-jmx-exporter с портом 8080 Анкет Следовательно, в докере-композите я должен использовать то же имя контейнера для JMX-Exporter, что и целевая служба.
global:
scrape_interval: 5s
evaluation_interval: 5s
scrape_configs:
- job_name: 'kafka'
scrape_interval: 5s
static_configs:
- targets: ['kafka-jmx-exporter:8080']
Чтобы создать изображение JMX-Exporter, мне нужно было больше настроек. Давайте начнем с Dockerfile. Изображение для JMX-экспортера использует базовое изображение из Java. Затем загрузки из Maven Repository JMX Прометею .JAR и записывает в файл с именем /opt/jmx_prometheus_httpserver/jmx_prometheus_httpserver.jar . Далее он загружает Confd и магазины в /usr/local/bin/confd , дает выполнение разрешений. Наконец, он копирует intrypoint в /opt/entrypoint.sh Анкет
FROM java:8 RUN mkdir /opt/jmx_prometheus_httpserver && wget 'https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_httpserver/0.11.0/jmx_prometheus_httpserver-0.11.0-jar-with-dependencies.jar' -O /opt/jmx_prometheus_httpserver/jmx_prometheus_httpserver.jar ADD https://github.com/kelseyhightower/confd/releases/download/v0.16.0/confd-0.16.0-linux-amd64 /usr/local/bin/confd COPY confd /etc/confd RUN chmod +x /usr/local/bin/confd COPY entrypoint.sh /opt/entrypoint.sh ENTRYPOINT ["/opt/entrypoint.sh"]
В intrypoint.sh , У меня было только исполнение Confd, затем запустил Start-jmx-scraper.sh Анкет Следовательно, после того, как Confd устанавливает исходные и назначенные файлы как для скребков Kafka, так и для JMX с .toml , мы запускаем загруженные jmx_prometheus_httpserver.jar файл. intrypoint.sh Похоже:
#!/bin/bash /usr/local/bin/confd -onetime -backend env /opt/start-jmx-scraper.sh
И Start-jmx-scraper.sh Выступает следующим образом, переменные среды в докере-композите определяют каждый ключ ( jmx_port , Jmx_host , Http_port , Jmx_exporter_config_file ) упомянуто в команде:
#!/bin/bash
java \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname={{ getv "/jmx/host" }} \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.port={{ getv "/jmx/port" }} \
-jar /opt/jmx_prometheus_httpserver/jmx_prometheus_httpserver.jar \
{{ getv "/http/port" }} \
/opt/jmx_prometheus_httpserver/{{ getv "/jmx/exporter/config/file" }}
С заданными пользовательскими изображениями Docker для Prometheus автоматически очищает Kafka, полный файл с докером для демонстрационного проекта заключается в следующем:
--------
version: "3.2"
services:
zookeeper:
image: confluentinc/cp-zookeeper
container_name: zookeeper
networks:
- crypto-network
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
kafka:
image: confluentinc/cp-kafka
container_name: kafka
depends_on:
- zookeeper
networks:
- crypto-network
ports:
- 9092:9092
- 30001:30001
environment:
KAFKA_CREATE_TOPICS: crypto_raw,crypto_latest_trends,crypto_moving_average
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 100
KAFKA_JMX_PORT: 30001
KAFKA_JMX_HOSTNAME: kafka
kafka-jmx-exporter:
build: ./tools/prometheus-jmx-exporter
container_name: jmx-exporter
ports:
- 8080:8080
links:
- kafka
networks:
- crypto-network
environment:
JMX_PORT: 30001
JMX_HOST: kafka
HTTP_PORT: 8080
JMX_EXPORTER_CONFIG_FILE: kafka.yml
prometheus:
build: ./tools/prometheus
container_name: prometheus
networks:
- crypto-network
ports:
- 9090:9090
spark-master:
image: bde2020/spark-master:2.2.2-hadoop2.7
container_name: spark-master
networks:
- crypto-network
volumes:
- ./connectors:/connectors
- ./:/scripts/
ports:
- 8082:8080
- 7077:7077
environment:
- INIT_DAEMON_STEP=setup_spark
spark-worker-1:
image: bde2020/spark-worker:2.2.2-hadoop2.7
container_name: spark-worker-1
networks:
- crypto-network
depends_on:
- spark-master
ports:
- 8083:8081
environment:
- "SPARK_MASTER=spark://spark-master:7077"
producer:
build:
context: .
dockerfile: ./Dockerfile.producer
container_name: producer
depends_on:
- kafka
networks:
- crypto-network
networks:
crypto-network:
driver: "bridge"
Поскольку Docker-Compose содержит дополнительную службу производителей, когда мы запускаем следующее, мы можем проверить наши тематические сообщения Kafka в минуту, проверив :
docker-compose up
Здесь вывод пользовательского интерфейса Prometheus будет следующим:
Последние слова
Это был демонстрационный проект, который я создал для изучения водяных знаков и окончательных функций при обработке потоковой обработки данных. Поэтому мне нужно было создать пользовательского производителя для Kafka и потреблять тех, кто использует структурированную потоковую передачу Spark. Хотя этап разработки проекта был очень забавным, мне также понравилось создавать этот довольно длинный пример с докером.
В случае, если нужна дополнительная деталь, я делюсь Репозиторий GitHub Анкет
Оригинал: «https://dev.to/nazliander/creating-a-development-environment-for-spark-structured-streaming-kafka-and-prometheus-29dl»