> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> Этот движок интегрируется с экосистемой Amazon S3 и поддерживает потоковый импорт. Подобно движкам Kafka и RabbitMQ, он предоставляет возможности, специфичные для S3.

# движок таблицы S3Queue

export const ScalePlanFeatureBadge = ({feature = 'Эта возможность', linking_verb_are = false}) => {
  return <div className="scalePlanFeatureContainer">
            <div className="scalePlanFeatureBadge">
                Возможность плана Scale
            </div>
            <div>
                <p>{feature} {linking_verb_are ? 'доступны' : 'доступна'} в тарифах Scale и Enterprise. Чтобы перейти на более высокий тариф, откройте страницу тарифов в облачной консоли.</p>
            </div>
        </div>;
};

Этот движок обеспечивает интеграцию с экосистемой [Amazon S3](https://aws.amazon.com/s3/) и позволяет выполнять потоковый импорт. Этот движок похож на движки [Kafka](/docs/ru/reference/engines/table-engines/integrations/kafka), [RabbitMQ](/docs/ru/reference/engines/table-engines/integrations/rabbitmq), но предоставляет возможности, характерные именно для S3.

Важно понимать это примечание из [оригинального PR с реализацией S3Queue](https://github.com/ClickHouse/ClickHouse/pull/49086/files#diff-e1106769c9c8fbe48dd84f18310ef1a250f2c248800fde97586b3104e9cd6af8R183): когда `MATERIALIZED VIEW` подключается к движку, движок таблицы S3Queue начинает собирать данные в фоновом режиме.

<div id="creating-a-table">
  ## CREATE TABLE
</div>

```sql theme={null}
CREATE TABLE s3_queue_engine_table (name String, value UInt32)
    ENGINE = S3Queue(path, [NOSIGN, | aws_access_key_id, aws_secret_access_key,] format, [compression], [headers], [extra_credentials])
    [SETTINGS]
    [mode = '',]
    [after_processing = 'keep',]
    [keeper_path = '',]
    [loading_retries = 10,]
    [processing_threads_num = 16,]
    [parallel_inserts = false,]
    [enable_logging_to_queue_log = true,]
    [last_processed_path = "",]
    [tracked_files_limit = 1000,]
    [tracked_file_ttl_sec = 0,]
    [polling_min_timeout_ms = 1000,]
    [polling_max_timeout_ms = 600000,]
    [polling_backoff_ms = 30000,]
    [cleanup_interval_min_ms = 60000,]
    [cleanup_interval_max_ms = 60000,]
    [buckets = 0,]
    [list_objects_batch_size = 1000,]
    [enable_hash_ring_filtering = 0,]
    [max_processed_files_before_commit = 100,]
    [max_processed_rows_before_commit = 0,]
    [max_processed_bytes_before_commit = 0,]
    [max_processing_time_sec_before_commit = 0,]
```

<Warning>
  До версии `24.7` для всех настроек, кроме `mode`, `after_processing` и `keeper_path`, необходимо использовать префикс `s3queue_`.
</Warning>

**Параметры движка**

Параметры `S3Queue` совпадают с параметрами, которые поддерживает движок таблицы `S3`. См. раздел параметров [здесь](/docs/ru/reference/engines/table-engines/integrations/s3#parameters).

**Пример**

```sql theme={null}
CREATE TABLE s3queue_engine_table (name String, value UInt32)
ENGINE=S3Queue('https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/*', 'CSV', 'gzip')
SETTINGS
    mode = 'unordered';
```

Использование именованных коллекций:

```xml theme={null}
<clickhouse>
    <named_collections>
        <s3queue_conf>
            <url>https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/*</url>
            <access_key_id>test</access_key_id>
            <secret_access_key>test</secret_access_key>
        </s3queue_conf>
    </named_collections>
</clickhouse>
```

```sql theme={null}
CREATE TABLE s3queue_engine_table (name String, value UInt32)
ENGINE=S3Queue(s3queue_conf, format = 'CSV', compression_method = 'gzip')
SETTINGS
    mode = 'ordered';
```

<div id="settings">
  ## Настройки
</div>

Чтобы получить список настроек, заданных для таблицы, используйте таблицу `system.s3_queue_settings`. Доступно с версии `24.10`.

<Info>
  **Имена настроек (24.7+)**

  Начиная с версии 24.7, настройки S3Queue можно указывать как с префиксом `s3queue_`, так и без него:

  * **Современный синтаксис** (24.7+): `processing_threads_num`, `tracked_file_ttl_sec` и т. д.
  * **Устаревший синтаксис** (все версии): `s3queue_processing_threads_num`, `s3queue_tracked_file_ttl_sec` и т. д.

  Обе формы поддерживаются в версии 24.7 и выше. В примерах на этой странице используется современный синтаксис без префикса.
</Info>

<div id="mode">
  ### Режим
</div>

Возможные значения:

* unordered — В режиме unordered множество уже обработанных файлов отслеживается с помощью постоянных узлов в ZooKeeper.
* ordered — В режиме ordered файлы обрабатываются в лексикографическом порядке. Это означает, что если файл с именем 'BBB' был обработан в какой-то момент, а позже в бакет будет добавлен файл с именем 'AA', он будет проигнорирован. В ZooKeeper сохраняются только максимальное имя (в лексикографическом смысле) успешно обработанного файла и имена файлов, для которых будут выполняться повторные попытки после неудачной загрузки.

Значение по умолчанию: `ordered` в версиях до 24.6. Начиная с 24.6 значение по умолчанию отсутствует, и этот параметр необходимо указывать вручную. Для таблиц, созданных в более ранних версиях, для совместимости значением по умолчанию останется `Ordered`.

<div id="after_processing">
  ### `after_processing`
</div>

Что делать с файлом после успешной обработки.

Возможные значения:

* keep.
* delete.
* move.
* tag.

Значение по умолчанию: `keep`.

Для `move` требуются дополнительные настройки. Если перемещение выполняется в пределах одного бакета, нужно указать новый префикс пути в `after_processing_move_prefix`.

Для перемещения в другой S3 бакет требуется URI целевого бакета в `after_processing_move_uri`, а также учетные данные S3 в `after_processing_move_access_key_id` и `after_processing_move_secret_access_key`.

Пример:

```sql theme={null}
CREATE TABLE s3queue_engine_table (name String, value UInt32)
ENGINE=S3Queue('https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/*', 'CSV', 'gzip')
SETTINGS
    mode = 'unordered',
    after_processing = 'move',
    after_processing_retries = 20,
    after_processing_move_prefix = 'dst_prefix',
    after_processing_move_uri = 'https://clickhouse-public-datasets.s3.amazonaws.com/dst-bucket',
    after_processing_move_access_key_id = 'test',
    after_processing_move_secret_access_key = 'test';
```

Для перемещения из одного контейнера Azure в другой требуются строка подключения Blob Storage в параметре `after_processing_move_connection_string` и имя контейнера в параметре `after_processing_move_container`. См. [настройки AzureQueue](/docs/ru/reference/engines/table-engines/integrations/azure-queue#settings).

Для тегирования требуются ключ тега и значение тега, задаваемые параметрами `after_processing_tag_key` и `after_processing_tag_value`.

<div id="after_processing_retries">
  ### `after_processing_retries`
</div>

Количество повторных попыток для запрошенного действия после обработки, прежде чем отказаться от дальнейших попыток.

Возможные значения:

* Неотрицательное целое число.

Значение по умолчанию: `10`.

<div id="after_processing_move_access_key_id">
  ### `after_processing_move_access_key_id`
</div>

Идентификатор ключа доступа для S3 бакета, в который перемещаются успешно обработанные файлы, если пункт назначения — другой S3 бакет.

Возможные значения:

* String.

Значение по умолчанию: пустая строка.

<div id="after_processing_move_prefix">
  ### `after_processing_move_prefix`
</div>

Префикс пути, в который будут перемещаться успешно обработанные файлы. Применяется в обоих случаях: при перемещении в пределах того же бакета и в другой бакет.

Возможные значения:

* String.

Значение по умолчанию: пустая строка.

<div id="after_processing_move_preserve_path">
  ### `after_processing_move_preserve_path`
</div>

Если `true`, при перемещении успешно обработанного файла к `after_processing_move_prefix` добавляется полный путь к исходному объекту, поэтому исходная структура каталогов в бакете сохраняется в пункте назначения. Если `false`, используется только имя файла, а исходная структура каталогов становится плоской.

Возможные значения:

* `true` / `false`.

Значение по умолчанию: `false`.

<div id="after_processing_move_secret_access_key">
  ### `after_processing_move_secret_access_key`
</div>

Секретный ключ доступа для S3 бакета, в который нужно перемещать успешно обработанные файлы, если в качестве пункта назначения используется другой S3 бакет.

Возможные значения:

* String.

Значение по умолчанию: пустая строка.

<div id="after_processing_move_uri">
  ### `after_processing_move_uri`
</div>

URI S3 бакета, в который перемещаются успешно обработанные файлы, если пунктом назначения является другой S3 бакет.

Возможные значения:

* String.

Значение по умолчанию: пустая строка.

<div id="after_processing_tag_key">
  ### `after_processing_tag_key`
</div>

Ключ тега, который будет присвоен успешно обработанным файлам, если `after_processing='tag'`.

Возможные значения:

* String.

Значение по умолчанию: пустая строка.

<div id="after_processing_tag_value">
  ### `after_processing_tag_value`
</div>

Значение тега, которое присваивается успешно обработанным файлам, если `after_processing='tag'`.

Возможные значения:

* String.

Значение по умолчанию: пустая строка.

<div id="keeper_path">
  ### `keeper_path`
</div>

Путь к метаданным очереди в ZooKeeper. Если он не задан явно, ClickHouse формирует путь из `s3queue_default_zookeeper_path`, UUID базы данных и UUID таблицы. Абсолютные значения (начинающиеся с `/`) используются как есть, а относительные добавляются к настроенному префиксу. Макросы, такие как `{database}` или `{uuid}`, разворачиваются до подключения движка к ZooKeeper.

Чтобы указать дополнительный кластер ZooKeeper, добавьте к значению в качестве префикса настроенное имя, например `analytics_keeper:/clickhouse/queue/orders`. Это имя должно существовать в `<auxiliary_zookeepers>`; в противном случае движок сообщит об ошибке `Unknown auxiliary ZooKeeper name ...`. Полная строка (включая префикс) сохраняется в `SHOW CREATE TABLE`, чтобы оператор можно было дословно воспроизвести.

Возможные значения:

* String.

Значение по умолчанию: `/`.

<div id="loading_retries">
  ### `loading_retries`
</div>

Повторять попытку загрузки файла указанное количество раз.
Возможные значения:

* Неотрицательное целое число.

Значение по умолчанию: `10`.

<div id="processing_threads_num">
  ### `processing_threads_num`
</div>

Количество потоков для обработки. Применяется только в режиме `Unordered`.

Значение по умолчанию: количество процессоров или 16.

<div id="parallel_inserts">
  ### `parallel_inserts`
</div>

По умолчанию `processing_threads_num` будет создавать один `INSERT`, поэтому в нескольких потоках будут только скачиваться файлы и разбираться их содержимое.
Но это ограничивает параллелизм, поэтому для более высокой пропускной способности используйте `parallel_inserts=true`: это позволит выполнять вставку данных параллельно (но имейте в виду, что это приведёт к увеличению числа создаваемых частей данных в семействе MergeTree).

<Note>
  `INSERT` будут создаваться с учётом настроек `max_process*_before_commit`.
</Note>

Значение по умолчанию: `false`.

<div id="enable_logging_to_queue_log">
  ### `enable_logging_to_queue_log`
</div>

Включает запись в журнал `system.s3queue_log`.

Значение по умолчанию: `1`.

<div id="polling_min_timeout_ms">
  ### `polling_min_timeout_ms`
</div>

Указывает минимальное время в миллисекундах, которое ClickHouse ожидает перед следующей попыткой опроса.

Возможные значения:

* Положительное целое число.

Значение по умолчанию: `1000`.

<div id="polling_max_timeout_ms">
  ### `polling_max_timeout_ms`
</div>

Определяет максимальное время в миллисекундах, по истечении которого ClickHouse приступает к следующей попытке опроса.

Возможные значения:

* Положительное целое число.

Значение по умолчанию: `600000`.

<div id="polling_backoff_ms">
  ### `polling_backoff_ms`
</div>

Определяет дополнительное время ожидания, добавляемое к предыдущему интервалу опроса, если новых файлов не найдено. Следующий опрос выполняется через сумму предыдущего интервала и этого значения задержки либо через максимальный интервал — в зависимости от того, что меньше.

Возможные значения:

* Положительное целое число.

Значение по умолчанию: `30000`.

<div id="tracked_files_limit">
  ### `tracked_files_limit`
</div>

Позволяет ограничить количество узлов ZooKeeper, если используется режим 'unordered'; для режима 'ordered' не имеет эффекта.
При достижении лимита самые старые обработанные файлы будут удалены из узла ZooKeeper и обработаны повторно.

Возможные значения:

* Положительное целое число.

Значение по умолчанию: `1000`.

<div id="tracked_file_ttl_sec">
  ### `tracked_file_ttl_sec`
</div>

Максимальное количество секунд, в течение которых обработанные файлы хранятся в узле ZooKeeper (по умолчанию — бессрочно) для режима 'unordered'; для режима 'ordered' не применяется.
По истечении указанного количества секунд файл будет повторно импортирован.

Возможные значения:

* Положительное целое число.

Значение по умолчанию: `0`.

<div id="cleanup_interval_min_ms">
  ### `cleanup_interval_min_ms`
</div>

Для режима 'Ordered'. Определяет минимальное значение интервала повторного планирования для фоновой задачи, отвечающей за поддержание TTL отслеживаемых файлов и максимального количества отслеживаемых файлов.

Значение по умолчанию: `60000`.

<div id="cleanup_interval_max_ms">
  ### `cleanup_interval_max_ms`
</div>

Для режима `Ordered`. Определяет максимальный интервал перепланирования фоновой задачи, отвечающей за поддержание TTL отслеживаемых файлов и максимального количества отслеживаемых файлов.

Значение по умолчанию: `60000`.

<div id="buckets">
  ### `buckets`
</div>

Для режима 'Ordered'. Доступно начиная с версии `24.6`. Если у таблицы S3Queue несколько реплик и каждая из них работает с одним и тем же каталогом метаданных в Keeper, значение `buckets` должно быть как минимум равно числу реплик. Если также используется настройка `processing_threads`, имеет смысл ещё увеличить значение `buckets`, так как именно она определяет фактический параллелизм обработки `S3Queue`.

<div id="use_persistent_processing_nodes">
  ### `use_persistent_processing_nodes`
</div>

Постоянные узлы обработки исключают появление дубликатов, если сеанс Keeper завершается после начала обработки, но до того, как S3Queue зафиксирует обработанный файл. В более ранних версиях использовались эфемерные узлы обработки, которые в таком случае могли приводить к появлению дубликатов.

Эта настройка устарела, и её значение игнорируется: постоянные узлы обработки используются всегда. Таблица, созданная с `use_persistent_processing_nodes = 0`, всё равно использует постоянные узлы обработки, а интроспекция настроек, включая `SHOW CREATE TABLE`, показывает `1` независимо от указанного значения.

<div id="persistent_processing_node_ttl_seconds">
  ### `persistent_processing_node_ttl_seconds`
</div>

В случае нештатного завершения работы сервера может оказаться, что узлы обработки не были удалены. Этот параметр задаёт период времени, по истечении которого такие узлы обработки можно безопасно удалить. Этот же TTL также используется для блокировки бакета в режиме `Ordered`, которая может удерживаться дольше, чем отдельный узел обработки, поэтому значение должно учитывать и это.

Значение по умолчанию: `21600` (6 часов).

<div id="s3-settings">
  ## Настройки, связанные с S3
</div>

Этот движок поддерживает все настройки, связанные с S3. Дополнительные сведения о настройках S3 см. [здесь](/docs/ru/reference/engines/table-engines/integrations/s3).

<div id="s3-role-based-access">
  ## Ролевой доступ на основе ролей к S3
</div>

<ScalePlanFeatureBadge feature="S3 Role-Based Access" />

Движок таблицы S3Queue поддерживает доступ на основе ролей.
Инструкции по настройке роли для доступа к вашему бакету см. в документации [здесь](/docs/ru/products/cloud/guides/data-sources/accessing-s3-data-securely).

После настройки роли `roleARN` можно передать через параметр `extra_credentials`, как показано ниже:

```sql theme={null}
CREATE TABLE s3_table
(
    ts DateTime,
    value UInt64
)
ENGINE = S3Queue(
                'https://<your_bucket>/*.csv',
                extra_credentials(role_arn = 'arn:aws:iam::111111111111:role/<your_role>')
                ,'CSV')
SETTINGS
    ...
```

<div id="ordered-mode">
  ## Упорядоченный режим S3Queue
</div>

Режим обработки `S3Queue` позволяет хранить меньше метаданных в ZooKeeper, но имеет ограничение: файлы, добавленные позже, должны иметь алфавитно-цифровые имена, которые больше по порядку.

Режим `S3Queue` `ordered`, как и `unordered`, поддерживает настройку `(s3queue_)processing_threads_num` (префикс `s3queue_` необязателен), которая позволяет управлять количеством потоков, выполняющих локальную обработку файлов `S3` на сервере.

Для режима `ordered` без партиционирования ClickHouse может возобновлять перечисление объектов S3 с последнего обработанного ключа, чтобы не выполнять повторный обход всей истории префикса. В бакетизированном упорядоченном режиме точка возобновления консервативно выбирается как наименьший обработанный ключ среди всех бакетов, чтобы избежать пропуска необработанных файлов.
Эта оптимизация возобновления перечисления используется только для очередей на базе S3 в режиме `ordered` без партиционирования (не для AzureQueue и не когда задан `partitioning_mode`).
Кроме того, режим `ordered` также вводит ещё одну настройку — `(s3queue_)buckets`, которая означает «логические потоки». В распределённом сценарии, когда есть несколько серверов с репликами таблицы `S3Queue`, эта настройка определяет количество единиц обработки. Например, каждый поток обработки на каждой реплике `S3Queue` будет пытаться заблокировать определённый `bucket` для обработки, при этом каждый `bucket` назначается определённым файлам по хэшу имени файла. Поэтому в распределённом сценарии настоятельно рекомендуется, чтобы значение настройки `(s3queue_)buckets` было как минимум равно числу реплик или больше. Количество бакетов может быть больше числа реплик. Оптимальный вариант — когда значение настройки `(s3queue_)buckets` равно произведению `number_of_replicas` и `(s3queue_)processing_threads_num`.
Использовать настройку `(s3queue_)processing_threads_num` не рекомендуется до версии `24.6`.
Настройка `(s3queue_)buckets` доступна начиная с версии `24.6`.

<div id="select">
  ## SELECT из движка таблицы S3Queue
</div>

Запросы SELECT для таблиц S3Queue по умолчанию запрещены. Это соответствует распространённому паттерну очереди, при котором данные считываются один раз, а затем удаляются из очереди. SELECT запрещён, чтобы предотвратить случайную потерю данных.
Однако в некоторых случаях это может быть полезно. Для этого нужно установить параметр `stream_like_engine_allow_direct_select` в `True`.
У движка S3Queue есть специальный параметр для запросов SELECT: `commit_on_select`. Установите его в `False`, чтобы сохранить данные в очереди после чтения, или в `True`, чтобы удалить их.

<div id="description">
  ## Описание
</div>

`SELECT` не особенно полезен для потокового импорта (кроме отладки), поскольку каждый файл можно импортировать только один раз. Гораздо практичнее создавать потоки в реальном времени с помощью [materialized view](/docs/ru/reference/statements/create/view). Для этого:

1. С помощью движка создайте таблицу для чтения из указанного пути в S3 и рассматривайте её как поток данных.
2. Создайте таблицу с нужной структурой.
3. Создайте materialized view, который преобразует данные из движка и помещает их в ранее созданную таблицу.

Когда `MATERIALIZED VIEW` подключается к движку, он начинает собирать данные в фоновом режиме.

Пример:

```sql theme={null}
CREATE TABLE s3queue_engine_table (name String, value UInt32)
    ENGINE=S3Queue('https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/*', 'CSV', 'gzip')
    SETTINGS
        mode = 'unordered';

CREATE TABLE stats (name String, value UInt32)
    ENGINE = MergeTree() ORDER BY name;

CREATE MATERIALIZED VIEW consumer TO stats
    AS SELECT name, value FROM s3queue_engine_table;

  SELECT * FROM stats ORDER BY name;
```

<div id="virtual-columns">
  ## Виртуальные столбцы
</div>

* `_path` — Путь к файлу.
* `_file` — Имя файла.
* `_size` — Размер файла.
* `_time` — Время создания файла.

Подробнее о виртуальных столбцах см. [здесь](/docs/ru/reference/engines/table-engines/index#table_engines-virtual_columns).

<div id="wildcards-in-path">
  ## Подстановочные шаблоны в path
</div>

Аргумент `path` может задавать несколько файлов с помощью bash-подобных подстановочных шаблонов. Чтобы файл был обработан, он должен существовать и соответствовать шаблону пути целиком. Список файлов определяется во время `SELECT` (а не в момент `CREATE`).

* `*` — Заменяет любое количество любых символов, кроме `/`, включая пустую строку.
* `**` — Заменяет любое количество любых символов, включая `/`, включая пустую строку.
* `?` — Заменяет любой отдельный символ.
* `{some_string,another_string,yet_another_one}` — Заменяет любую из строк: `'some_string'`, `'another_string'`, `'yet_another_one'`.
* `{N..M}` — Заменяет любое число в диапазоне от N до M включительно. N и M могут содержать ведущие нули, например `000..078`.

Конструкции с `{}` аналогичны конструкции в табличной функции [remote](/docs/ru/reference/functions/table-functions/remote).

<div id="limitations">
  ## Ограничения
</div>

1. Дублирующиеся строки могут возникать в результате:

* исключения во время парсинга в середине обработки файла, если повторные попытки включены через `s3queue_loading_retries`;

* `S3Queue` настроен на нескольких серверах, указывающих на один и тот же путь в ZooKeeper, и сеанс Keeper истекает до того, как один из серверов успевает закоммитить обработанный файл. Это может привести к тому, что другой сервер начнёт обрабатывать файл, который уже был частично или полностью обработан первым сервером. Однако этому препятствуют постоянные узлы обработки, доступные с версии 25.8 и теперь используемые всегда (см. [`use_persistent_processing_nodes`](#use_persistent_processing_nodes)).

* аварийного завершения работы сервера.

2. Если `S3Queue` настроен на нескольких серверах, указывающих на один и тот же путь в ZooKeeper, и используется режим `Ordered`, то `s3queue_loading_retries` не будет работать. Это скоро исправят.

3. Потеря строк при отключении питания устройства на узле ClickHouse. Файл, данные из которого были считаны, помечается как обработанный в Keeper (а его исходный объект удаляется при `after_processing = 'delete'`) сразу после завершения вставки, однако вставленные строки становятся устойчивыми только после выполнения fsync для целевой части, что по умолчанию не происходит синхронно (`fsync_after_insert = 0`). Keeper принудительно синхронизируется и обычно работает на отдельном узле, поэтому переживает отключение питания этого узла. Если питание узла отключается после коммита файла как обработанного, но до выполнения fsync для целевой части, файл не будет повторно прочитан после перезапуска, а его строки будут потеряны (без возможности восстановления при `after_processing = 'delete'`). Обычное завершение процесса не выявляет эту проблему, поскольку page cache сохраняется. Для рекомендуемого пути обработки через materialized view (файл коммитится только после завершения всего конвейера вставки) настройка `fsync_after_insert = 1` (и `fsync_part_directory = 1`) в целевой таблице `MergeTree` обеспечивает устойчивость вставленной части до коммита файла как обработанного, что существенно сужает это окно. Это не относится к прямому `INSERT ... SELECT` с `commit_on_select = 1`, при котором файл коммитится в конце чтения до того, как приемник назначения завершит формирование последней части.

<div id="introspection">
  ## Интроспекция
</div>

Для интроспекции используйте stateless-таблицы `system.s3queue_metadata_cache` и `system.s3_queue_metadata`, а также постоянную таблицу `system.s3queue_log`.

* Используйте `system.s3queue_metadata_cache` для проверки кэша в памяти, содержащего состояние обработки каждого файла (какие файлы сейчас обрабатываются, уже обработаны или завершились ошибкой) на локальном сервере.
* Используйте `system.s3_queue_metadata` для проверки состояния, хранящегося непосредственно в Keeper: количества узлов `processed`, `processing` и `failed` для каждого объекта метаданных, а также, при необходимости, их содержимого. Это полезно, если кэш в памяти ещё не отражает состояние Keeper, или для просмотра общего состояния всего кластера.
* Используйте `system.s3queue_log` для хранения постоянной истории файлов со статусами `processed` и `failed`.

1. `system.s3queue_metadata_cache`. Эта таблица не является постоянной и показывает текущее состояние `S3Queue` в памяти: какие файлы обрабатываются в данный момент, какие уже обработаны, а какие завершились ошибкой.

```text theme={null}
┌─statement──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ CREATE TABLE system.s3queue_metadata_cache
(
    `database` String,
    `table` String,
    `file_name` String,
    `rows_processed` UInt64,
    `status` String,
    `processing_start_time` Nullable(DateTime),
    `processing_end_time` Nullable(DateTime),
    `ProfileEvents` Map(String, UInt64)
    `exception` String
)
ENGINE = SystemS3Queue
COMMENT 'Contains in-memory state of S3Queue metadata and currently processed rows per file.' │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
```

Пример:

```sql theme={null}

SELECT *
FROM system.s3queue_metadata_cache

Row 1:
──────
zookeeper_path:        /clickhouse/s3queue/25ea5621-ae8c-40c7-96d0-cec959c5ab88/3b3f66a1-9866-4c2e-ba78-b6bfa154207e
file_name:             wikistat/original/pageviews-20150501-030000.gz
rows_processed:        5068534
status:                Processed
processing_start_time: 2023-10-13 13:09:48
processing_end_time:   2023-10-13 13:10:31
ProfileEvents:         {'ZooKeeperTransactions':3,'ZooKeeperGet':2,'ZooKeeperMulti':1,'SelectedRows':5068534,'SelectedBytes':198132283,'ContextLock':1,'S3QueueSetFileProcessingMicroseconds':2480,'S3QueueSetFileProcessedMicroseconds':9985,'S3QueuePullMicroseconds':273776,'LogTest':17}
exception:
```

2. `system.s3_queue_metadata`. Эта таблица не является постоянной и считывает состояние непосредственно из Keeper: количество узлов `processed`, `processing` и `failed` для каждого объекта метаданных, а также, по запросу, их содержимое.

Столбцы `processed_nodes`, `processing_nodes`, `failed_nodes` и `processed_path` выполняют запросы к Keeper и извлекаются только при выборе соответствующего столбца, поэтому выбор только счётчиков `*_nodes_count` позволяет избежать дополнительного трафика к Keeper.

```sql theme={null}
SELECT zookeeper_path, processed_nodes_count, processing_nodes_count, failed_nodes_count
FROM system.s3_queue_metadata

Row 1:
──────
zookeeper_path:         /clickhouse/s3queue/25ea5621-ae8c-40c7-96d0-cec959c5ab88/3b3f66a1-9866-4c2e-ba78-b6bfa154207e
processed_nodes_count:  128
processing_nodes_count: 2
failed_nodes_count:     0
```

Полный список столбцов см. на справочной странице `system.s3_queue_metadata`.

3. `system.s3queue_log`. Постоянная таблица. Содержит ту же информацию, что и `system.s3queue_metadata_cache`, но для файлов со статусами `processed` и `failed`.

Таблица имеет следующую структуру:

```sql theme={null}
SHOW CREATE TABLE system.s3queue_log

Query id: 0ad619c3-0f2a-4ee4-8b40-c73d86e04314

┌─statement──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ CREATE TABLE system.s3queue_log
(
    `event_date` Date,
    `event_time` DateTime,
    `table_uuid` String,
    `file_name` String,
    `rows_processed` UInt64,
    `status` Enum8('Processed' = 0, 'Failed' = 1),
    `processing_start_time` Nullable(DateTime),
    `processing_end_time` Nullable(DateTime),
    `ProfileEvents` Map(String, UInt64),
    `exception` String
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(event_date)
ORDER BY (event_date, event_time) │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
```

Чтобы использовать `system.s3queue_log`, задайте его конфигурацию в конфигурационном файле сервера:

```xml theme={null}
    <s3queue_log>
        <database>system</database>
        <table>s3queue_log</table>
    </s3queue_log>
```

Пример:

```sql theme={null}
SELECT *
FROM system.s3queue_log

Row 1:
──────
event_date:            2023-10-13
event_time:            2023-10-13 13:10:12
table_uuid:
file_name:             wikistat/original/pageviews-20150501-020000.gz
rows_processed:        5112621
status:                Processed
processing_start_time: 2023-10-13 13:09:48
processing_end_time:   2023-10-13 13:10:12
ProfileEvents:         {'ZooKeeperTransactions':3,'ZooKeeperGet':2,'ZooKeeperMulti':1,'SelectedRows':5112621,'SelectedBytes':198577687,'ContextLock':1,'S3QueueSetFileProcessingMicroseconds':1934,'S3QueueSetFileProcessedMicroseconds':17063,'S3QueuePullMicroseconds':5841972,'LogTest':17}
exception:
```
