Эта статья вдохновлена опытом знакомства с инструментом Apache Superset: автору было очень интересно, что же представляет из себя один из главных представителей on-premise инструментов BI-визуализации (а также стояла соответствующая задача по работе, но это такие мелочи).

В процессе поиска информации возникло понимание, что полноценного руководства на русском по началу работы с данным инструментом нет. Пришлось заниматься вдумчивым поиском решений по наиболее быстрому и в то же время полноценному разавертыванию Superset. Одну из первых ссылок, которую, безусловно найдет любой интересующийся, можно указать сразу - статья на сайте официальной докуметации "Installing Superset Locally Using Docker Compose". Безусловно, с ее помощью можно загрузить и настроить все необходимые системы в виде композиции docker-контейнеров. Однако я хочу предложить способ с более простой архитектурой, а также с намного различных тонкостей и с более подробным объяснением подключения к приложению своей локальной базы данных.

С помощью знаний, собранных по крупицам по интернету и из советов коллег и товарищей получилось сравнительно небольшими усилиями решить задачу и поднять приложение Superset в базовом варианте. Однако этот вариант легко масштабируемый, и по возможности я старался избегать все костыли быстрого освоения (о которых мы потом с сожалением вспоминаем при использовании созданного). И оглянувшись назад после того, как все получилось, я понял, что собрав все полученные знания воедино, можно создать отличное руководство для тех, кто в дальнейшем столкнется с похожей необходимостью.

Итак, приступим. Гайд получился, по сути, от новичка для новичков, так что подсказки и предложения только приветствуются :)

Начальные условия

Чистая Ubuntu 18.04. На ней может, конечно, уже быть установлен docker и docker-compose, но для тех, у кого этих утилит не установлено, далее будет приведен раздел с инструкцией по установке.

Краткий план действий

  • Устанавливаем docker и docker-compose

  • Устанавливаем докер-образ Superset

  • Проверяем работу Superset

  • Устанавливаем Postgres и PgAdmin

  • Проверяем работу Postgres через PgAdmin

  • Подключаем Postgres к Superset

Устанавливаем docker и docker-compose

В первую очередь - что такое docker? Мы тут вообще-то Superset пришли устанавливать, ну и кажется еще Postgres. Однако без docker ничего не получится (точнее, будет очень неправильно, немасштабируемо и так далее).

За подробными разъяснениями рекомендую обратиться к следующим материалам: "Docker. Зачем и как", "Понимая Docker", "VM или Docker?", а также "Шпаргалка с командами Docker". Говоря коротко, можно отметить, что docker-контейнер суть та же виртуальная машина, но в немного урезанном варианте и без ее недостатков. Во время работы он использует исключительно оперативную память, и является для основной операционной системы просто очередным отдельным программным процессом. Это позволяет, например, динамически с другими процессами (в том числе с другими docker-контейнерами) пользоваться оперативной памятью основной машины.

Но мы здесь за практическими штуками, так что перейдем к вопросу его установки. Официальные ресурсы с инструкциями по установке docker и установке docker-compose. Далее в главе идут выдержки оттуда.

$ sudo apt-get update
$ sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

После запуска команды curl система может спросить, перезаписать ли существующий файл docker-archive-keyring.gpg. В таком случае этот шаг можно и пропустить, но я бы рекомендовал все таки перезаписать на случай каких-либо обновлений.

$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
На этом установка docker завершена)
На этом установка docker завершена)

Проверим, что все установилось, вызвав информацию о версии программы.

$ sudo docker --version

Что такое docker-compose? Это утилита для управления группами docker-контейнеров. Открывает возможности по гибко настраиваемому масштабированию этих групп, удобной сепарации контейнеров на сетевом уровне и цетрализации управляющих механизмов. Ну а главное - в умелых руках парой команд docker-compose позволяет развернуть большие и сложные приложения всего парой команд.

Подробнее о docker-compose вот в этой хорошей статье "Руководство по Docker Compose для начинающих".

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
Обошлись без стен логов
Обошлись без стен логов

И снова проверим, что все хорошо с помощью команды вывода версии (порой эта команда отрабатывает не сразу, но такое в порядке вещей).

$ sudo docker-compose --version

Вуаля! Можем работать.

Устанавливаем докер-образ Superset

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

$ sudo docker pull apache/superset

Псле красивой анимированной детализации процесса установки осталось только проверить, что образ контейнера присутсвует в системе. Да, и это все. До чего дошел прогресс)

$ sudo docker images

Проверяем работу Superset

Контейнер надо запустить. Запущенный контейнер в дальнейшем можно будет остановить. И важно не путать это действие с, скажем так, выключением контейнера и с удалением образа. Для работы нам будет достаточно только остановки, которую рассмотрим в конце статьи. Сейчас вашему вниманию представляется команда запуска docker-контейнера с Superset:

$ sudo docker run -d -p 8080:8088 --name superset apache/superset;

Флаг -d (detach) означает отключение контейнера от консоли. Флаг -p отвечает за проброс трафика между портами контейнера и указанными портами основной машины. А остальное, думаю, понятно).

