Skip to content

Hadoop 技术

Hadoop 是一个分布式系统基础架构,用于存储和处理大规模数据集。

HDFS

概述

HDFS(Hadoop Distributed File System)是 Hadoop 的分布式文件系统,具有高容错性和高吞吐量的特点。

架构组成

  • NameNode: 管理文件系统的命名空间,维护文件系统树和元数据
  • DataNode: 存储实际的数据块,执行数据的读写操作
  • Secondary NameNode: 定期合并 NameNode 的 edit log 和 fsimage

核心概念

java
// HDFS 文件写入流程
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);

Path path = new Path("/user/hadoop/example.txt");
FSDataOutputStream out = fs.create(path);
out.write("Hello, HDFS!".getBytes());
out.close();
fs.close();

特性

  • 分块存储: 默认块大小为 128MB
  • 副本机制: 默认 3 个副本
  • 数据本地性: 计算向数据移动

MapReduce

概述

MapReduce 是一种分布式计算框架,采用分而治之的思想处理大规模数据。

执行流程

  1. Split: 将输入数据分割成多个分片
  2. Map: 对每个分片进行映射处理
  3. Shuffle: 对 Map 输出进行排序和分组
  4. Reduce: 对分组后的数据进行汇总

WordCount 示例

java
public class WordCount {
    public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();
        
        public void map(LongWritable key, Text value, Context context) 
            throws IOException, InterruptedException {
            String line = value.toString();
            StringTokenizer tokenizer = new StringTokenizer(line);
            while (tokenizer.hasMoreTokens()) {
                word.set(tokenizer.nextToken());
                context.write(word, one);
            }
        }
    }
    
    public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
        public void reduce(Text key, Iterable<IntWritable> values, Context context) 
            throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) {
                sum += val.get();
            }
            context.write(key, new IntWritable(sum));
        }
    }
}

YARN

概述

YARN(Yet Another Resource Negotiator)是 Hadoop 的资源管理系统。

架构组成

  • ResourceManager: 集群资源的管理者
  • NodeManager: 单个节点的资源管理者
  • ApplicationMaster: 管理单个应用的执行

工作流程

  1. Client 提交作业到 ResourceManager
  2. ResourceManager 分配第一个 Container 运行 ApplicationMaster
  3. ApplicationMaster 向 ResourceManager 请求资源
  4. ResourceManager 分配 Container 给 ApplicationMaster
  5. ApplicationMaster 启动任务执行