国外优秀的设计网站,网站关键词优化的步骤,画册设计理念和设计思路,易思企业网站文章目录 前言MapReduce 基本流程概述MapReduce 三个核心阶段详解Map 阶段工作原理 Shuffle 阶段具体步骤分区#xff08;Partition#xff09;排序#xff08;Sort#xff09;分组#xff08;Combine 和 Grouping#xff09; Reduce 阶段工作原理 MapReduce 应用场景Map… 文章目录 前言MapReduce 基本流程概述MapReduce 三个核心阶段详解Map 阶段工作原理 Shuffle 阶段具体步骤分区Partition排序Sort分组Combine 和 Grouping Reduce 阶段工作原理 MapReduce 应用场景MapReduce Java 实战Hadoop 环境搭建代码实现打包提交服务器运行 个人简介 前言
Hadoop 是一个开源的分布式计算框架专为处理大规模数据而设计。它最初由 Apache 软件基金会开发能够以经济高效的方式在分布式集群上存储和处理海量数据。Hadoop 的核心组件包括分布式存储HDFS和分布式计算MapReduce以及一套支持工具。本文将重点探讨 分布式计算MapReduce, Hadoop MapReduce 是一种分布式计算模型旨在处理大规模数据集。它通过将任务分解为多个子任务并在分布式集群中并行执行极大地提高了数据处理效率。本文将详细剖析 MapReduce 的三个核心阶段Map 阶段、Shuffle 阶段 和 Reduce 阶段帮助您深入理解其工作机制。
MapReduce 基本流程概述 为了更好的理解 MapReduce 计算模型上面是我在网上找的一张流程图可以清晰的看到整体流程可以大致分为三个阶段Map、Shuffle、Reduce但实际上在进入三个阶段前还有一个数据分片阶段因此我们可以将整体流程分为以下四个步骤
1、输入数据分片将数据分割成多个逻辑块每个块被一个 Mapper 处理。
2、Map 阶段处理输入数据将其转化为键值对 (key, value)。
3、Shuffle 阶段对 Map 阶段的输出进行分区、排序和分组。
4、Reduce 阶段对同一键的所有值进行聚合或计算最终输出结果。MapReduce 三个核心阶段详解
Map 阶段
将输入数据转化为中间键值对 (key, value) 的形式。
工作原理
输入格式Hadoop 的 InputFormat默认是 TextInputFormat将原始数据分割成逻辑记录传递给 Mapper。
1、每个逻辑块由一个 Mapper 处理读取输入数据并生成中间结果。
2、用户需实现 map() 方法定义如何将输入转化为中间 (key, value) 对。示例
输入数据
hello hadoop
hello world输出数据
(hello, 1), (hadoop, 1), (hello, 1), (world, 1)Shuffle 阶段
将 Map 阶段的中间结果组织为 Reducer 可用的形式包括分区、排序和分组。是介于 Map 和 Reduce 之间的一个过程可以分为 Map 端的 shuffle 和 Reduce 端的 Shuffle。
具体步骤
分区Partition
根据分区函数默认是哈希函数 hash(key) % num_reducers将中间键值对分配到不同的 Reducer。 相同键值对会被发送到同一个 Reducer。
排序Sort
对中间键值对按键进行全局排序。排序可以在 Mapper 端局部排序也可以在 Reducer 端进行全局合并排序。
分组Combine 和 Grouping 在 Reducer 端具有相同键的所有值被合并为一个列表。 可选地使用 Combiner 函数在 Mapper 端预聚合中间结果以减少网络传输量。 示例
输入数据
(hello, 1), (hadoop, 1), (hello, 1), (world, 1)输出数据
Reducer 1: (hadoop, [1])
Reducer 2: (hello, [1, 1]), (world, [1])注意Shuffle 阶段可能成为性能瓶颈因为涉及大量数据的网络传输和排序操作。
Reduce 阶段
对 Shuffle 阶段分组后的中间结果进行聚合或计算输出最终结果。
工作原理
1、输入key, list(values)即每个键和其对应的值列表。
2、用户需实现 reduce() 方法定义如何对同一键的所有值进行处理。示例
输入数据
(hadoop, [1])
(hello, [1, 1])
(world, [1])输出数据
(hadoop, 1)
(hello, 2)
(world, 1)MapReduce 应用场景
数据分析如日志处理、点击流分析。文本处理如全文索引、词频统计。大规模计算如矩阵乘法、图处理。 MapReduce Java 实战
Hadoop 环境搭建
本文主要演示 MapReduceMap、Shuffle、Reduce 三个流程因此安装使用现成的 docker 镜像实现
docker pull sequenceiq/hadoop-docker:2.7.1# 运行 Hadoop 单节点容器
docker run -it --name hadoop-master -p 8088:8088 -p 9870:9870 -p 9000:9000 sequenceiq/hadoop-docker:2.7.1安装成功后访问服务是否正常启动
HDFS NameNode 界面http://xxxxx:9870
YARN ResourceManager 界面http://xxxx:8088代码实现 下面我们演示如何用 Java 实现一个基本的词频统计程序WordCount,包含 Mapper、Reducer 和 Driver 的完整 Java 类。。 WordCountMapper.java
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;public class WordCountMapper extends MapperObject, Text, Text, IntWritable {private final static IntWritable one new IntWritable(1);private Text word new Text();Overrideprotected void map(Object key, Text value, Context context) throws IOException, InterruptedException {String line value.toString();String[] words line.split(\\s);for (String str : words) {word.set(str); // 设置当前单词context.write(word, one); // 输出单词和计数值1}}
}WordCountReducer.java
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;public class WordCountReducer extends ReducerText, IntWritable, Text, IntWritable {private IntWritable result new IntWritable();Overrideprotected void reduce(Text key, IterableIntWritable values, Context context) throws IOException, InterruptedException {int sum 0;for (IntWritable val : values) {sum val.get();}result.set(sum); // 设置结果值context.write(key, result); // 输出单词和总次数}
}WordCount.java (Driver 类)
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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class WordCount {public static void main(String[] args) throws Exception {if (args.length ! 2) {System.err.println(Usage: WordCount input path output path);System.exit(-1);}Configuration conf new Configuration();Job job Job.getInstance(conf, Word Count);job.setJarByClass(WordCount.class);job.setMapperClass(WordCountMapper.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);}
}打包提交服务器运行
上传统计文件到 HDFS
wordcount.txt
hadoop hello hadoop
world# 上传
hdfs dfs -mkdir -p /input/wordcount
hdfs dfs -put wordcount.txt /input/wordcount运行程序计算
hadoop jar xxx/hadoop-wordcount-1.0-SNAPSHOT.jar com.example.WordCount查看运行结果 查看统计文件
hadoop 1
hello 2
world 1个人简介 你好我是 Lorin 洛林一位 Java 后端技术开发者座右铭Technology has the power to make the world a better place. 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。 作为一个 Java 后端技术爱好者我不仅热衷于探索语言的新特性和技术的深度还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。 在我的博客上你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法以帮助你更好地掌握Java编程。 我鼓励互动和建立社区因此请留下你的问题、建议或主题请求让我知道你感兴趣的内容。此外我将分享最新的互联网和技术资讯以确保你与技术世界的最新发展保持联系。我期待与你一起在技术之路上前进一起探讨技术世界的无限可能性。 保持关注我的博客让我们共同追求技术卓越。