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

Пример

Создайте таблицу

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

  • path — URL бакета с путём к файлу. В режиме readonly поддерживаются следующие подстановочные шаблоны: *, **, ?, {abc,def} и {N..M}, где N, M — числа, а 'abc', 'def' — строки. Подробнее см. ниже.
  • NOSIGN - Если это ключевое слово указано вместо учётных данных, запросы не будут подписываться.
  • formatФормат файла.
  • aws_access_key_id, aws_secret_access_key - Долговременные учётные данные пользователя аккаунта AWS. Их можно использовать для аутентификации запросов. Параметр необязателен. Если учётные данные не указаны, они берутся из файла конфигурации. Подробнее см. Использование S3 для хранения данных.
  • compression — Тип сжатия. Поддерживаемые значения: none, gzip/gz, brotli/br, xz/LZMA, zstd/zst. Параметр необязателен. По умолчанию тип сжатия определяется автоматически по расширению файла.
  • partition_strategy – Варианты: WILDCARD или HIVE. Для WILDCARD в пути должен присутствовать {_partition_id}, который заменяется ключом партиционирования. HIVE не поддерживает подстановочные шаблоны, предполагает, что путь указывает на корень таблицы, и генерирует каталоги партиций в стиле Hive, где в качестве имён файлов используются Snowflake ID, а расширением служит формат файла. По умолчанию используется настройка file_like_engine_default_partition_strategy (WILDCARD при настройках compatibility старше 26.6, в противном случае HIVE).
  • partition_columns_in_data_file - Используется только со стратегией партиционирования HIVE. Указывает, должен ли ClickHouse ожидать, что столбцы партиции будут записаны в файл данных. По умолчанию — false.
  • storage_class_name - Варианты: STANDARD или INTELLIGENT_TIERING; позволяет указать AWS S3 Intelligent Tiering.
  • extra_credentials - Необязательный параметр. Используется для передачи role_arn для ролевого доступа в ClickHouse Cloud. Инструкции по настройке см. в Secure S3.

Кэш данных

Движок таблицы S3 поддерживает кэширование данных на локальном диске. Параметры конфигурации и использование файлового кэша описаны в этом разделе. Кэширование выполняется на основе path и ETag объекта хранилища, поэтому ClickHouse не будет читать устаревшую версию кэша. Чтобы включить кэширование, используйте настройки filesystem_cache_name = '<name>' и enable_filesystem_cache = 1.
Есть два способа задать кэш в конфигурационном файле.
  1. добавьте следующий раздел в конфигурационный файл ClickHouse:
  1. повторно использовать конфигурацию кэша (а значит, и хранилище кэша) из раздела storage_configuration в ClickHouse, описанного здесь

PARTITION BY

PARTITION BY — необязателен. В большинстве случаев ключ партиционирования не нужен, а если он всё же нужен, то, как правило, достаточно партиционирования по месяцам. Партиционирование не ускоряет запросы (в отличие от выражения ORDER BY). Никогда не используйте слишком мелкое партиционирование. Не разбивайте данные на партиции по идентификаторам или именам клиентов (вместо этого сделайте идентификатор или имя клиента первым столбцом в выражении ORDER BY). Для партиционирования по месяцам используйте выражение toYYYYMM(date_column), где date_column — столбец с датой типа Date. Имена партиций в этом случае имеют формат "YYYYMM".

Стратегия партиционирования

WILDCARD: заменяет подстановочный символ {_partition_id} в пути к файлу на фактический ключ партиционирования. Чтение не поддерживается. По умолчанию выбирается только при значении настройки compatibility ниже 26.6; в противном случае по умолчанию используется HIVE (см. настройку file_like_engine_default_partition_strategy). HIVE реализует секционирование в стиле Hive для чтения и записи. Для чтения используется рекурсивный glob-шаблон; это эквивалентно SELECT * FROM s3('table_root/**.parquet'). При записи файлы создаются в следующем формате: <prefix>/<key1=val1/key2=val2...>/<snowflakeid>.<toLower(file_format)>. Примечание: при использовании стратегии партиционирования HIVE настройка use_hive_partitioning не имеет эффекта. Пример стратегии партиционирования HIVE:

Запросы к данным, разбитым на партиции

В этом примере используется рецепт Docker Compose, который интегрирует ClickHouse и MinIO. Вы сможете воспроизвести те же запросы с S3, заменив значения конечной точки и аутентификации. Обратите внимание, что конечная точка S3 в конфигурации ENGINE использует токен параметра {_partition_id} как часть объекта S3 (имени файла), а в запросах SELECT используются получившиеся имена объектов (например, test_3.csv).
Как показано в примере, выполнение запросов к S3-таблицам с разбиением на партиции в настоящее время напрямую не поддерживается, но этого можно добиться, запрашивая отдельные партиции с помощью табличной функции S3.Основной сценарий использования записи данных с разбиением на партиции в S3 — перенос этих данных в другую систему ClickHouse (например, при переходе с локальных систем на ClickHouse Cloud). Поскольку датасеты ClickHouse часто бывают очень большими, а надёжность сети не всегда идеальна, имеет смысл передавать датасеты по частям — отсюда и запись с разбиением на партиции.