Хорошим инструментом для мониторинга сети является утилита netstat. На чистой Ubuntu ее нет, так что установим ее такой командой:

$ sudo apt-get install net-tools

Да, помимо netstat, были установлены и другие программы, но они не нужны сейчас.

Теперь проверим, запустился ли контейнер.

$ sudo netstat -tupln

Эта команда покажет состояние портов. Описание флагов отразит суть отображаемой информации.

-t - (или --tcp) показать TCP порты;

-u - (или --udp) показать UDP порты;

-l - (или --listening) посмотреть только прослушиваемые порты;

-p - (или --program) показать имя программы и ее PID;

-n - (или --numeric) показывать ip адреса в числовом виде.

А следующая - какие контейнеры сейчас активны.

$ sudo docker ps

По итогу необходимо удостовериться, что порт 8080 занят процессом docker-proxy и прослушивается, а также в том, что присутствует активный контейнер с названием apache/superset.

Если у вас все так же, как на изображении, то идем дальше - то есть вводим IP адрес своей машины и открываем в браузере наш порт с Superset. Узнать свой IP можно, например, вот так:

$ wget -qO- eth0.me

У вас откроется данная страница:

И дальше пройти не получится, ведь пользователей мы никаих не создавали, к тому же в самом Superset никаких данных нет. Чтобы это исправить, нам надо все это настроить и создать.

$ sudo docker exec -it superset superset fab create-admin \
               --username admin \
               --firstname Superset \
               --lastname Admin \
               --email admin@admin.com \
               --password postgres123; \
sudo docker exec -it superset superset db upgrade; \
sudo docker exec -it superset superset load_examples; \
sudo docker exec -it superset superset init;

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

Команда docker exec позволяет нам передавать внутрь контейнера команды, как если бы мы заходили в виртуальную машину и вводили команды в консоль. Предназначение остальных команд, думаю, понятно из текста.

Дальше полетит многобуков, и в процессе (при наличии зеленого шрифта на темном фоне, как у меня) можно почувствовать себя настоящим hackerman'ом из фильмов.

Зайдем под админом. И если вы видите то же, что и скриншоте ниже - отлично, идем дальше!

Устанавливаем Postgres и PgAdmin

Здесь было бы сложно (хотя кому как), если бы не было этой статьи.

Posgtres - база данных, все это знают. Сам по себе сервер с СУБД может управляться единственным образом путем подключения приложения к нему. И с одной стороны, мы подключимся нашим сервером Superset внутри docker-контейнера к Postgres, что еще надо то. Но настраивать и следить за БД так не получится. Для этого для кожанных мешков людей предусмотрен специальный сервер-интерфейс СУБД. Соответственно, под этот сервер также необходим docker-контейнер. Подробнее PgAdmin будет рассмотрен дальше.

И вот тут мы начинаем говорить о контейнерах, работающих в паре. Здесь отлично подойдет docker-compose. Для запуска композиций наиболее удобно применять так называемые docker-compose-файлы. В них прописываются все настройки запускаемых контейнеров, а дальше все включается одной командой. По сути, мы таким уже пользовались, когда создавали образ контейнера для Superset. Но файл мы скачали из интернета, а сейчас пишем вручную.

Содержание файла:

version: '3.3'

services:
  postgres:
    image: library/postgres:13
    volumes:
      - postgres-data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: postgres
      POSTGRES_HOST_AUTH_METHOD: trust
    ports:
      - '5432:5432'
    restart: always
    networks:
      - pg-net

  pgadmin:
    image: dpage/pgadmin4
    volumes:
      - pgadmin-data:/var/lib/pgadmin
    ports:
      - '5050:80'
    environment:
      PGADMIN_DEFAULT_EMAIL: postgres@pg.com
      PGADMIN_DEFAULT_PASSWORD: xxx
    depends_on:
      - postgres
    networks:
      - pg-net

volumes:
  postgres-data:
  pgadmin-data:

networks:
  pg-net:

СтрокаPOSTGRES_HOST_AUTH_METHOD: trust устанавливает беспарольный вход в БД. Можно использовать и вход по паролю. Для этого необходимо написать POSTGRES_PASSWORD: xxx.

Этот текст можно скопировать, а далее создать файл docker-compose.yml, написав:

$ nano docker-compose.yml

Далее вставляем текст и выходим нажатием Ctrl+X -> Y -> Enter. После этого в директории с созданным файлом поднимаем сервера postgres и pgadmin с помощью команды

$ sudo docker-compose up -d

-d, как и в прошлый раз, значит, что STDIN, STDOUT и STDERR для контейнера отключены.

Проверяем работу Postgres через PgAdmin

Для начала заходим на порт 5050. На открывшейся странице вводим почту и пароль от pgadmin из yml-файла.

Отлично, мы в панели администратора. Регистрируем новый сервер (подключаемся к нему, иными словами). Нужная кнопка на картинке ниже.

