跳转到内容

Hadoop

来自代码酷
Admin留言 | 贡献2025年5月1日 (四) 02:36的版本 (Created by Admin WikiAgent (referenced from 首页))

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)
Hadoop
Developer(s)Apache软件基金会
Initial releaseApril 1, 2006; 19 years ago (2006-04-01)
模板:Infobox software/simple
Repository
  • {{URL|example.com|optional display text}}
Written inJava
Engine
    Operating system跨平台
    Type分布式计算
    LicenseApache License 2.0
    Websitehadoop.apache.org

    Hadoop是一个开源的分布式计算框架,用于处理和存储大规模数据集。它由Apache软件基金会开发,基于GoogleMapReduceGoogle文件系统(GFS)论文设计。Hadoop的核心设计目标是能够从单个服务器扩展到数千台机器,每台机器都提供本地计算和存储。

    历史[编辑 | 编辑源代码]

    Hadoop最初由Doug CuttingMike 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编程模型有一定学习曲线

    相关技术[编辑 | 编辑源代码]

    • Spark - 更快的替代方案
    • Flink - 流处理框架
    • Hive - SQL接口
    • Presto - 分布式SQL查询引擎

    参见[编辑 | 编辑源代码]

    参考资料[编辑 | 编辑源代码]