← Назад к вопросам

Через какие движки на HDFS можно с файлами работать как с таблицами

2.0 Middle🔥 121 комментариев
#Hadoop и распределенные системы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Через какие движки на HDFS можно с файлами работать как с таблицами

Это отличный вопрос о query engines, которые позволяют работать с файлами в HDFS (или других распределенных хранилищах) как с обычными SQL таблицами.

1. Apache Hive

Hive — это исторически первый и наиболее зрелый engine для этого.

Особенности:

  • SQL interface поверх MapReduce (позже Spark и Tez)
  • Хранит metadata в metastore (обычно PostgreSQL)
  • Создает таблицы поверх файлов HDFS
  • Медленный для interactive queries (batch-oriented)
-- Создать Hive таблицу поверх CSV файлов в HDFS
CREATE TABLE users (
    user_id INT,
    name STRING,
    email STRING,
    age INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION '/data/users_csv';

-- Теперь работаешь как обычно
SELECT * FROM users WHERE age > 18;

Форматы файлов:

  • TEXTFILE (CSV, JSON line-delimited)
  • SEQUENCEFILE (Hadoop binary)
  • PARQUET (columnar, быстро)
  • ORC (optimized, compression)

Когда использовать:

  • Legacy систем с большим объемом Hive кода
  • Batch processing
  • Интеграция с Hadoop экосистемой

Проблемы:

  • Медленно для interactive (queries могут занять минуты)
  • Overhead на создание MapReduce job'ов
  • Нужен отдельный metastore

2. Apache Spark SQL

Модерный approach через Spark DataFrame API и SQL.

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("read-files").getOrCreate()

# Прямое чтение файлов из HDFS
df = spark.read \
    .format("csv") \
    .option("header", "true") \
    .option("inferSchema", "true") \
    .load("hdfs:///data/users_csv")

# Регистрируем как временную таблицу
df.createOrReplaceTempView("users")

# Теперь SQL query
result = spark.sql("""
    SELECT name, COUNT(*) as order_count
    FROM users
    GROUP BY name
    HAVING order_count > 5
""")

result.show()

Особенности:

  • Лучше perfomance, чем Hive (в памяти, DAG optimizer)
  • Поддержка множества форматов (Parquet, ORC, CSV, JSON, Delta)
  • Можно без metastore (schema inference)
  • Interactive queries (seconds вместо minutes)

Когда использовать:

  • Модерное data engineering
  • Interactive EDA
  • Быстрые итерации
  • ML pipelines

3. Presto / Trino

Distributed SQL query engine, супер быстрый для OLAP запросов.

-- Используется HDFS как connector
CREATE TABLE hive.default.users AS
SELECT
    user_id,
    name,
    email,
    age
FROM hdfs.default.users_parquet;

-- Interactive query (обычно < 1 second)
SELECT country, COUNT(*) as user_count
FROM hive.default.users
GROUP BY country
ORDER BY user_count DESC;

Особенности:

  • Очень быстро для OLAP (parallel distributed execution)
  • Работает как single SQL endpoint
  • Поддержка разных источников (Hive, PostgreSQL, Elasticsearch одновременно)
  • MPP (Massively Parallel Processing)

Когда использовать:

  • BI queries и dashboards
  • Ad-hoc analysis
  • Multi-source joins
  • Real-time analytics

Vs Spark:

  • Presto быстрее для ad-hoc queries
  • Spark быстрее для больших batch jobs
  • Presto = BI, Spark = ETL

4. Impala

Google-inspired distributed SQL engine от Cloudera.

CREATE TABLE users (
    user_id INT,
    name STRING,
    email STRING
)
STORED AS PARQUET
LOCATION '/data/users';

-- Супербыстро даже для больших датасетов
SELECT * FROM users WHERE age > 25;

Особенности:

  • Самый быстрый для interactive queries
  • C++ implementation (vs Spark's JVM)
  • In-memory query execution
  • Хорошо интегрируется с Hive metastore

Проблемы:

  • Требует Hadoop cluster
  • Меньше поддержки чем Spark
  • Сложнее в maintenance

5. Apache Drill

Schema-less distributed SQL engine.

-- Работает с файлами без определения схемы
SELECT
    `user_id`,
    `name`,
    CAST(`age` AS INT) as age
FROM hdfs.`/data/users_json`
WHERE age > 18;

Особенности:

  • Schema-less (автоматически определяет структуру)
  • Работает с nested JSON, Parquet, CSV
  • Self-service analytics
  • Меньше configuration нужно

Когда использовать:

  • Semi-structured data (JSON)
  • Exploratory analysis
  • Когда не знаешь schema заранее

6. Apache Flink SQL

Distributed stream processing engine, который тоже поддерживает batch SQL.

from pyspark.sql import StreamingDataFrame
from pyspark.sql import functions as F

# Batch SQL
df = spark.read.parquet("hdfs:///data/events")
df.createOrReplaceTempView("events")

result = spark.sql("""
    SELECT
        user_id,
        COUNT(*) as event_count,
        MAX(timestamp) as last_event
    FROM events
    WHERE timestamp > current_date() - INTERVAL 7 DAY
    GROUP BY user_id
""")

# Streaming SQL
streaming_df = spark.readStream \
    .format("kafka") \
    .option("kafka.bootstrap.servers", "localhost:9092") \
    .option("subscribe", "events") \
    .load()

Особенности:

  • Unified batch и streaming SQL
  • Event time semantics
  • State management
  • Production-ready for real-time

7. DuckDB

Новый kid on the block, суперпопулярный для OLAP.

import duckdb

# DuckDB может читать напрямую из HDFS (с S3-compatible API)
conn = duckdb.connect(':memory:')

# Читаем Parquet с HDFS
result = conn.execute("""
    SELECT
        user_id,
        name,
        COUNT(*) as purchases
    FROM read_parquet('hdfs:///data/users/*.parquet')
    GROUP BY user_id, name
    HAVING purchases > 10
""").fetchall()

print(result)

Особенности:

  • Embedded database (no server needed)
  • Супербыстро для OLAP
  • Поддержка Parquet, CSV, JSON
  • Zero configuration
  • Отличен для local analytics

Ограничения:

  • Single machine (не distributed)
  • Для small-medium datasets

Сравнение

EngineSpeedSetupLearning CurveBatchInteractiveUse Case
HiveSlowComplexMediumExcellentPoorLegacy systems
SparkMediumComplexMediumExcellentGoodETL + EDA
PrestoVery FastComplexMediumGoodExcellentBI, Ad-hoc
ImpalaVery FastComplexHardGoodExcellentInteractive OLAP
DrillFastSimpleEasyGoodGoodSemi-structured
FlinkFastComplexHardGoodExcellentStreaming + Batch
DuckDBVery FastNoneEasyGoodExcellentLocal Analytics

Реальный стек

Современная архитектура:

HDFS / S3 (файлы)
  |
  +---- Spark (batch ETL)
  |        |
  |        v
  |     Parquet/Delta tables
  |        |
  +---- Presto (BI queries)
  |        |
  |        v
  |     BI dashboards
  |
  +---- Flink (streaming)
           |
           v
        Real-time aggregates

Рекомендации

Для ETL:

  • Используй Spark SQL (универсален, быстро, гибко)

Для BI и аналитики:

  • Используй Presto/Trino (очень быстро, SQL oriented)

Для streaming:

  • Используй Flink SQL (event-time semantics)

Для local exploration:

  • Используй DuckDB (zero setup, супербыстро)

Для legacy systems:

  • Используй Hive (если уже есть инвестиции)

В 2024 году больше не рекомендую Hive для новых проектов. Выбирай между Spark (flexibility) и Presto (speed).