Создание таблицы

Вставка данных

Выборка из партиции 3

В этом запросе используется табличная функция S3

Выборка из партиции 1

Выборка данных из партиции 45

Ограничение

Возможно, вы попробуете выполнить Select * from p, но, как отмечалось выше, этот запрос завершится ошибкой; используйте запрос выше.

Вставка данных

Обратите внимание: строки можно вставлять только в новые файлы. Операции разделения файлов и циклы слияния не поддерживаются. После записи файла все последующие вставки завершатся ошибкой. Чтобы этого избежать, можно использовать настройки s3_truncate_on_insert и s3_create_new_file_on_insert. Подробнее см. здесь.

Виртуальные столбцы

  • _path — Путь к файлу. Тип: LowCardinality(String).
  • _file — Имя файла. Тип: LowCardinality(String).
  • _size — Размер файла в байтах. Тип: Nullable(UInt64). Если размер неизвестен, значение равно NULL.
  • _time — Время последнего изменения файла. Тип: Nullable(DateTime). Если время неизвестно, значение равно NULL.
  • _etag — ETag файла. Тип: LowCardinality(String). Если ETag неизвестен, значение равно NULL.
  • _tags — Метки файла. Тип: Map(String, String). Если меток нет, значение — пустой Map {}.
Подробнее о виртуальных столбцах см. здесь.

Подробности реализации

Репликация с нулевым копированием не готова для продакшнаВ ClickHouse версии 22.8 и выше репликация с нулевым копированием по умолчанию отключена. Эта возможность не рекомендуется для использования в продакшне.

Подстановочные шаблоны в path

Аргумент 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.
Если список файлов содержит числовые диапазоны с ведущими нулями, используйте конструкцию с фигурными скобками отдельно для каждой цифры или ?.
Пример с подстановочными шаблонами 1 Создайте таблицу с файлами с именами file-000.csv, file-001.csv, … , file-999.csv:
Пример с подстановочными шаблонами 2 Предположим, у нас есть несколько файлов в формате CSV со следующими URI в S3: Есть несколько способов создать таблицу из всех шести файлов:
  1. Укажите диапазон суффиксов файлов:
  1. Возьмите все файлы с префиксом some_file_ (в обеих папках не должно быть других файлов с таким префиксом):
  1. Возьмите все файлы из обеих папок (все файлы должны соответствовать формату и схеме, указанным в запросе):

Настройки хранилища

  • s3_truncate_on_insert - позволяет обрезать файл перед вставкой данных. По умолчанию отключена.
  • s3_create_new_file_on_insert - позволяет создавать новый файл при каждой вставке, если у формата есть суффикс. По умолчанию отключена.
  • s3_skip_empty_files - позволяет пропускать пустые файлы при чтении. По умолчанию включена.

Настройки, связанные с S3

Следующие настройки можно задать перед выполнением запроса или указать в конфигурационном файле.
  • s3_max_single_part_upload_size — Максимальный размер объекта для загрузки в S3 с помощью singlepart upload. Значение по умолчанию — 32Mb.
  • s3_min_upload_part_size — Минимальный размер части, загружаемой при multipart-загрузке через S3 Multipart upload. Значение по умолчанию — 16Mb.
  • s3_max_redirects — Максимально допустимое количество переходов при перенаправлениях S3. Значение по умолчанию — 10.
  • s3_single_read_retries — Максимальное количество попыток при одном чтении. Значение по умолчанию — 4.
  • s3_max_put_rps — Максимальная частота PUT-запросов в секунду до применения троттлинга. Значение по умолчанию — 0 (без ограничений).
  • s3_max_put_burst — Максимальное количество запросов, которые можно отправить одновременно до достижения лимита запросов в секунду. По умолчанию (значение 0) равно s3_max_put_rps.
  • s3_max_get_rps — Максимальная частота GET-запросов в секунду до применения троттлинга. Значение по умолчанию — 0 (без ограничений).
  • s3_max_get_burst — Максимальное количество запросов, которые можно отправить одновременно до достижения лимита запросов в секунду. По умолчанию (значение 0) равно s3_max_get_rps.
  • s3_upload_part_size_multiply_factor - Умножает s3_min_upload_part_size на этот коэффициент каждый раз, когда в рамках одной записи в S3 было загружено s3_multiply_parts_count_threshold частей. Значение по умолчанию — 2.
  • s3_upload_part_size_multiply_parts_count_threshold - Каждый раз, когда в S3 загружено такое количество частей, s3_min_upload_part_size умножается на s3_upload_part_size_multiply_factor. Значение по умолчанию — 500.
  • s3_max_inflight_parts_for_one_file - Ограничивает количество PUT-запросов, которые могут выполняться параллельно для одного объекта. Это число следует ограничивать. Значение 0 означает отсутствие ограничений. Значение по умолчанию — 20. Для каждой части в процессе загрузки выделяется буфер размером s3_min_upload_part_size для первых s3_upload_part_size_multiply_factor частей и большего размера, если файл достаточно велик; см. upload_part_size_multiply_factor. При настройках по умолчанию загрузка одного файла размером менее 8G потребляет не более 320Mb. Для файлов большего размера потребление выше.
