Skip to content

HDFS — Hadoop Distributed File System Complete Guide

DodaTech Updated 2026-06-20 10 min read

In this tutorial, you'll learn about HDFS. We cover key concepts, practical examples, and best practices to help you understand and apply this topic effectively.

HDFS is the Hadoop Distributed File System designed to store massive datasets across commodity hardware clusters by splitting files into blocks and replicating them for fault tolerance.

What You'll Learn

In this tutorial, you'll learn how HDFS works under the hood — its architecture, block Replication, read and write pipelines, CLI commands, and how security tools use distributed storage for log analysis.

Why It Matters

Every second, security systems generate terabytes of log data from firewalls, endpoints, and servers. A single machine cannot store or Process this volume. HDFS provides the distributed foundation that makes enterprise-scale storage affordable and reliable.

Real-World Use

Durga Antivirus Pro uses distributed storage patterns similar to HDFS to store and analyze millions of malware signatures across geographically distributed data centers, enabling real-time threat detection without a single point of failure.

flowchart TD
  Client -->|Write Request| NN[NameNode]
  NN -->|Metadata| Client
  Client -->|Block 1| DN1[DataNode 1]
  Client -->|Block 2| DN2[DataNode 2]
  Client -->|Block 3| DN3[DataNode 3]
  DN1 -->|Replica| DN4[DataNode 4]
  DN2 -->|Replica| DN5[DataNode 5]
  DN3 -->|Replica| DN6[DataNode 6]
  subgraph Metadata
    NN
  end
  subgraph Storage
    DN1 & DN2 & DN3 & DN4 & DN5 & DN6
  end

Understanding HDFS Architecture

Think of a library. A single library can hold thousands of books. But what happens when you have billions of books? You need many libraries spread across a city. HDFS is that city-wide library system, but for data.

Core Components

HDFS has two main components:

NameNode — The master server. It keeps the directory tree of all files in the filesystem. Think of it as the library catalog that tells you which shelf (DataNode) holds which book (block). It runs in memory for speed.

DataNodes — The worker machines. They store the actual data blocks. A cluster can have hundreds or thousands of DataNodes.

How HDFS Stores Files

When you store a file in HDFS, here is exactly what happens:

Step Action Why
1 File is split into blocks (128 MB default) Large files must be distributed
2 Each block is replicated 3 times Fault tolerance
3 Replicas go to different racks Survives rack-level failures
4 NameNode records block locations Enables fast lookups

Why 128 MB? Earlier versions used 64 MB. The block size is large to minimize seek time. A disk seek takes about 10 ms. If your block is 128 MB and you read at 100 MB/s, the seek overhead is only about 0.008% of the read time.

Block Replication in Detail

Replication is what makes HDFS fault-tolerant. Let's simulate the storage calculation:

def calculate_hdfs_storage(file_size_gb, replication=3, block_size_mb=128):
    file_bytes = file_size_gb * 1024**3
    num_blocks = (file_bytes + (block_size_mb * 1024**2) - 1) // (block_size_mb * 1024**2)
    raw_storage = file_size_gb * replication
    efficiency = file_size_gb / raw_storage * 100

    print(f"File size: {file_size_gb} GB")
    print(f"Block size: {block_size_mb} MB")
    print(f"Blocks needed: {num_blocks}")
    print(f"Replication factor: {replication}")
    print(f"Total HDFS storage: {raw_storage:.1f} GB")
    print(f"Storage efficiency: {efficiency:.1f}%")

calculate_hdfs_storage(10, 3, 128)

Expected output:

File size: 10 GB
Block size: 128 MB
Blocks needed: 80
Replication factor: 3
Total HDFS storage: 30.0 GB
Storage efficiency: 33.3%

You pay 3× storage for reliability. In exchange, any 2 of 3 replicas can fail without data loss. That is the trade-off — and it is worth it for production systems.

HDFS Read and Write Pipeline

Write Pipeline

When a client writes a file to HDFS:

import hashlib
from time import sleep

