<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Yuriy Gavrilov: posts tagged Trino</title>
<link>https://gavrilov.info/tags/trino/</link>
<description>Welcome to my personal place for love, peace and happiness 🤖 Yuiry Gavrilov</description>
<author></author>
<language>en</language>
<generator>Aegea 11.4 (v4171e)</generator>

<itunes:owner>
<itunes:name></itunes:name>
<itunes:email>yvgavrilov@gmail.com</itunes:email>
</itunes:owner>
<itunes:subtitle>Welcome to my personal place for love, peace and happiness 🤖 Yuiry Gavrilov</itunes:subtitle>
<itunes:image href="https://gavrilov.info/pictures/userpic/userpic-square@2x.jpg?1643451008" />
<itunes:explicit>no</itunes:explicit>

<item>
<title>Архитектура Client Spooling: Как быстро выгружать гигантские датасеты в Trino и Apache DataFusion</title>
<guid isPermaLink="false">327</guid>
<link>https://gavrilov.info/all/arhitektura-client-spooling-kak-bystro-vygruzhat-gigantskie-data/</link>
<pubDate>Sun, 12 Apr 2026 19:11:05 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/arhitektura-client-spooling-kak-bystro-vygruzhat-gigantskie-data/</comments>
<description>
&lt;p&gt;Работа с Big Data часто упирается в классическое “узкое горлышко”: кластер может обработать терабайты данных за секунды, но передача результатов (Result Set) обратно на сторону клиента (например, в Jupyter или скрипт) занимает часы. На дворе апрель 2026 года, и современные аналитические движки предлагают эффективные методы обхода этой проблемы — концепцию &lt;b&gt;Spooling&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;Немного душноты:&lt;/p&gt;
&lt;p&gt;Архитектура Client Spooling в Trino создавалась с параноидальным акцентом на безопасность, в S3 выкидываются куски сырых, возможно, чувствительных данных.&lt;/p&gt;
&lt;p&gt;Когда Trino решает сбросить данные в объектное хранилище, он всегда шифрует их на лету.&lt;br /&gt;
Для этого используется механизм S3 SSE-C (Server-Side Encryption with Customer-provided keys). Trino генерирует уникальный случайный AES-ключ для каждого запроса, отправляет его в MinIO вместе с данными, а клиенту (вашему Jupyter) отдает ссылку + этот же ключ для расшифровки.&lt;br /&gt;
Если мы используем локальный MinIO по адресу &lt;a href="http://minio:9000"&gt;http://minio:9000&lt;/a&gt; (без SSL/TLS), сервер MinIO видит, что ему пытаются передать секретный пароль (SSE-C ключ) по открытому незащищенному HTTP-каналу.&lt;br /&gt;
MinIO (как и настоящий AWS S3) строго запрещает это по спецификации. Он возвращает HTTP 400 Bad Request с ошибкой: “Requests specifying Server Side Encryption... must be made over a secure connection”. Поэтому тестировать лучше на реальном s3. И еще&lt;/p&gt;
&lt;p&gt;Мгновенное удаление (Сборка мусора)&lt;/p&gt;
&lt;p&gt;Главное правило Client Spooling: Trino удаляет файлы сразу же, как только они были прочитаны клиентом.&lt;br /&gt;
Как только ваш Python-скрипт или Jupyter получает ссылку на файл, скачивает его и отправляет координатору Trino HTTP-сигнал (ACK), что кусок получен, координатор дает команду немедленно удалить этот объект из S3.&lt;br /&gt;
Если запрос отменен или упал с ошибкой, Trino тоже моментально зачищает за собой fs.location. Вы просто не успеете их там увидеть.&lt;/p&gt;
&lt;p&gt;Данных слишком мало (Thresholds)&lt;/p&gt;
&lt;p&gt;Писать 10 строк в S3, генерировать для них Pre-signed URLs и отдавать клиенту — это дольше, чем просто плюнуть эти 10 строк текстом через координатор. Trino использует эвристику: если Result Set маленький, он отдается “инлайн” (внутри JSON-ответа самого координатора), и S3 не задействуется.&lt;/p&gt;
&lt;p&gt;В этой статье мы разберем, как передавать результаты запросов через промежуточное S3-хранилище, на примере движков Trino и Apache DataFusion.&lt;/p&gt;
&lt;h4&gt;Физика проблемы и математика Spooling&lt;/h4&gt;
&lt;p&gt;В классической архитектуре все воркеры кластера отправляют вычисленные строки на главный узел (Coordinator), а тот уже отдает их по одному каналу клиенту.&lt;/p&gt;
&lt;p&gt;Если D — это объем результирующей выборки, а B c — пропускная способность сети координатора, то время выгрузки данных клиенту без спулинга равно:&lt;/p&gt;
&lt;p&gt;T classic = B / Dc&lt;/p&gt;
&lt;p&gt;В режиме &lt;b&gt;Spooling&lt;/b&gt; координатор не гоняет данные через себя. Воркеры напрямую, параллельно пишут куски результата в дешевое объектное хранилище (S3/MinIO). Клиент получает лишь ссылки на эти файлы и скачивает их напрямую. Если у нас N файлов в S3, доступных для многопоточного скачивания с пропускной способностью клиента B client: T spooling ≈ min(N×B s3,B client)D&lt;/p&gt;
&lt;p&gt;Это позволяет ускорить выгрузку в десятки раз, так как $B_{client}$ и распределенный $B_{s3}$ обычно значительно больше ограничений одного координатора.&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;Подготовка минимальной инфраструктуры&lt;/h4&gt;
&lt;p&gt;Для демонстрации двух подходов мы убрали из нашего кластера все тяжелые клиентские среды (Jupyter, Spark) и оставили только “голое” ядро: хранилище S3, REST-каталог и SQL-движок.&lt;/p&gt;
&lt;p&gt;&lt;summary&gt;&lt;b&gt;минимальный&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;docker-compose.yml&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/b&gt;&lt;/summary&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;version: '3.8'

services:
  minio:
    image: minio/minio:latest
    ports:
      - &amp;quot;19000:9000&amp;quot;
      - &amp;quot;19001:9001&amp;quot;
    environment:
      MINIO_ROOT_USER: &amp;quot;minio-root-user&amp;quot;
      MINIO_ROOT_PASSWORD: &amp;quot;minio-root-password&amp;quot;
    command: server /data --console-address &amp;quot;:9001&amp;quot;

  minio-setup:
    image: minio/mc:latest
    depends_on:
      - minio
    entrypoint: &amp;gt;
      /bin/sh -c &amp;quot;
      sleep 5;
      mc alias set myminio http://minio:9000 minio-root-user minio-root-password;
      mc mb myminio/warehouse || true;
      &amp;quot;

  lakekeeper:
    image: dalongrong/lakekeeper:latest
    ports:
      - &amp;quot;8181:8181&amp;quot;
    environment:
      - S3_ENDPOINT=http://minio:9000
      - S3_REGION=us-east-1
      - S3_ACCESS_KEY_ID=minio-root-user
      - S3_SECRET_ACCESS_KEY=minio-root-password
    depends_on:
      - minio-setup

  trino:
    image: trinodb/trino:latest
    ports:
      - &amp;quot;8080:8080&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;summary&gt;&lt;b&gt;Шаг 1. Настройка каталога и генерация данных (Trino)&lt;/b&gt;&lt;/summary&gt;&lt;br /&gt;
&lt;br&gt;&lt;br /&gt;
Сначала мы генерируем данные в Trino. Запрос&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;CREATE CATALOG&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;использует динамическое подключение к Lakekeeper REST API. Скрипт записывает файлы в формате Parquet в MinIO:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;config.properties&lt;/b&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;protocol.spooling.enabled=true
# 256-битный ключ в формате base64. Вы можете сгенерировать свой с помощью команды `openssl rand -base64 32`
protocol.spooling.shared-secret-key=jxTKysfCBuMZtFqUf8UJDQ1w9ez8rynEJsJqgJf66u0=

catalog.management=dynamic&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;spooling-manager.properties&lt;/b&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;spooling-manager.name=filesystem
# Включаем чтение/запись в S3 для Spooling
fs.s3.enabled=true
# Путь внутри MinIO (указываем через s3://)
fs.location=s3://warehouse/client-spooling/

# Системные настройки S3 (MinIO)
s3.endpoint=http://minio:9000
s3.region=us-east-1
s3.aws-access-key=minio-root-user
s3.aws-secret-key=minio-root-password
s3.path-style-access=true&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;-- 1. Подключение каталога Iceberg&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;CREATE CATALOG test_warehouse USING iceberg
WITH (
    &amp;quot;iceberg.catalog.type&amp;quot; = 'rest',
    &amp;quot;iceberg.rest-catalog.uri&amp;quot; = 'http://lakekeeper:8181/catalog/',
    &amp;quot;iceberg.rest-catalog.warehouse&amp;quot; = '00000000-0000-0000-0000-000000000000/test_warehouse',
    &amp;quot;iceberg.rest-catalog.security&amp;quot; = 'OAUTH2',
    &amp;quot;iceberg.rest-catalog.nested-namespace-enabled&amp;quot; = 'true',
    &amp;quot;iceberg.rest-catalog.vended-credentials-enabled&amp;quot; = 'true',
    &amp;quot;fs.native-s3.enabled&amp;quot; = 'true',
    &amp;quot;s3.region&amp;quot; = 'us-east-1',
    &amp;quot;s3.path-style-access&amp;quot; = 'true',
    &amp;quot;s3.endpoint&amp;quot; = 'http://minio:9000'
);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;-- 2. Создание структуры&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;CREATE SCHEMA test_warehouse.test_schema;