Соображение безопасности: если злоумышленник может указывать произвольные URL S3, s3_max_redirects необходимо установить в ноль, чтобы избежать атак SSRF; либо, в качестве альтернативы, в конфигурации сервера необходимо указать remote_host_filter.

Настройки для конечных точек

Следующие настройки можно указать в файле конфигурации для заданной конечной точки (которая будет сопоставляться по точному префиксу URL):
  • endpoint — Задает префикс конечной точки. Обязательно.
  • access_key_id и secret_access_key — Задают учетные данные, которые будут использоваться для данной конечной точки. Необязательно.
  • use_environment_credentials — Если установлено значение true, клиент S3 попытается получить учетные данные из переменных окружения и метаданных Amazon EC2 для данной конечной точки. Необязательно, значение по умолчанию — false.
  • region — Задает имя региона S3. Необязательно.
  • use_insecure_imds_request — Если установлено значение true, клиент S3 будет использовать небезопасный запрос IMDS при получении учетных данных из метаданных Amazon EC2. Необязательно, значение по умолчанию — false.
  • expiration_window_seconds — Льготный период для проверки того, не истек ли срок действия учетных данных. Необязательно, значение по умолчанию — 120.
  • no_sign_request - Игнорирует все учетные данные, чтобы запросы не подписывались. Полезно для доступа к публичным бакетам.
  • header — Добавляет указанный HTTP-заголовок в запрос к данной конечной точке. Необязательно, можно указывать несколько раз.
  • access_header - Добавляет указанный HTTP-заголовок в запрос к данной конечной точке в случаях, когда отсутствуют другие учетные данные из другого источника.
  • server_side_encryption_customer_key_base64 — Если указано, будут установлены необходимые заголовки для доступа к объектам S3 с шифрованием SSE-C. Необязательно.
  • server_side_encryption_kms_key_id - Если указано, будут установлены необходимые заголовки для доступа к объектам S3 с шифрованием SSE-KMS. Если указана пустая строка, будет использоваться ключ S3 под управлением AWS. Необязательно.
  • server_side_encryption_kms_encryption_context - Если указано вместе с server_side_encryption_kms_key_id, будет установлен указанный заголовок контекста шифрования для SSE-KMS. Необязательно.
  • server_side_encryption_kms_bucket_key_enabled - Если указано вместе с server_side_encryption_kms_key_id, будет установлен заголовок для включения ключей S3 бакета для SSE-KMS. Необязательно, может быть true или false, по умолчанию не задано (соответствует настройке на уровне бакета).
  • max_single_read_retries — Максимальное количество попыток в ходе одного чтения. Значение по умолчанию — 4. Необязательно.
  • max_put_rps, max_put_burst, max_get_rps и max_get_burst - Настройки ограничения скорости (см. описание выше), используемые для конкретной конечной точки вместо настроек на уровне запроса. Необязательно.
Пример:

Работа с архивами

Предположим, что у нас есть несколько архивных файлов со следующими URI в S3: Извлечь данные из этих архивов можно с помощью ::. Глоб-шаблоны можно использовать как в части URL, так и в части после :: (она отвечает за имя файла внутри архива).
ClickHouse поддерживает три формата архивов: ZIP TAR 7Z Хотя к архивам ZIP и TAR можно обращаться из любого поддерживаемого места хранения, архивы 7Z можно читать только из локальной файловой системы, на которой установлен ClickHouse.

Доступ к публичным бакетам

ClickHouse пытается получать учетные данные из множества различных источников. Иногда это может вызывать проблемы при доступе к некоторым публичным бакетам, из-за чего клиент возвращает ошибку 403. Этой проблемы можно избежать, используя ключевое слово NOSIGN, которое заставляет клиент игнорировать все учетные данные и не подписывать запросы.

Оптимизация производительности

Подробнее об оптимизации производительности функции s3 см. в нашем подробном руководстве.

Ролевой доступ

В ClickHouse Cloud для аутентификации в S3 можно использовать ролевой доступ вместо ключей доступа. Шаги по настройке см. в разделе Secure S3. После настройки roleARN можно передать через параметр extra_credentials:
Необязательный external_id также можно передать вместе с role_arn. Он передаётся как параметр ExternalId в вызове AWS STS AssumeRole, что позволяет политике доверия роли требовать общий секрет, чтобы снизить риск проблемы confused deputy:

См. также

Последнее изменение 1 июля 2026 г.