class SimulatedHDFSWrite:
    """Simulates the HDFS write pipeline with replication"""

    def __init__(self, replication_factor=3):
        self.replication_factor = replication_factor
        self.nodes = []

    def write_block(self, data, block_id):
        """Write a block through the pipeline"""
        checksum = hashlib.md5(data.encode()).hexdigest()[:8]
        pipeline = []

        # First replica is written locally
        pipeline.append(("DataNode-1", "local_rack"))
        print(f"Block {block_id}: Writing to {pipeline[0][0]} (local rack)")
        sleep(0.1)

        # Replicas are written to remote nodes
        for i in range(1, self.replication_factor):
            node = f"DataNode-{i + 1 + hash(block_id) % 10}"
            pipeline.append((node, "remote_rack"))
            print(f"Block {block_id}: Replicating to {node} (remote rack)")
            sleep(0.1)

        print(f"Block {block_id}: All {self.replication_factor} replicas written. Checksum: {checksum}")
        return pipeline

hdfs = SimulatedHDFSWrite()
hdfs.write_block("HDFS write pipeline example data", "blk-1073741825")

Expected output:

Block blk-1073741825: Writing to DataNode-1 (local rack)
Block blk-1073741825: Replicating to DataNode-7 (remote rack)
Block blk-1073741825: Replicating to DataNode-3 (remote rack)
Block blk-1073741825: All 3 replicas written. Checksum: a1b2c3d4

The client writes to the first DataNode. That DataNode forwards the data to the next in the pipeline. Data never returns to the client between replicas — it flows like water through pipes.

Read Pipeline

Reading is simpler. The client asks the NameNode for block locations, then reads from the closest replica (rack awareness).

class SimulatedHDFSRead:
    """Simulates HDFS read with rack awareness"""

    def read_file(self, filename, block_locations):
        print(f"Reading {filename}")
        print(f"NameNode returns block locations: {block_locations}")

        for block_id, replicas in block_locations.items():
            # Pick closest replica (simplified)
            chosen = replicas[0]
            print(f"  Block {block_id}: reading from {chosen} (closest replica)")

        print("File assembled successfully")

blocks = {
    "blk-001": ["DataNode-1(local)", "DataNode-4(remote)", "DataNode-7(remote)"],
    "blk-002": ["DataNode-2(local)", "DataNode-5(remote)", "DataNode-8(remote)"],
}
reader = SimulatedHDFSRead()
reader.read_file("/user/data/logs.gz", blocks)

Expected output:

Reading /user/data/logs.gz
NameNode returns block locations: {'blk-001': [...], 'blk-002': [...]}
  Block blk-001: reading from DataNode-1(local) (closest replica)
  Block blk-002: reading from DataNode-2(local) (closest replica)
File assembled successfully

HDFS CLI Commands

Here are the most common HDFS shell commands:

Command Purpose Example
hdfs dfs -ls List directory contents hdfs dfs -ls /user/data
hdfs dfs -put Upload file to HDFS hdfs dfs -put logs.gz /user/data/
hdfs dfs -get Download file from HDFS hdfs dfs -get /user/data/logs.gz ./
hdfs dfs -cat Display file contents hdfs dfs -cat /user/data/sample.txt
hdfs dfs -rm Delete file hdfs dfs -rm /user/data/old.gz
hdfs dfs -chmod Change file permissions hdfs dfs -chmod 600 /user/data/secure.log
hdfs dfsadmin -report Cluster health report hdfs dfsadmin -report
hdfs fsck File system check hdfs fsck /user/data/ -files -blocks

Security-Relevant HDFS Commands

HDFS supports POSIX-style permissions and ACLs. For security-sensitive deployments, use these:

# Restrict log access to specific group
hdfs dfs -chmod 640 /var/logs/security/
hdfs dfs -chown :security-team /var/logs/security/

# Enable encryption zone for sensitive data
hdfs crypto -createZone -path /user/encrypted -keyName myKey

HDFS in Security Operations

Security teams use HDFS extensively. Here is a real scenario:

Problem: A SOC (Security Operations Center) needs to store and analyze 5 TB of firewall logs daily across 30 data centers.

Solution with HDFS:

  1. Each data center runs a local HDFS cluster
  2. Logs are ingested via Flume or Kafka into HDFS
  3. Spark or Hadoop MapReduce processes the logs for anomaly detection
  4. Results feed into SIEM systems

This pattern is why tools like Durga Antivirus Pro can scan petabytes of threat intelligence data. The storage layer must scale horizontally — and HDFS delivers exactly that.

Common HDFS Mistakes

1. Small Files Problem

HDFS is optimized for large files. Each file, directory, and block consumes about 150 bytes in NameNode memory. With 128 GB RAM, you can handle about 900 million objects. One million small files (1 KB each) wastes 150 MB of NameNode memory.

Fix: Combine small files into sequence files or use HAR (Hadoop Archive).

2. Ignoring Rack Awareness

