Hasib
Back to Blog
Big Data

How to Solve the Hive Small File Problem in Hadoop (Practical Guide for Production Clusters)

10,000 files × 1 MB is far worse than 100 files × 128 MB for the same total data. Here's how to detect, prevent, and fix the small file problem in production Hive clusters.

March 9, 20265 min read51 views

What Is the Small File Problem?

HDFS is optimised for a relatively small number of large files. Each file — regardless of size — consumes one slot in the NameNode's memory.

Scenario Files NameNode Objects Total Data
Inefficient 10,000 10,000 10 GB
Optimal 100 100 10 GB

Same data volume, but the first scenario creates 100× more NameNode pressure.

Why Small Files Accumulate

  • High-frequency streaming ingestion (Kafka → HDFS)
  • Hourly/minutely Hive partitions
  • Telecom CDR data pipelines
  • IoT sensor data streams
  • Log aggregation pipelines

Each micro-batch or partition creates its own set of small files.

Impact on the Cluster

  • NameNode memory exhaustion — each file/block = memory object
  • Slow Hive queries — each mapper processes one file; too many mappers → overhead
  • Block report bloat — DataNodes report more blocks to NameNode
  • Slower HDFS checkpoints — fsimage grows proportionally

Detection

# Find tables with many small files
hdfs dfs -ls -R /warehouse/tablespace/managed/hive/mydb.db/ \
  | awk '{print $5, $8}' \
  | awk '$1 < 67108864' \
  | wc -l
-- Check partition file counts via Hive
SHOW PARTITIONS mydb.mytable;

Fix 1: Hive Compaction (Managed ORC Tables)

For ACID-managed ORC tables:

-- Minor compaction (merges delta files)
ALTER TABLE mydb.mytable PARTITION (dt='2026-03-01') COMPACT 'MINOR';

-- Major compaction (rewrites entire partition into one file)
ALTER TABLE mydb.mytable PARTITION (dt='2026-03-01') COMPACT 'MAJOR';

Fix 2: INSERT OVERWRITE for External Tables

SET hive.merge.mapfiles=true;
SET hive.merge.mapredfiles=true;
SET hive.merge.size.per.task=268435456;   -- 256 MB
SET hive.merge.smallfiles.avgsize=134217728; -- 128 MB

INSERT OVERWRITE TABLE mydb.mytable PARTITION (dt='2026-03-01')
SELECT * FROM mydb.mytable WHERE dt='2026-03-01';

Fix 3: Tez Container Reuse + Merge

SET hive.execution.engine=tez;
SET tez.am.container.reuse.enabled=true;
SET hive.merge.tezfiles=true;

Prevention: Batch Ingestion

Instead of writing every event as a file, batch by time window:

# Kafka → HDFS: use hourly or daily rollover
# Flume/NiFi: set file roll interval to 1 hour minimum
# Spark Streaming: use trigger(processingTime="1 hour")

Ongoing Maintenance

Schedule compaction via Hive's automatic compaction:

ALTER TABLE mydb.mytable SET TBLPROPERTIES (
  'auto.purge'='true',
  'compactor.mapreduce.map.memory.mb'='4096'
);

Sheikh Wasiu Al Hasib

Senior DevOps Engineer & DBA

Comments

Comments are reviewed before they're published.

No comments yet. Be the first to share your thoughts.