Hadoop
外观
Developer(s) | Apache软件基金会 |
---|---|
Initial release | April 1, 2006 |
Repository |
|
Written in | Java |
Engine | |
Operating system | 跨平台 |
Type | 分布式计算 |
License | Apache License 2.0 |
Website | hadoop |
Hadoop是一个开源的分布式计算框架,用于处理和存储大规模数据集。它由Apache软件基金会开发,基于Google的MapReduce和Google文件系统(GFS)论文设计。Hadoop的核心设计目标是能够从单个服务器扩展到数千台机器,每台机器都提供本地计算和存储。
历史[编辑 | 编辑源代码]
Hadoop最初由Doug Cutting和Mike Cafarella在2005年开发,作为Nutch项目的一部分。2006年,它成为Apache的顶级项目。名称"Hadoop"来源于Cutting儿子的玩具大象。
架构[编辑 | 编辑源代码]
Hadoop主要由以下几个核心组件组成:
Hadoop Common[编辑 | 编辑源代码]
提供支持其他Hadoop模块的常用工具和库。
Hadoop分布式文件系统 (HDFS)[编辑 | 编辑源代码]
HDFS是Hadoop的存储组件,具有以下特点:
- 高度容错性
- 设计用于运行在廉价硬件上
- 提供高吞吐量访问应用程序数据
- 适合具有大数据集的应用程序
Hadoop YARN[编辑 | 编辑源代码]
YARN(Yet Another Resource Negotiator)是Hadoop的资源管理平台,负责集群资源管理和作业调度。
Hadoop MapReduce[编辑 | 编辑源代码]
基于YARN的系统,用于并行处理大型数据集。
生态系统[编辑 | 编辑源代码]
Hadoop生态系统包含多个相关项目,扩展了其功能:
项目 | 描述 |
---|---|
HBase | 分布式列式数据库 |
Hive | 数据仓库基础设施 |
Pig | 高级数据流语言和执行框架 |
ZooKeeper | 分布式协调服务 |
Spark | 快速通用计算引擎 |
Flume | 可靠的数据收集系统 |
Sqoop | 在Hadoop和关系数据库之间传输数据 |
Oozie | 工作流调度系统 |
工作原理[编辑 | 编辑源代码]
Hadoop遵循"移动计算比移动数据更便宜"的原则。数据处理通常在数据所在的节点上执行,以减少网络流量。
数据存储[编辑 | 编辑源代码]
HDFS将大文件分割成块(默认128MB),并在集群中的多个节点上复制(默认3份)以实现容错。
数据处理[编辑 | 编辑源代码]
MapReduce作业分为两个阶段: 1. Map阶段:处理输入数据并生成中间键值对 2. Reduce阶段:合并具有相同键的中间值
示例代码[编辑 | 编辑源代码]
以下是一个简单的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);
}
}
应用场景[编辑 | 编辑源代码]
Hadoop广泛应用于以下领域:
- 日志处理
- 推荐系统
- 数据仓库
- 机器学习
- 金融分析
- 生物信息学
优势与局限[编辑 | 编辑源代码]
优势[编辑 | 编辑源代码]
- 可扩展性:可扩展到数千个节点
- 成本效益:可在廉价硬件上运行
- 灵活性:可处理各种结构化和非结构化数据
- 容错性:自动处理节点故障
局限[编辑 | 编辑源代码]
- 不适合低延迟数据访问
- 不适合大量小文件
- MapReduce编程模型有一定学习曲线