Как попробовать YTsaurus
В данном руководстве можно посмотреть на YTsaurus в действии — через установку и запуск кластера. Вы локально развернёте кластер YTsaurus, создадите таблицу и выполните простой SELECT запрос. Затем вы попробуете чуть более сложный пример — решите классическую задачу Word Count, запустив операцию MapReduce.
Примечание
Наиболее быстрый способ ознакомиться с возможностями продукта — на демо-стенде. Вы получите временный доступ к демо-кластеру, на котором развёрнуты все необходимые компоненты YTsaurus. Всё, что вам понадобится — это браузер.
Перед началом работы
-
Рекомендуемая среда для работы YTsaurus — это x86_64 Linux. Если у вас MacOS с процессором Apple Silicon, для локальной установки YTsaurus вам потребуется использовать режим эмуляции под архитектуру x86. Для этого подойдёт платформа виртуализации Docker Desktop с включённой Rosetta 2. Однако следует учитывать, что работа YTsaurus в режиме эмуляции не гарантируется.
-
В данном руководстве вы будете запускать YTsaurus кластер в минимальной конфигурации — без гарантий отказоустойчивости. Не используйте предлагаемую конфигурацию в промышленном окружении и для проведения тестов производительности. Примеры того, как настраивать конфигурацию кластера, приведены в Руководстве администратора.
-
Для корректной работы примеров в вашей системе должен быть установлен Python 3.8+.
Установка и запуск YTsaurus кластера
В инструкции будет предложено два способа установить YTsaurus кластер: через Docker и Minikube.
Независимо от способа установки, в результате будут подняты необходимые компоненты системы: мастер-сервер, планировщик, YQL, Query Tracker и другие. Все последующие примеры из этого руководства — создание таблиц, загрузка данных и запуск MapReduce — не зависят от способа установки кластера и будут одинаковыми как для Docker, так и в случае Minikube.
-
Установите Docker:
- Если у вас Linux x86_64 — установите Docker Engine.
- Если у вас Mac — установите Docker Desktop либо Podman в качестве альтернативы. Убедитесь, что у вас установлена и включена Rosetta 2.
-
Скачайте скрипт run_local_cluster.sh для развёртывания кластера и выставьте права на исполнение:
mkdir ~/yt-local && cd ~/yt-local curl -s https://raw.githubusercontent.com/ytsaurus/ytsaurus/main/yt/docker/local/run_local_cluster.sh > run_local_cluster.sh chmod +x run_local_cluster.sh
-
Чтобы поднять кластер, запустите скрипт:
./run_local_cluster.sh
Этот скрипт создаст и запустит docker-контейнеры, в которых будет развёрнут YTsaurus. Если всё прошло успешно, появится сообщение:
Congratulations! Local cluster is up and running. To use the cluster web interface, point your browser to http://localhost:8001. Or, if you prefer command-line tool 'yt', use it like this: 'yt --proxy localhost:8000 <command>'.
Обратите внимание на адреса, которые указаны в этом сообщении. Они понадобятся в дальнейших примерах.
localhost:8001
— адрес веб-интерфейса. Можно открыть его в браузере.localhost:8000
— адрес серверной части кластера. Этот адрес нужно будет указать в качестве адреса прокси для доступа к кластеру через CLI.
-
Чтобы убедиться, что всё работает, запустите команду:
$ docker ps | grep yt CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2c254e35037c ghcr.io/ytsaurus/local:stable "--fqdn localhost --…" 2 minutes ago Up 2 minutes 80/tcp, 8002/tcp yt.backend 5235b5077b5b ghcr.io/ytsaurus/ui:stable "" 2 minutes ago Up 2 minutes 80/tcp yt.frontend
У вас должны быть запущены два контейнера:
-
yt.frontend
— процессы, связанные с веб-интерфейсом. -
yt.backend
— в этом контейнере подняты компоненты YTsaurus кластера.Про компоненты YTsaurus
Чтобы узнать, какие компоненты YTsaurus подняты в системе, можно посмотреть на список запущенных процессов внутри контейнера:
$ docker exec -it yt.backend /bin/bash $ ps -axo command | grep ytserver /mnt/rosetta /usr/bin/python3.8 /usr/local/bin/yt_local start --proxy-port 80 --local-cypress-dir /var/lib/yt/local-cypress --fqdn localhost --ytserver-all-path /usr/bin/ytserver-all --sync --fqdn localhost --proxy-config {coordinator={public_fqdn="localhost:8000"}} --rpc-proxy-count 0 --rpc-proxy-port 8002 --node-count 1 --queue-agent-count 1 --address-resolver-config {enable_ipv4=%true;enable_ipv6=%false;} --native-client-supported --id primary -c {name=query-tracker} -c {name=yql-agent;config={path="/usr/bin";count=1;artifacts_path="/usr/bin"}} /mnt/rosetta /primary/bin/ytserver-http-proxy --pdeathsig 9 --config /primary/configs/http-proxy-0.yson --pdeathsig 15 --setsid /mnt/rosetta /primary/bin/ytserver-master --pdeathsig 9 --config /primary/configs/master-0-0.yson --pdeathsig 15 --setsid /mnt/rosetta /primary/bin/ytserver-queue-agent --pdeathsig 9 --config /primary/configs/queue_agent-0.yson --pdeathsig 15 --setsid /mnt/rosetta /primary/bin/ytserver-node --pdeathsig 9 --config /primary/configs/node-0.yson --pdeathsig 15 --setsid /mnt/rosetta /primary/bin/ytserver-scheduler --pdeathsig 9 --config /primary/configs/scheduler-0.yson --pdeathsig 15 --setsid /mnt/rosetta /primary/bin/ytserver-controller-agent --pdeathsig 9 --config /primary/configs/controller_agent-0.yson --pdeathsig 15 --setsid /mnt/rosetta /primary/bin/ytserver-query-tracker --pdeathsig 9 --config /primary/configs/query_tracker-0.yson --pdeathsig 15 --setsid /mnt/rosetta /usr/bin/ytserver-yql-agent --pdeathsig 9 --config /primary/configs/yql_agent-0.yson --pdeathsig 15 --setsid /mnt/rosetta /usr/bin/grep --color=auto ytserver
Как видно, запустились компоненты:
- Мастер-сервер — отвечает за отказоустойчивое хранение метаданных кластера. К этим данным относится информация о пользователях системы, о хранимых объектах и о местоположении самих данных.
- Нода — объединяет в себе функциональность Data-ноды и Exec-ноды. Отвечает за хранение данных, за работу динамических таблиц и занимается исполнением джобов.
- Планировщик (шедулер) — отвечает за планирование процесса обработки данных (Map, Reduce и так далее).
- Контроллер-агент — отвечает за планирование джобов конкретных операций.
- HTTP-прокси — сервер, через который осуществляется общение с внешним миром.
- YQL-агент — движок исполнения SQL подобных запросов.
- Очередь YTsaurus — упорядоченные динамические таблицы.
- Query Tracker — компонент для запуска запросов на разных SQL диалектах (YQL, QT, CHYT, SPYT).
-
-
Готово! Теперь YTsaurus поднят и готов к использованию. Можно переходить к следующему шагу. После того как вы закончите работу с примерами, не забудьте удалить кластер.
В этом примере вы локально развернёте кластер Kubernetes, состоящий из одного узла, и в нём запустите YTsaurus кластер. В качестве движка исполнения контейнеров будет использоваться Docker.
Требования по ресурсам
Чтобы успешно развернуть YTsaurus в кластере Kubernetes, на хостовой машине должно быть:
- от 4-х ядер CPU;
- от 8 ГБ оперативной памяти;
- от 30 ГБ дискового пространства.
Для установки YTsaurus в Minikube выполните шаги:
- Подготовьте окружение
- Поднимите кластер Kubernetes
- Установите cert-manager
- Установите YTsaurus оператор
- Запустите кластер YTsaurus
- Проверьте сетевые доступы
Более детально процесс установки рассмотрен в вебинаре.
1. Подготовьте окружение
- Установите Docker:
- Если у вас Linux — установите Docker Engine;
- Если у вас Mac — установите Docker Desktop либо Podman в качестве альтернативы. Убедитесь, что у вас установлена и включена Rosetta 2.
- Установите kubectl — утилита для управления кластером Kubernetes.
- Установите Minikube — утилита, позволяющая запустить простой кластер Kubernetes на локальном компьютере.
- Установите Helm — пакетный менеджер для установки компонент YTsaurus в Kubernetes.
2. Поднимите кластер Kubernetes
$ minikube start --cpus=6 --memory=8192 --driver=docker
# Если вы используете Podman
# minikube start --cpus=6 --memory=8192 --driver=podman
Когда кластер Kubernetes будет поднят, должна успешно выполняться команда:
$ kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:36399
CoreDNS is running at https://127.0.0.1:36399/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
3. Установите cert-manager
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.17.1/cert-manager.yaml
Дождитесь, когда под cert-manager-webhook
будет находиться в состоянии Running
:
$ kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
cert-manager cert-manager-7b5cdf866f-5lfth 1/1 Running 0 2m12s
cert-manager cert-manager-cainjector-7c9788477c-xdp8l 1/1 Running 0 2m12s
cert-manager cert-manager-webhook-764949f558-dldzp 1/1 Running 0 2m12s
kube-system coredns-668d6bf9bc-774xg 1/1 Running 0 2m57s
...
4. Установите YTsaurus оператор
YTsaurus оператор — это программа, которая управляет исполнением YTsaurus в Kubernetes кластере. Оператор следит за тем, чтобы все компоненты YTsaurus были запущены и работали корректно.
Установите чарт:
helm install ytsaurus oci://ghcr.io/ytsaurus/ytop-chart --version 0.20.0
Если возникла ошибка 'Internal error occurred: failed calling webhook "webhook.cert-manager.io"'
Проверьте, какой статус у пода cert-manager-webhook
:
$ kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
cert-manager cert-manager-7b5cdf866f-5lfth 1/1 ContainerCreating 0 2m12s
cert-manager cert-manager-cainjector-7c9788477c-xdp8l 1/1 ContainerCreating 0 2m12s
cert-manager cert-manager-webhook-764949f558-dldzp 1/1 ContainerCreating 0 2m12s
...
Если под находится в состоянии ContainerCreating
, дождитесь завершения его установки и попробуйте перезапустить команду helm install ytsaurus oci://ghcr.io/ytsaurus/ytop-chart --version 0.20.0
.
Если у пода состояние ImagePullBackOff
, это означает, что система не может скачать необходимые образы. Скорее всего, это связано с сетевыми настройками внутри Minikube. Возможные решения проблемы описаны тут.
Дождитесь, когда оператор будет находиться в статусе Running
:
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
ytsaurus-ytop-chart-controller-manager-5765c5f995-dntph 2/2 Running 0 7m57s
5. Запустите YTsaurus кластер
curl -s https://raw.githubusercontent.com/ytsaurus/ytsaurus/refs/heads/main/yt/docs/code-examples/cluster-config/cluster_v1_local.yaml > cluster_v1_local.yaml
kubectl apply -f cluster_v1_local.yaml
Обычно запуск YTsaurus кластера занимает несколько минут. Если всё прошло успешно, список запущенных подов будет выглядеть следующим образом:
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
ca-0 1/1 Running 0 8m43s
dnd-0 1/1 Running 0 8m44s
dnd-1 1/1 Running 0 8m44s
dnd-2 1/1 Running 0 8m44s
ds-0 1/1 Running 0 11m
end-0 1/1 Running 0 8m43s
hp-0 1/1 Running 0 8m44s
hp-control-0 1/1 Running 0 8m44s
ms-0 1/1 Running 0 11m
rp-0 1/1 Running 0 8m43s
rp-heavy-0 1/1 Running 0 8m43s
sch-0 1/1 Running 0 8m39s
strawberry-controller-679786577b-4p5kz 1/1 Running 0 7m17s
yt-client-init-job-user-ljfqf 1/1 Running 0 8m39s
yt-master-init-job-default-hdnfm 1/1 Running 0 9m23s
yt-master-init-job-enablerealchunks-575hk 1/1 Running 0 8m50s
yt-strawberry-controller-init-job-cluster-l5gns 1/1 Running 0 8m17s
yt-strawberry-controller-init-job-user-nn9lk 1/1 Running 0 8m34s
yt-ui-init-job-default-6w5zv 1/1 Running 0 8m43s
ytsaurus-ui-deployment-7b469d5cc8-596sf 1/1 Running 0 8m35s
ytsaurus-ytop-chart-controller-manager-859b7bbddf-jc5sv 2/2 Running 0 14m
Если поды зависают в статусе Pending
Скорее всего, это связано с нехваткой ресурсов. Удалите Minikube кластер и попробуйте создать его заново, увеличив число ресурсов при запуске.
$ kubectl delete -f cluster_v1_local.yaml
$ minikube delete
$ minikube start --cpus=8 --memory=10000 --driver=docker
Если указанные ресурсы превышают лимит, который установлен в конфигурациях Podman, увеличьте этот лимит в разделе настроек.
6. Проверьте сетевые доступы
Чтобы посмотреть, по какому адресу будет доступен кластер YTsaurus, запустите команды:
# Сетевой доступ до веб-интерфейса
$ minikube service ytsaurus-ui --url
http://192.168.49.2:30539
# Сетевой доступ до прокси
$ minikube service http-proxies-lb --url
http://192.168.49.2:30228
По первой ссылке доступен веб-интерфейс. Для входа используйте:
Login: admin
Password: password
Как получить доступ к веб-интерфейсу, если кластер развёрнут на удалённом хосте
-
На удалённом хосте запустите команду:
$ minikube service http-proxies-lb --url <HOST>:<PORT>
Значения
<HOST>
и<PORT>
вам понадобятся на следующем шаге. -
На локальном хосте запустите новую сессию терминала и выполните:
ssh -fnNT -L 127.0.0.1:8080:<HOST>:<PORT> <VM>
Веб-интерфейс будет доступен по адресу 127.0.0.1:8080.
По второй ссылке вы будете подключаться к кластеру из командной строки. Подробнее будет рассказано ниже, в разделе с примерами.
Готово!
Теперь YTsaurus поднят и готов к использованию — можно переходить к следующему шагу. После того как вы закончите работу с примерами, не забудьте удалить кластер.
Установка YTsaurus CLI
Самый удобный способ взаимодействия с системой YTsaurus — из консоли. Утилита YTsaurus СLI не устанавливается при развёртывании кластера, её нужно установить в системе отдельно.
Для начала установите менеджер пакетов pip3, если он у вас ещё не установлен:
sudo apt update
sudo apt install python3-pip
Проверьте, что всё получилось:
$ pip3 --version
pip 22.0.2 from ...
Установите утилиту ytsaurus-client
:
pip3 install --user ytsaurus-client
Добавьте путь до $HOME/.local/bin
в переменную PATH
:
export PATH="$PATH:$HOME/.local/bin"
Как сохранить это изменение после перезагрузки системы
echo 'export PATH="$PATH:$HOME/.local/bin"' >> ~/.bashrc # Команда добавит строку в конец файла ~/.bashrc
source ~/.bashrc # Применить изменения сейчас
Проверьте, что установка YTsaurus СLI прошла успешно:
$ yt --version
Version: YT wrapper 0.13.20
Подробнее про работу с CLI можно посмотреть в ознакомительном вебинаре (начиная с 24:30).
Выполнение примеров
В данной инструкции вы создадите таблицу, запишете в неё данные и выполните простой SELECT запрос. В конце раздела приведён более сложный пример — запуск MapReduce операции.
Установите переменные окружения
Это понадобится в следующих примерах, для доступа к кластеру через CLI.
export YT_PROXY=localhost:8000
export YT_PROXY=`minikube service http-proxies-lb --url`
# Отключить автоматическое обнаружение прокси-сервера YTsaurus
export YT_CONFIG_PATCHES='{proxy={enable_proxy_discovery=%false}}'
export YT_TOKEN=password
Важно
Здесь токен задаётся в переменной окружения — это сделано намеренно, для простоты и наглядности примера. В реальных задачах так делать не стоит, для работы с токенами в YTsaurus есть специальные команды. Подробнее читайте в разделе Аутентификация.
Создайте таблицу
В YTsaurus все данные хранятся в таблицах. Поэтому для начала создайте таблицу:
$ yt create table //home/input_table --attributes '{schema = [{name = id; type = int64}; {name = text; type = string}]}'
> 16-64ca-10191-47007b7d
Значение 16-64ca-10191-47007b7d
— это идентификатор созданного узла Кипариса. Идентификаторы узлов полезны при работе с транзакциями в YTsaurus. В рамках текущего примера данные идентификаторы вам не понадобятся.
Посмотреть на созданную таблицу можно в веб-интерфейсе. Откройте в браузере адрес, который вы получили при запуске кластера, перейдите на вкладку Navigation и кликните на созданную таблицу:
Запишите данные
Теперь запишите данные в таблицу, вызвав команду write-table:
echo '{ "id": 0, "text": "Hello" } { "id": 1, "text": "World!" }' | yt write-table //home/input_table --format json
Прочитайте результат
Чтобы убедиться, что данные записались в таблицу, выполните команду:
$ yt read-table //home/input_table --format json
{"id":0,"text":"Hello"}
{"id":1,"text":"World!"}
Другой способ прочитать таблицу — выполнить SELECT запрос в веб-интерфейсе. Для этого перейдите во вкладку Queries и введите запрос:
SELECT * FROM `//home/input_table`;
Всплывает ошибка 'Attribute "cluster_name" is not found'
Если вы поднимали YTsaurus кластер через Docker, проделайте шаги:
-
В веб-интерфейсе перейдите на вкладку Queries.
-
Нажмите иконку настроек — она находится справа в верхней части страницы. Удалите текущий Settings.
-
Нажмите кнопку Add setting и в полях укажите значения: "cluster" и "primary" соответственно. Нажмите галочку.
Если вы поднимали YTsaurus кластер через Minikube — пожалуйста, сообщите нам об этой ошибке в community-чате.
Продвинутый пример: запуск MapReduce
В этом разделе показано, как запустить MapReduce операцию — на примере задачи Word Count.
- Подготовьте данные
- Создайте таблицу и запишите в неё данные
- Запустите MapReduce
- Прочитайте результат
Как выполняется MapReduce
В случае с задачей Word Count, схема выполнения MapReduce будет выглядеть так:
- Исходный текст разбивается на строки, и каждая строка записывается в таблицу в виде отдельной записи.
- Для каждой записи выполняется Map операция — она будет выдавать для каждого слова пару колонок
(<слово>, 1)
. - Результат из предыдущего шага сортируется по первой колонке.
- По первой колонке выполняется Reduce операция, суммирующая вторую колонку. На выходе получается набор пар
(<слово>, <количество упоминаний слова>)
.
1. Подготовьте данные
Скачайте исходный текст и преобразуйте его в tab-separated формат:
curl -s https://raw.githubusercontent.com/ytsaurus/ytsaurus/refs/heads/main/yt/docs/code-examples/source/moem.txt > source.txt
awk '{gsub(/\t/, "\\t"); print "lineno="NR"\ttext="$0}' source.txt > source.tsv
Про tab-separated формат
- Строки таблицы отделяются друг от друга переводом строки
\n
- Колонки отделяются друг от друга табуляцией
\t
- Имя колонки и содержимое колонки отделяются друг от друга знаком
=
К примеру, строка: lineno=1\tsize=6\tvalue=foobar
описывает строку с колонками lineno
, size
и value
со значениями 1
, 6
и foobar
соответственно. Символы табуляции экранируются.
Подготовьте исходник программы, которая будет выполнять MapReduce операцию. Скачайте скрипт — он написан на Python 3 — и сохраните его локально:
curl -s https://raw.githubusercontent.com/ytsaurus/ytsaurus/refs/heads/main/yt/docs/code-examples/python/word-count.py > word-count.py
2. Создайте таблицу
Создайте две таблицы — одну для исходных данных, а вторую для результатов выполнения MapReduce:
yt create table //home/mapreduce_input --attributes '{schema = [{name = lineno; type = string}; {name = text; type = string}]}'
yt create table //home/mapreduce_result --attributes '{schema = [{name = count; type = string}; {name = word; type = string}]}'
Если вы получаете ошибку 'Cannot determine backend type: either driver config or proxy url should be specified.' — необходимо выставить переменную окружения YT_PROXY
.
Теперь запишите данные в исходную таблицу, вызвав команду write-table:
cat source.tsv | yt write-table //home/mapreduce_input --format dsv
Чтобы проверить, что в таблицу записались данные, можно прочитать таблицу с помощью команды read-table. В квадратных скобках указан полуинтервал — получить первые шесть строк таблицы:
yt read-table '//home/mapreduce_input[:#6]' --format dsv
3. Запустите MapReduce
Запустите MapReduce операцию с помощью команды map-reduce:
yt map-reduce --mapper "python3 word-count.py map" --reducer "python3 word-count.py reduce" --map-local-file word-count.py --reduce-local-file word-count.py --src //home/mapreduce_input --dst //home/mapreduce_result --reduce-by word --format dsv
Статус запущенной операции можно отследить в веб-интерфейсе, в разделе Operations.
Где найти этот раздел
4. Прочитайте результат
Теперь можно прочитать итоговую таблицу, выполнив простой SELECT запрос. В веб-интерфейсе перейдите во вкладку Queries и введите запрос:
SELECT * FROM `//home/mapreduce_result`
ORDER BY count
LIMIT 30;
Остановка кластера
Чтобы остановить YTsaurus кластер, необходимо завершить работу контейнеров yt.frontend
и yt.backend
. Для этого выполните команду:
./run_local_cluster.sh --stop
Команда остановит контейнеры (выполнит docker stop
) и затем удалит их (docker rm
).
-
Удалите YTsaurus кластер:
kubectl delete -f cluster_v1_local.yaml
-
Удалите оператор:
helm uninstall ytsaurus
-
Остановите кластер Kubernetes:
minikube stop
-
Удалите кластер Kubernetes:
minikube delete
-
Очистите кеш Minikube:
rm -rf ~/.minikube/
-
Если вы использовали Podman:
podman rm -f minikube podman volume rm minikube
Демо-стенд
Это онлайн-демонстрация возможностей YTsaurus. Чтобы получить доступ к демо-кластеру, заполните форму. После этого на указанную почту придёт письмо — в нём будет информация касательно доступов к кластеру.
Для взаимодействия с YTsaurus на демо-стенде настроено несколько сред:
Jupyter Notebook
В ноутбуке подготовлено множество примеров для работы c YTsaurus — создание таблиц, загрузка данных, использование CHYT, SPYT, YQL и примеры SDK. Обзор всех примеров приведён на стартовой странице ноутбука About YTsaurus demo.
Ссылка на поднятый Jupyter Notebook будет в письме.
Веб-интерфейс
Тут вы сможете ознакомиться с возможностями веб-интерфейса YTsaurus: изучить файловую систему, посмотреть на список пулов, позапускать запросы в Query Tracker.
Ссылка на веб-интерфейс поднятого кластера будет в письме.
Про работу в веб-интерфейсе можно послушать в ознакомительном вебинаре (начиная с минуты 15:30).
Решение проблем
Если у вас что-то не получилось — не стесняйтесь задавать вопросы в community-чате в телеграме. Мы обязательно вам ответим.
Чтобы оставить пожелания или замечания по документации, пожалуйста, заведите issue в GitHub-репозитории проекта. Ваш фидбек всегда приветствуется — он поможет сделать документацию лучше.
Кипарис — это распределённая файловая система и хранилище метаинформации. В Кипарисе хранятся таблицы и файлы. Подробнее читайте в документации.
Образы контейнеров собираются из Dockerfile, который можно посмотреть тут.
Инструмент для запуска SQL-подобных запросов. Query Tracker доступен в веб-интерфейсе — в разделе Queries. Подробнее читайте в документации.
Это декларативный язык запросов к системам хранения и обработки данных. Основан на SQL синтаксисе.
Отвечает за отказоустойчивое хранение метаданных кластера. К ним относится информация о пользователях системы, о хранимых объектах и о местоположении самих данных. Подробнее читайте в документации.
Отвечает за распределение ресурсов между операциями и за процесс их исполнения на кластере. Подробнее в документации.