Nano Hash - криптовалюты, майнинг, программирование

перевести мой стартовый файл контейнеров в docker-compose.yml

Я новичок в области больших данных и впервые использую Docker. Я только что нашел этот замечательный проект: https://kiwenlau.com/2016/06/26/hadoop-cluster-docker-update-english/, которые создают кластер hadoop, состоящий из одного главного и двух подчиненных устройств, использующих Docker.

После выполнения всей установки я просто запускаю контейнеры, и они работают нормально. Есть файл start-containers.sh, который помогает мне запустить кластер. Я решил установить некоторые инструменты, такие как sqoop, чтобы импортировать мою локальную реляционную базу данных в Hbase, и это работает нормально. После этого я останавливаю все контейнеры Docker на своем компьютере, нажав

docker stop $(docker ps -a -q)

На второй день, когда я попытался перезапустить контейнеры, запустив тот же скрипт ./start-container.sh, я обнаружил эту ошибку:

запустить контейнер hadoop-master...

запустить контейнер hadoop-slave1...

запустить контейнер hadoop-slave2...

Ответ об ошибке от демона: Контейнер

e942e424a3b166452c9d2ea1925197d660014322416c869dc4a982fdae1fb0ad не запущен

даже обедаю этим демоном; контейнеры моего кластера не могут соединиться друг с другом, и я не могу получить доступ к данным, которые хранятся на Hbase.

Во-первых, кто-нибудь может сказать мне, почему этот демон не работает.

PS: в файле start-container.sh есть строка, которая удаляет контейнеры, если они существуют до их создания, я удаляю эту строку, т.к. если я их не удаляю, то каждый раз делаю все дела с начала.

После поиска я обнаружил, что предпочтительнее использовать docker compose, который дает мне возможность пообедать всем контейнером вместе.

Но я не могу найти как перевести мой файл start-container.sh в файл docker-compose.yml. Это лучший способ пообедать все мои контейнеры в то же время? Это содержимое файла start-containers.sh:

#!/bin/bash

sudo docker network create --driver=bridge hadoop

# the default node number is 3
N=${1:-3}


# start hadoop master container
#sudo docker rm -f hadoop-master &> /dev/null
echo "start hadoop-master container..."
sudo docker run -itd \
                --net=hadoop \
                -p 50070:50070 \
                -p 8088:8088 \
        -p 7077:7077 \
        -p 16010:16010 \
                --name hadoop-master \
                --hostname hadoop-master \
                spark-hadoop:latest &> /dev/null



# sudo docker run -itd \
#       --net=hadoop \
#       -p 5432:5432 \
#       --name postgres \
#       --hostname hadoop-master \
#       -e POSTGRES_PASSWORD=0000
#       --volume /media/mobelite/0e5603b2-b1ad-4662-9869-8d0873b65f80/postgresDB/postgresql/10/main:/var/lib/postgresql/data  \
#       sameersbn/postgresql:10-2 &> /dev/null



# start hadoop slave container
i=1
while [ $i -lt $N ]
do
#    sudo docker rm -f hadoop-slave$i &> /dev/null
    echo "start hadoop-slave$i container..."
    port=$(( 8040 + $i ))
    sudo docker run -itd \
            -p $port:8042 \
                    --net=hadoop \
                    --name hadoop-slave$i \
                    --hostname hadoop-slave$i \
                    spark-hadoop:latest &> /dev/null
    i=$(( $i + 1 ))
done 

# get into hadoop master container
sudo docker exec -it hadoop-master bash

  • Мне немного непонятно, к чему этот вопрос: Это о каких-то проблемах с запуском кластера (как описано в начале) или скорее о создании файла docker-compose.yml? 07.11.2019
  • @linux-fan у меня два вопроса первый как решить проблему с запуском докера, почему именно в первый раз все контейнеры работают а во второй раз у меня ошибка второй мой вопрос лучше запускать контейнеры с помощью докер-составить? Если да, то как создать docker-compose.yml из моего стартового скрипта? 07.11.2019

Ответы:


1

Проблемы с перезапуском контейнеров