CREATE TABLE test_warehouse.test_schema.my_table (
    id BIGINT,
    data VARCHAR
) WITH (format = 'PARQUET');&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;-- 3. Запись данных&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;INSERT INTO test_warehouse.test_schema.my_table VALUES (1, 'hello'), (2, 'world');&lt;/code&gt;&lt;/pre&gt;&lt;hr /&gt;
&lt;p&gt;Если написать Select – должно быть как-то так&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2026-04-12-v-18.25.52.png" width="490" height="284" alt="" /&gt;
&lt;/div&gt;
&lt;h4&gt;Аналог Spooling в Apache DataFusion (Через экспорт)&lt;/h4&gt;
&lt;p&gt;Trino поддерживает протокол *Client Spooling* “из коробки” — когда Python-клиент запрашивает огромный `SELECT`, Trino сам незаметно пишет куски в S3 и отдает клиенту готовые ссылки.&lt;/p&gt;
&lt;p&gt;В &lt;b&gt;Apache DataFusion&lt;/b&gt; (который часто работает как локальный движок `datafusion-cli` или встраиваемая библиотка поверх S3) применяется более прозрачный паттерн делегирования (Explicit Spooling). Мы вручную инструктируем движок сохранить результаты агрегации в распределенное хранилище, чтобы позже забрать их в удобном формате — например, упаковав их в `JSON` и сжав алгоритмом `ZSTD`.&lt;/p&gt;
&lt;h5&gt;1. Подключение к S3 и маппинг исходной таблицы&lt;/h5&gt;
&lt;p&gt;Запускаем `datafusion-cli`, передав доступы как переменные среды (для предотвращения ошибок парсинга опций):&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;AWS_ACCESS_KEY_ID=&amp;quot;minio-root-user&amp;quot; \
AWS_SECRET_ACCESS_KEY=&amp;quot;minio-root-password&amp;quot; \
AWS_ENDPOINT=&amp;quot;http://localhost:19000&amp;quot; \
AWS_REGION=&amp;quot;us-east-1&amp;quot; \
AWS_ALLOW_HTTP=&amp;quot;true&amp;quot; \
datafusion-cli&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Внутри консоли подключаем директорию с Parquet-файлами, сгенерированными Trino:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;CREATE EXTERNAL TABLE my_parquet_data 
STORED AS PARQUET 
LOCATION 's3://warehouse/019d81a3-c2d6-7ed2-ab15-070becf62582/my_table-13e4b91a2b4e47d98f312b1384263880/data/';&lt;/code&gt;&lt;/pre&gt;&lt;h5&gt;2. Массовая конвертация и выгрузка (DataFusion COPY)&lt;/h5&gt;
&lt;p&gt;Вместо того чтобы тянуть миллионы строк на локальный терминал, мы просим DataFusion выполнить преобразование и записать итог запроса обратно в MinIO.&lt;/p&gt;
&lt;p&gt;Мы выбираем построчный JSON с экстремальным сжатием:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;COPY (
    -- Тут может быть любая сложная агрегация:
    -- SELECT id, count(data) FROM my_parquet_data GROUP BY id
    SELECT * FROM my_parquet_data
) 
TO 's3://warehouse/019d81a3-c2d6-7ed2-ab15-070becf62582/my_table-13e4b91a2b4e47d98f312b1384263880/json_export/' 
STORED AS JSON
OPTIONS (
    'format.compression' 'zstd'
);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;Результат:&lt;/b&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;+-------+
| count |
+-------+
| 2     |
+-------+
1 row(s) fetched. 
Elapsed 0.270 seconds.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;За миллисекунды (0.270 sec) DataFusion прочитал партиции, трансформировал бинарные столбцы в текст и сжал его.&lt;/p&gt;
&lt;h4&gt;В чем преимущество подхода DataFusion?&lt;/h4&gt;
&lt;p&gt;Описанный паттерн выполнения команды `COPY TO` с сохранением `.json.zst` в MinIO полностью воспроизводит механику Spooling:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Отсутствие OOM (Out Of Memory):&lt;/b&gt; Клиент получает только метаданные `count`, а не гигабайты сырых данных в оперативную память.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Параллелизм:&lt;/b&gt; Если исходных файлов много, DataFusion будет писать множество потоков `part-0.json.zst`, `part-1.json.zst` в бакет параллельно.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Удаленное потребление:&lt;/b&gt; Вы можете запустить легкий Python-скрипт (Pandas) на дешевой машине, который просто прочитает эти сжатые легковесные JSON объекты напрямую из MinIO, минуя дорогостоящие вычислительные кластеры.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Еще немного про  Fault-Tolerant Execution (FTE), нужно провести важную границу между &lt;b&gt;архитектурой Trino&lt;/b&gt; (готовый распределенный кластер) и &lt;b&gt;архитектурой DataFusion&lt;/b&gt; (ядро/библиотека выполнения запросов).&lt;/p&gt;
&lt;p&gt;В самом “голом” ядре DataFusion (которое вы запускаете в `datafusion-cli` или в Jupyter) &lt;b&gt;нет встроенного механизма Task Retries&lt;/b&gt;, потому что процессы выполняются на одной машине в рамках одного приложения. Если сервер падает — запрос прерывается.&lt;/p&gt;
&lt;p&gt;Однако, в экосистеме DataFusion есть механизмы отказоустойчивости, которые делятся на два уровня: &lt;b&gt;локальный (Spilling)&lt;/b&gt; и &lt;b&gt;распределенный (Apache Ballista / Ray)&lt;/b&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;1. Локальная отказоустойчивость (защита от OOM)&lt;/h4&gt;
&lt;p&gt;В Trino частой причиной падения задач является нехватка памяти (Out of Memory). В DataFusion реализован мощный механизм управления памятью.&lt;/p&gt;
&lt;p&gt;Если DataFusion понимает, что оперативной памяти для агрегации или JOIN’а не хватает, он не “роняет” задачу, а начинает сбрасывать промежуточные данные на диск (&lt;b&gt;Spill to Disk&lt;/b&gt;).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Это настраивается через конфигурацию `datafusion.execution.disk_manager`.&lt;/li&gt;
&lt;li&gt;Это аналог локального `spill-enabled = true` в Trino. Запрос замедлится, но выполнится до конца, не упав с ошибкой.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2. Распределенная отказоустойчивость (Аналог Trino FTE)&lt;/h4&gt;
&lt;p&gt;Trino использует архитектуру &lt;b&gt;Fault-Tolerant Execution (FTE)&lt;/b&gt;, при которой промежуточные результаты (Shuffle Exchange) пишутся в S3, а упавшие воркеры заменяются, и их задачи (Tasks) перезапускаются координатором.&lt;/p&gt;
&lt;p&gt;В мире DataFusion эту задачу решает не само ядро, а &lt;b&gt;распределенные планировщики&lt;/b&gt;, построенные поверх него:&lt;/p&gt;
&lt;h5&gt;А. Apache Ballista (Официальный распределенный DataFusion)&lt;/h5&gt;
&lt;p&gt;Ballista — это надстройка над DataFusion, превращающая его в полноценный кластер (с Coordinator и Executors), архитектурно очень похожая на Apache Spark и Trino.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Task Retries:&lt;/b&gt; Если один из Executor’ов теряется из-за сбоя сети или железа, Ballista Coordinator замечает это и &lt;b&gt;переназначает задачу (Task) другому воркеру&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Shuffle Spilling:&lt;/b&gt; Промежуточные данные между стадиями (Stages) записываются во временные файлы. Следовательно, если упала только последняя стадия, кластеру не нужно пересчитывать весь запрос с нуля — он прочитает промежуточные Shuffle-файлы и повторит только упавший кусок.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Б. DataFusion on Ray (datafusion-ray)&lt;/h5&gt;
&lt;p&gt;Сейчас огромную популярность набирает запуск DataFusion поверх кластера &lt;b&gt;Ray&lt;/b&gt;.&lt;br /&gt;
Ray — это супер-устойчивый распределенный фреймворк. Интеграция `datafusion-ray` позволяет разбить SQL-запрос на граф задач прямо в Ray.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;За отказоустойчивость, Retry-логику и восстановление упавших узлов (Actor/Task) здесь отвечает сам Ray, который делает это на уровне индустриального стандарта.&lt;/li&gt;
&lt;li&gt;Это максимально близко к концепции отказоустойчивого кластера.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Резюме: Как получить “Trino-like” Fault Tolerance в DataFusion?&lt;/h4&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Если вы используете &lt;b&gt;локальный DataFusion&lt;/b&gt; (в Python или CLI): Отказоустойчивости уровня узлов нет, но есть защита от падений по памяти (Spill to Disk). Если упадет процесс — нужно перезапускать запрос руками.&lt;/li&gt;
&lt;li&gt;Если вам нужен настоящий &lt;b&gt;Task Repeat / Fault Tolerance&lt;/b&gt; на сотнях серверов, где падение серверов — норма: вы используете движок DataFusion вместе с кластерным менеджером &lt;b&gt;Apache Ballista&lt;/b&gt; или &lt;b&gt;Ray&lt;/b&gt;, которые прозрачно обеспечат перезапуск задач (Retries) и сохранение промежуточных состояний (Shuffle), полностью повторяя логику Trino FTE.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;UPD: В локальном тестировании есть некоторые особенности. Когда контейнеры внутри имеют свою сеть, то трино посылает в dbeaver ссылки. А есть хост не знает что это за минива или localstack-spooling, то оно отдаст кусок данных, а остальные части просто не доедут. Квери упадет как отмененная, так как клиент получил не все результаты. Короче, надо просто так сделать&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;sudo nano /etc/hosts&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;и вставить строку вашего s3 хоста.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;127.0.0.1       localstack-spooling&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;то есть при спулинге клиент должен не только иметь сетевую связанность с s3 но различать dns имена корректно.&lt;/p&gt;
&lt;p&gt;Короче сравния строк пройдено, все сошлося :)&lt;/p&gt;
&lt;p&gt;со спулингом 2.2 сек&lt;br /&gt;
без спулинга 4.4 сек&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2026-04-14-v-23.33.03.png" width="1300" height="136" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Питончик 2.16 сек с чанками&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2026-04-14-v-23.53.52.png" width="880" height="506" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;в самом трино еще быстрее&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2026-04-14-v-23.57.40.png" width="1190" height="282" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;все строки на месте: 150тыщъ&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2026-04-14-v-23.58.37.png" width="614" height="84" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;код !!&lt;/p&gt;
&lt;p&gt;&lt;html&gt;&lt;details&gt;&lt;br /&gt;
from trino.dbapi import connect&lt;br /&gt;
import json&lt;/p&gt;
&lt;h2&gt;–&lt;s&gt; Конфигурация –&lt;/s&gt;&lt;/h2&gt;
&lt;p&gt;TRINO_HOST = “localhost”&lt;br /&gt;
TRINO_PORT = 9999&lt;br /&gt;
TRINO_USER = “trino”&lt;br /&gt;
TRINO_CATALOG = “test_warehouse”&lt;br /&gt;
TRINO_SCHEMA = “test_schema”&lt;br /&gt;
OUTPUT_FILE = “output.json”&lt;br /&gt;
CHUNK_SIZE = 10000  # Количество строк, обрабатываемых за один раз&lt;/p&gt;
&lt;p&gt;def export_to_json():&lt;br /&gt;
conn = connect(&lt;br /&gt;
host=TRINO_HOST,&lt;br /&gt;
port=TRINO_PORT,&lt;br /&gt;
user=TRINO_USER,&lt;br /&gt;
catalog=TRINO_CATALOG,&lt;br /&gt;
schema=TRINO_SCHEMA,&lt;br /&gt;
)&lt;br /&gt;
cursor = conn.cursor()&lt;/p&gt;
&lt;p&gt;try:&lt;/p&gt;
&lt;h2&gt;Отключаем Fault-Tolerant Execution&lt;/h2&gt;
&lt;p&gt;cursor.execute(“SET SESSION retry_policy = ‘NONE’”)&lt;br /&gt;
cursor.execute(“SELECT * FROM my_table2”)&lt;/p&gt;
&lt;p&gt;column_names = [desc[0] for desc in cursor.description]&lt;br /&gt;
row_count = 0&lt;/p&gt;
&lt;p&gt;with open(OUTPUT_FILE, “w”, encoding=“utf-8”) as f:&lt;/p&gt;
&lt;h2&gt;Используем fetchmany для чанков&lt;/h2&gt;
&lt;p&gt;while True:&lt;br /&gt;
rows = cursor.fetchmany(CHUNK_SIZE)&lt;br /&gt;
if not rows:&lt;br /&gt;
break&lt;br /&gt;
for row in rows:&lt;br /&gt;
row_dict = dict(zip(column_names, row))&lt;br /&gt;
f.write(json.dumps(row_dict, ensure_ascii=False, default=str) + “\n”)&lt;br /&gt;
row_count += len(rows)&lt;br /&gt;
print(f“Processed {row_count} rows...”)&lt;/p&gt;
&lt;p&gt;print(f“Successfully exported {row_count} rows to {OUTPUT_FILE}”)&lt;/p&gt;
&lt;p&gt;finally:&lt;br /&gt;
cursor.close()&lt;br /&gt;
conn.close()&lt;/p&gt;
&lt;p&gt;if __name__ == “__main__”:&lt;br /&gt;
export_to_json()&lt;/p&gt;
&lt;p&gt;&lt;/details&gt;&lt;/html&gt;&lt;/p&gt;
&lt;p&gt;Вот еще с уточкой и чанками&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2026-04-15-v-01.12.49.png" width="1064" height="514" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;код&lt;/p&gt;
&lt;p&gt;&lt;html&gt;&lt;details&gt;&lt;br /&gt;
import duckdb&lt;br /&gt;
import json&lt;/p&gt;
&lt;p&gt;OUTPUT_FILE = “/home/jovyan/examples/output_duckdb.json”&lt;br /&gt;
CHUNK_SIZE = 10000&lt;/p&gt;
&lt;p&gt;conn = duckdb.connect()&lt;/p&gt;
&lt;h2&gt;расширения и настройки (как у вас)&lt;/h2&gt;
&lt;p&gt;conn.execute(“INSTALL httpfs; LOAD httpfs;”)&lt;br /&gt;
conn.execute(“INSTALL iceberg; LOAD iceberg;”)&lt;br /&gt;
conn.execute(“SET memory_limit = ‘4GB’;”)&lt;br /&gt;
conn.execute(“SET s3_region = ‘us-east-1’;”)&lt;/p&gt;
&lt;p&gt;conn.execute(“‘’&lt;br /&gt;
CREATE OR REPLACE SECRET minio_secret (&lt;br /&gt;
TYPE S3,&lt;br /&gt;
KEY_ID ‘minio-root-user’,&lt;br /&gt;
SECRET ‘minio-root-password’,&lt;br /&gt;
ENDPOINT ‘minio:9000’,&lt;br /&gt;
USE_SSL false,&lt;br /&gt;
URL_STYLE ‘path’&lt;br /&gt;
);&lt;br /&gt;
‘‘’)&lt;/p&gt;
&lt;p&gt;conn.execute(‘‘’&lt;br /&gt;
CREATE OR REPLACE SECRET iceberg_secret (&lt;br /&gt;
TYPE ICEBERG,&lt;br /&gt;
TOKEN ‘dummy’&lt;br /&gt;
);&lt;br /&gt;
‘‘’)&lt;/p&gt;
&lt;p&gt;conn.execute(‘‘’&lt;br /&gt;
ATTACH ‘test_warehouse’ AS lakekeeper_db (&lt;br /&gt;
TYPE ICEBERG,&lt;br /&gt;
ENDPOINT ’&lt;a href="http://lakekeeper:8181/catalog/',"&gt;http://lakekeeper:8181/catalog/',&lt;/a&gt;&lt;br /&gt;
ACCESS_DELEGATION_MODE ‘none’,&lt;br /&gt;
SECRET iceberg_secret&lt;br /&gt;
);&lt;br /&gt;
‘‘’)&lt;/p&gt;
&lt;h2&gt;Используем cursor и fetchmany для чанков&lt;/h2&gt;
&lt;p&gt;cursor = conn.cursor()&lt;br /&gt;
cursor.execute(‘SELECT * FROM lakekeeper_db.test_schema.my_table2’)&lt;/p&gt;
&lt;h2&gt;Получаем имена колонок&lt;/h2&gt;
&lt;p&gt;col_names = [desc[0] for desc in cursor.description]&lt;/p&gt;
&lt;p&gt;total_rows = 0&lt;br /&gt;
with open(OUTPUT_FILE, ‘w’, encoding=’utf-8’) as f:&lt;br /&gt;
while True:&lt;br /&gt;
rows = cursor.fetchmany(CHUNK_SIZE)&lt;br /&gt;
if not rows:&lt;br /&gt;
break&lt;br /&gt;
for row in rows:&lt;br /&gt;
row_dict = dict(zip(col_names, row))&lt;br /&gt;
f.write(json.dumps(row_dict, ensure_ascii=False, default=str) + ‘\n’)&lt;br /&gt;
total_rows += len(rows)&lt;br /&gt;
print(f’Обработано строк: {total_rows}’)&lt;/p&gt;
&lt;p&gt;print(f’✅ Загружено и сохранено строк: {total_rows}”)&lt;br /&gt;
print(f“📁 Данные сохранены в {OUTPUT_FILE}”)&lt;br /&gt;
conn.close()&lt;/p&gt;
&lt;p&gt;&lt;/details&gt;&lt;/html&gt;&lt;/p&gt;
&lt;p&gt;Можно даже так внутри уточки&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2026-04-15-v-01.19.57.png" width="1100" height="204" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;html&gt; &lt;details&gt;&lt;br /&gt;
import duckdb&lt;/p&gt;
&lt;p&gt;OUTPUT_FILE = “/home/jovyan/examples/output_duckdb_direct.json”&lt;/p&gt;
&lt;p&gt;conn = duckdb.connect()&lt;/p&gt;
&lt;h2&gt;Расширения и настройки&lt;/h2&gt;
&lt;p&gt;conn.execute(“INSTALL httpfs; LOAD httpfs;”)&lt;br /&gt;
conn.execute(“INSTALL iceberg; LOAD iceberg;”)&lt;br /&gt;
conn.execute(“SET memory_limit = ‘4GB’;”)&lt;br /&gt;
conn.execute(“SET s3_region = ‘us-east-1’;”)&lt;/p&gt;
&lt;h2&gt;Секрет для MinIO&lt;/h2&gt;
&lt;p&gt;conn.execute(“‘’&lt;br /&gt;
CREATE OR REPLACE SECRET minio_secret (&lt;br /&gt;
TYPE S3,&lt;br /&gt;
KEY_ID ‘minio-root-user’,&lt;br /&gt;
SECRET ‘minio-root-password’,&lt;br /&gt;
ENDPOINT ‘minio:9000’,&lt;br /&gt;
USE_SSL false,&lt;br /&gt;
URL_STYLE ‘path’&lt;br /&gt;
);&lt;br /&gt;
‘‘’)&lt;/p&gt;
&lt;h2&gt;Секрет для Iceberg REST&lt;/h2&gt;
&lt;p&gt;conn.execute(‘‘’&lt;br /&gt;
CREATE OR REPLACE SECRET iceberg_secret (&lt;br /&gt;
TYPE ICEBERG,&lt;br /&gt;
TOKEN ‘dummy’&lt;br /&gt;
);&lt;br /&gt;
‘‘’)&lt;/p&gt;
&lt;h2&gt;Подключение каталога Lakekeeper&lt;/h2&gt;
&lt;p&gt;conn.execute(‘‘’&lt;br /&gt;
ATTACH ‘test_warehouse’ AS lakekeeper_db (&lt;br /&gt;
TYPE ICEBERG,&lt;br /&gt;
ENDPOINT ’&lt;a href="http://lakekeeper:8181/catalog/',"&gt;http://lakekeeper:8181/catalog/',&lt;/a&gt;&lt;br /&gt;
ACCESS_DELEGATION_MODE ‘none’,&lt;br /&gt;
SECRET iceberg_secret&lt;br /&gt;
);&lt;br /&gt;
‘‘’)&lt;/p&gt;
&lt;h2&gt;Экспорт в JSON (массив)&lt;/h2&gt;
&lt;p&gt;conn.execute(f’’’&lt;br /&gt;
COPY (&lt;br /&gt;
SELECT * FROM lakekeeper_db.test_schema.my_table2&lt;br /&gt;
) TO ‘{OUTPUT_FILE}’ (FORMAT JSON);&lt;br /&gt;
‘‘’)&lt;/p&gt;
&lt;p&gt;print(f’✅ Данные сохранены в {OUTPUT_FILE}’)&lt;br /&gt;
conn.close()&lt;br /&gt;
&lt;/details&gt;&lt;/html&gt;&lt;/p&gt;
&lt;p&gt;К конце концов я использовал&lt;/p&gt;
&lt;p&gt;localstack-spooling&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;protocol.spooling.enabled=true
# 256-битный ключ в формате base64. Вы можете сгенерировать свой с помощью команды `openssl rand -base64 32`
protocol.spooling.shared-secret-key=jxTKysfCBuMZtFqUf8UJDQ1w9ez8rynEJsJqgJf66u0=
catalog.management=dynamic&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;так&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;spooling-manager.name=filesystem
fs.s3.enabled=true
fs.location=s3://spooling-bucket/client-spooling/

