📖 数据密集型设计

Hadoop MapReduce与分布式计算

深入探讨Hadoop MapReduce原理与分布式计算框架

一、Hadoop概述

Hadoop是Apache基金会的开源分布式计算平台,核心包括HDFS(分布式文件系统)、MapReduce(分布式计算框架)和YARN(资源调度系统)。Hadoop设计用于处理大规模数据,具有高可靠性、高扩展性和高容错性。

二、Hadoop生态系统

2.1 生态组件

graph TD A[Hadoop生态] --> B[HDFS] A --> C[MapReduce] A --> D[YARN] A --> E[Hive] A --> F[HBase] A --> G[Spark] A --> H[Pig] A --> I[Sqoop] A --> J[Flume] B --> B1[分布式存储] C --> C1[分布式计算] D --> D1[资源调度] E --> E1[数据仓库] F --> F1[NoSQL数据库] G --> G1[大数据处理] H --> H1[数据流语言] I --> I1[数据迁移] J --> J1[日志收集]

三、HDFS架构

3.1 HDFS组成

组件 功能 角色
NameNode 管理文件系统元数据 主节点
DataNode 存储实际数据 从节点
SecondaryNameNode 辅助NameNode 备份节点

3.2 HDFS读写流程

sequenceDiagram participant Client as 客户端 participant NN as NameNode participant DN as DataNode Client->>NN: 请求写入文件 NN-->>Client: 返回DataNode列表 Client->>DN: 写入数据块 DN-->>Client: 写入确认 DN->>DN: 复制数据块 Client->>NN: 完成写入

3.3 HDFS副本策略

HDFS默认复制3份数据:

graph TD A[数据块] --> B[副本1: 本地节点] A --> C[副本2: 同机架另一节点] A --> D[副本3: 另一机架节点] B --> B1[Rack1/Node1] C --> C1[Rack1/Node2] D --> D1[Rack2/Node1]

四、MapReduce原理

4.1 MapReduce流程

flowchart TD A[输入数据] --> B[Split切分] B --> C[Map阶段] C --> D[Shuffle阶段] D --> E[Reduce阶段] E --> F[输出结果] C --> C1[键值对生成] D --> D1[排序分组] E --> E1[聚合计算]

4.2 Map阶段

public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String[] words = value.toString().split(" ");
        for (String word : words) {
            context.write(new Text(word), new IntWritable(1));
        }
    }
}

4.3 Reduce阶段

public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable value : values) {
            sum += value.get();
        }
        context.write(key, new IntWritable(sum));
    }
}

4.4 驱动程序

public class WordCountDriver {
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "wordcount");
        
        job.setJarByClass(WordCountDriver.class);
        job.setMapperClass(WordCountMapper.class);
        job.setReducerClass(WordCountReducer.class);
        
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

五、YARN架构

5.1 YARN组件

组件 功能 角色
ResourceManager 管理集群资源 主节点
NodeManager 管理节点资源 从节点
ApplicationMaster 管理应用 应用级
Container 资源容器 任务级

5.2 YARN工作流程

sequenceDiagram participant Client as 客户端 participant RM as ResourceManager participant NM as NodeManager participant AM as ApplicationMaster Client->>RM: 提交应用 RM-->>Client: 返回ApplicationMaster位置 Client->>NM: 启动ApplicationMaster AM->>RM: 请求资源 RM-->>AM: 分配Container AM->>NM: 启动任务 NM-->>AM: 任务状态 AM-->>Client: 应用状态

六、MapReduce优化

6.1 数据本地化

尽量让计算靠近数据,减少网络传输:

// 设置数据本地化策略
conf.set("mapreduce.job.locality.parameters.delay", "0");
conf.set("mapreduce.tasktracker.http.address", "0.0.0.0:50060");

6.2 Combiner优化

在Map端进行局部聚合,减少Shuffle数据量:

job.setCombinerClass(WordCountReducer.class);

6.3 分区优化

合理设置分区数,平衡Reduce负载:

job.setNumReduceTasks(10);

6.4 压缩优化

对中间数据和输出数据进行压缩:

// 设置压缩格式
conf.set("mapreduce.map.output.compress", "true");
conf.set("mapreduce.map.output.compress.codec", "org.apache.hadoop.io.compress.GzipCodec");

conf.set("mapreduce.output.fileoutputformat.compress", "true");
conf.set("mapreduce.output.fileoutputformat.compress.codec", "org.apache.hadoop.io.compress.GzipCodec");

七、Hadoop部署

7.1 单节点模式

所有组件运行在单个节点上,用于开发测试:

# 格式化HDFS
hdfs namenode -format

# 启动HDFS
start-dfs.sh

# 启动YARN
start-yarn.sh

7.2 伪分布式模式

所有组件运行在单个节点上,但模拟分布式环境:

# 修改配置文件
# core-site.xml
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
</property>

# hdfs-site.xml
<property>
    <name>dfs.replication</name>
    <value>1</value>
</property>

7.3 完全分布式模式

组件分布在多个节点上,生产环境使用:

graph TD A[Master节点] --> A1[NameNode] A --> A2[ResourceManager] B[Slave节点1] --> B1[DataNode] B --> B2[NodeManager] C[Slave节点2] --> C1[DataNode] C --> C2[NodeManager] D[Slave节点3] --> D1[DataNode] D --> D2[NodeManager]

八、Hadoop与Spark对比

特性 Hadoop MapReduce Spark
计算模式 磁盘计算 内存计算
性能 较慢 快10-100倍
编程复杂度
容错机制 重新执行 基于RDD

九、Hadoop最佳实践

9.1 合理设置块大小

HDFS默认块大小为128MB,根据数据特点调整。

9.2 监控集群状态

使用Hadoop Web UI监控集群状态。

9.3 数据备份

定期备份NameNode元数据。

9.4 日志管理

合理配置日志级别和存储路径。

9.5 安全配置

启用Kerberos认证,配置访问控制。

十、总结

Hadoop是大数据处理的基础框架,虽然Spark在性能上更优,但Hadoop在存储和资源管理方面仍然是大数据生态的核心。掌握Hadoop的原理和使用,能够理解分布式计算的本质,为构建大数据系统打下坚实基础。