Рубрики
Uncategorized

Создание среды разработки для структурированной потоковой передачи Spark, Kafka и Prometheus

Docker-Compose позволяет нам моделировать довольно сложные настройки программирования в наших местных средах. Это… Tagged с Docker, DevOps, базой данных, тестированием.

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 в минуту, проверив : 9000 :

docker-compose up

Здесь вывод пользовательского интерфейса Prometheus будет следующим:

Последние слова

Это был демонстрационный проект, который я создал для изучения водяных знаков и окончательных функций при обработке потоковой обработки данных. Поэтому мне нужно было создать пользовательского производителя для Kafka и потреблять тех, кто использует структурированную потоковую передачу Spark. Хотя этап разработки проекта был очень забавным, мне также понравилось создавать этот довольно длинный пример с докером.

В случае, если нужна дополнительная деталь, я делюсь Репозиторий GitHub Анкет

Оригинал: «https://dev.to/nazliander/creating-a-development-environment-for-spark-structured-streaming-kafka-and-prometheus-29dl»