Documentation
🪣 S3

S3 / объектное хранилище

S3 часто ставят рядом с Hadoop и HDFS, потому что оба варианта используют для хранения больших объёмов данных. Но важно не путать: S3 — это не часть Hadoop.

HDFS — это распределённая файловая система внутри Hadoop-кластера. S3 — это объектное хранилище, к которому приложения подключаются по API.

Проще говоря:

  • в HDFS мы работаем с файлами в распределённой файловой системе;
  • в S3 мы работаем с объектами внутри бакетов;
  • S3 может лежать в облаке, в Kubernetes, в Docker или на своих серверах;
  • многие инструменты Big Data умеют читать и писать данные в S3 напрямую.

Какие бывают S3-хранилища

Когда говорят "S3", не всегда имеют в виду именно Amazon. Часто имеют в виду S3-compatible storage, то есть хранилище, которое поддерживает S3 API.

Примеры:

  • Amazon S3 — оригинальный сервис от AWS.
  • MinIO / MinIO S3 — популярное self-hosted S3-хранилище, которое можно поднять локально, в Docker или в Kubernetes.
  • Yandex Object Storage — S3-совместимое хранилище в Yandex Cloud.
  • Ceph Object Gateway — S3-совместимый слой поверх Ceph.
  • Selectel Object Storage, VK Cloud Object Storage и другие облачные S3-compatible решения.

В учебных проектах часто используют MinIO, потому что его легко поднять локально и работать с ним почти так же, как с настоящим S3.


Базовые сущности S3

Bucket

Bucket — это верхнеуровневый контейнер для данных. Можно думать о нём как о корневой папке проекта, хотя технически это не обычная папка.

Примеры:

  • raw
  • staging
  • analytics
  • shustikov

Object

Object — это файл плюс метаданные. Например:

s3://raw/orders/2026/07/11/orders.parquet

Здесь:

  • raw — bucket;
  • orders/2026/07/11/orders.parquet — key объекта.

Prefix

Prefix — это начало пути объекта. В S3 нет настоящих директорий как в файловой системе, но есть ключи, которые выглядят как пути.

Например, для объектов:

file_size/ORC/part-000.orc
file_size/PARQUET/part-000.parquet
file_size/CSV/data.csv

префиксами будут:

file_size/ORC
file_size/PARQUET
file_size/CSV

Чем S3 отличается от HDFS

Что сравниваемHDFSS3 / Object Storage
Тип храненияРаспределённая файловая системаОбъектное хранилище
Где живётОбычно внутри Hadoop-кластераВ облаке или отдельно от вычислений
Как обращаемсяЧерез HDFS API / hdfs dfsЧерез S3 API / HTTP
Основная единицаФайл и блокиОбъект
МасштабированиеЧерез DataNodeЧерез сервис хранилища
Типичный use caseКлассический Hadoop-кластерData Lake, бэкапы, обмен данными, сырые данные

На практике S3 часто выбирают потому, что оно отделяет хранение от вычислений. Например, данные лежат в S3, а читать их могут Spark, ClickHouse, Airflow, Python-скрипты, Greenplum, Trino, Presto или dbt-пайплайны.


Кто может подключаться к S3

Python

В Python чаще всего используют:

  • boto3 — официальный AWS SDK, который также работает с MinIO и другими S3-compatible хранилищами;
  • s3fs — удобный доступ к S3 как к файловой системе;
  • pandas, pyarrow, polars — могут читать CSV/Parquet из S3 при правильной настройке.

Spark

Spark умеет читать и писать данные в S3 через s3a://.

Пример:

df = spark.read.parquet("s3a://raw/orders/")
df.write.mode("overwrite").parquet("s3a://analytics/orders/")

Для MinIO обычно дополнительно настраивают endpoint, access key, secret key и path-style access.

ClickHouse

ClickHouse умеет работать с S3 через табличную функцию s3 и движок S3.

Пример чтения Parquet:

SELECT *
FROM s3(
    'http://minio:9000/shustikov/file_size/PARQUET/*.parquet',
    'access_key',
    'secret_key',
    'Parquet'
);

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

Airflow

В Airflow можно работать с S3 через:

  • S3Hook;
  • S3KeySensor;
  • S3CreateBucketOperator;
  • обычный Python-код с boto3.

Например, DAG может скачать данные из API, положить JSON/CSV/Parquet в S3, а потом Spark или ClickHouse заберут эти данные дальше.

Другие инструменты

С S3 также часто работают:

  • Greenplum через PXF;
  • Trino / Presto для SQL-запросов по файлам в Data Lake;
  • Hive Metastore / Iceberg / Hudi / Delta Lake для хранения таблиц поверх файлов в S3;
  • Kafka Connect для выгрузки топиков в S3;
  • dbt через движки, которые умеют читать S3.

Пример: посмотреть размер данных в MinIO через boto3

Ниже пример Python-кода, который подключается к MinIO по S3 API и считает размер объектов по префиксам. Так удобно сравнивать, сколько места занимают разные форматы файлов: ORC, Parquet и CSV.

import os
 
import boto3
 
 
s3 = boto3.client(
    "s3",
    endpoint_url="http://minio:9000",
    aws_access_key_id=os.getenv("MINIO_ROOT_USER"),
    aws_secret_access_key=os.getenv("MINIO_ROOT_PASSWORD"),
)
 
 
def get_size(prefix):
    total = 0
    resp = s3.list_objects_v2(Bucket="shustikov", Prefix=prefix)
 
    for obj in resp.get("Contents", []):
        total += obj["Size"]
 
    return total / (1024**2)  # MB
 
 
print("ORC:", get_size("file_size/ORC"))
print("PARQUET:", get_size("file_size/PARQUET"))
print("CSV:", get_size("file_size/CSV"))

Что здесь происходит:

  • endpoint_url="http://minio:9000" — говорим boto3, что подключаемся не к AWS, а к MinIO;
  • MINIO_ROOT_USER и MINIO_ROOT_PASSWORD — берём логин и пароль из переменных окружения;
  • Bucket="shustikov" — выбираем бакет;
  • Prefix=prefix — считаем только объекты внутри нужного "пути";
  • list_objects_v2 возвращает список объектов и их размеры;
  • итог делим на 1024**2, чтобы получить мегабайты.

Главное, что нужно запомнить

  • S3 — это объектное хранилище, а не файловая система Hadoop.
  • MinIO, AWS S3, Yandex Object Storage и другие S3-compatible решения работают по похожему API.
  • В S3 обычно складывают raw/stage/backup/data lake данные.
  • Spark, Python, ClickHouse, Airflow, Greenplum, Trino и другие инструменты могут читать и писать данные в S3.
  • В современном Data Engineering S3 часто становится центральным местом хранения данных, а вычисления подключаются к нему отдельно.