Как стать автором
Поиск
Написать публикацию
Обновить

Новые динтаблицы: вторичные индексы, web assembly и ещё много улучшений к версии YTsaurus 24.1.0

Время на прочтение17 мин
Количество просмотров2.6K
Всего голосов 28: ↑28 и ↓0+32
Комментарии9

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

Это ваш внутренний закрытый софт?

А можно примеры использования wasm?

Привет

Ответ на вопрос будет состоять из двух частей:

1. Вы хотите использовать wasm-рантайм в своём проекте

Тут отправной точкой будет библиотека для работы с wasm из C++: https://github.com/ytsaurus/ytsaurus/tree/main/yt/yt/library/web_assembly.

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

Для того, чтобы написать простую функцию и собрать её под wasm, можно воспользоваться подобными опциями сборки: clang++ -shared -fPIC -nostdlib -nostdlib++ --target=wasm64-unknown-unknown.

Важно упомянуть:
- Нужен свежий clang;
- Мы используем target wasm64 всегда, и 32-битный режим поддерживать не планируем (например, потому что мы хотим адресовать больше 4 гигабайт памяти).

В качестве виртуальной машины сейчас используется WAVM -- библиотека для jit-компиляции wasm через llvm. Возможно, вы захотите посмотреть на эту библиотеку тоже.

1.1. Вы хотите писать код под wasm, используя стандартную библиотеку C++

Например, чтобы можно было использовать std::vector. Для этого необходимо собрать libcxx под wasm и подлинковать её в момент подготовки виртуальной машины (функцияIWebAssemblyCompartment::AddModule). Тут стоит честно сказать, что при разработке мы используем собственную систему сборки -- об этом можно догадаться по наличию файликов ya.make в разных папках на github.

Сейчас в open source сборка под cmake не готова к такому, но есть понятный workaround:
- Мы используем libc, libcxx и dlmalloc из emscripten;
- Отправной точкой тут будет следующая команда: em++ -v -sMAIN_MODULE -fPIC -sERROR_ON_UNDEFINED_SYMBOLS=0 -Dwasm64 main.cpp;
- Таким образом можно получить первый артефакт -- стандартная библиотека, скомпилированная под wasm;
- Вторым артефактом будет shared библиотека с вашим кодом, её следует собрать похожим образом, но как side module (https://emscripten.org/docs/tools_reference/settings_reference.html#side-module);
- После этого можно будет запустить функцию, использующую стандартную библиотеку C++.

2. Вы хотите использовать динамические таблицы ytsaurus, и для расширения языка запросов вам нужны udf-ки

Необходимо написать udf-ку, вот пример функции, которая конкатенирует две строки: https://github.com/ytsaurus/ytsaurus/blob/main/yt/yt/library/query/engine/udf/concat.c.

Исторически такие функции компилируются в байткод llvm, и в open source это поддержано. Для wasm необходимо будет собрать код с опцией --target=wasm64-unknown-emscripten. Как я писал выше, на настоящий момент компиляция под wasm сейчас в open source не готова. Здесь можно использовать описанный workaround.

После этого udf-ку проще всего запустить, например, в unit-тестах: https://github.com/ytsaurus/ytsaurus/blob/main/yt/yt/library/query/unittests/ql_query_ut.cpp.
Или в интеграционных: https://github.com/ytsaurus/ytsaurus/blob/main/yt/yt/tests/integration/dynamic_tables/test_query.py.

В обозримом будущем в документации должен появиться понятный и простой пример того, как сделать всё это за несколько простых команд (запустить сборку, загрузить артефакт на кластер, выполнить запрос).

Тут стоит завести issue на github -- так мы сможем понять, насколько эта фича востребована, и быстрее выложить её в open source.

- Мы используем target wasm64 всегда, и 32-битный режим поддерживать не планируем (например, потому что мы хотим адресовать больше 4 гигабайт памяти).

Или вы планируете 4-гигабайтные вебстранички или вы используете wasm на стороне сервера - оба варианта странные

Речь не про вебстранички, а про безопасный запуск произвольных вычислений в многопользовательской системе. Запрос на такой кейс сейчас довольно широкий. Посмотрите, например, программу последнего хайлоада https://highload.ru/moscow/2024/abstracts - там будет целых два доклада про использование wasm в таком контексте

Идея заимствовать браузерные технологии, кстати, не нова. Например, статья от 21 года про использование v8 для похожей задачи: https://habr.com/ru/companies/yandex/articles/572880/

Более продвинутая структура t‑digest явно применяет k‑means кластеризацию для получения лучшего отношения размера к погрешности. Её реализация уже успешно применялась в Яндексе.

Применялась вообще в Яндексе или в YTsaurus? Планируется применяться вместо Q-digest? У вас своя реализация или от Facebook?

Спасибо за ответ!

Зарегистрируйтесь на Хабре, чтобы оставить комментарий