Обновить
-1

Пользователь

0,1
Рейтинг
Отправить сообщение

Векторизованное колоночное исполнение запросов в PostgreSQL 19

Уровень сложностиСложный
Время на прочтение21 мин
Охват и читатели8.6K

На прошлой неделе я перенес форк Apache Cloudberry на PostgreSQL 19 в виде набора расширений и рассказал, где этот порт проигрывает оригинальному форку. Впрочем как и Cloudberry на ClickBench современные колоночные движки обгоняют его на порядок. И дело тут не в реализации MPP, а в исполнителе PostgreSQL - он работает с кортежами в памяти СУБД. Каждый кортеж проходит отдельно, значение проходит через fmgr, а сегменты кластера лишь добавляют число процессоров на котором крутится тот же самый цикл по строкам таблицы.

Следующий логичный шаг для ускорения - векторизованный исполнитель в PostgreSQL. В открытом коде Apache Cloudberry его нет: от закрытого движка в репозитарии остались только следы - флаг create_vectorization_plan, который планировщик всегда передает как false, а также узел WindowHashAgg без реализации и адаптер PAX под VEC_BUILD, который не компилируется. Проектировать придется самому и, конечно, снова в виде расширения постгреса. Так появился pg_vexec - набор расширений для PostgreSQL 19.

Проект не требует модификации ядра PostgreSQL даже при использовании планировщика ORCA в одноузловой конфигурации без координатора на ванильной сборке PostgreSQL. Модуль gp_orca из порта Cloudberry теперь собирается без pg_core и прочих потрохов greenplum и патчей ядра СУБД, а vexec превращает ORCA в векторный планировщик с исполнителем в “одном флаконе”: его оптимизатор оценивает стоимости теперь и векторных узлов, а транслятор генерирует эти узлы в плане. Патчи ядра не нужны, только если не нужна функциональность и колоночное хранение данных таблиц из Cloudberry. Если же загрузить расширение Cloudberry на пропатченном ядре постгреса, то vexec может более эффективно читать и писать колоночные PAX и ao_column, без лишних конвертаций из и в строки, а Motion тогда может передавать между сегментами данные сразу в колоночном формате Arrow IPC.

И к постгресу можно подключаться как по привычному pgwire протоколу, так и по более современному Flight SQL, что могут оценить те кто будет запускать ML модели на данных из PostgreSQL. Как минимум при загрузке данных в polars скажут мне спасибо!

Читать далее

Пересмотрел свое отношение к Obsidian когда сделал второй мозг на 219 тысяч файлов

Время на прочтение4 мин
Охват и читатели8.1K

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

Начинал я как все, со связки Obsidian и Claude.

Первые свои выводы начал делать после того, как загружено было 219 353 файла. Я не знаю как для вас, но для меня Obsidian теперь - это просто программа для просмотра, а не то что я раньше про него думал. Вся ценность всего этого массива моих данных - в трёх вещах: обычные текстовые файлы на диске, ссылки, перелинковки между ними и агент, который читает и пишет их напрямую.

Как это у меня устроено сейчас и сколько токенов на это потрачено

Цель у меня была сделать своего цифрового двойника. Систему, которая думает и отвечает как я, помнит всё, что помню я, и то, что я уже забыл. Для этого нужна правильно работающая память. Но не векторная база с блоками текста по пятьсот токенов, а нормальная, со структурой и историей.

Я поставил Obsidian, завёл хранилище, стал туда складывать заметки, документы, истории - да все подряд.

Чего я ждал от Obsidian, когда ставил его: что он станет местом, где живёт вся моя память; что граф будет моим рабочим инструментом, по которому я нахожу забытое, а не только картинкой, что дополнения которые есть в обсидиан, закроют всё, чего мне не хватало: свяжут заметки между собой, соберут из них таблицы и подключат к базе нейросеть; что синхронизация между машинами будет его заботой, а не моей; что агент сможет работать с базой через него.

Из этого сбылось только то, что граф действительно приятно смотреть, и заметки удобно читать глазами. Но Obsidian это не база знаний. Для меня сейчас это программа для просмотра папки с текстовыми файлами. Она красивая, с графом и плагинами.

Читать далее

Apache Spark и компиляция пользовательских функций UDF на Java в рантайме

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели11K

Привет, Хабр! Меня зовут Михаил Сичалов, я руководитель проектов и эксперт практики Applied Intelligence в компании Axenix.

Это вводная статья из цикла работ, посвящённых реальным сценариям использования Apache Spark и сопутствующим техническим нюансам, с которыми я столкнулся за последнее десятилетие работы над проектами в области Data Engineering. Я решил систематизировать и переосмыслить свой опыт работы с этим фреймворком и поделиться с сообществом интересными и нестандартными аспектами, освоенными на практике.