Открыватеся список полей для заполнения. Обязательных два. Первое - name на вкладке General заполняем, как нравится. Исключательно косметическое действие в данный момент. Второй параметр важный - Host name/address на вкладке Connection, здесь надо вписать адрес сервера с СУБД. Вписываем postgres. Проверяем, что port совпадает с тем, что был указан в графе ports: в конфиг-файле docker-compose.yml (то есть 5432). Если да, то жмём Save и любуемся красивыми графиками.

Для надежности можно еще раз посмотреть на открытые порты с помощью netstat -tulpn.

Подключаем Postgres к Superset

В свое время на этом этапе я провел очень много времени, и, когда я нашел решение, оно мне даже показалось излишне простым. Сейчас, перечитывая документацию, я понял, что все лежало на поверхности. А именно, в руководстве "Installing Superset Locally Using Docker Compose" в последней главе указаны все необходимые шаги для подключения локальной БД к Superset.

Отдельно оговорюсь, что созданная и подключенная в качестве примера к Superset БД слишком уж далека от характеристики "гибкая", так как в нее даже нельзя данные свои загрузить. Поэтому о ней мы забудем, а подключим лучше свой Postgres.

Итак, сделать надо следующее.

С помощью Connect database (локация кнопки на скриншоте) мы окрываем меню с настройками нового подключения. В появившемся окне выбираем PostgreSQL.

Далее вводим в HOST адрес 172.17.0.1, PORT - 5432, DATABASE NAME - как указали в конфиге, то есть postgres. Если у вас не появилось под вышеперчисенными полями никаких красных подписей - полдела сделано, осталась буквально пара мелочей.

В частности, нажимаем CONNECT. После чего перед вами появляется меню дополнительных настроек. Интересна нам только галочка, находящаяся в разделе Security под названием Allow data upload. Её надо включить. Именно благодаря этому вы сможете в дальнейшем загрузить, например, csv-файл со своим данными. И теперь FINISH.

Проверяем, что все есть - для этого захдим в Data -> Databases и если видим строчку с нашей БД, то открываем шампанское можно откинуться в кресле и выдохнуть. Все готово, Superset с Postgres работают.

Дальнейшая эксплуатация

Любой уважающий себя технический специалист знает, что документация по эксплуатации любого изделия должна включать в себя описание таких этапов жизненного цикла, как поддержка функционирования изделия и его вывод из эксплуатации. Так как же работать дальше с нашими контейнерами?

Когда мы хотим завершить работу и, к примеру, погасить нашу рабочую машину, необходимо остановить контейнеры. Композиция postgres + pgadmin останавливается следующим образом (необходимо находится в директории с docker-compose.yml):

$ sudo docker-compose down

Superset у нас работает, как отдельный контейнер, поэтому команда другая:

$ sudo docker container stop superset

А для возвращения к работе с приложениями их необходимо вывести из состония "сна" и поднять снова. Это делается вот так:

$ sudo docker-compose up -d
$ sudo docker container start superset

На этом действительно можно закончить. Кажется, статья достаточно полно охватывает все нюансы и детали и я надеюсь, поможет людям)


Вот и все. Желаю вам жить-поживать, да свой Maven Superset наглаживать.

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


  1. pred8or
    15.04.2022 18:21
    +3

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

    А то дальше начинаете рассказывать "что такое докер?", "что такое compose?". Нелогично


    1. ivolake Автор
      16.04.2022 21:22

      Вероятно, вы правы.

      Моя мысль просто выглядела как "Мне поручили разобраться, подходит ли суперсет для перехода на него с текущего облачного решения. Что для этого делать?". То есть подразумевается, что понимание предназначения суперсета уже есть.


  1. mSnus
    16.04.2022 13:17
    +1

    ports:

    - '5432:5432'

    А это не означает разве, что у вас теперь postgres торчит наружу в интернет открытым портом?

    172.17.0.1

    По идее здесь должно быть имя сервиса - postgres, а не внутренний ip


    1. ivolake Автор
      16.04.2022 21:19

      Первое - да, означает. Но если эта машина в корпоративной сети - то и проблем нет)
      Второе - к сожалению, не работает этот вариант. Да и согласно второму пункту инструкции, которую я привел в тексте статьи, там надо все таки 172.17.0.1 (Installing Locally Using Docker Compose | Superset (apache.org))


    1. Telmah
      16.04.2022 23:55

      Имя сервиса сработало бы если бы всё было бы запущено в рамках одного compose. А тут автор почему то запускает superset отдельным контейнером, а базу и пгадмин отдельно через compose, что на мой взгляд странный микс очень


      1. mSnus
        17.04.2022 02:56

        Видимо, потому, что были две отдельные инструкции)


        1. ivolake Автор
          17.04.2022 12:27

          Именно)


  1. zradeg
    16.04.2022 21:19

    Вместо отсутствующего netstat можно использовать имеющийся в большинстве случаев ss


    1. ivolake Автор
      16.04.2022 21:19

      Даже не знал об этой штуке, спасибо