Without rack awareness, HDFS may place all replicas of a block on the same rack. If that rack loses power, the block is gone.

Fix: Configure topology.script.file.name to map IPs to rack IDs.

3. Running Out of NameNode Memory

The NameNode holds all metadata in RAM. A full metadata table means no new files can be created — even if DataNodes have free space.

Fix: Monitor NameNode heap usage. Consider HDFS Federation for very large clusters.

4. Incorrect Replication Factor

Setting Replication to 1 saves storage but means any single disk failure causes data loss. Setting it to 5 wastes storage.

Fix: Use default Replication of 3. For critical security logs, use 4 or 5.

5. Not Using Wire Encryption

By default, data between client and DataNodes is unencrypted. Anyone with network access can sniff data transfers.

Fix: Enable dfs.encrypt.data.transfer and configure Kerberos authentication.

6. Misconfigured Block Size

Setting blocks too small (32 MB) increases metadata overhead and slows reads. Setting them too large (1 GB) wastes space on small files.

Fix: 128 MB or 256 MB for most workloads. Use MongoDB or HBase for small records.

7. Ignoring Data Locality

MapReduce jobs run slowly when data must move across the network. The whole point of HDFS is data locality — code should run where data lives.

Fix: Monitor "Data-local map tasks" in the job tracker. Aim for 95%+.

HDFS vs Other Storage Systems

Feature HDFS NFS MongoDB Amazon S3
Design Distributed FS Network FS Document DB Object Store
Data Model Blocks (128 MB) Files Documents Objects
Consistency Write-once POSIX Tunable Eventual
Replication Automatic (3×) RAID/SAN Replica sets Cross-region
Best for Batch, large files Small files JSON docs Cloud-native
Security Kerberos + ACLs Unix perms RBAC IAM

FAQ

**What happens if the NameNode fails?**

Without HA (High Availability), the cluster becomes unavailable. HDFS supports active/passive NameNode HA with ZooKeeper failover. A Standby NameNode maintains the same metadata and takes over within minutes.

**Can I change the block size after data is written?**

No. Block size is determined when the file is created. Existing files keep their original block size. Only new files use the new setting.

**How does HDFS handle corrupted data?**

HDFS stores a CRC32 checksum for each block. When a client reads a block, it verifies the checksum. If a replica is corrupt, HDFS tries another replica and re-replicates from the good copy.

**Is HDFS compatible with Docker and Kubernetes?**

Yes. HDFS can run in containers, but stateful sets require persistent volumes. Many production deployments run HDFS on bare metal for performance, with Docker managing only compute containers.

**Does HDFS support erasure coding?**

Yes. HDFS supports Reed-Solomon erasure coding (since Hadoop 3.x), which reduces storage overhead from 200% (3× Replication) to ~50% while maintaining similar durability.

Practice Questions

  1. What is the default block size in HDFS? 128 MB (configurable via dfs.blocksize).

  2. Why does HDFS use 3x Replication? To survive up to 2 simultaneous replica failures. With rack-aware placement, it also survives an entire rack failure.

  3. What problem does HDFS Federation solve? It allows multiple independent NameNodes to share DataNode storage, scaling namespace capacity beyond a single NameNode's memory limit.

  4. How does HDFS ensure data integrity? Each block has a CRC32 checksum. On read, the checksum is verified. Corrupt blocks are replaced from healthy replicas.

  5. What is the difference between HDFS and a traditional file system? HDFS is distributed, write-once, optimized for streaming reads of large files, and handles failures transparently through Replication.

Challenge

Write a Python script that simulates how HDFS selects replica placements across racks. Given 3 racks and 10 DataNodes, place 3 replicas for 100 blocks ensuring no two replicas are on the same rack. Calculate the percentage of rack failure scenarios that cause data loss.

Real-World Task

Set up a single-node HDFS cluster (using Docker), ingest 100 MB of server access logs (or generate them), configure encryption zones, and run hdfs fsck to verify block health. Document the storage overhead of 3× Replication versus erasure coding.

What's Next

MapReduce — Complete Guide with Examples
Apache Hadoop — Complete Beginner's Guide
Apache Hive — Data Warehousing on Hadoop Guide

Before moving on, you should understand:

  • How HDFS splits, replicates, and stores files across a cluster
  • The read/write pipeline and rack awareness
  • How to use HDFS CLI commands for security operations

Built by the developers of Doda Browser, DodaZIP, and Durga Antivirus Pro.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro