Container au Havre pour les 500 ans by 0Lifea.

При разработке Open-source-проекта важно помогать пользователям и оставлять рекомендации. Но чтобы это делать, иногда нужно буквально «прочувствовать их боль»: воссоздать их рабочую среду, запустить тот же код и посмотреть на ту же ошибку. А учитывая сложность современных стеков данных, это бывает непросто.

Команда Kubernetes aaS VK Cloud Solutions перевела статью об инструменте Everything Bagel, который позволяет эффективнее работать с локальными стеками данных.

Что такое Everything Bagel




Everything Bagel — это мультиконтейнерная среда Docker, которую можно запустить локально одной командой. Она содержит множество технологий, с которыми выполняется деплоймент lakeFS: Spark, Hive,  Trino, MinIO.

При этом lakeFS можно скачать бесплатно в репозитории.

Разберем, как запустить на своем ноутбуке Docker Everything Bagel, как он работает и что еще интересного можно сделать с помощью этого инструмента.

Начало работы


Первым делом ставим на ноутбук Docker. Потом запускаем Everything Bagel по инструкции:

  1. Клонируем репозиторий lakeFS: git clone https://github.com/treeverse/lakeFS.git.
  2. Переходим к директории deployments/compose: cd. deployments/compose.
  3. Запускаем compose up -d.

Готово! Начинается деплоймент контейнеров — в первый раз это займет несколько минут. После этого можно проверить статус контейнеров — для этого нужно запустить docker compose ps. Ответ можно увидеть в терминале:

NAME                     COMMAND                   SERVICE             STATUS              PORTS
compose_spark-worker_1   "/opt/bitnami/script…"    spark-worker        running             0.0.0.0:53129->8081/tcp
compose_spark-worker_2   "/opt/bitnami/script…"    spark-worker        running             0.0.0.0:53126->8081/tcp
compose_spark-worker_3   "/opt/bitnami/script…"    spark-worker        running             0.0.0.0:53128->8081/tcp
compose_spark_1          "/opt/bitnami/script…"    spark               running             0.0.0.0:18080->8080/tcp, :::18080->8080/tcp
hive                     "/bin/sh -c \"/entryp…"   hive-metastore      running             0.0.0.0:9083->9083/tcp, :::9083->9083/tcp
hiveserver2              "hive --service hive…"    hive-server         running
lakefs                   "/app/wait-for postg…"    lakefs              running             0.0.0.0:8000->8000/tcp, :::8000->8000/tcp
lakefs-setup             "/app/wait-for postg…"    lakefs-setup        exited (0)
mariadb                  "docker-entrypoint.s…"    mariadb             running             3306/tcp
minio                    "minio server /data …"    minio               running             0.0.0.0:9000->9000/tcp, :::9000->9000/tcp, 0.0.0.0:9001->9001/tcp, :::9001->9001/tcp
minio-setup              "mc mb lakefs/example"    minio-setup         exited (0)
postgres                 "docker-entrypoint.s…"    postgres            running             5432/tcp
trino                    "/usr/lib/trino/bin/…"    trino               running             8080/tcp

Если создаете более десяти контейнеров Everything Bagel, убедитесь, что приложению Docker хватит выделенной памяти.

Чтобы изменить эту настройку, перейдите на страницу параметров Docker. Там откройте вкладку Resources и убедитесь, что в параметре Memory задано как минимум 4 ГБ.



Как работает Docker Everything Bagel


Принцип работы Everything Bagel поможет понять файл docker-compose.yaml. На него по умолчанию ссылается команда docker compose up -d. Флаг -d означает «Запущено в состоянии Detached».

Мы не сможем полностью рассказать про все файлы Docker Compose, но давайте коснемся раздела о сервисах, чтобы понимать, что происходит. Посмотрим на фрагмент конфигурации.

version: "3"
services:
  lakefs-setup:
    image: treeverse/lakefs:latest
    container_name: lakefs-setup
    depends_on:
      - postgres
      - minio-setup
    environment:
      - LAKEFS_AUTH_ENCRYPT_SECRET_KEY=some random secret string
      - LAKEFS_DATABASE_CONNECTION_STRING=postgres://lakefs:lakefs@postgres/postgres?sslmode=disable
      - LAKECTL_CREDENTIALS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
      - LAKECTL_CREDENTIALS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
      - LAKECTL_SERVER_ENDPOINT_URL=http://lakefs:8000
    entrypoint: ["/app/wait-for", "postgres:5432", "--", "sh", "-c",
      "lakefs setup --user-name docker --access-key-id AKIAIOSFODNN7EXAMPLE --secret-access-key wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY && lakectl repo create lakefs://example s3://example"
      ]
  minio-setup:
    image: minio/mc
    container_name: minio-setup
    environment:
        - MC_HOST_lakefs=http://minioadmin:minioadmin@minio:9000
    depends_on:
      - minio
    command: ["mb", "lakefs/example"]
    
  postgres:
    image: postgres:11
    container_name: postgres
    environment:
      POSTGRES_USER: lakefs
      POSTGRES_PASSWORD: lakefs

В этом фрагменте показаны разделы, создающие контейнеры, в которых выполняются Postgres (зависимость lakeFS), MinIO (базовое объектное хранилище) и lakeFS. Разберем отдельные компоненты файла.

  • image. Пожалуй, самая важная настройка в разделе services. В ней указан базовый образ, который используется для создания контейнера. В большинстве случаев в Docker Hub можно найти официальный образ сервиса, который устанавливает все пакеты для выполнения сервиса. Например, образ lakeFS на Docker Hub выгружается автоматически рабочим процессом GitHub Action каждый раз, когда появляется новый официальный релиз lakeFS. И после начала работы автоматически запускает выполнение lakeFS.
  • Ключ depends_on. Нужен для контроля последовательности, в которой создаются контейнеры. Перед запуском сервиса lakeFS необходимо убедиться, что первыми запускается контейнер, выполняющий Postgres, и сервис, который запускает MinIO и создает bucket. MinIO — это Open-source объектное хранилище, совместимое с S3 API. Поэтому в нем удобно моделировать S3 в локальных средах, чем мы и занимаемся.
  • Ключenvironment. В нем можно перечислить любые переменные рабочей среды. Аналогичным образом мы можем целиком сохранить файлы конфигурации и скопировать их в контейнер как Volume. В качестве примера можно посмотреть сервис Spark.
  • Ключ entrypoint. Это команда или команды, которые нам нужно запустить в контейнере. Обычно так запускают соответствующий сервис. Однако в lakeFS-setup мы выполняем дополнительные шаги — создаем пользователя и репозиторий lakeFS (через утилиту командной строки lakectl), так что вручную повторять эти действия каждый раз не надо.

После этого экземпляр Repository-less lakeFS практически не нужен.

Если правильно указать эти настройки, можно запустить практически любой нужный нам сервис в изолированной рабочей среде Docker.

Как можно использовать Everything Bagel


  1. Подключаться к клиентам Hive и Trino [docker compose — profile client run — rm trino-client] и создавать таблицы или запросы к данным.
  2. Перемещаться в контейнер Spark [docker-compose exec spark bash] и тестировать задания Spark-submit.
  3. Открывать пользовательские интерфейсы lakeFS (http://localhost:8000) и MinIO (http://localhost:9000) и смотреть, как в них отображаются операции Spark, Hive и Trino.

Попробуйте Kubernetes as a Service на платформе VK Cloud Solutions. Мы даем новым пользователям 3000 бонусных рублей на тестирование кластера или любых других сервисов.

Что еще почитать:

  1. Рабочие узлы Kubernetes: много маленьких или несколько больших?
  2. Чек-лист по безопасности контейнеров
  3. Политики управления рабочими нагрузками в Kubernetes
  4. Телеграм-канал с новостями о Kubernetes

Комментарии (0)