Использование Docker и коннекторов для подключения kafka к spark, spark к cassandra и kafka к cassandra

Подробности. Мы докеризовали Kafka, Cassandra и Spark, используя образы wurstmeister/kafka, strapdata/elassandra и bde2020/spark-master в docker-compose.

Что мы хотим сделать, так это соединить следующее с помощью коннекторов:

  • Поток Kafka в поток Spark

  • Поток искры к Кассандре

  • Поток Кафки к Кассандре

Проблема в том, что мы не знаем, нормально это работает или нет, потому что эти технологии звучат для нас в новинку.

Графическое представление:

введите здесь описание изображения

Важные файлы:

докер-compose.yml

version: '2'
services:
  spark:
    container_name: spark
    image: bde2020/spark-master
    ports: 
      - 9180:8080
      - 9177:7077
      - 9181:8081
    links: 
      - elassandra
    volumes:
hosein:/var/lib/docker/volumes/data/python
      - /home/mostafa/Desktop/kafka-test/together/cassandra/mostafa-hosein:/var/lib/docker/volumes/data/python



  elassandra:
    image: strapdata/elassandra
    container_name: elassandra
    build: /home/mostafa/Desktop/kafka-test/together/cassandra
    env_file:
      - /home/mostafa/Desktop/kafka-test/together/cassandra/conf/cassandra.env
    volumes:
      - /home/mostafa/Desktop/kafka-test/together/cassandra/jarfile:/var/lib/docker/volumes/data/_data
    ports:
      - '7000:7000'
      - '7001:7001'
      - '7199:7199'
      - '9042:9042'
      - '9142:9142'
      - '9160:9160'
      - '9200:9200'
      - '9300:9300'

  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"

  kafka:
    build: .
    container_name: kafka
    links:
     - zookeeper
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: localhost
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_OPTS: -javaagent:/usr/app/jmx_prometheus_javaagent.jar=7071:/usr/app/prom-jmx-agent-config.yml
      CONNECTORS: elassandra
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    depends_on: 
      - elassandra

  kafka_connect-cassandra:
    image: datamountaineer/kafka-connect-cassandra
    container_name: kafka-connect-cassandra
    ports:
      - 8083:8083
      - 9102:9102
    environment: 
      - connect.cassandra.contact.points=localhost
      - KAFKA_ZOOKEEPER_CONNECT =  "zookeeper:2181"
      - KAFKA_ADVERTISED_LISTENERS= "kafka:9092"
      - connect.cassandra.port=9042
      - connector.class=com.datamountaineer.streamreactor.connect.cassandra.sink.CassandraSinkConnector
      - tasks.max=1
    depends_on:
      - kafka
      - elassandra

Докерфайл

FROM wurstmeister/kafka
ADD prom-jmx-agent-config.yml /usr/app/prom-jmx-agent-config.yml
ADD jmx_prometheus_javaagent-0.10.jar /usr/app/jmx_prometheus_javaagent.jar
COPY wait-for-it.sh /wait-for-it.sh
RUN chmod +x /wait-for-it.sh
CMD ["/wait-for-it.sh", "zookeeper:2181", "--", "start-kafka.sh"]

Пример: В качестве примера я добавил CONNECTOR: elassandra к переменным среды контейнера kafka, но я не столкнулся с какой-либо ошибкой и не уверен, является ли это допустимой переменной среды или нет!

Как мы можем проверить переменные среды и проверить, что коннекторы работают нормально?


person Mostafa Ghadimi    schedule 07.07.2019    source источник
comment
CONNECTORS ничего не делает для контейнера kafka... Kafka Connect должен быть отдельным контейнером   -  person OneCricketeer    schedule 07.07.2019
comment
@cricket_007 Я нашел изображение без какой-либо полезной документации, я имею в виду datamountaineer/kafka-connect -кассандра. У вас есть идеи, как подключить kafka к cassandra, используя этот образ? Потому что я запускал изображения kafka и cassandra отдельно.   -  person Mostafa Ghadimi    schedule 07.07.2019
comment
Я не использовал это. Я обычно использую слитные изображения, однако я не думаю, что они включают Cassandra. Документация без Docker находится здесь docs.lenses.io/connectors/sink/cassandra.html но сам Kafka Connect API можно найти на сайтах Apache или Confluent   -  person OneCricketeer    schedule 07.07.2019
comment
Изображения confluentinc @cricket_007 больше не находятся в докер-хабе!   -  person Mostafa Ghadimi    schedule 07.07.2019
comment
@MostafaGhadimi, можете ли вы уточнить, что вы на самом деле спрашиваете здесь? Это детали конфигурации для Docker? Или концептуально, как использовать эти три технологии вместе? Например, Kafka-›Cassandra хорошо работает с Kafka Connect, если вы используете Kafka Streams, то почему также Spark Streaming и т. д.   -  person Robin Moffatt    schedule 08.07.2019
comment
Слитные образы находятся в Docker Hub по адресу hub.docker.com/u/confluentinc.   -  person Robin Moffatt    schedule 08.07.2019
comment
Вы когда-нибудь проверяли эту ссылку недавно @RobinMoffatt? Я столкнулся с ошибкой «Страница не найдена»!   -  person Mostafa Ghadimi    schedule 09.07.2019
comment
@cricket_007 Я отредактировал пост и использовал datamountaineer/kafka-connect-cassandra изображение. Я выполнил docker-compose без каких-либо проблем. Есть ли у вас какие-либо идеи о том, как я могу убедиться в целостности связи между Кафкой и Кассандрой?   -  person Mostafa Ghadimi    schedule 09.07.2019
comment
@RobinMoffatt Я отредактировал сообщение и использовал изображение datamountaineer/kafka-connect-cassandra. Я выполнил docker-compose без каких-либо проблем. Есть ли у вас какие-либо идеи о том, как я могу убедиться в целостности связи между Кафкой и Кассандрой?   -  person Mostafa Ghadimi    schedule 09.07.2019


Ответы (1)


Как уже упоминалось, CONNECTORS не является допустимой переменной для контейнера Kafka. Kafka Connect — это служба, отдельная от брокера, поэтому она должна быть отдельным контейнером.

Kafka Connect предоставляет REST API через порт 8083.

Вам необходимо выполнять HTTP-запросы, используя curl, Postman и т. д., чтобы предоставить коннекторы; они не могут быть загружены только из переменных.

Мне не сразу известны какие-либо конкретные свойства, необходимые для контейнеров Datamountainer, но они созданы поверх образов Confluent, и вы можете найти все эти переменные среды здесь — https://github.com/confluentinc

Они предназначены для контейнера Kafka, а не для Kafka Connect, поскольку они начинаются с KAFKA_.

  - KAFKA_ZOOKEEPER_CONNECT =  "zookeeper:2181"
  - KAFKA_ADVERTISED_LISTENERS= "kafka:9092

И они предназначены для свойств соединителя (которые будут отправлены POST через JSON), а не для переменных среды.

  - connect.cassandra.contact.points=localhost
  - connect.cassandra.port=9042
  - connector.class=com.datamountaineer.streamreactor.connect.cassandra.sink.CassandraSinkConnector
  - tasks.max=1

Тогда localhost нигде в этих свойствах не должно использоваться; если вы хотите, чтобы контейнер Connect достиг Cassandra, вы должны использовать "connect.cassandra.contact.points": "elassandra" (имя службы докера)

person OneCricketeer    schedule 09.07.2019