Эта статья вдохновлена опытом знакомства с инструментом 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
Проверим, что все установилось, вызвав информацию о версии программы.
$ 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)
mSnus
16.04.2022 13:17+1ports:
- '5432:5432'
А это не означает разве, что у вас теперь postgres торчит наружу в интернет открытым портом?
172.17.0.1
По идее здесь должно быть имя сервиса - postgres, а не внутренний ip
ivolake Автор
16.04.2022 21:19Первое - да, означает. Но если эта машина в корпоративной сети - то и проблем нет)
Второе - к сожалению, не работает этот вариант. Да и согласно второму пункту инструкции, которую я привел в тексте статьи, там надо все таки 172.17.0.1 (Installing Locally Using Docker Compose | Superset (apache.org))
Telmah
16.04.2022 23:55Имя сервиса сработало бы если бы всё было бы запущено в рамках одного compose. А тут автор почему то запускает superset отдельным контейнером, а базу и пгадмин отдельно через compose, что на мой взгляд странный микс очень
pred8or
Хоть бы слово во введении сказали про то что такое суперсет, для чего и кому нужен. Да и ссылки на проект не повредили бы.
А то дальше начинаете рассказывать "что такое докер?", "что такое compose?". Нелогично
ivolake Автор
Вероятно, вы правы.
Моя мысль просто выглядела как "Мне поручили разобраться, подходит ли суперсет для перехода на него с текущего облачного решения. Что для этого делать?". То есть подразумевается, что понимание предназначения суперсета уже есть.