Я не уверен, правильно ли я понял упомянутые проблемы с перезапуском контейнеров. Таким образом, в дальнейшем я попытаюсь сконцентрироваться на потенциальных проблемах, которые я вижу из сценария и сообщений об ошибках:

При запуске контейнеров без --rm они останутся на месте после остановки. Если кто-то попытается run создать контейнер с тем же сопоставлением портов или тем же именем (оба случая здесь!), впоследствии это не удастся, поскольку контейнер уже существует. По сути, ни один контейнер не будет запущен в процессе. Чтобы решить эту проблему, нужно либо каждый раз заново создавать контейнеры (и хранить все важные состояния вне контейнеров), либо обнаруживать существующий контейнер и запускать его, если он существует. С именами это может быть так же просто, как:

if ! docker start hadoop-master; then
    docker run -itd \
                --net=hadoop \
                -p 50070:50070 \
                -p 8088:8088 \
                -p 7077:7077 \
                -p 16010:16010 \
                --name hadoop-master \
                --hostname hadoop-master \
                spark-hadoop:latest &> /dev/null
fi

и аналогично для других записей. Обратите внимание, что я не понимаю, зачем использовать комбинацию -itd (интерактивный, назначить TTY, но перейти в фоновый режим) для контейнера службы, подобного этому? Я бы порекомендовал пойти сюда только с -d?

Другой общий совет по сценариям: предпочитайте bash -e (заставляет сценарий останавливаться на необработанных ошибках).

Docker-Compose против сценариев запуска

Вопрос содержит некоторые сомнения в том, следует ли использовать docker-compose или следует предпочесть сценарий запуска. С моей точки зрения, наиболее важными отличиями являются следующие:

  • Скрипты хороши своей гибкостью: всякий раз, когда в среде необходимо обнаружить что-то, выходящее за рамки переменных среды, сценарии обеспечивают необходимую гибкость для выполнения команд и зависят от среды. Можно возразить, что это частично противоречит духу изоляции контейнеров, чтобы они зависели от такой среды, но многие среды Docker используются для целей тестирования, где это не является основной задачей.

  • docker-compose предоставляет несколько явных преимуществ «из коробки». Есть команды up и down (и даже такие радикальные, как down -v --rmi all), которые позволяют быстро создавать и уничтожать среды. При написании сценариев необходимо реализовывать все эти вещи по отдельности, что часто приводит к менее полным решениям. Преимущество, которое часто упускают из виду, также связано с проблемами переносимости: docker-compose существует и для Windows. Еще одна интересная функция (хотя и не такая «простая», как кажется) — возможность развертывания docker-compose.yml файлов в кластерах Docker. Наконец, docker-compose также обеспечивает некоторую дополнительную изоляцию (например, все контейнеры по умолчанию становятся частью сети, специально созданной для этого экземпляра docker-compose).

От сценария запуска к Docker-Compose

Имеющийся начальный сценарий уже находится в хорошей форме, чтобы вместо этого рассмотреть возможность перехода к файлу docker-compose.yml. Основная идея состоит в том, чтобы определить одну service для каждой docker run инструкции и преобразовать аргументы командной строки в соответствующие docker-compose.yml имена. Документация достаточно подробно описывает параметры.

Идея может быть следующей:

version: "3.2"
services:
  hadoop-master:
    image: spark-hadoop:latest
    ports:
     - 50070:50070
     - 8088:8088
     - 7077:7077
     - 16010:16010
  hadoop-slave1:
    image: spark-hadoop:latest
    ports:
     - 8041:8042
  hadoop-slave2:
    image: spark-hadoop:latest
    ports:
     - 8042:8042
  hadoop-slave2:
    image: spark-hadoop:latest
    ports:
     - 8043:8042

Кстати. Я не смог протестировать файл docker-compose.yml, потому что изображение spark-hadoop:latest недоступно через docker pull:

# docker pull spark-hadoop:latest
Error response from daemon: pull access denied for spark-hadoop, repository does not exist or may require 'docker login'

Но приведенного выше файла может быть достаточно, чтобы получить представление.

07.11.2019
  • Большое спасибо, это решило мою проблему, а также спасло мне жизнь :) 08.11.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..