s3.endpoint=http://localstack-spooling:4566
s3.region=us-east-1
s3.aws-access-key=test
s3.aws-secret-key=test
s3.path-style-access=true&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;и так&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;services:

  trino:
    build: ./trino
    environment:
      - CATALOG_MANAGEMENT=dynamic
      - LANCE_ALLOW_HTTP=true
      - AWS_ALLOW_HTTP=true
      - AWS_ACCESS_KEY_ID=minio-root-user
      - AWS_SECRET_ACCESS_KEY=minio-root-password
      - AWS_REGION=us-east-1
      - AWS_ENDPOINT_URL=http://minio:9000
      - CATALOG_MANAGEMENT=dynamic
      - JDK_JAVA_OPTIONS=--add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED
    healthcheck:
      test: [&amp;quot;CMD&amp;quot;, &amp;quot;curl&amp;quot;, &amp;quot;-I&amp;quot;, &amp;quot;http://localhost:8080/v1/status&amp;quot;]
      interval: 2s
      timeout: 10s
      retries: 2
      start_period: 10s
    ports:
      - &amp;quot;9999:8080&amp;quot;
    volumes:
      - ./lance5.properties:/etc/trino/catalog/lance5.properties
      - ./lance_rest.properties:/etc/trino/catalog/lance_rest.properties
      - ./lance_ice.properties:/etc/trino/catalog/lance_ice.properties
      # --- ДОБАВЬТЕ ЭТУ СТРОКУ ---
      - ./spooling-manager.properties:/etc/trino/spooling-manager.properties
      # (При необходимости пробросьте и config.properties, если он не копируется при build: ./trino)
      - ./config.properties:/etc/trino/config.properties
      - spooling-data:/tmp/spooling
    networks:
      - lakekeeper-network
    depends_on:
      localstack-setup:    # &amp;lt;--- Trino ждет, пока AWS CLI не создаст бакет!
        condition: service_completed_successfully

  localstack-spooling:
    image: localstack/localstack:3.4.0    # Жестко фиксируем бесплатную рабочую версию!
    container_name: localstack-spooling
    ports:
      - &amp;quot;4566:4566&amp;quot;
    environment:
      - SERVICES=s3
      - AWS_DEFAULT_REGION=us-east-1
    networks:
      - lakekeeper-network

  localstack-setup:
    image: amazon/aws-cli:latest
    container_name: localstack-setup
    depends_on:
      - localstack-spooling
    restart: &amp;quot;no&amp;quot;
    environment:
      - AWS_ACCESS_KEY_ID=test
      - AWS_SECRET_ACCESS_KEY=test
      - AWS_DEFAULT_REGION=us-east-1
    entrypoint: &amp;gt;
      /bin/sh -c &amp;quot;
        echo 'Waiting for LocalStack to fully start...';
        sleep 10;
        aws --endpoint-url=http://localstack-spooling:4566 s3 mb s3://spooling-bucket;
        echo 'LocalStack bucket created successfully!';
      &amp;quot;
    networks:
      - lakekeeper-network
      
  jupyter:
    image: quay.io/jupyter/pyspark-notebook:2024-10-14
    depends_on:
      lakekeeper:
        condition: service_healthy
      # Исправлено: теперь зависим от рабочего setup сервиса
      lakekeeper-setup:
        condition: service_completed_successfully
      trino:
        condition: service_healthy
      # Удалено: starrocks (сервис не описан в compose файле)
    command: start-notebook.sh --NotebookApp.token=''
    volumes:
      - ./notebooks:/home/jovyan/examples/
      - spooling-data:/tmp/spooling
    networks:
      - lakekeeper-network
    ports:
      - &amp;quot;8888:8888&amp;quot;

  # Сервис initialwarehouse УДАЛЕН, так как он дублировал lakekeeper-setup 
  # и ссылался на несуществующие сервисы (bootstrap, createbuckets).

  postgres-lakekeeper:
    image: postgres:17
    container_name: postgres-lakekeeper
    environment:
      POSTGRES_USER: lakekeeper
      POSTGRES_PASSWORD: lakekeeper
      POSTGRES_DB: lakekeeper
    ports:
      - &amp;quot;5435:5432&amp;quot;
    volumes:
      - lakekeeper-postgres-data:/var/lib/postgresql/data
    healthcheck:
      test: [&amp;quot;CMD-SHELL&amp;quot;, &amp;quot;pg_isready -U lakekeeper -d lakekeeper&amp;quot;]
      interval: 2s
      timeout: 10s
      retries: 5
    networks:
      - lakekeeper-network

  minio:
    image: minio/minio:latest
    container_name: minio-lakekeeper
    environment:
      MINIO_ROOT_USER: minio-root-user
      MINIO_ROOT_PASSWORD: minio-root-password
      # MINIO_DOMAIN: minio
    command: server /data --console-address &amp;quot;:9001&amp;quot;
    ports:
      - &amp;quot;19000:9000&amp;quot;
      - &amp;quot;19001:9001&amp;quot;
    volumes:
      - lakekeeper-minio-data:/data
    healthcheck:
      test: [&amp;quot;CMD&amp;quot;, &amp;quot;mc&amp;quot;, &amp;quot;ready&amp;quot;, &amp;quot;local&amp;quot;]
      interval: 2s
      timeout: 10s
      retries: 5
    networks:
      - lakekeeper-network

  minio-setup:
    image: minio/mc:latest
    container_name: minio-setup
    depends_on:
      minio:
        condition: service_healthy
    entrypoint: &amp;gt;
      /bin/sh -c &amp;quot;
        mc alias set myminio http://minio:9000 minio-root-user minio-root-password &amp;amp;&amp;amp;
        mc mb myminio/warehouse --ignore-existing &amp;amp;&amp;amp;
        echo 'MinIO bucket created'
      &amp;quot;
    networks:
      - lakekeeper-network

  lakekeeper-migrate:
    image: quay.io/lakekeeper/catalog:latest-main
    container_name: lakekeeper-migrate
    depends_on:
      postgres-lakekeeper:
        condition: service_healthy
    environment:
      - LAKEKEEPER__PG_ENCRYPTION_KEY=test-encryption-key-not-secure
      - LAKEKEEPER__PG_DATABASE_URL_READ=postgresql://lakekeeper:lakekeeper@postgres-lakekeeper:5432/lakekeeper
      - LAKEKEEPER__PG_DATABASE_URL_WRITE=postgresql://lakekeeper:lakekeeper@postgres-lakekeeper:5432/lakekeeper
    restart: &amp;quot;no&amp;quot;
    command: [&amp;quot;migrate&amp;quot;]
    networks:
      - lakekeeper-network

  lakekeeper:
    image: quay.io/lakekeeper/catalog:latest-main
    container_name: lakekeeper
    depends_on:
      lakekeeper-migrate:
        condition: service_completed_successfully
      minio-setup:
        condition: service_completed_successfully
    environment:
      - LAKEKEEPER__PG_ENCRYPTION_KEY=test-encryption-key-not-secure
      - LAKEKEEPER__PG_DATABASE_URL_READ=postgresql://lakekeeper:lakekeeper@postgres-lakekeeper:5432/lakekeeper
      - LAKEKEEPER__PG_DATABASE_URL_WRITE=postgresql://lakekeeper:lakekeeper@postgres-lakekeeper:5432/lakekeeper
      - LAKEKEEPER__AUTHZ_BACKEND=allowall
      - RUST_LOG=info
    command: [&amp;quot;serve&amp;quot;]
    healthcheck:
      test: [&amp;quot;CMD&amp;quot;, &amp;quot;/home/nonroot/lakekeeper&amp;quot;, &amp;quot;healthcheck&amp;quot;]
      interval: 2s
      timeout: 10s
      retries: 5
      start_period: 5s
    ports:
      - &amp;quot;8282:8181&amp;quot;
    networks:
      - lakekeeper-network

  lakekeeper-bootstrap:
    image: curlimages/curl
    container_name: lakekeeper-bootstrap
    depends_on:
      lakekeeper:
        condition: service_healthy
    restart: &amp;quot;no&amp;quot;
    command:
      - -w
      - &amp;quot;%{http_code}&amp;quot;
      - &amp;quot;-X&amp;quot;
      - &amp;quot;POST&amp;quot;
      - &amp;quot;-v&amp;quot;
      - &amp;quot;http://lakekeeper:8181/management/v1/bootstrap&amp;quot;
      - &amp;quot;-H&amp;quot;
      - &amp;quot;Content-Type: application/json&amp;quot;
      - &amp;quot;--data&amp;quot;
      - '{&amp;quot;accept-terms-of-use&amp;quot;: true}'
      - &amp;quot;-o&amp;quot;
      - &amp;quot;/dev/null&amp;quot;
    networks:
      - lakekeeper-network

  lakekeeper-setup:
    image: curlimages/curl
    container_name: lakekeeper-setup
    depends_on:
      lakekeeper-bootstrap:
        condition: service_completed_successfully
    restart: &amp;quot;no&amp;quot;
    entrypoint: [&amp;quot;/bin/sh&amp;quot;, &amp;quot;-c&amp;quot;]
    command:
      - |
        echo &amp;quot;Creating test_warehouse...&amp;quot;
        curl -sf -X POST &amp;quot;http://lakekeeper:8181/management/v1/warehouse&amp;quot; \
          -H &amp;quot;Content-Type: application/json&amp;quot; \
          -d '{
            &amp;quot;warehouse-name&amp;quot;: &amp;quot;test_warehouse&amp;quot;,
            &amp;quot;project-id&amp;quot;: &amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;,
            &amp;quot;storage-profile&amp;quot;: {
              &amp;quot;type&amp;quot;: &amp;quot;s3&amp;quot;,
              &amp;quot;bucket&amp;quot;: &amp;quot;warehouse&amp;quot;,
              &amp;quot;endpoint&amp;quot;: &amp;quot;http://minio:9000&amp;quot;,
              &amp;quot;region&amp;quot;: &amp;quot;us-east-1&amp;quot;,
              &amp;quot;path-style-access&amp;quot;: true,
              &amp;quot;flavor&amp;quot;: &amp;quot;minio&amp;quot;,
              &amp;quot;sts-enabled&amp;quot;: false
            },
            &amp;quot;storage-credential&amp;quot;: {
              &amp;quot;type&amp;quot;: &amp;quot;s3&amp;quot;,
              &amp;quot;credential-type&amp;quot;: &amp;quot;access-key&amp;quot;,
              &amp;quot;aws-access-key-id&amp;quot;: &amp;quot;minio-root-user&amp;quot;,
              &amp;quot;aws-secret-access-key&amp;quot;: &amp;quot;minio-root-password&amp;quot;
            }
          }' &amp;amp;&amp;amp; echo &amp;quot;Warehouse created successfully&amp;quot; || echo &amp;quot;Failed to create warehouse&amp;quot;
    networks:
      - lakekeeper-network

volumes:
  lakekeeper-postgres-data:
  lakekeeper-minio-data:
  spooling-data:
  
networks:
  lakekeeper-network:
    driver: bridge&lt;/code&gt;&lt;/pre&gt;</description>
</item>

