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 — это верхнеуровневый контейнер для данных. Можно думать о нём как о корневой папке проекта, хотя технически это не обычная папка.
Примеры:
rawstaginganalyticsshustikov
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
| Что сравниваем | HDFS | S3 / 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 часто становится центральным местом хранения данных, а вычисления подключаются к нему отдельно.