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»