Hadoop 简介及应用示例

Hadoop 是一个开源的分布式计算框架,专为大数据处理而设计。它允许用户利用商用硬件集群高效存储和处理海量的数据。Hadoop 的核心组件包括 Hadoop 分布式文件系统(HDFS)和 MapReduce 编程模型。

Hadoop 的架构

Hadoop 的架构主要由以下几个部分组成:

  1. Hadoop 分布式文件系统(HDFS):负责数据的存储和管理。
  2. MapReduce:负责数据的处理和计算。
  3. YARN(Yet Another Resource Negotiator):负责管理资源和作业调度。

以下是这三个组件之间的关系图:

erDiagram
    HDFS ||--o{ DataNodes : contains
    DataNodes }o--|| NameNode : manages
    MapReduce ||--o{ Jobs : executes
    Jobs }o--|| YARN : schedules

这个关系图显示了 Hadoop 的各个组件之间的关联:HDFS 存储数据,MapReduce 处理数据,而 YARN 负责资源的管理和作业的调度。

Hadoop 使用示例

为了更好地理解 Hadoop 的工作原理,下面是一个简单的代码示例,演示如何使用 MapReduce 处理文本文件并统计单词频率。

1. Mapper 类

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

public class WordCountMapper extends Mapper<LongWritable, Text, Text, LongWritable> {
    private final static LongWritable one = new LongWritable(1);
    private Text word = new Text();

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String[] words = value.toString().split("\\s+");
        for (String w : words) {
            word.set(w);
            context.write(word, one);
        }
    }
}

2. Reducer 类

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

public class WordCountReducer extends Reducer<Text, LongWritable, Text, LongWritable> {
    @Override
    protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {
        long sum = 0;
        for (LongWritable val : values) {
            sum += val.get();
        }
        context.write(key, new LongWritable(sum));
    }
}

3. 运行主程序

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCount {
    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(WordCountMapper.class);
        job.setCombinerClass(WordCountReducer.class);
        job.setReducerClass(WordCountReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

Hadoop 执行流程

以下是 Hadoop 中 MapReduce 的执行流程序列图:

sequenceDiagram
    participant Client
    participant YARN
    participant NodeManager
    participant TaskTracker

    Client->>YARN: Submit job
    YARN->>Client: Acknowledge submission
    YARN->>NodeManager: Allocate resources
    NodeManager->>TaskTracker: Start Mapper tasks
    TaskTracker->>YARN: Mapper completed
    YARN->>NodeManager: Assign Reducer tasks
    NodeManager->>TaskTracker: Start Reducer tasks
    TaskTracker->>YARN: Reducer completed
    YARN->>Client: Job finished

在这个序列图中,客户端向 YARN 提交作业,YARN 分配资源并启动 Mapper 和 Reducer 任务。最终,YARN 通知客户端作业完成。

结尾

Hadoop 提供了强大而灵活的工具来处理大规模的数据集。通过分布式计算,用户能够轻松处理复杂的数据分析任务。掌握 Hadoop 的基本概念和使用方法,将有助于更好地利用大数据技术,推动业务的发展。希望这篇文章能够为你深入理解 Hadoop 的原理和应用提供帮助!