hadoop之MapReduce

简介: MapReduce

一个与Hadoop开发相关的知识点是MapReduce。MapReduce是一种分布式处理模型,可用于大规模数据集的处理和计算,在Hadoop中被广泛应用。在本文中,我将详细介绍什么是MapReduce,如何实现和使用它,并提供代码示例以加深您对该技术的理解。

什么是MapReduce?

MapReduce是一种运行在分布式系统上的并行分析框架,主要用于大型数据集的处理和计算。它的核心思想是将任务分为两个部分:Map和Reduce。

Map阶段中,数据会被分成多个小块,每个小块被发送到不同的计算机节点上进行计算。这些计算机节点将输出结果存储在哈希表中,并通过网络传回给Master节点。Reduce阶段构建了一个全局哈希表,以收集来自所有Mapper节点的结果键值对。然后它执行聚合操作,最终生成结果并将其写入目标文件或输出流。

Map和Reduce函数都非常简单,通常只有几十行代码。但是,通过组合这些功能,可以实现高性能、可扩展和可靠的数据处理和分析任务。当然,Hadoop以及其他一些大数据工具(如Hive、Pig和Spark)已经在MapReduce基础上提供了许多高级编程接口和工具,以方便开发人员实现各种复杂的数据分析需求。

如何使用MapReduce?

在Hadoop中,您需要设计并实现Java类来实现Map和Reduce函数。以下是一个简单的代码示例,展示了如何使用MapReduce计算一组文档中所有单词出现次数的总和:

Map 类

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

    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
   
        String line = value.toString();
        StringTokenizer tokenizer = new StringTokenizer(line);

        while (tokenizer.hasMoreTokens()) {
   
            word.set(tokenizer.nextToken().toLowerCase());
            context.write(word, one);
        }
    }
}

在这个Map函数中,每一行文本会被切割成单个单词,并将它们用小写字母标准化。对于每个单词,我们都会新建一个键值对,其中键是文本单词,而值则始终为1。

Reduce 类

public static class WordCountReducer 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);
    }
}

在Reduce函数中,每个键值对的键将是一个独特的单词,各自对应着若干个整数值。这个函数使用一个运行总数计算每个单词的出现次数。

驱动程序

最后可编写驱动程序来启动MapReduce作业并指定输入/输出:

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(IntWritable.class);
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));

    System.exit(job.waitForCompletion(true) ? 0 : 1);
}
目录
相关文章
|
1月前
|
分布式计算 资源调度 Hadoop
大数据-80 Spark 简要概述 系统架构 部署模式 与Hadoop MapReduce对比
大数据-80 Spark 简要概述 系统架构 部署模式 与Hadoop MapReduce对比
65 2
|
1月前
|
分布式计算 资源调度 Hadoop
Hadoop-10-HDFS集群 Java实现MapReduce WordCount计算 Hadoop序列化 编写Mapper和Reducer和Driver 附带POM 详细代码 图文等内容
Hadoop-10-HDFS集群 Java实现MapReduce WordCount计算 Hadoop序列化 编写Mapper和Reducer和Driver 附带POM 详细代码 图文等内容
96 3
|
1月前
|
分布式计算 资源调度 数据可视化
Hadoop-06-Hadoop集群 历史服务器配置 超详细 执行任务记录 JobHistoryServer MapReduce执行记录 日志聚合结果可视化查看
Hadoop-06-Hadoop集群 历史服务器配置 超详细 执行任务记录 JobHistoryServer MapReduce执行记录 日志聚合结果可视化查看
38 1
|
1月前
|
分布式计算 资源调度 Hadoop
Hadoop-05-Hadoop集群 集群WordCount 超详细 真正的分布式计算 上传HDFS MapReduce计算 YRAN查看任务 上传计算下载查看
Hadoop-05-Hadoop集群 集群WordCount 超详细 真正的分布式计算 上传HDFS MapReduce计算 YRAN查看任务 上传计算下载查看
47 1
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
86 0
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
37 0
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
46 0
|
3月前
|
缓存 分布式计算 算法
优化Hadoop MapReduce性能的最佳实践
【8月更文第28天】Hadoop MapReduce是一个用于处理大规模数据集的软件框架,适用于分布式计算环境。虽然MapReduce框架本身具有很好的可扩展性和容错性,但在某些情况下,任务执行可能会因为各种原因导致性能瓶颈。本文将探讨如何通过调整配置参数和优化算法逻辑来提高MapReduce任务的效率。
510 0
|
5月前
|
分布式计算 Hadoop Java
Hadoop MapReduce编程
该教程指导编写Hadoop MapReduce程序处理天气数据。任务包括计算每个城市ID的最高、最低气温、气温出现次数和平均气温。在读取数据时需忽略表头,且数据应为整数。教程中提供了环境变量设置、Java编译、jar包创建及MapReduce执行的步骤说明,但假设读者已具备基础操作技能。此外,还提到一个扩展练习,通过分区功能将具有相同尾数的数字分组到不同文件。
64 1
|
5月前
|
数据采集 SQL 分布式计算

相关实验场景

更多