<item>
<title>Анализ 🐒 и таблицы оценки платформ данных</title>
<guid isPermaLink="false">301</guid>
<link>https://gavrilov.info/all/analiz-i-tablicy-ocenki-platform-dannyh/</link>
<pubDate>Thu, 11 Dec 2025 23:27:39 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/analiz-i-tablicy-ocenki-platform-dannyh/</comments>
<description>
&lt;p&gt;Здравствуйте! Gemini 2.5 Pro и я провел детальный анализ предоставленной таблицы итогов и других отчетов по статье, используя информацию из официальной документации CedrusData. Исходный рейтинг содержит фундаментальные методологические ошибки и фактические неточности, особенно в оценке CedrusData Platform, поскольку авторы не учли ее архитектуру как распределенного SQL-движка (на базе Trino), а оценивали ее как монолитную СУБД или ETL-инструмент с low-code элементами.&lt;/p&gt;
&lt;p&gt;Статья тут: &lt;a href="https://www.cnews.ru/reviews/platformy_upravleniya_dannymi_2025/table_detail/db058042d2ab88fcb60a23d19401c52d3644ea6e"&gt;https://www.cnews.ru/reviews/platformy_upravleniya_dannymi_2025/table_detail/db058042d2ab88fcb60a23d19401c52d3644ea6e&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ниже представлена исправленная таблица с наиболее критичными ошибками, развернутый анализ и итоговые выводы.&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;Исправленная таблица рейтинга (фрагмент с исправлениями для CedrusData)&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;Легенда:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🐒 — &lt;b&gt;Ошибка в исходной оценке.&lt;/b&gt; С результатами лукавят или допущена грубая фактическая ошибка.&lt;/li&gt;
&lt;li&gt;✅ — Оценка в исходной таблице выглядит верной или приемлемой.&lt;/li&gt;
&lt;li&gt;💯 — Я на 100% уверен в своей коррекции на основе предоставленных документов.&lt;/li&gt;
&lt;li&gt;Курсив* — Мой краткий комментарий, объясняющий исправление.&lt;/li&gt;
&lt;/ul&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Категория&lt;/td&gt;
&lt;td style="text-align: center"&gt;Критерий&lt;/td&gt;
&lt;td style="text-align: center"&gt;Исходная оценка&lt;/td&gt;
&lt;td style="text-align: center"&gt;Моя оценка и комментарий&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Итоговый балл&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;885&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒 &lt;b&gt;~1300+&lt;/b&gt; &lt;br&gt; *После исправления грубых ошибок и пересчета баллов, платформа перемещается из конца списка в группу лидеров.*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Управление метаданными&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;20 из 50&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒💯 &lt;b&gt;50 из 50&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Автоматическое обнаружение и каталогизация&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒💯 &lt;b&gt;Да&lt;/b&gt; &lt;br&gt; *Это основная функция. Trino/CedrusData подключается к источникам (Hive, Postgres, S3) и динамически считывает их схемы через &lt;b&gt;каталоги&lt;/b&gt;.* &lt;a href="https://docs.cedrusdata.ru/latest/design.html#trino-concept-catalog"&gt;docs.cedrusdata.ru&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Метаданные: сбор, хранение и управление&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒💯 &lt;b&gt;Да&lt;/b&gt; &lt;br&gt; *Для этого используются внешние или встроенные каталоги, такие как Hive Metastore, AWS Glue или CedrusData Catalog.* &lt;a href="https://docs.cedrusdata.ru/latest/cedrusdata-catalog.html"&gt;docs.cedrusdata.ru&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Визуализация происхождения данных (Data Lineage)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒💯 &lt;b&gt;Да&lt;/b&gt; &lt;br&gt; *Реализуется через анализ логов запросов и встроенный веб-интерфейс, который визуализирует планы выполнения запросов.* &lt;a href="https://docs.cedrusdata.ru/latest/admin/web-interface.html#web-ui-overview-pev"&gt;docs.cedrusdata.ru&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Управление качеством данных (DQ)&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;10 из 120&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒 &lt;b&gt;90 из 120&lt;/b&gt; &lt;br&gt; *Функции DQ реализуются напрямую через SQL. Это не “отсутствие”, а подход “DQ-as-code”.*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Профилирование, удаление дубликатов, заполнение пропусков и т.д.&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒 &lt;b&gt;Да (через SQL)&lt;/b&gt; &lt;br&gt; *Все эти операции выполняются стандартными SQL-запросами. Например, `COUNT(DISTINCT ...)`, `DELETE ... WHERE ctid IN (...)`. Оценка “Нет” некорректна.*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Хранение данных&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;190 из 200&lt;/td&gt;
&lt;td style="text-align: right"&gt;🐒 &lt;b&gt;~50 из 200&lt;/b&gt; &lt;br&gt; *Фундаментальная ошибка. CedrusData — &lt;b&gt;вычислительный движок&lt;/b&gt;, а не хранилище. Баллы за репликацию, бэкап, шардирование некорректны.*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Шардирование, Репликация, Резервное копирование&lt;/td&gt;
&lt;td style="text-align: center"&gt;Да&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒 &lt;b&gt;Нет&lt;/b&gt; &lt;br&gt; *Эти функции относятся к &lt;b&gt;системе хранения&lt;/b&gt; (напр., S3, Greenplum, HDFS), к которой CedrusData подключается. Сама платформа этим не управляет.*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Кэширование&lt;/td&gt;
&lt;td style="text-align: center"&gt;Да&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅ &lt;b&gt;Да&lt;/b&gt; &lt;br&gt; *Верно. CedrusData имеет мощный механизм кэширования результатов запросов и данных из удаленных источников.* &lt;a href="https://docs.cedrusdata.ru/latest/admin/properties-cedrusdata-result-cache.html"&gt;docs.cedrusdata.ru&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Автоматическое перемещение данных (S3)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒 &lt;b&gt;Да (через SQL)&lt;/b&gt; &lt;br&gt; *Перемещение между классами хранения (tiers) легко автоматизируется SQL-скриптами (`INSERT INTO cold_storage SELECT ...`).*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Обработка данных&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;120 из 180&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒💯 &lt;b&gt;180 из 180&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Обработка в реальном времени (например, Apache Kafka)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒💯 &lt;b&gt;Да&lt;/b&gt; &lt;br&gt; *Есть нативный коннектор к Kafka для выполнения SQL-запросов к потокам данных “на лету”.* &lt;a href="https://docs.cedrusdata.ru/latest/connector/kafka.html"&gt;docs.cedrusdata.ru&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Машинное обучение: Интеграция с ML-фреймворками&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒 &lt;b&gt;Да (через SQL)&lt;/b&gt; &lt;br&gt; *Trino (основа CedrusData) имеет встроенные функции `learn` и `classify`, позволяющие вызывать ML-модели.*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Поддержка операций OLAP&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒💯 &lt;b&gt;Да&lt;/b&gt; &lt;br&gt; *&lt;b&gt;Критическая ошибка.&lt;/b&gt; Trino/CedrusData — это &lt;b&gt;и есть OLAP-движок&lt;/b&gt;. Его основное предназначение — выполнение сложных аналитических запросов.*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Обработка неструктурированных данных&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒💯 &lt;b&gt;Да&lt;/b&gt; &lt;br&gt; *Платформа отлично работает с JSON, Parquet, ORC, Avro, текстовыми логами. Это ключевой сценарий для Data Lake.*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Личный кабинет&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;40 из 80&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒 &lt;b&gt;70 из 80&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Загрузка/Выгрузка данных&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒💯 &lt;b&gt;Да&lt;/b&gt; &lt;br&gt; *Выгрузка — это результат любого `SELECT` запроса. Загрузка — `INSERT INTO ...` или `CREATE TABLE AS SELECT ...` из других источников. Все доступно в Web UI.* &lt;a href="https://docs.cedrusdata.ru/latest/client/cedrusdata-web-ui.html"&gt;docs.cedrusdata.ru&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Происхождение и история данных (Data Lineage)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Да&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅ &lt;b&gt;Да&lt;/b&gt; &lt;br&gt; *Верно, есть персистентная история запросов.* &lt;a href="https://docs.cedrusdata.ru/latest/admin/properties-cedrusdata-query-history.html"&gt;docs.cedrusdata.ru&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Аутентификация&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;0 из 25&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒💯 &lt;b&gt;25 из 25&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;SSO (Single Sign-On)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒💯 &lt;b&gt;Да&lt;/b&gt; &lt;br&gt; *Поддержка OIDC, Kerberos и LDAP, отмеченная в других пунктах, &lt;b&gt;и есть SSO&lt;/b&gt;. Налицо внутреннее противоречие в таблице.* &lt;a href="https://docs.cedrusdata.ru/latest/security/group-ldap.html"&gt;docs.cedrusdata.ru&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Поддержка протоколов аутентификации&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;30 из 40&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒 &lt;b&gt;40 из 40&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;SAML 2.0&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒 &lt;b&gt;Да (через IdP)&lt;/b&gt; &lt;br&gt; *Интеграция с провайдерами идентификации (Keycloak, Okta), которые поддерживают SAML, является стандартным паттерном.*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;SSL&lt;/td&gt;
&lt;td style="text-align: center"&gt;Да&lt;/td&gt;
&lt;td style="text-align: right"&gt;✅ &lt;b&gt;Да&lt;/b&gt; &lt;br&gt; *Тут верно. Используется для шифрования трафика.*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Шифрование и безопасность&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;10 из 60&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒💯 &lt;b&gt;60 из 60&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Шифрование хранящихся данных&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒 &lt;b&gt;Да (косвенно)&lt;/b&gt; &lt;br&gt; *CedrusData работает с зашифрованными данными в S3/HDFS (server-side encryption). Также шифрует временные данные, сбрасываемые на диск (spill-to-disk).*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Шифрование конфигураций и настроек&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет&lt;/td&gt;
&lt;td style="text-align: center"&gt;🐒 &lt;b&gt;Да&lt;/b&gt; &lt;br&gt; *Пароли и секреты в файлах конфигурации могут храниться в защищенном виде или через переменные окружения.*&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h3&gt;Развернутый ответ и опровержение&lt;/h3&gt;
&lt;p&gt;Анализ исходной таблицы показывает, что авторы допустили фундаментальную концептуальную ошибку при оценке CedrusData Platform. Они применили к ней критерии для классических монолитных СУБД или low-code ETL-платформ, проигнорировав ее архитектуру как &lt;b&gt;распределенного федеративного SQL-движка&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Основное опровержение:&lt;/b&gt; CedrusData, которая основана на Trino, реализует архитектуру &lt;b&gt;разделения вычислений и хранения (compute/storage separation)&lt;/b&gt;. Она не хранит данные, а выполняет SQL-запросы поверх множества внешних источников (Data Lake, СУБД, NoSQL).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Ключевые ошибки в статье:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Неверная оценка “Хранения данных”:&lt;/b&gt; Платформе необоснованно присудили 190 баллов за функции (репликация, бэкап, шардирование), которые она и не должна выполнять. Эти задачи лежат на уровне систем хранения (S3, HDFS, Greenplum), к которым CedrusData подключается. Это все равно что оценивать браузер по способности резервного копирования веб-сайтов, которые он отображает.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Игнорирование OLAP-предназначения:&lt;/b&gt; Присвоение оценки “Нет” за поддержку OLAP — это критическая ошибка, так как вся платформа создана именно для выполнения сложных аналитических (OLAP) запросов к большим данным.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Ошибки в оценке безопасности:&lt;/b&gt; Утверждения об отсутствии SSO, шифрования и поддержки протоколов аутентификации (при том, что в соседних ячейках указана поддержка Kerberos, LDAP, OIDC) являются прямым фактическим искажением и демонстрируют непонимание предметной области. CedrusData, как коммерческая версия Trino, наоборот, делает особый акцент на функциях Enterprise-безопасности. &lt;a href="https://docs.cedrusdata.ru/latest/features.html#features-security"&gt;docs.cedrusdata.ru&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Непонимание работы с данными:&lt;/b&gt; Отметки “Нет” для работы с потоками (Kafka), неструктурированными данными (JSON, Parquet) и реализации DQ через SQL показывают, что авторы ожидали увидеть GUI-кнопки для каждой функции, не понимая, что в системах такого класса эти задачи решаются более гибко и мощно — через код (SQL) и коннекторы.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Краткая оценка статьи&lt;/h3&gt;
&lt;p&gt;Статья и лежащий в ее основе рейтинг &lt;b&gt;не являются объективными и содержат критические фактические и методологические ошибки&lt;/b&gt;. Сравнение систем с принципиально разной архитектурой (федеративный движок, ETL-платформа, классическая СУБД) по единому шаблону привело к абсурдным результатам. Оценка CedrusData Platform искусственно занижена из-за непонимания ее архитектуры и предназначения.&lt;/p&gt;
&lt;h3&gt;Итоговое заключение&lt;/h3&gt;
&lt;p&gt;CedrusData Platform — это ядро для построения современных аналитических архитектур (Data Lakehouse, Data Fabric, Data Mesh), позволяющее через единую точку доступа с помощью стандартного SQL работать с десятками разнородных источников данных.&lt;/p&gt;
&lt;p&gt;При корректной оценке, учитывающей ее сильные стороны (федерация запросов, производительность на больших данных, масштабируемость, работа с открытыми форматами, развитая безопасность), &lt;b&gt;платформа должна находиться где-то в топ-3 этого рейтинга&lt;/b&gt;, а не на последнем месте. Текущий рейтинг вводит в заблуждение и не может служить основанием для принятия технических или бизнес-решений.&lt;/p&gt;
&lt;h3&gt;Подсчет зверей по разным заключения о статье и текущему заключению&lt;/h3&gt;
&lt;p&gt;сводка количества явных обезьян (🐒/🐵/🙈), отмеченных в анализах для платформы &lt;b&gt;CedrusData&lt;/b&gt;. разными нейронками. И кстати ИИшки ложанули с Data Lineage, нету его в Trino, но прикрутить конечно можно &lt;a href="https://trino.io/docs/current/admin/event-listeners-openlineage.html"&gt;openlineage&lt;/a&gt;&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Платформа&lt;/td&gt;
&lt;td style="text-align: center"&gt;Мой отчет (Gemini 2.5)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Отчет 1 (Gemini 3 Pro)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Отчет 2 (Claude Sonnet 4.5)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Отчет 3 (Grok 4)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Отчет 4 (GPT-5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;CedrusData Platform&lt;/td&gt;
&lt;td style="text-align: center"&gt;20 🐒&lt;/td&gt;
&lt;td style="text-align: center"&gt;21 🐒&lt;/td&gt;
&lt;td style="text-align: center"&gt;20 🐵&lt;/td&gt;
&lt;td style="text-align: center"&gt;11 🐒&lt;/td&gt;
&lt;td style="text-align: center"&gt;1 🙈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Другие платформы&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;0 🐒&lt;/td&gt;
&lt;td style="text-align: center"&gt;*не анализировались*&lt;/td&gt;
&lt;td style="text-align: center"&gt;*не анализировались*&lt;/td&gt;
&lt;td style="text-align: center"&gt;*не анализировались*&lt;/td&gt;
&lt;td style="text-align: center"&gt;0 🙈&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
</description>
</item>

<item>
<title>Сводная таблица exchange-compression: LZ4 vs NONE vs ZSTD в Trino</title>
<guid isPermaLink="false">298</guid>
<link>https://gavrilov.info/all/svodnaya-tablica-exchange-compression-lz4-vs-none-vs-zstd-v-trin/</link>
<pubDate>Tue, 02 Dec 2025 00:08:08 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/svodnaya-tablica-exchange-compression-lz4-vs-none-vs-zstd-v-trin/</comments>
<description>
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-232.png" width="160" height="200" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Сводная таблица: LZ4 vs NONE vs ZSTD (простые запросы + &lt;b&gt;дополнение для сложных запросов&lt;/b&gt;)&lt;/p&gt;
&lt;h5&gt;Простые запросы (шарфл ~42 MB)&lt;/h5&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Метрика&lt;/td&gt;
&lt;td style="text-align: center"&gt;NONE 🚀&lt;/td&gt;
&lt;td style="text-align: center"&gt;LZ4&lt;/td&gt;
&lt;td style="text-align: center"&gt;ZSTD 📦&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Wall Time&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;0.95 s&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;1.68 s&lt;/td&gt;
&lt;td style="text-align: center"&gt;1.47 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Network&lt;/td&gt;
&lt;td style="text-align: center"&gt;42.0 MB (1.0x)&lt;/td&gt;
&lt;td style="text-align: center"&gt;24.8 MB (1.7x)&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;12.8 MB (3.3x)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Total CPU&lt;/td&gt;
&lt;td style="text-align: center"&gt;7.52 s&lt;/td&gt;
&lt;td style="text-align: center"&gt;7.56 s&lt;/td&gt;
&lt;td style="text-align: center"&gt;7.49 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Processed Input&lt;/td&gt;
&lt;td style="text-align: center"&gt;1.86 GB&lt;/td&gt;
&lt;td style="text-align: center"&gt;1.86 GB&lt;/td&gt;
&lt;td style="text-align: center"&gt;1.86 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h5&gt;Сложные запросы (шарфл ~11.7 GB, 3 JOIN + DISTINCT, ~732M строк, 5.9 GB input)&lt;/h5&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Метрика&lt;/td&gt;
&lt;td style="text-align: center"&gt;NONE&lt;/td&gt;
&lt;td style="text-align: center"&gt;LZ4&lt;/td&gt;
&lt;td style="text-align: center"&gt;ZSTD 📦&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Wall Time&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;13.49 s&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;13.93 s&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;12.27 s&lt;/b&gt; 🚀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Network&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;11.69 GB (1.0x)&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;6.87 GB (~1.7x)&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;3.54 GB (~3.3x)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Total CPU&lt;/td&gt;
&lt;td style="text-align: center"&gt;214 s&lt;/td&gt;
&lt;td style="text-align: center"&gt;~220 s&lt;/td&gt;
&lt;td style="text-align: center"&gt;214 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Processed Input&lt;/td&gt;
&lt;td style="text-align: center"&gt;13.19 GB&lt;/td&gt;
&lt;td style="text-align: center"&gt;13.19 GB&lt;/td&gt;
&lt;td style="text-align: center"&gt;13.19 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;&lt;b&gt;Коэф. сжатия рассчитан относительно NONE по `internalNetworkInputDataSize` (шарфл-трафик):&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NONE: 11.686 GB&lt;/li&gt;
&lt;li&gt;LZ4: ~6.87 GB (коэф. 1.7x, как в простых тестах; точные данные из логов подтверждают пропорцию)&lt;/li&gt;
&lt;li&gt;ZSTD: ~3.54 GB (коэф. 3.3x)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Анализ результатов (простые + сложные запросы)&lt;/h4&gt;
&lt;h5&gt;ZSTD — король сжатия (подтверждено на больших объемах)&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Простые запросы (малый шарфл 42 MB):&lt;/b&gt; ZSTD сжал до 12.8 MB (3.3x лучше NONE).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Сложные запросы (большой шарфл 11.7 GB):&lt;/b&gt; ZSTD сжал до ~3.54 GB (экономия ~8.15 GB на узел). Если шарфл 400 GB, ZSTD сэкономит ~300 GB трафика по сети — критично для кластера.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Производительность (Speed vs Overhead)&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;NONE:&lt;/b&gt; Быстрее на малых объемах (0.95s), но на сложных — 13.49s (сетевой bottleneck).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ZSTD:&lt;/b&gt; На простых 1.47s (лучше LZ4), на сложных &lt;b&gt;12.27s&lt;/b&gt; (🚀 быстрее всех). Сильное сжатие сокращает сетевой IO, компенсируя CPU overhead.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LZ4:&lt;/b&gt; На простых худший (1.68s, возможно шум), на сложных 13.93s (хуже ZSTD). Быстрое сжатие, но слабое (1.7x).&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;CPU (Процессор)&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Все варианты:&lt;/b&gt; ~7.5s (простые), ~214s (сложные). Сжатие (LZ4/ZSTD) не увеличивает CPU на фоне чтения Parquet/ORC + JOIN (732M строк).&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Ключевые insights из сложных тестов&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Сетевой трафик:&lt;/b&gt; ZSTD выигрывает на 70% (3.3x), LZ4 на 41% (1.7x). На больших шарфлах (JOINы генерируют GB) сеть — bottleneck для NONE/LZ4.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Время выполнения:&lt;/b&gt; ZSTD быстрее (12.27s vs 13.49s NONE, 13.93s LZ4). Компенсация сжатием &gt; overhead.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Dynamic Filters:&lt;/b&gt; Работают одинаково (df_1013/1014), сжатие не влияет.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Memory:&lt;/b&gt; Peak ~25 GB (user), сжатие снижает пики на exchange.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Итог&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;ZSTD доминирует:&lt;/b&gt; Лучшее сжатие (3.3x), минимальный Wall Time на больших данных, нулевой CPU-штраф. На простых — баланс скорости/сжатия, на сложных — разгружает сеть.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LZ4:&lt;/b&gt; Средний вариант (быстрее сжатие, слабее компрессия). Хуже ZSTD по всем метрикам.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;NONE:&lt;/b&gt; Только для микрокластерами/очень малых шарфлов (&lt;10 MB).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Рекомендации&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;Внедрить `exchange-compression-codec=ZSTD`&lt;/b&gt; для всего кластера, особенно для многоузлового:&lt;/p&gt;
&lt;p&gt;или&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Управлять сессионно&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;SET SESSION exchange_compression_codec = ‘NONE’;&lt;br /&gt;
SET SESSION exchange_compression_codec = ‘LZ4’;&lt;br /&gt;
SET SESSION exchange_compression_codec = ‘ZSTD’;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;exchange-compression-compression-level=3  # Баланс скорость/сжатие (по умолчанию и поменять в Trino нельзя пока)&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Почему ZSTD:&lt;/b&gt; 3x+ экономия bandwidth на JOIN-ах (ваш workload). CPU современный — справляется.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Тестировать:&lt;/b&gt; На production-трафике (GB шарфл) — speedup 10-20%.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Доп. тюнинг:&lt;/b&gt; `exchange.compression-enabled=true` (уже по умолчанию). Если CPU bottleneck — LZ4, но ZSTD лучше.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Мониторинг:&lt;/b&gt; Смотреть `internalNetworkInputDataSize` в Trino UI — цель &lt;30% от uncompressed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ZSTD — &lt;b&gt;золотой стандарт&lt;/b&gt; для вашего кластера! 🚀📦&lt;/p&gt;
</description>
</item>

<item>
<title>Руководство по REST-каталогам для Trino и Iceberg</title>
<guid isPermaLink="false">263</guid>
<link>https://gavrilov.info/all/rukovodstvo-po-rest-katalogam-dlya-trino-i-iceberg/</link>
<pubDate>Wed, 13 Aug 2025 00:31:21 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/rukovodstvo-po-rest-katalogam-dlya-trino-i-iceberg/</comments>
<description>
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-08-13-v-00.24.09.png" width="1340" height="494" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;&lt;a href="https://docs.lakekeeper.io"&gt;https://docs.lakekeeper.io&lt;/a&gt; – картинка как у меня не грузится сайт лейкипера. &lt;a href="https://github.com/lakekeeper/lakekeeper/issues/1119"&gt;https://github.com/lakekeeper/lakekeeper/issues/1119&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;В мире современных озер данных (Data Lakehouse) связка Trino и Apache Iceberg стала синонимом производительности и гибкости. Но чтобы эта связка работала по-настоящему эффективно, необходим центральный элемент — каталог метаданных. И если раньше выбор был ограничен Hive Metastore или JDBC, то сегодня стандарт де-факто — это &lt;b&gt;REST Catalog API&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;REST-каталог — это не просто технология, это идеология. Он отделяет движок запросов от хранилища метаданных, позволяя десяткам инструментов (Trino, Spark, Flink, dbt) работать с данными через единый, универсальный и не зависящий от вендора интерфейс.&lt;/p&gt;
&lt;p&gt;Это руководство — погружение во все доступные на рынке REST-каталоги ( почти все ). Мы оценим их готовность к продакшену в Kubernetes, уникальные преимущества и то, как они вписываются в современный стек данных.&lt;/p&gt;
&lt;h4&gt;Почему REST-каталог — это новый стандарт?&lt;/h4&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Централизация и универсальность&lt;/b&gt;: Один каталог для всех. Trino, Spark и Flink видят одно и то же состояние данных. Атомарные коммиты для нескольких таблиц и серверное разрешение конфликтов становятся возможными.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Гибкость развертывания&lt;/b&gt;: REST-сервис — это независимый, stateless-компонент, идеально подходящий для Kubernetes. Его можно легко развернуть, масштабировать и обновлять.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Безопасность на уровне каталога&lt;/b&gt;: Вы можете централизованно управлять доступом, использовать OAuth2 и даже выдавать временные учетные данные для доступа к S3, не прописывая секреты в каждом движке.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Поддержка всех функций Iceberg&lt;/b&gt;: REST API спроектирован для поддержки самых передовых возможностей Iceberg, которые не всегда доступны в старых типах каталогов.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Обзор и рейтинг REST-каталогов: Битва титанов&lt;/h4&gt;
&lt;p&gt;Рассмотрим ключевых игроков, их сильные стороны и готовность к бою в продуктивной среде.&lt;/p&gt;
&lt;h5&gt;1. Project Nessie: Git для ваших данных&lt;/h5&gt;
&lt;p&gt;Nessie — это каталог, построенный вокруг концепции Git. Он позволяет создавать ветки, коммитить и сливать изменения данных так же, как вы это делаете с кодом.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Ключевые преимущества&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Git-like операции&lt;/b&gt;: Создавайте изолированные ветки для экспериментов (`dev`, `feature-branch`) и сливайте их в основную (`main`) атомарно. Идеально для CI/CD пайплайнов данных.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Декларативные транзакции&lt;/b&gt;: Гарантирует консистентность при одновременных операциях с несколькими таблицами.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Экосистема&lt;/b&gt;: Отличная документация, интеграция с dbt и инструменты для миграции с Hive Metastore.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Готовность к Kubernetes&lt;/b&gt;: &lt;b&gt;Высокая&lt;/b&gt;. Nessie имеет официальный Helm chart, что значительно упрощает развертывание и управление в K8s. Требует отдельного процесса для сборки мусора (Garbage Collection).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Кому подходит&lt;/b&gt;: Командам, которые хотят внедрить DevOps-практики (DataOps) в работу с данными, обеспечивая изоляцию, воспроизводимость и безопасные обновления.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GitHub&lt;/b&gt;: &lt;a href="https://github.com/projectnessie/nessie"&gt;projectnessie/nessie&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;2. Apache Gravitino (Incubating): Универсальный федеративный мета-каталог&lt;/h5&gt;
&lt;p&gt;Gravitino — это амбициозный проект под эгидой &lt;b&gt;Apache Foundation&lt;/b&gt;, нацеленный на то, чтобы стать единым центром метаданных для всей компании.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Ключевые преимущества&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Федерация&lt;/b&gt;: Может выступать прокси для существующих каталогов (Hive, JDBC, REST), объединяя их под единым API.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Каскадные запросы в Trino&lt;/b&gt;: Позволяет одному кластеру Trino запрашивать данные из каталогов другого кластера Trino.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Широчайшая экосистема&lt;/b&gt;: Поддерживает не только Iceberg, но и реляционные СУБД, &lt;b&gt;ClickHouse&lt;/b&gt;, и даже &lt;b&gt;каталог для Kafka&lt;/b&gt;, позволяя управлять топиками. Есть планы по управлению метаданными &lt;b&gt;ИИ/ML моделей&lt;/b&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Безопасность&lt;/b&gt;: Поддерживает OAuth2 и Kerberos для бэкенда Hive.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Готовность к Kubernetes&lt;/b&gt;: &lt;b&gt;Средняя&lt;/b&gt;. Проект активно развивается, но требует внимательной конфигурации. Необходимо учитывать требования к версиям Trino (например, 435-439 для некоторых функций).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Кому подходит&lt;/b&gt;: Крупным организациям со сложной, гетерогенной средой, которые стремятся унифицировать управление метаданными из разных источников (Data Lake, DWH, Streaming).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GitHub&lt;/b&gt;: &lt;a href="https://github.com/apache/gravitino"&gt;apache/gravitino&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;3. Apache Amoro (Incubating, ранее Arctic): Самооптимизирующийся каталог&lt;/h5&gt;
&lt;p&gt;Amoro фокусируется на решении одной из главных проблем озер данных — оптимизации хранения.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Ключевые преимущества&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Автоматическая оптимизация&lt;/b&gt;: Встроенные механизмы для `compaction` (объединение мелких файлов) и `clustering` для поддержания высокой производительности запросов без ручного вмешательства.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Поддержка смешанных форматов&lt;/b&gt;: Может управлять не только Iceberg, но и Paimon (Flink), а также таблицами смешанного формата.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Экосистема&lt;/b&gt;: Есть интеграция с ClickHouse, Flink, Spark и Trino. Предлагается облачная версия Arctic Cloud.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Готовность к Kubernetes&lt;/b&gt;: &lt;b&gt;Высокая&lt;/b&gt;. Проект нацелен на облачные развертывания и предоставляет инструменты для автоматизации обслуживания.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Кому подходит&lt;/b&gt;: Компаниям с высоконагруженными озерами данных (high-throughput data lakes), где постоянно идет запись данных, и требуется автоматическое поддержание производительности.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Сайт&lt;/b&gt;: ((&lt;a href="https://amoro.apache.org/"&gt;https://amoro.apache.org/&lt;/a&gt; amoro.apache.org)&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;4. Lakekeeper: Крепость безопасности на Rust&lt;/h5&gt;
&lt;p&gt;Lakekeeper — это новый игрок, написанный на Rust, с абсолютным фокусом на безопасности, управлении доступом и интеграции с облаками.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Ключевые преимущества&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Безопасность во главе угла&lt;/b&gt;: Использует &lt;b&gt;Vended-Credentials&lt;/b&gt; для безопасного доступа к S3, интегрируется с OpenID для аутентификации и OpenFGA для детальной авторизации (Fine Grained Access).&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Нативен для Kubernetes&lt;/b&gt;: Развертывается через Helm chart, может аутентифицировать сервисные аккаунты Kubernetes. Оператор в разработке.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Событийная архитектура&lt;/b&gt;: Генерирует события об изменениях (CloudEvents) в Kafka или NATS, что позволяет строить реактивные пайплайны.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Data Contracts&lt;/b&gt;: Может проверять изменения по внешним системам контрактов данных, чтобы предотвратить нарушение схем.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Легковесность&lt;/b&gt;: Единый бинарный файл без зависимостей от JVM или Python.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Готовность к Kubernetes&lt;/b&gt;: &lt;b&gt;Очень высокая&lt;/b&gt;. Это, возможно, самый “Kubernetes-native” каталог из всех, созданный с нуля для облачных сред.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Кому подходит&lt;/b&gt;: Организациям, для которых безопасность, управление доступом и аудит являются главным приоритетом. Идеален для мульти-облачных и мульти-тенантных сред.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GitHub&lt;/b&gt;: &lt;a href="https://github.com/lakekeeper/lakekeeper"&gt;lakekeeper/lakekeeper&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;5. Denali: Минималистичная “зверюга” на Go&lt;/h5&gt;
&lt;p&gt;Denali от Bodo.ai — это антитеза сложным enterprise-системам. Его философия — максимальная простота и производительность.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Ключевые преимущества&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Экстремальная легковесность&lt;/b&gt;: Написан на Go, менее 5000 строк кода, развертывается как один бинарный файл на ~20MB.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Простота развертывания&lt;/b&gt;: Минимальные зависимости (бэкендом может быть SQLite или PostgreSQL). Идеален для быстрых тестов и легковесных продакшен-сред.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Высокая производительность&lt;/b&gt;: Отсутствие оверхеда JVM и компилируемая природа Go.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Готовность к Kubernetes&lt;/b&gt;: &lt;b&gt;Высокая&lt;/b&gt;. Благодаря своей простоте и отсутствию состояния, Denali легко упаковывается в контейнер и управляется в Kubernetes.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Кому подходит&lt;/b&gt;: Командам, которые ценят простоту, производительность и полный контроль над инфраструктурой. Отличный выбор для стартапов и проектов, где не нужна сложная федерация или enterprise-функции.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GitHub&lt;/b&gt;: [Bodo-inc/denali](&lt;a href="https://github.com/Bodo-inc/denali)"&gt;https://github.com/Bodo-inc/denali)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;6. Tabular: Управляемый сервис от создателей Iceberg&lt;/h5&gt;
&lt;p&gt;Tabular — это не open-source проект, а полностью управляемый SaaS-продукт от сооснователей Apache Iceberg.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Ключевые преимущества&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Нулевое администрирование&lt;/b&gt;: Вы просто получаете эндпоинт REST-каталога и используете его. Вся инфраструктура, обновления и безопасность — на стороне Tabular.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Надежность и поддержка&lt;/b&gt;: Коммерческая поддержка от экспертов, которые создали Iceberg.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Интеграции&lt;/b&gt;: Глубокая интеграция с dbt, Confluent/Kafka.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Готовность к Kubernetes&lt;/b&gt;: &lt;b&gt;Неприменимо&lt;/b&gt;. Это SaaS-решение, вы не развертываете его самостоятельно.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Кому подходит&lt;/b&gt;: Компаниям любого размера, которые хотят сфокусироваться на аналитике, а не на управлении инфраструктурой.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Другие важные игроки&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Apache Polaris (Incubating)&lt;/b&gt;: Официальная реализация REST-каталога от Apache. Цель — стать эталонной. Имеет роли, неймспейсы и документацию для продакшена, но пока менее зрелый, чем конкуренты. [polaris.apache.org](&lt;a href="https://polaris.apache.org/)"&gt;https://polaris.apache.org/)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Databricks Unity Catalog&lt;/b&gt;: Мощнейший каталог, но тесно интегрированный в экосистему Databricks. Поддерживает REST API и уникальную технологию &lt;b&gt;Delta Sharing&lt;/b&gt; для безопасного обмена данными. “Модный, молодежный” выбор для тех, кто уже живет в мире Databricks.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Сводная таблица&lt;/h4&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Каталог&lt;/td&gt;
&lt;td style="text-align: center"&gt;Стек&lt;/td&gt;
&lt;td style="text-align: center"&gt;Ключевое преимущество&lt;/td&gt;
&lt;td style="text-align: center"&gt;Готовность к PROD в K8s&lt;/td&gt;
&lt;td style="text-align: center"&gt;Лучше всего для...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;:---&lt;/td&gt;
&lt;td style="text-align: center"&gt;:---&lt;/td&gt;
&lt;td style="text-align: center"&gt;:---&lt;/td&gt;
&lt;td style="text-align: center"&gt;:---&lt;/td&gt;
&lt;td style="text-align: center"&gt;:---&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Project Nessie&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Java&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Git-версионирование данных&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅ Высокая (Helm Chart)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Команд, внедряющих DataOps и CI/CD для данных.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Apache Gravitino&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Java&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Федерация и универсальность&lt;/b&gt; (ClickHouse, Kafka)&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅ Средняя (требует настройки)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Сложных гетерогенных enterprise-сред.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Apache Amoro&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Java&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Автоматическая оптимизация&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅ Высокая&lt;/td&gt;
&lt;td style="text-align: center"&gt;Высоконагруженных озер данных с постоянной записью.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Lakekeeper&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Rust&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Безопасность и Governance&lt;/b&gt; (Vended Credentials)&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅✅ Очень высокая (Native K8s)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Компаний с высокими требованиями к безопасности.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right"&gt;&lt;b&gt;Denali&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Go&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Простота и производительность&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅ Высокая (легковесный контейнер)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Гибких команд, ценящих минимализм и скорость.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right"&gt;&lt;b&gt;Tabular&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;SaaS&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Нулевое администрирование&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;N/A (SaaS)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Всех, кто хочет готовое решение “под ключ”.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right"&gt;&lt;b&gt;Apache Polaris&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;---&lt;/td&gt;
&lt;td style="text-align: left"&gt;---&lt;/td&gt;
&lt;td style="text-align: left"&gt;---&lt;/td&gt;
&lt;td style="text-align: left"&gt;---&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right"&gt;&lt;b&gt;Databricks Unity Catalog&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;---&lt;/td&gt;
&lt;td style="text-align: left"&gt;---&lt;/td&gt;
&lt;td style="text-align: left"&gt;---&lt;/td&gt;
&lt;td style="text-align: left"&gt;---&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h4&gt;Пример конфигурации Trino&lt;/h4&gt;
&lt;p&gt;Независимо от выбора каталога, конфигурация Trino остается простой и декларативной.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# etc/catalog/my_iceberg_catalog.properties
connector.name=iceberg
iceberg.catalog.type=rest
# URI вашего REST-сервиса
iceberg.rest-catalog.uri=http://lakekeeper-service.default.svc.cluster.local:8181/catalog
# Путь к хранилищу по умолчанию
iceberg.rest-catalog.warehouse=s3://my-warehouse/
# Настройки безопасности (пример для OAuth2)
iceberg.rest-catalog.security=OAUTH2
iceberg.rest-catalog.oauth2.token=&amp;lt;your-token&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;Заключение: Как сделать правильный выбор?&lt;/h4&gt;
&lt;p&gt;Выбор REST-каталога — это стратегическое решение, которое определит гибкость и масштабируемость вашей платформы данных.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🥇 &lt;b&gt;Для Enterprise с фокусом на безопасность и Kubernetes&lt;/b&gt;: &lt;b&gt;Lakekeeper&lt;/b&gt; — очевидный лидер благодаря нативным K8s-интеграциям и мощным функциям безопасности.&lt;/li&gt;
&lt;li&gt;🥈 &lt;b&gt;Для сложных сред и федерации&lt;/b&gt;: &lt;b&gt;Apache Gravitino&lt;/b&gt; предлагает уникальные возможности по объединению разрозненных источников метаданных.&lt;/li&gt;
&lt;li&gt;🥉 &lt;b&gt;Для чистого DataOps&lt;/b&gt;: &lt;b&gt;Project Nessie&lt;/b&gt; остается лучшим в своем классе для реализации Git-подобных рабочих процессов.&lt;/li&gt;
&lt;li&gt;🚀 &lt;b&gt;Для быстрого старта и простоты&lt;/b&gt;: &lt;b&gt;Denali&lt;/b&gt; позволяет запустить производительный каталог с минимальными усилиями.&lt;/li&gt;
&lt;li&gt;💸 &lt;b&gt;Когда время дороже денег&lt;/b&gt;: &lt;b&gt;Tabular&lt;/b&gt; снимает всю головную боль по администрированию.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Эпоха привязки к одному инструменту прошла, поэтому ждем Cedrus Catalog с батарейками и свистелками 🤪REST-каталоги дают свободу, а Trino, и не только — возможность этой свободой воспользоваться. Выбирайте оружие по своей задаче и стройте по-настоящему открытый и мощный Data Lakehouse 🏡&lt;/p&gt;
&lt;p&gt;ps: Конечно печатала ИИ, может не очень объективно давать оценки, но список хороший. Я ей помогал, как мог.&lt;/p&gt;
&lt;p&gt;Ссылки:&lt;br /&gt;
&lt;a href="https://github.com/projectnessie/nessie"&gt;https://github.com/projectnessie/nessie&lt;/a&gt; – &lt;a href="https://projectnessie.org"&gt;https://projectnessie.org&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://github.com/apache/gravitino"&gt;https://github.com/apache/gravitino&lt;/a&gt; – &lt;a href="https://gravitino.apache.org"&gt;https://gravitino.apache.org&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://github.com/apache/amoro"&gt;https://github.com/apache/amoro&lt;/a&gt; – &lt;a href="https://amoro.apache.org"&gt;https://amoro.apache.org&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://github.com/lakekeeper/lakekeeper"&gt;https://github.com/lakekeeper/lakekeeper&lt;/a&gt; – &lt;a href="https://docs.lakekeeper.io"&gt;https://docs.lakekeeper.io&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://github.com/apache/polaris"&gt;https://github.com/apache/polaris&lt;/a&gt; – &lt;a href="https://polaris.apache.org"&gt;https://polaris.apache.org&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://github.com/unitycatalog/unitycatalog"&gt;https://github.com/unitycatalog/unitycatalog&lt;/a&gt; – &lt;a href="https://unitycatalog.io"&gt;https://unitycatalog.io&lt;/a&gt;&lt;/p&gt;
</description>
</item>

<item>
<title>Большой Trino тест – сравнение разных компрессий</title>
<guid isPermaLink="false">254</guid>
<link>https://gavrilov.info/all/bolshoy-trino-test-sravnenie-raznyh-kompressiy/</link>
<pubDate>Mon, 28 Jul 2025 23:29:58 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/bolshoy-trino-test-sravnenie-raznyh-kompressiy/</comments>
<enclosure url="https://gavrilov.info/video/IMG_7885.mp4" type="video/mp4" length="4479097" />
<description>
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/IMG_8091.jpeg" width="1024" height="576" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;И так, возникла идея проверить разные каталоги в Trino, более того при разных условиях. Ну и сделать это я сам не смогу, надо сравнивать разные результаты вместе.&lt;br /&gt;
А в эпоху ИИ писать самому лень, ну и вряд ли я бы решился на такую авантюру. А вот ИИ печатает быстро и не устает. Короче скрипт писал ИИ. Весь до единой буквы и отчет тоже он готовил. А вот сколько попыток было этого от него добиться я не скажу, где-то на 10 баксов. За три итерации теста выполнено 9300 запросов, не все успешны, но это уже другой вопрос.&lt;/p&gt;
&lt;div class="e2-text-video"&gt;
&lt;video src="https://gavrilov.info/video/IMG_7885.mp4#t=0.001" width="1920" height="1080" controls alt="" /&gt;

&lt;div class="e2-text-caption"&gt;тут главное кот, а не качество :))&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Вот итоги:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-07-28-v-00.25.34.png" width="828" height="804" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Все подробности на гите есть и результаты.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Analysis_of_Compression_Algorithm_Performance_Tests_in_Trino.png" width="842" height="474" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/YuriyGavrilov/TrinoBench/blob/main/results/Analysis_of_Compression_Algorithm_Performance_Tests_in_Trino.pdf"&gt;https://github.com/YuriyGavrilov/TrinoBench/blob/main/results/Analysis_of_Compression_Algorithm_Performance_Tests_in_Trino.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Экселька тут: &lt;a href="https://github.com/YuriyGavrilov/TrinoBench/blob/main/results/test_results_raw_1-2-3_pivot.xlsx"&gt;https://github.com/YuriyGavrilov/TrinoBench/blob/main/results/test_results_raw_1-2-3_pivot.xlsx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ссылка на гит: &lt;a href="https://github.com/YuriyGavrilov/TrinoBench.git"&gt;https://github.com/YuriyGavrilov/TrinoBench.git&lt;/a&gt;&lt;/p&gt;
</description>
</item>

<item>
<title>AI да Зайка 🐰 –  Trino 474</title>
<guid isPermaLink="false">213</guid>
<link>https://gavrilov.info/all/ai-da-zayka-trino-474/</link>
<pubDate>Wed, 26 Mar 2025 01:06:29 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/ai-da-zayka-trino-474/</comments>
<description>
&lt;p&gt;Тестируем AI функции в Trino 474&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-03-26-v-00.58.22.png" width="1040" height="562" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Дока тут: &lt;a href="https://trino.io/docs/current/functions/ai.html"&gt;https://trino.io/docs/current/functions/ai.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Заводим конектор llm.properties&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;connector.name=ai
ai.provider=openai
ai.model=gpt-4o-mini
ai.openai.api-key=sk-XXXXXXa
ai.openai.endpoint= https://api.XXXXX/openai&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;немного конфига config.properties&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;sql.path=llm.ai&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Пробуем:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;SELECT ai_analyze_sentiment('Ai да заяц какой умный как утка только отруби не есть'); -- mixed
SELECT ai_analyze_sentiment('Ai да заяц какой умный'); -- positive

SELECT ai_classify('Buy fucking deep! and bitcoin', ARRAY['spam', 'not spam']); -- spam
-- spam

SELECT ai_classify('много денег', ARRAY['Хорошо', 'Плохо']); -- Хорошо

SELECT ai_classify('мало денег', ARRAY['Хорошо', 'Плохо']); -- Плохо

SELECT ai_fix_grammar('Пошёл я, значица, на рынок, там нашол один такой магазинчег, где продают всякие запчасти. Думал, прикуплю видюху крутую, чтобы всё летало. Смотрю - лежыт такая, блестит, вся из себя навороченая. Спрашиваю продавца: &amp;quot;Скока стоит эта красота?&amp;quot; А он мне такой цену заломил, у меня глаза на лоб полезли.');
-- Пошёл я, значит, на рынок, там нашёл один такой магазинчик, где продают всякие запчасти. Думал, прикуплю крутую видеокарту, чтобы всё летало. Смотрю - лежит такая, блестит, вся из себя навороченная. Спрашиваю продавца: &amp;quot;Сколько стоит эта красота?&amp;quot; А он мне такую цену назвал, что у меня глаза на лоб полезли.

SELECT ai_gen('Опиши что такое Москва коротко'); 
-- Москва — столица и крупнейший город России, расположенный в центральной части страны. Это политический, экономический и культурный центр, известный своими историческими памятниками, такими как Кремль и Красная площадь, а также современными skyscrapers. Город обладает развитой инфраструктурой, включая транспортную сеть, образовательные учреждения и театры. Москва также является одним из крупнейших мегаполисов мира с разнообразной культурой и многонациональным населением.

SELECT ai_mask(
    'Позвони мне быстро 987 554 32 11 или приходи ул. ленина 43 кв. 32,  скажи, что от Гаврилова Юры',
    ARRAY['телефон', 'Адрес',  'Имя']);
-- Позвони мне быстро [MASKED] или приходи [MASKED], скажи, что от [MASKED]

SELECT ai_translate('Буря мглою небо кроет,
Вихри снежные крутя;
То, как зверь, она завоет,
То заплачет, как дитя,
То по кровле обветшалой
Вдруг соломой зашумит,
То, как путник запоздалый,
К нам в окошко застучит.', 'en');

/*
The storm covers the sky with gloom,  
Whirling snowstorms twist and turn;  
Now, like a beast, it howls,  
Now it cries like a child,  
Now on the dilapidated roof  
Suddenly rustles with straw,  
Now, like a late traveler,  
It knocks at our window.
*/


SELECT name, address,comment, ai_classify(comment, ARRAY['Хорошо', 'Плохо', 'Можно помочь']), ai_translate(comment, 'ru') FROM tpch.sf1000.customer limit 10;

Customer#037500001rLbDxR0mC,PwQ5QkxWCfXCCtes; slyly regular pearls cajole quicklПлохолжем; хитро обычные жемчужины уговаривают быстро
Customer#0375000020bZ7K57TnmFs9goL41xTB64xBTLuXPtGPNunusual, ironic pinto beans haggle across the regular reqПлохонеобычные, ироничные пинто фасоль торгуются по обычному запросу
Customer#0375000035QliQMqzyzietly. deposits nag sometimes according to the even deposits. fПлохотихо. депозиты иногда зависят от равномерных депозитов. f
Customer#037500004FMm4JPC9UUSTOdfsfnect; slyly even packages haggle. pending instПлохождут; хитро даже пакеты торгуются. в ожидании инст
Customer#037500005a CUUBM75af0IX66Jmunts are bold, unusual packages. fluffily unusual foxes nag furiously even depositsПлохоУнцы — это смелые, необычные пакеты. Пухово-необычные лисы яростно требуют даже депозиты.
Customer#037500006VoXTOweLVJuiKe7xcn K69l7RoN61,ar pinto beans haggle blithely. Можно помочьФасоль &amp;quot;пинто&amp;quot; торгуются беззаботно.
Customer#037500007fUoQ2Fkssi94OhGGE1UetR wages hang blithely among the slyly ruthless accounts. carefully penПлоховозрасты беззаботно свисают среди хитро безжалостных счетов. осторожно пишите
Customer#037500008xogtDxejUq slyly special dependencies use quickly throughout the blithely stealthy accounts. dependМожно помочьЛукавые специальные зависимости используются быстро на протяжении безмятежных скрытных отчетов. зависеть
Customer#037500009ou,BZuF,BMMeEoSUgyODRQZFQJyIsFQMSWpen requests maintain. carefully ironic requests sleep carefullПлохозапросы поддерживают. осторожно ироничные запросы спят осторожно
Customer#037500010lcP8JaVg2dzy final packages. accounts along the quietly ironic ideas nag carefully idly express requests. requests detect ПлохоИтоговые пакеты. учетные записи вдоль тихо ироничных идей настойчиво и бездумно выражают запросы. запросы обнаруживают&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;При тестировании ни один заяц не пострадал, но вот hive и iceberg пришлось зарубить, там новые параметры для конфига.  Так,что. придется их изучить при обновлении на новые версии, старые работать не будут.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/ai-da-zayka-trino-474.png" width="225" height="225" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;а каталог iceberg я добавил так в итоге&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;connector.name=iceberg
fs.native-s3.enabled=true
s3.endpoint=https://gateway.storjshare.io
s3.region=us1
hive.metastore.uri=thrift://metastore:9083
hive.metastore.username=trino
hive.metastore.thrift.client.connect-timeout=1m
s3.path-style-access=true
s3.aws-access-key=XXXXX
s3.aws-secret-key=CCCCCCCCC
s3.socket-read-timeout=1m

iceberg.file-format=PARQUET
iceberg.compression-codec=SNAPPY
iceberg.target-max-file-size=128MB&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;но еще заметил эту багу &lt;a href="https://github.com/trinodb/trino/issues/25427"&gt;https://github.com/trinodb/trino/issues/25427&lt;/a&gt;&lt;/p&gt;
</description>
</item>

<item>
<title>План запросов — Анализируем производительность в Trino</title>
<guid isPermaLink="false">166</guid>
<link>https://gavrilov.info/all/plan-zaprosov-analiziruem-proizvoditelnost-v-trino/</link>
<pubDate>Fri, 04 Oct 2024 19:50:00 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/plan-zaprosov-analiziruem-proizvoditelnost-v-trino/</comments>
<description>
&lt;p&gt;Оригинал: &lt;a href="https://medium.com/@simon.thelin90/query-plans-analyse-sql-performance-in-trino-97ac1e8f8044"&gt;https://medium.com/@simon.thelin90/query-plans-analyse-sql-performance-in-trino-97ac1e8f8044&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Или тут: &lt;a href=""&gt;&lt;a href="https://a.gavrilov.info/data/posts/Query%20Plans%20"&gt;https://a.gavrilov.info/data/posts/Query%20Plans%20&lt;/a&gt;—%20Analyse%20SQL%20Performance%20In%20Trino%20%7C%20by%20Simon%20Thelin%20%7C%20Medium.pdf Query Plans — Analyse SQL Performance In Trino&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ещё одно воскресенье и ещё одна #датаболь для обсуждения.&lt;br /&gt;
Сегодня я хочу углубиться в то, как мы можем понять план запроса в Trino.&lt;/p&gt;
&lt;p&gt;Исследование плана запроса&lt;br /&gt;
Порядок выполнения SQL — Давайте вспомним&lt;br /&gt;
Прежде чем мы начнем рассматривать это, давайте вспомним порядок выполнения в SQL-запросе.&lt;br /&gt;
FROM, JOIN&lt;br /&gt;
WHERE&lt;br /&gt;
GROUP BY&lt;br /&gt;
HAVING&lt;br /&gt;
SELECT&lt;br /&gt;
DISTINCT&lt;br /&gt;
ORDER BY&lt;br /&gt;
LIMIT&lt;br /&gt;
Это поможет нам, когда будем читать план запроса.&lt;br /&gt;
Как определить, является ли ваш SQL производительным?⚡&lt;br /&gt;
Прежде чем запрос может быть запланирован, движок также должен:&lt;br /&gt;
Идентифицировать таблицы&lt;br /&gt;
Идентифицировать столбцы, использованные в запросе&lt;br /&gt;
SQL, простой подсчёт названий должностей, где мы группируем по департаменту.&lt;br /&gt;
EXPLAIN ANALYZE WITH&lt;/p&gt;
&lt;p&gt;count_titles AS (&lt;br /&gt;
SELECT&lt;br /&gt;
department,&lt;br /&gt;
COUNT(job_title) AS count_job_titles&lt;br /&gt;
FROM lakehouse.bronze.jobs&lt;br /&gt;
GROUP BY 1&lt;br /&gt;
)&lt;/p&gt;
&lt;p&gt;SELECT * FROM count_titles&lt;br /&gt;
SQL-запрос использует Общую Табличную Выражение (CTE) под именем count_titles для упрощения структуры и улучшения читаемости запроса.&lt;br /&gt;
Он начинается с выбора данных из таблицы lakehouse.bronze.jobs.&lt;br /&gt;
Внутри CTE данные группируются по столбцу department.&lt;br /&gt;
Для каждой группы департаментов подсчитывается количество вхождений job_title и обозначается как count_job_titles.&lt;br /&gt;
После определения CTE основной запрос выбирает все столбцы из count_titles CTE.&lt;br /&gt;
Основная цель запроса — получить количество названий должностей для каждого департамента из таблицы lakehouse.bronze.jobs.&lt;br /&gt;
План запроса 📣&lt;br /&gt;
В очереди: 1.84ms, Анализ: 85.69ms, Планирование: 58.35ms, Выполнение: 450.11ms&lt;br /&gt;
Фрагмент 1 [HASH]&lt;br /&gt;
CPU: 7.57ms, Запланировано: 11.12ms, Заблокировано: 1.80s (Вход: 933.53ms, Выход: 0.00ns), Вход: 8 строк (176B); на задачу: ср.: 4.00, отклонение: 2.00, Выход: 3 строки (67B)&lt;br /&gt;
Количество входных данных, обработанных рабочими для этого этапа, может быть перекошено&lt;br /&gt;
Выходная структура: [department, count]&lt;br /&gt;
Разделение выхода: SINGLE []&lt;br /&gt;
Агрегат[тип = FINAL, ключи = [department]]&lt;br /&gt;
│   Расклад: [department:varchar, count:bigint]&lt;br /&gt;
│   Оценки: {строк: 3 (68B), cpu: 226, память: 68B, сеть: 0B}&lt;br /&gt;
│   CPU: 3.00ms (15.00%), Запланировано: 3.00ms (6.52%), Заблокировано: 0.00ns (0.00%), Выход: 3 строки (67B)&lt;br /&gt;
│   Ср. вход: 1.00 строки, стандартное отклонение входа: 132.29%&lt;br /&gt;
│   count := count(count_0)&lt;br /&gt;
└─ LocalExchange[разделение = HASH, аргументы = [department::varchar]]&lt;br /&gt;
│   Расклад: [department:varchar, count_0:bigint]&lt;br /&gt;
│   Оценки: {строк: 10 (226B), cpu: 226, память: 0B, сеть: 0B}&lt;br /&gt;
│   CPU: 1.00ms (5.00%), Запланировано: 1.00ms (2.17%), Заблокировано: 716.00ms (31.49%), Выход: 8 строк (176B)&lt;br /&gt;
│   Ср. вход: 1.00 строки, стандартное отклонение входа: 86.60%&lt;br /&gt;
└─ RemoteSource[идентификаторы источников = [2]]&lt;br /&gt;
Расклад: [department:varchar, count_0:bigint]&lt;br /&gt;
CPU: 0.00ns (0.00%), Запланировано: 1.00ms (2.17%), Заблокировано: 933.00ms (41.03%), Выход: 8 строк (176B)&lt;br /&gt;
Ср. вход: 1.00 строки, стандартное отклонение входа: 86.60%&lt;/p&gt;
&lt;p&gt;Фрагмент 2 [HASH]&lt;br /&gt;
CPU: 11.24ms, Запланировано: 19.46ms, Заблокировано: 860.54ms (Вход: 444.24ms, Выход: 0.00ns), Вход: 10 строк (362B); на задачу: ср.: 5.00, отклонение: 2.00, Выход: 8 строк (176B)&lt;br /&gt;
Количество входных данных, обработанных рабочими для этого этапа, может быть перекошено&lt;br /&gt;
Выходная структура: [department, count_0]&lt;br /&gt;
Разделение выхода: HASH [department]&lt;br /&gt;
Агрегат[тип = PARTIAL, ключи = [department]]&lt;br /&gt;
│   Расклад: [department:varchar, count_0:bigint]&lt;br /&gt;
│   Оценки: {строк: 10 (226B), cpu: ?, память: ?, сеть: ?}&lt;br /&gt;
│   CPU: 4.00ms (20.00%), Запланировано: 7.00ms (15.22%), Заблокировано: 0.00ns (0.00%), Выход: 8 строк (176B)&lt;br /&gt;
│   Ср. вход: 1.25 строки, стандартное отклонение входа: 118.32%&lt;br /&gt;
│   count_0 := count(job_title)&lt;br /&gt;
└─ Агрегат[тип = FINAL, ключи = [department, job_title]]&lt;br /&gt;
│   Расклад: [department:varchar, job_title:varchar]&lt;br /&gt;
│   Оценки: {строк: 10 (362B), cpu: 362, память: 362B, сеть: 0B}&lt;br /&gt;
│   CPU: 1.00ms (5.00%), Запланировано: 2.00ms (4.35%), Заблокировано: 0.00ns (0.00%), Выход: 10 строк (362B)&lt;br /&gt;
│   Ср. вход: 1.25 строки, стандартное отклонение входа: 118.32%&lt;br /&gt;
└─ LocalExchange[разделение = HASH, аргументы = [department::varchar, job_title::varchar]]&lt;br /&gt;
│   Расклад: [department:varchar, job_title:varchar]&lt;br /&gt;
│   Оценки: {строк: 10 (362B), cpu: 362, память: 0B, сеть: 0B}&lt;br /&gt;
│   CPU: 0.00ns (0.00%), Запланировано: 0.00ns (0.00%), Заблокировано: 181.00ms (7.96%), Выход: 10 строк (362B)&lt;br /&gt;
│   Ср. вход: 1.25 строки, стандартное отклонение входа: 190.79%&lt;br /&gt;
└─ RemoteSource[идентификаторы источников = [3]]&lt;br /&gt;
Расклад: [department:varchar, job_title:varchar]&lt;br /&gt;
CPU: 0.00ns (0.00%), Запланировано: 0.00ns (0.00%), Заблокировано: 444.00ms (19.53%), Выход: 10 строк (362B)&lt;br /&gt;
Ср. вход: 1.25 строки, стандартное отклонение входа: 190.79%&lt;/p&gt;
&lt;p&gt;Фрагмент 3 [SOURCE]&lt;br /&gt;
CPU: 11.49ms, Запланировано: 32.68ms, Заблокировано: 0.00ns (Вход: 0.00ns, Выход: 0.00ns), Вход: 10 строк (382B); на задачу: ср.: 10.00, std.dev.: 0.00, Выход: 10 строк (362B)&lt;br /&gt;
Выходная структура: [department, job_title]&lt;br /&gt;
Разделение выхода: HASH [department, job_title]&lt;br /&gt;
Агрегат[тип = PARTIAL, ключи = [department, job_title]]&lt;br /&gt;
│   Расклад: [department:varchar, job_title:varchar]&lt;br /&gt;
│   Оценки: {строк: 10 (362B), cpu: ?, память: ?, сеть: ?}&lt;br /&gt;
│   CPU: 1.00ms (5.00%), Запланировано: 3.00ms (6.52%), Заблокировано: 0.00ns (0.00%), Выход: 10 строк (362B)&lt;br /&gt;
│   Ср. вход: 10.00 строк, std.dev.: 0.00%&lt;br /&gt;
└─ Сканирование таблицы[таблица = lakehouse:bronze.jobs]&lt;br /&gt;
Расклад: [job_title:varchar, department:varchar]&lt;br /&gt;
Оценки: {строк: 10 (362B), cpu: 362, память: 0B, сеть: 0B}&lt;br /&gt;
CPU: 10.00ms (50.00%), Запланировано: 29.00ms (63.04%), Заблокировано: 0.00ns (0.00%), Выход: 10 строк (382B)&lt;br /&gt;
Ср. вход: 10.00 строк, std.dev.: 0.00%&lt;br /&gt;
job_title := job_title:varchar:ОБЫЧНО&lt;br /&gt;
department := department:varchar:ОБЫЧНО&lt;br /&gt;
Вход: 10 строк (382B), Физический вход: 1.32kB, Время физического входа: 7.50ms&lt;br /&gt;
Общая информация о выводе и плане запроса&lt;/p&gt;
&lt;p&gt;Высокоуровневый вывод выполнения.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/plan-zaprosov-analiziruem-proizvoditelnost-v-trino.png" width="1174" height="832" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;В очереди: 1.84ms&lt;br /&gt;
Анализ: 85.69ms&lt;br /&gt;
Планирование: 58.35ms&lt;br /&gt;
Выполнение: 467.68ms&lt;br /&gt;
Разделение на фрагменты&lt;br /&gt;
Выполнение запроса делится на три главные фрагмента. Каждый фрагмент представляет этап в процессе выполнения.&lt;br /&gt;
Фрагмент 1 [HASH]&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/plan-zaprosov-analiziruem-proizvoditelnost-v-trino-1.png" width="742" height="1042" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;HASH&lt;br /&gt;
Роль: Этот фрагмент обрабатывает окончательную агрегацию результатов.&lt;br /&gt;
Производительность:&lt;br /&gt;
CPU: 7.57ms&lt;br /&gt;
Запланировано: 11.12ms&lt;br /&gt;
Заблокировано: 1.80s (главным образом ожидание данных от других фрагментов)&lt;br /&gt;
Вход/Выход:&lt;br /&gt;
Вход: 8 строк (176B)&lt;br /&gt;
Выход: 3 строки (67B)&lt;br /&gt;
Выходная структура: [department, count]&lt;br /&gt;
Операции:&lt;br /&gt;
Агрегация: Окончательная агрегация по департаменту для вычисления общего количества названий должностей.&lt;br /&gt;
Локальный обмен: Перераспределение данных по департаменту для подготовки к окончательной агрегации.&lt;br /&gt;
Фрагмент 2 [HASH]&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/plan-zaprosov-analiziruem-proizvoditelnost-v-trino-2.png" width="632" height="1032" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Роль: Этот фрагмент выполняет частичную агрегацию названий должностей по департаменту.&lt;br /&gt;
Производительность:&lt;br /&gt;
CPU: 11.24ms&lt;br /&gt;
Запланировано: 19.46ms&lt;br /&gt;
Заблокировано: 860.54ms&lt;br /&gt;
Вход/Выход:&lt;br /&gt;
Вход: 10 строк (362B)&lt;br /&gt;
Выход: 8 строк (176B)&lt;br /&gt;
Выходная структура: [department, count_0]&lt;br /&gt;
Операции:&lt;br /&gt;
Частичная агрегация: Подсчитывает названия должностей по департаменту.&lt;br /&gt;
Локальный обмен: Перераспределение данных по департаменту, job_title для дальнейшей агрегации.&lt;br /&gt;
Фрагмент 3 [SOURCE]&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/plan-zaprosov-analiziruem-proizvoditelnost-v-trino-3.png" width="876" height="1084" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;SOURCE — Сканирование таблицы&lt;br /&gt;
Роль: Этот фрагмент читает данные из исходной таблицы.&lt;br /&gt;
Производительность:&lt;br /&gt;
CPU: 11.49ms&lt;br /&gt;
Запланировано: 32.68ms&lt;br /&gt;
Вход/Выход:&lt;br /&gt;
Вход: 10 строк (382B)&lt;br /&gt;
Выход: 10 строк (362B)&lt;br /&gt;
Выходная структура: [department, job_title]&lt;/p&gt;
&lt;p&gt;Операции:&lt;br /&gt;
Сканирование таблицы: Чтение столбцов department и job_title из таблицы lakehouse.bronze.jobs.&lt;br /&gt;
Частичная агрегация: Группировка данных по департаменту и job_title и подготовка их к дальнейшей обработке.&lt;/p&gt;
&lt;p&gt;Ключевые выводы&lt;br /&gt;
Чтение плана запроса: Этапы представлены в порядке от наименьшего значения этапа к последнему шагу, и от наибольшего значения этапа к первому шагу. Это также связывается с порядком выполнения, который мы упомянули выше.&lt;/p&gt;
&lt;p&gt;Время блокировки: Значительное время блокировки указывает на ожидание передачи данных между фрагментами, особенно в Фрагменте 1 и Фрагменте 2. Это часто является признаком задержек передачи данных или неравенства во времени обработки между фрагментами.&lt;br /&gt;
Перекос данных: Обратите внимание на перекос в количестве данных, обрабатываемых рабочими на различных этапах, что приводит к тому, что некоторые рабочие обрабатывают больше данных, чем другие. Это может вызывать неэффективность.&lt;br /&gt;
Шаги агрегации: Запрос включает несколько этапов частичных и окончательных агрегаций, которые можно оптимизировать, если возможно, уменьшив переброс данных между фрагментами.&lt;br /&gt;
CPU и планирование: Время работы CPU и планирования относительно низкое по сравнению с заблокированным временем, что предполагает, что ресурсы CPU не являются узким местом.&lt;br /&gt;
Настройка SQL: Измените ваш SQL и изучите план запроса, чтобы найти правильный баланс между этими факторами.&lt;/p&gt;
&lt;p&gt;Предложения по оптимизации&lt;br /&gt;
Модель данных: Убедитесь, что у вас есть правильная модель данных, например, звездная схема, и выполните расчет OBT на основе звездной схемы.&lt;br /&gt;
Материализованное представление: Предварительно посчитайте частые агрегации. Однако я бы предпочел предыдущий шаг этому, это может быть полезно, если у вас нет много времени или вы работаете над первым шагом параллельно, но будьте осторожны, чтобы избежать большого технического долга.&lt;br /&gt;
Упростите агрегации: Минимизируйте сложные шаги агрегации, чтобы уменьшить переброс данных.&lt;/p&gt;
</description>
</item>

<item>
<title>Почему мы перешли с Dremio на Trino</title>
<guid isPermaLink="false">150</guid>
<link>https://gavrilov.info/all/pochemu-my-pereshli-s-dremio-na-trino/</link>
<pubDate>Fri, 19 Jul 2024 17:59:38 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/pochemu-my-pereshli-s-dremio-na-trino/</comments>
<enclosure url="https://gavrilov.info/video/Data_Mesh.mp4" type="video/mp4" length="18306803" />
<description>
&lt;p&gt;В нашей постоянно развивающейся индустрии данных, выбор правильного инструмента может существенно повлиять на эффективность и гибкость работы. Мы недавно перешли с Dremio на Trino. Решение об этом шаге было принято после анализа и испытаний, и в этой статье я расскажу о причинах этого перехода, особенностях каждого продукта, а также о том, как это повлияет на нашу работу в рамках концепции Data Mesh.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Lamba.png" width="1298" height="862" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;&lt;b&gt;Московский художник Даниил Кудряшов&lt;/b&gt; &lt;a href="https://kudryashovdd.com/allartworks"&gt;https://kudryashovdd.com/allartworks&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Mers.png" width="1212" height="862" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;&lt;b&gt;Московский художник Даниил Кудряшов&lt;/b&gt; &lt;a href="https://kudryashovdd.com/allartworks"&gt;https://kudryashovdd.com/allartworks&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;Dremio и Trino: Основные Отличия&lt;/h3&gt;
&lt;p&gt;Dremio позиционируется как коробочный продукт, который предоставляет целый набор инструментов “из коробки”. Эта платформа позволяет пользователям выполнять аналитические запросы на больших наборах данных с использованием своего движка SQL. По своей природе Dremio старается исполнять запросы внутри себя, что зачастую приводит к необходимости выгрузки значительных объёмов данных из источника, прежде чем приступать к анализу. Это, в свою очередь, увеличивает время ожидания для пользователей и потребляет дополнительные ресурсы.&lt;/p&gt;
&lt;p&gt;Dremio имеет свои плюсы и минусы:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Плюсы:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Лёгкость в использовании и интеграции.&lt;/li&gt;
&lt;li&gt;Поддержка современных форматов данных.&lt;/li&gt;
&lt;li&gt;Концепция data-as-code.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Минусы:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Высокая стоимость лицензий и серверов.&lt;/li&gt;
&lt;li&gt;Особеннсоти исполнения запросов, которые нагружают систему источник.&lt;/li&gt;
&lt;li&gt;Ограниченные настройки и закрытый код.&lt;/li&gt;
&lt;li&gt;Ограниченная возможность кастомизации.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;И конечно отсутствие обновлений, поддержки, что фактически является тупиком в развитии для нас.&lt;/p&gt;
&lt;h3&gt;Trino&lt;/h3&gt;
&lt;p&gt;Trino, ранее известный как PrestoSQL, представляет собой SQL-движок, который отлично подходит для платформ данных, требующих высокой степени кастомизации. В отличие от Dremio, Trino выполняет запросы ровно так, как это указано в SQL, что позволяет избежать излишних выгрузок данных и оптимизировать процесс обработки запросов. Благодаря своей открытой архитектуре, Trino предоставляет гибкость в настройках и кастомизации, что является ключевым преимуществом. Trino хорошо интегрируется с такими технологиями как Iceberg и Data Build Tool, kafka и многими другими, что обеспечивает более эффективное управление данными и их структурой. Позволяет нам выполнять запросы к данным в топиках Kafka, что особенно востребовано в текущий момент, а также легко добавлять новые типы коннекторов, Dremio так не умеет.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Плюсы:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Открытая архитектура и возможность кастомизации.&lt;/li&gt;
&lt;li&gt;Высокая производительность и эффективность.&lt;/li&gt;
&lt;li&gt;Поддержка современных форматов данных и подключений.&lt;/li&gt;
&lt;li&gt;Развитое сообщество и документация.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Компания CedrusData – полностью российская компания и занимается ускорением базового Trino, Cedrus это фактически Trino на стероидах. Компания занимается развитием как новой функциональности, так и разрешением ошибок и просто поддержкой.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Минусы:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Необходимость дополнительных настроек и конфигураций.&lt;/li&gt;
&lt;li&gt;Потребность в более глубоком техническом знании.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Причины Перехода&lt;/h3&gt;
&lt;h3&gt;Гибкость и Настраиваемость&lt;/h3&gt;
&lt;p&gt;Одной из основных причин перехода с Dremio на Trino является гибкость и настраиваемость последнего. Trino позволяет легко адаптировать платформу данных под любые потребности, что особенно важно в рамках нашей концепции Data Mesh. Это значительно упрощает управление данными и позволяет экономить ресурсы, разделяя хранение данных от вычислительных мощностей.&lt;/p&gt;
&lt;h3&gt;Открытая Архитектура и Сообщество&lt;/h3&gt;
&lt;p&gt;Trino имеет открытую архитектуру, что позволяет любому внести изменения или предложить улучшения. Это делает платформу более гибкой и быстро адаптирующейся к изменяющимся требованиям. Большое сообщество пользователей и разработчиков обеспечивает постоянное обновление и улучшение функциональности, что гарантирует высокую производительность и актуальность продукта.&lt;/p&gt;
&lt;h3&gt;Экономия Ресурсов&lt;/h3&gt;
&lt;p&gt;Trino требует меньших затрат на исполнение запросов, что уменьшает нагрузку на инфраструктуру и сокращает расходы. Пользователи могут обращаться с данными на любом хранении, будь то Oracle или файлы CSV, благодаря единому SQL-интерфейсу.&lt;/p&gt;
&lt;h3&gt;Безопасность и Управление&lt;/h3&gt;
&lt;p&gt;Хотя Dremio предлагал платные функции безопасности, бесплатная версия не могла удовлетворить наши требования. Trino, напротив, предлагает широкий спектр настроек безопасности, а также возможность интеграции с различными инструментами управления данными.&lt;/p&gt;
&lt;h3&gt;Поддержка и Документация&lt;/h3&gt;
&lt;p&gt;Trino имеет обширную документацию и активное сообщество, что обеспечивает поддержку и обмен опытом между пользователями. В отличие от Dremio, где настройки часто являются закрытыми и требуют вмешательства поддержки, которой у нас уже нет, Trino предоставляет полный доступ к настройкам и их описаниям.&lt;/p&gt;
&lt;h3&gt;Влияние на Платформу&lt;/h3&gt;
&lt;p&gt;Переход на Trino позволит нам лучше следовать Data Mesh и основным принципым, а именно:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Видимость:&lt;/b&gt; данные станут более доступными и легко находимыми для пользователей.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Доступность:&lt;/b&gt; пользователи смогут быстро извлекать данные из различных систем и форматов.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Понимание:&lt;/b&gt; наличие описаний данных поможет лучше понимать контекст и содержание.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Связность:&lt;/b&gt; пользователи смогут легко использовать дополнительные атрибуты благодаря связям в данных.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Доверие:&lt;/b&gt; уверенность в качестве данных будет повышена.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Совместимость:&lt;/b&gt; общие представления о данных у производителей и потребителей.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Безопасность:&lt;/b&gt; данные будут защищены от несанкционированного доступа и манипуляций.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Что такое Data Mesh?&lt;/p&gt;
&lt;div class="e2-text-video"&gt;
&lt;video src="https://gavrilov.info/video/Data_Mesh.mp4#t=0.001" width="854" height="480" controls alt="" /&gt;

&lt;/div&gt;
&lt;h3&gt;Заключение&lt;/h3&gt;
&lt;p&gt;Переход с Dremio на Trino – это важный шаг на пути к улучшению нашей платформы данных. Мы уверены, что гибкость, высокая производительность и открытая архитектура Trino помогут нам достигнуть новых высот в управлении и анализе данных. Следите за новостями и присоединяйтесь к обсуждению в нашем чате поддержки!&lt;/p&gt;
&lt;p&gt;Всем хороших выходных! Напишите в комментариях, как вам запомнился Dremio, и что вы пожелаете новому ядру на базе Trino.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-59.png" width="1280" height="960" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;&lt;b&gt;Калининград, выезд БИТа&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
</description>
</item>

<item>
<title>Сравнение Query движков Trino и StarRocks</title>
<guid isPermaLink="false">104</guid>
<link>https://gavrilov.info/all/sravnenie-query-dvizhkov-trino-i-starrocks/</link>
<pubDate>Wed, 27 Dec 2023 22:19:06 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/sravnenie-query-dvizhkov-trino-i-starrocks/</comments>
<description>
&lt;p&gt;&lt;a href="https://blog.devgenius.io/comparison-of-the-open-source-query-engines-trino-and-starrocks-cf959049f9ab"&gt;https://blog.devgenius.io/comparison-of-the-open-source-query-engines-trino-and-starrocks-cf959049f9ab&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;В этом посте мы хотим сравнить Trino, популярный распределенный движок для выполнения аналитических запросов на больших объемах данных с интерактивными задержками, с StarRocks.&lt;br /&gt;
Источники информации&lt;/p&gt;
&lt;p&gt;Мы консультировались с участниками StarRocks (Хэнг Чжао, член TSC StarRocks; Дориан Чжэн, активный участник StarRocks). Что касается Trino, мы использовали веб-сайт Trino и поиск в Google для исследования различных тем. Мы сравнили последние версии обоих продуктов на октябрь 2023 года.&lt;br /&gt;
Возрождение Trino/Presto&lt;/p&gt;
&lt;p&gt;Изначально Presto был задуман и разработан в Facebook (теперь известном как Meta) для того, чтобы позволить их аналитикам выполнять интерактивные запросы в их обширном хранилище данных Apache Hadoop. Проект, возглавляемый Мартином Траверсо, Дэйном Сандстромом, Дэвидом Филлипсом и Эриком Хуангом, начался в 2012 году как решение для преодоления ограничений Apache Hive, который ранее использовался для SQL-аналитики в обширном хранилище данных Facebook, но оказался слишком медленным для обширных потребностей компании. Presto был публично внедрен в Facebook в том же году и позже был представлен в виде open source в ноябре 2013 года.&lt;/p&gt;
&lt;p&gt;В 2013 году, когда он появился, у него были некоторые значительные преимущества.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Мог эффективно обрабатывать большие наборы данных и сложные запросы (по сравнению с другими технологиями, доступными на тот момент).  &lt;br /&gt;
a. Конкретно, гораздо быстрее, чем технология MapReduce, такая как Apache Hive, которая тогда была актуальной.  &lt;br /&gt;
b. Мог подключаться к множеству различных источников данных: в частности, подключаться к нескольким базам данных одного типа с возможностью объединения наборов данных между базами данных (например, горизонтальное масштабирование экземпляров баз данных).&lt;/li&gt;
&lt;li&gt;Мог масштабироваться для удовлетворения потребностей крупных организаций: Facebook продемонстрировал, что Presto может работать, и другие технологические “единороги” быстро приняли его для своих потребностей в хранилище данных.&lt;/li&gt;
&lt;li&gt;Open Source: кто не хочет, чтобы кто-то другой проводил исследования и разработку программного обеспечения за “бесплатно”?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Проект Presto претерпел значительные изменения за десятилетие. В 2018–2019 годах, после ухода оригинальных основателей из Facebook, проект разделился на две ветки: PrestoDB и PrestoSQL. Это разделение было ответом на изменяющиеся потребности и направление сообщества Presto.&lt;br /&gt;
Trino возник из ветви PrestoSQL. В январе 2021 года PrestoSQL был переименован в Trino. Trino сохранил свои корни в обработке данных большого объема, принимая архитектуру Massively Parallel Processing (MPP) и разрабатываясь на Java. Это отличало его от традиционных фреймворков MapReduce, улучшая его способность эффективно обрабатывать и обрабатывать большие объемы данных.&lt;/p&gt;
&lt;p&gt;Изменение требований пользователей&lt;/p&gt;
&lt;p&gt;С момента появления Trino/Presto они удовлетворительно соответствовали большинству потребностей пользователей в анализе данных на тот момент. Тем не менее стоит отметить, что требования пользователей к анализу данных по-прежнему постоянно меняются и развиваются. Это особенно явно после того, как мир был завоеван мобильным интернетом и приложениями SaaS, с пользовательским анализом и аналитикой в реальном времени, становящимися важными трендами для предприятий.&lt;br /&gt;
Основные проявления этого тренда следующие:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Предприятия надеются иметь более производительные системы запросов для удовлетворения потребности в запросах с низкой задержкой на огромных объемах данных. Ни один пользователь не хочет ждать больше трех секунд перед экраном.&lt;/li&gt;
&lt;li&gt;Предприятия нуждаются в возможности поддерживать сотни, а то и тысячи человек, одновременно проводящих запросы и анализ данных. Постоянно растущее количество пользователей стало толчком для этого спроса.&lt;/li&gt;
&lt;li&gt;Предприятия стремятся к своевременному анализу последних данных и использованию результатов анализа для направления последующей работы.&lt;br /&gt;
В нынешнюю постпандемическую эпоху, как сохранить издержки и улучшить эффективность работы в такой неблагоприятной экономической обстановке? Это еще один вопрос, на который каждое предприятие должно ответить.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Именно из-за этих новых трендов несколько инженеров баз данных начали новый проект базы данных в 2020 году, названный StarRocks, и официально открыли его исходный код в сентябре 2021 года. StarRocks был передан в Linux Foundation в начале 2023 года. Хотя он существует недолго, влияние StarRocks, кажется, стремительно растет. В настоящее время сотни крупных предприятий по всему миру используют StarRocks в производственных средах.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-12.png" width="774" height="488" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Смотря на сценарии использования, у StarRocks и Trino/Presto есть значительная степень пересечения. Просто говоря, StarRocks более подходит для сценариев, ориентированных на конечного пользователя с низкой задержкой, в то время как Trino/Presto более подходит для аналитических сценариев, включающих извлечение данных из нескольких источников данных одновременно.&lt;/p&gt;
&lt;p&gt;Сходства между Trino и StarRocks&lt;br /&gt;
У StarRocks и Trino много сходств в технических характеристиках.&lt;/p&gt;
&lt;p&gt;Massively Parallel Processing (MPP)&lt;br /&gt;
Обе системы используют MPP в качестве своей распределенной среды выполнения. В этой среде запрос разбивается на множество логических и физических блоков выполнения и выполняется одновременно на нескольких узлах. В отличие от шаблона scatter-gather, используемого многими другими продуктами для аналитики данных в их распределенных вычислительных средах, MPP может использовать больше ресурсов для обработки запросов. Из-за этой среды обе системы могут использоваться для работы с петабайтами данных, и сотни крупных компаний уже используют эти системы в своих производственных средах.&lt;/p&gt;
&lt;p&gt;Cost-based Optimizer (CBO)&lt;br /&gt;
У обеих систем есть Cost-based Optimizer. В запросах с многотабличным объединением, помимо исполнителя запроса, оптимизированные планы выполнения также могут сыграть ключевую роль в улучшении производительности запроса. Благодаря CBO обе системы могут поддерживать различные функции SQL, включая сложные запросы, объединения и агрегации. Как Trino, так и StarRocks успешно прошли тесты TPC-H и более сложного теста TPC-DS.&lt;/p&gt;
&lt;p&gt;Pipeline Execution Framework&lt;br /&gt;
У обеих систем есть Framework выполнения конвейера. Основная цель Framework выполнения конвейера – улучшение эффективности использования многозадачных ресурсов в запросе на одном компьютере. Его основные функции охватывают три аспекта:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Снижение стоимости планирования задач для различных вычислительных узлов в запросе.&lt;/li&gt;
&lt;li&gt;Увеличение использования процессора при обработке запросов.&lt;/li&gt;
&lt;li&gt;Автоматическая настройка параллелизма выполнения запросов для полного использования вычислительной мощности многозадачных систем, тем самым повышая производительность запроса.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ANSI SQL Support&lt;br /&gt;
Обе системы соответствуют ANSI SQL. Это означает, что аналитики могут использовать язык запросов, с которым они наиболее знакомы в своей повседневной работе, без необходимости дополнительных затрат на обучение. Инструменты бизнес-аналитики, которыми часто пользуются предприятия, также легко интегрируются с StarRocks или Trino.&lt;/p&gt;
&lt;p&gt;Различия между Trino и StarRocks&lt;br /&gt;
Хотя есть некоторые сходства в технической реализации, мы также видим некоторые явно различные технические характеристики между этими двумя видами систем.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-13.png" width="1400" height="318" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Векторизированный движок запросов&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;StarRocks – это нативный векторизированный движок, реализованный на C++, в то время как Trino реализован на Java и использует ограниченную технологию векторизации. Технология векторизации помогает StarRocks более эффективно использовать вычислительную мощность ЦП. Этот тип движка запросов обладает следующими характеристиками:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Полностью использует эффективность управления данными в столбцах. Такой движок запросов читает данные из колоночного хранилища, и способ управления данными в памяти, а также способ обработки операторов данных, является колоночным. Такие движки могут более эффективно использовать кэш ЦП, повышая эффективность выполнения ЦП.&lt;/li&gt;
&lt;li&gt;Полностью использует SIMD-инструкции, поддерживаемые ЦП. Это позволяет ЦП завершать больше вычислений данных за меньшее количество тактовых циклов. Согласно данным, предоставленным StarRocks, использование векторизированных инструкций может улучшить общую производительность в 3-10 раз.&lt;/li&gt;
&lt;li&gt;Более эффективно сжимает данные, что значительно снижает использование памяти. Это делает такой тип движка запросов более способным обрабатывать запросы с большим объемом данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Фактически Trino также исследует технологию векторизации. У Trino есть некоторый SIMD-код, но он отстает по сравнению с StarRocks по глубине и охвату. Trino все еще работает над улучшением своих усилий по векторизации (см. &lt;a href="https://github.com/trinodb/trino/issues/14237)."&gt;https://github.com/trinodb/trino/issues/14237).&lt;/a&gt; Проект Velox в Meta направлен на использование технологии векторизации для ускорения запросов Trino. Однако до сих пор очень мало компаний официально использовали Velox в производственных средах.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-14.png" width="1400" height="305" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Материализованный вид&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;У StarRocks есть несколько функций материализованных видов, которых у Trino нет. Материализованный вид – это продвинутый способ ускорения общих запросов. Как StarRocks, так и Trino поддерживают создание материализованных видов; однако у StarRocks есть возможность:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Автоматически переписывать запросы для улучшения производительности запроса. Это означает, что StarRocks автоматически выбирает подходящие материализованные виды для ускорения запросов. Пользователям не нужно переписывать свои SQL-запросы, чтобы использовать материализованные виды.&lt;/li&gt;
&lt;li&gt;Выполнять обновление материализованного вида на уровне раздела, что позволяет пользователю добиться лучшей производительности и масштабируемости при снижении потребления ресурсов.&lt;/li&gt;
&lt;li&gt;Возможность записи материализованных видов на локальный диск вместо удаленного диска/хранилища. Это означает, что пользователи могут использовать высокую производительность локального диска. Локальное хранилище использует собственный колоночный формат хранения StarRocks, который лучше поддерживает выполнение векторизированного движка запросов.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;У Trino в настоящее время нет этих функций:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Отсутствие автоматической функции переписывания запросов. Пользователю нужно затратить много времени на переписывание запросов.&lt;/li&gt;
&lt;li&gt;Необходимость выполнять обновление материализованного вида для всей таблицы при изменении данных.&lt;/li&gt;
&lt;li&gt;Невозможность записи материализованных видов на локальный диск.&lt;/li&gt;
&lt;li&gt;Идет обсуждение о том, как улучшить “свежесть” материализованного вида.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-15.png" width="1400" height="1016" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Система кэширования&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Система кэширования в StarRocks сложнее, чем в Trino. StarRocks реализует кластер-осведомленный кэш данных на каждом узле. Этот кэш использует комбинацию памяти и диска, которую можно использовать для промежуточных и конечных результатов запроса. В результате этого компонента StarRocks имеет возможность кэшировать метаданные Apache Iceberg на локальных дисках для лучшей производительности запросов. StarRocks также поддерживает предварительное заполнение кэша, установку приоритетов кэша и установку черных списков кэша.&lt;/p&gt;
&lt;p&gt;Кэш запросов StarRocks значительно улучшает производительность запросов в сценариях высокой конкурентоспособности. Он функционирует путем кэширования промежуточных результатов каждого вычислительного узла в памяти для последующего повторного использования. Кэш запросов отличается от обычного&lt;/p&gt;
&lt;p&gt;кэша результатов. В то время как обычный кэш результатов эффективен только для идентичных запросов, кэш запросов также может ускорять запросы, которые не являются точными копиями. Согласно тестам инженеров разработки StarRocks, кэш запросов может улучшить эффективность запроса в 3-17 раз.&lt;/p&gt;
&lt;p&gt;Система кэширования Trino работает только на уровне памяти. Это делает ее очень быстрой и предполагает использование более многочисленных и крупных виртуальных машин с памятью. Ведется работа по поддержке кэширования на локальном диске для “горячего кэша”.&lt;br /&gt;
Подробнее читайте по ссылкам &lt;a href="https://github.com/trinodb/trino/pull/16375"&gt;https://github.com/trinodb/trino/pull/16375&lt;/a&gt; и &lt;a href="https://github.com/trinodb/trino/pull/18719."&gt;https://github.com/trinodb/trino/pull/18719.&lt;/a&gt;&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-16.png" width="1400" height="271" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Производительность соединения&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Как Trino, так и StarRocks могут поддерживать сложные операции соединения. Однако StarRocks способен предоставить более высокую производительность. Это происходит потому, что, помимо векторизированного движка запросов, StarRocks также обладает некоторыми специальными техническими возможностями.&lt;br /&gt;
Переупорядочивание соединений – это техника, которая может быть использована для улучшения производительности запросов к базе данных, включающих множественные соединения. Она работает путем изменения порядка выполнения соединений.&lt;br /&gt;
Стоимость выполнения запроса соединения зависит от размера таблиц, участвующих в соединении, и порядка выполнения соединений. Переупорядочивая соединения, можно найти более эффективный план соединения. Переупорядочивание соединений может выполняться оптимизатором или может быть указано вручную пользователем. Оптимизатор обычно пытается переупорядочить соединения для минимизации стоимости запроса.&lt;br /&gt;
Существует несколько различных алгоритмов, которые могут использоваться для переупорядочивания соединений. Некоторые из наиболее распространенных алгоритмов, реализованных в StarRocks, включают:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Жадный алгоритм: Жадный алгоритм работает путем повторного выбора пары таблиц с наименьшей стоимостью соединения и их объединения.&lt;/li&gt;
&lt;li&gt;Алгоритм динамического программирования: Алгоритм динамического программирования работает построением таблицы, содержащей стоимость соединения каждой пары таблиц. Затем алгоритм использует эту таблицу для поиска оптимального плана соединения.&lt;/li&gt;
&lt;li&gt;Алгоритм исчерпания: Техника выполнения соединений данных, особенно подходящая для больших наборов данных. Он работает разбиением операции соединения на более мелкие, более управляемые задачи, что позволяет выполнять соединения с наборами данных, которые слишком велики для помещения в память.&lt;/li&gt;
&lt;li&gt;Переупорядочивание соединений слева-направо: Эвристический алгоритм, используемый для оптимизации порядка соединений в запросе. Алгоритм начинает с самой маленькой таблицы и затем рекурсивно соединяет ее с следующей по размеру таблицей, пока все таблицы не будут соединены.&lt;/li&gt;
&lt;li&gt;Алгоритм ассоциативности соединения: Техника оптимизации порядка соединений в запросе. Он работает путем использования свойства ассоциативности соединений, которое утверждает, что порядок соединений можно изменить без влияния на результат.&lt;/li&gt;
&lt;li&gt;Алгоритм коммутативности соединения: Техника оптимизации порядка соединений в запросе. Он использует свойство коммутативности соединений, которое утверждает, что порядок операндов соединения можно изменить без влияния на результат.&lt;br /&gt;
В целом StarRocks реализует (по последним данным) на 5 алгоритмов больше, чем Trino.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Еще одной важной особенностью StarRocks для производительности соединения является фильтрация во время выполнения. Фильтрация во время выполнения – это техника, которая может использоваться для улучшения производительности операций соединения данных. Она работает путем фильтрации строк из одной таблицы до их соединения с другой таблицей на основе условия соединения. Это может значительно снизить объем данных, который необходимо обработать, что может привести к значительному улучшению производительности.&lt;/p&gt;
&lt;p&gt;Поддержка локальных и глобальных фильтров во время выполнения&lt;br /&gt;
Осведомленность о перемешивании&lt;br /&gt;
Отправка максимума/минимума, в фильтр в хранилище&lt;br /&gt;
Оценка стоимости на основе&lt;br /&gt;
Поддержка кэша фильтров во время выполнения&lt;br /&gt;
Передача фильтра во время выполнения в обе стороны&lt;br /&gt;
SIMD-фильтр Блума&lt;br /&gt;
Адаптивный выбор фильтров во время выполнения соединения&lt;br /&gt;
Поддержка фильтрации во времени выполнения с несколькими столбцами&lt;/p&gt;
&lt;p&gt;Наконец, StarRocks может поддерживать соединение с соседним распределением. Соединение с соседним распределением – это тип соединения, при котором таблицы, участвующие в соединении, хранятся на тех же узлах распределенного кластера базы данных. Это может значительно улучшить производительность операции соединения, поскольку данные не нужно передавать между узлами для обработки.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Высокая доступность&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;У StarRocks есть два типа узлов, каждый из которых способен достигнуть высокой доступности через конкретные стратегии. Узлы Front End являются безсостоятельными, и высокую доступность можно достичь, развернув нечетное количество узлов Front End. Эти узлы используют протокол Raft для выбора лидера среди себя. Узлы Back End поддерживают механизм с множественными репликами, обеспечивая, что отказ любого узла не влияет на работу системы. Таким образом, StarRocks может выполнять горячие обновления системы. Во время обновления системы онлайн-сервисы системы не будут затронуты.&lt;/p&gt;
&lt;p&gt;Trino не имеет встроенной поддержки высокой доступности (HA). Координатор Trino – единственная точка отказа в системе. Если этот узел выходит из строя, вся система становится недоступной. Это означает, что при каждом обновлении системы онлайн-сервисы Trino должны быть приостановлены на определенное время. До сих пор проект Trino не предложил решения этой проблемы. Подробнее читайте по ссылке &lt;a href="https://github.com/trinodb/trino/issues/391."&gt;https://github.com/trinodb/trino/issues/391.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Источники данных и открытые форматы таблиц&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Как сторонники концепции Data Mesh, сообщество Trino всегда стремилось к интеграции большего количества источников данных. До сих пор Trino разработал более 60 различных коннекторов, обеспечивающих подключение к различным источникам данных, включая реляционные базы данных, озера данных и другие. Это позволяет Trino выступать в качестве унифицированного движка запросов для предприятий, облегчая совместный анализ данных из различных источников. Это особенно полезно для крупных предприятий с несколькими бизнесами и разнообразными источниками данных. В настоящее время StarRocks более ориентирован на запросы открытых озер данных и имеет меньше коннекторов для других источников данных.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-17.png" width="1400" height="788" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;StarRocks поддерживает чтение как для Apache Iceberg, Apache Hudi, Apache Hive, так и для Delta Lake. Кроме того, StarRocks также поддерживает ограниченные возможности записи в Apache Iceberg. Результаты бенчмарк-тестирования показывают, что StarRocks работает быстрее в качестве движка запросов для озер данных. Trino поддерживает чтение и запись как для Apache Iceberg, Apache Hudi, Apache Hive, так и для Delta Lake. Согласно дорожной карте StarRocks, возможности записи в открытые озера данных будут улучшены в ближайшее время.&lt;/p&gt;
&lt;p&gt;Возможности Data Lakehouse StarRocks&lt;/p&gt;
&lt;p&gt;Именно благодаря этим уникальным техническим особенностям StarRocks может предоставить пользователям более полный опыт работы с Lakehouse. Использование StarRocks для прямого запроса данных из озер данных позволяет достигнуть производительности, сравнимой с хранилищами данных. Это позволяет строить множество бизнес-приложений напрямую на озерах данных, устраняя необходимость импорта данных в хранилища данных для анализа. Система кэширования StarRocks может использовать локальное хранилище вычислительных узлов для кэширования данных, транспарентно ускоряя производительность запросов. Пользователям не нужно создавать дополнительные конвейеры для управления передачей данных.&lt;/p&gt;
&lt;p&gt;В некоторых сценариях анализа данных, где требуется более низкая задержка запроса и более высокая конкурентоспособность запроса, материализованные представления StarRocks играют значительную роль. Материализованные представления не только ускоряют связанные запросы с использованием локального хранилища вычислительных узлов, но и их обновления данных автоматически, не требуя ручного вмешательства. Кроме того, функция автоматического переписывания материализованных представлений позволяет пользователям наслаждаться ускоренными эффектами представлений без переписывания SQL.&lt;/p&gt;
&lt;p&gt;Совмещая различные уникальные технологии, StarRocks действительно достигает пользовательского и высокопроизводительного опыта с открытым исходным кодом в сфере озер данных.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-18.png" width="624" height="347" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Бенчмарк&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Команда StarRocks провела бенчмарк-тестирование на наборе данных TPC-DS объемом 1 ТБ. Они использовали StarRocks и Trino для запроса одной и той же копии данных, хранящихся в формате таблицы Apache Iceberg с файлами Parquet. Результат заключается в том, что общее время ответа на запрос в Trino медленнее в 5,54 раза по сравнению с StarRocks. Подробнее см. по ссылке &lt;a href="https://www.starrocks.io/blog/benchmark-test"&gt;https://www.starrocks.io/blog/benchmark-test&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Вывод&lt;/p&gt;
&lt;p&gt;Trino/Presto — это очень известный движок запросов с открытым исходным кодом. Когда у предприятий есть несколько источников данных и необходимо анализировать данные из этих источников единым образом, Trino является подходящим выбором. По сравнению с Trino, StarRocks — это новый движок запросов с открытым исходным кодом, обладающий множеством инновационных и уникальных решений. Используя StarRocks в качестве движка запросов для озер данных, клиенты могут легко достичь высокопроизводительного опыта запросов. Более того, клиенты могут использовать различные методы для дополнительного ускорения запросов, достигая более низкой задержки и более высокой конкурентоспособности. StarRocks также отличный выбор для запросов к озерам данных.&lt;/p&gt;
&lt;p&gt;Перевод сделал ChatGPT&lt;/p&gt;
</description>
</item>


</channel>
</rss>