Hadoop 核心组件解析:HDFS 与 MapReduce 原理与实践
引言
在大数据时代,数据量呈现爆炸式增长,传统的单机存储和计算方式已无法满足需求。Hadoop 作为开源分布式计算平台,为处理大规模数据提供了强大解决方案。本文详细解析 Hadoop 的两个核心组件 HDFS 和 MapReduce 的原理,并通过实际案例展示数据处理方法。
本文深入剖析了 Hadoop 的两大核心组件——HDFS 分布式文件系统和 MapReduce 分布式计算框架的原理,结合 WordCount 案例展示了实际配置与代码实现。内容涵盖 NameNode 与 DataNode 架构、MapReduce 作业提交流程、数学模型分析及性能优化建议,旨在帮助开发者理解大数据存储与计算的核心机制及实践方法。
在大数据时代,数据量呈现爆炸式增长,传统的单机存储和计算方式已无法满足需求。Hadoop 作为开源分布式计算平台,为处理大规模数据提供了强大解决方案。本文详细解析 Hadoop 的两个核心组件 HDFS 和 MapReduce 的原理,并通过实际案例展示数据处理方法。
Hadoop 分布式文件系统,用于在大规模集群上存储和管理数据。它采用主从架构,由 NameNode 和 DataNode 组成。
一种分布式计算框架,用于处理大规模数据集。它将计算任务分解为 Map 和 Reduce 两个阶段并行执行。
HDFS 负责数据存储,MapReduce 负责数据处理。MapReduce 从 HDFS 读取数据,处理后写回 HDFS。NameNode 指导 TaskTracker 定位数据所在的 DataNode。
HDFS 主要由 NameNode、DataNode 和客户端组成。NameNode 管理元数据,DataNode 存储数据块。客户端通过 NameNode 获取元数据后直接与 DataNode 交互读写。
graph TD
Client[客户端] -->|提交作业 | JobTracker[JobTracker]
JobTracker -->|分解任务 | TaskTracker[TaskTracker]
TaskTracker -->|读取数据 | HDFS[HDFS]
TaskTracker -->|执行 Map 任务 | Shuffle[Shuffle 和 Sort]
Shuffle -->|执行 Reduce 任务 | TaskTracker
TaskTracker -->|最终结果 | HDFS
JobTracker -->|监控任务 | TaskTracker
HDFS 将大文件分割成多个数据块(默认 128MB),复制多份存储在不同 DataNode 上以提高可靠性。NameNode 管理数据块位置信息。
start-dfs.shhdfs dfs -mkdir /testhdfs dfs -put local_file /testhdfs dfs -ls /testhdfs dfs -get /test/local_filehdfs dfs -rm /test/local_fileMap 阶段将输入数据转换为键值对,Reduce 阶段对相同键的值进行汇总。
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class WordCount {
public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.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);
}
}
javac -classpath $(hadoop classpath) WordCount.java && jar cf wc.jar WordCount*.classhadoop jar wc.jar WordCount /input /output假设文件大小 $F$,数据块大小 $B$,复制因子 $R$,所需存储空间 $S$: $$ S = \frac{F}{B} \times B \times R = F \times R $$ 例如:1GB 文件,128MB 块,复制因子 3,需 3GB 空间。
假设输入大小 $I$,Map 处理块大小 $M$,Map 任务数 $N_{map}$: $$ N_{map} = \frac{I}{M} $$ 每个 Reduce 任务处理的键值对数量取决于总输出量和 Reduce 任务数。
dfs.blocksize 参数,默认 128MB。mapreduce.job.reduces 参数。
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online