一、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的原理和使用,能够理解分布式计算的本质,为构建大数据系统打下坚实基础。