Несмотря на выразительность модуля Spark SQL с точки зрения описания преобразований над данными, зачастую возникает необходимость в создании пользовательских функций (UDF). Для этого в Apache Spark есть целое подмножество API, с помощью которого можно реализовать пользовательскую функцию произвольной сложности. Но что делать в случае, когда код функции становится доступным только в рантайме, а Spark используется в связке с Java API?

В данной статье рассмотрим подход к подготовке, компиляции и исполнению Java-кода пользовательских функций в рантайме приложения Spark, а также, почему этого не стоит повторять.

Читать далее

Агрегаты в микросервисах: гайд по проектированию бизнес-логики с примерами на Java

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели6.6K

Разрабатываете микросервисы и чувствуете, что бизнес-логика превращается в хаос?

В статье на примере простого UserService разберем, как три правила агрегатов DDD и асинхронные доменные события помогают навести порядок.

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

Читать далее

HDFS и Hive для CDC: строим хранилище данных в домашней лаборатории

Время на прочтение12 мин
Охват и читатели8.7K

Четвёртая статья цикла о построении CDC-пайплайна с нуля. Данные уже текут из PostgreSQL в Kafka — пора их куда-то складывать. Сегодня поднимаем Hadoop и Hive, и разбираемся, почему Hive 3.1.3 не дружит с Java 11.

Читать далее

5 основополагающих советов по управлению базами данных Greenplum

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели3.5K

Greenplum — это массивно‑параллельная (MPP) база данных с открытым исходным кодом, предназначенная для организации хранилищ данных и высокопроизводительной аналитики. Как и в случае с другими MPP‑СУБД, она требует регулярной оптимизации запросов, корректировки распределения ресурсов и защиты данных. В этой статье мы рассмотрим пять рекомендаций, обязательных для эффективного управления Greenplum.

Читать далее

TrueSql — ультимативный sql-коннектор для Java

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели3.8K

Community долго шло к видению, что Java новых версий это хороший язык, но у него проблема с библиотеками. Сегодня мы готовы публично представить TrueSql – библиотеку для “right” работы с базой данных из Java.

Читать далее

MinIo и Boto3: маленький гайд по созданию скрипта для объектного хранилища на python

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели16K

MinIo, как система объектного хранилища данных, заслуженно пользуется любовью разработчиков: инструмент приятный и, довольно, простой в использовании и освоении. Вот и для одного из наших крупных проектов на работе недавно возникла потребность в использовании S3 хранилища, мы, однако, по корпоративным соображениям выбрали для применения в продакшене другой инструмент, а именно - IONOS (компания у нас немецкая и на ионосе много еще чего завязано), но для тестов и для локального запуска скриптов ничего лучше MinIo в голову нам не пришло. Подобное сочетание при этом вызвало необходимость в использовании такой Python библиотеки, которая могла бы работать и "на наших, и на ваших", а в нашем случае и на MinIo, и на IONOS (поменял параметры в конфиге и тот же самый код, что работал локально, начинает работать и с продакшеном) и этой библиотекой стал Boto3 (стандартный пакет minio для этих целей не подходил). Именно об этой констелляции - Python, MinIo и Boto3 - дальше мне и хотелось бы рассказать, ну а если вместо MinIo вы захотите использовать что-то другое, то "поменял параметры в конфиге и тот же самый код, что работал локально, начинает работать и с продакшеном".

Читать далее

[Туториал] Пишем собственные Spark Native Functions (Часть 2)

Уровень сложностиСложный
Время на прочтение12 мин
Охват и читатели1.8K

В предыдущей своей статье Почему стоит начать писать собственные Spark Native Functions? (Часть 1), которая является переводом и которая вдохновила меня на собственные изыскания, был разобран пример, как написать свою Spark Native Function по генерации UID. Это, конечно, здорово, но вот только данная функция не принимает аргументы на вход, в то время как в реальной практике нам требуются обычно функции, которым надо передать на вход 1, 2 или 3 аргумента. Такие случаи не рассматриваются в упомянутой выше переводной статье - ну что ж, попробуем восполнить этот пробел!

Ниже я предлагаю вашему вниманию результаты своих изысканий по созданию собственных Spark Native Functions, которые бы принимали на вход несколько аргументов.

Читать далее

Информация

В рейтинге
3 991-й
Зарегистрирован
Активность

Специализация

Бэкенд разработчик, ML разработчик
Старший
Java
Spring Boot
Hibernate
Базы данных