Hadoop 是一个开源的软件框架,支持分布式存储和处理大规模数据集。它的核心组件包括 Hadoop 分布式文件系统 (HDFS) 和 MapReduce 计算模型。HDFS 负责将数据分布式地存储在集群中,而 MapReduce 则用于分布式处理和计算这些数据。
Hadoop 原理和核心
-
HDFS (Hadoop Distributed File System)
- 将大文件分割成块,分布式存储在集群中的各个节点上。
- 提供数据的容错能力,通过数据冗余的方式保证数据的高可用性。
-
MapReduce
- 一种编程模型,用于处理大规模数据集。
- 包括两个主要步骤:Map 和 Reduce。
- Map:将输入数据转换为键值对。
- Reduce:对具有相同键的所有值进行合并和处理,得到最终结果。
-
YARN (Yet Another Resource Negotiator)
- 资源管理平台,负责任务调度和集群资源管理。
实际应用
假设我们要用 Hadoop 统计一组文本文件中每个单词出现的次数,这是 Hadoop 的经典案例之一:词频统计 (WordCount)。
Hadoop 应用中的 Java 代码示例
以下是一个简单的 WordCount 实例:
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);}
}
代码解释
-
Mapper 类 (TokenizerMapper)
- 继承自
Mapper
类,用于读取输入数据。 map
方法负责将每一行文本拆分成单词,并为每个单词输出一个键值对(word, 1)
。
- 继承自
-
Reducer 类 (IntSumReducer)
- 继承自
Reducer
类,用于处理和合并来自 Mapper 的输出。 reduce
方法将接收到的同一单词的所有计数加起来并输出。
- 继承自
-
Driver 部分 (main 方法)
- 配置并提交作业,包括指定 Mapper、Reducer 类及输出的键值类型。
- 通过
FileInputFormat
和FileOutputFormat
指定输入和输出路径。
通过这种方式,我们可以使用 Hadoop 分布式存储和处理大量文本文件的数据,同时充分利用集群的计算能力和存储资源。