词频统计 MapReduce 初识+案例

1.1.1是什么
:是中的一个分布式计算框架,基于写出的应用程序能够运行在大型集群上,并以一种可靠容错的方式并行处理上 T 级别的数据集 。
一个作业(Job)通常会把输入的数据切分为若干个独立的数据块,由 Map 任务(Task)以完全并行的方式处理它们 。框架会对 Map 的输出先进行排序,然后把结果输入给任务,通常作业的输入和输出都会被存储在文件系统中 。
整个框架负责任务的调度和监控,以及重新执行已经失败的任务 。
1.2 优点/缺点 1.2.1 优点1.2.2 缺点
不擅长做实际计算、流式计算、DAG(有向图)计算 。
的任务表达能力有限,一个只能完成一次映射和聚合,像 DAG 任务就需要多次聚合,那就需要将任务拆成多个,每个 任务都需要大量的磁盘 IO,将导致性能低下 。
1.3运行阶段
第一阶段: Map Task 并发实例,完全并行运行,不互相干
第二阶段:Task 并发实例,获取上一阶段的输出作为本阶段的输入
1.4进程
:负责整个程序的过程调度及状态调度
:负责 Map 阶段的整个数据处理流程
:负责阶段的整个数据处理流程
2. Java 词频统计
在理解之前,不如先用 Java 实现一个词频统计的实例 。
public static void main(String[] args) throws IOException {// 1. 创建容器存储结果HashMap map = new HashMap<>();// 2. 读取文件File file = new File("...");String encoding = "utf8";List lines = FileUtils.readLines(file, encoding);// 3. 遍历每一行for (String line : lines) {// 4. 切分出每个单词String[] words = line.split("\\s+");for (String word : words) {// 5. 替换掉特殊字符String w = word.toLowerCase().replace("\\W", "");// 6. 每出现一个单词进行数量 + 1if (!w.isEmpty()){map.put(w, map.getOrDefault(w,0) + 1 );}}}// 7. 将统计结果进行排序ArrayList> entries = new ArrayList<>(map.entrySet());entries.sort(new Comparator>() {@Overridepublic int compare(Map.Entry o1, Map.Entry o2) {return o2.getValue() - o1.getValue();}});for (Map.Entry entry : entries) {System.out.printf("单词:%s \t出现的个数为 %d\n", entry.getKey(), entry.getValue());}}
3.编程规范
利用实现词频统计之前还需要了解的编程规范 。
通常我们编写一个程序,会将其分解为三个部分:、、 。
**: **
自定义一个类,并继承 ,定义输入输出键值对的泛型实现父类的 map() 方法(进程),定义键值对的参数类型及上下文对象 编写 map 的具体实现,最后通过对象将映射结果写入框架
**: **
自定义一个类,并继承 ,定义输入输出键值对的泛型实现父类的 () 方法(进程),定义键值对的参数类型及上下文对象 编写 的具体实现,最后通过对象将聚合结果写入框架

这是一个包含 main 方法的任务的入口实例化 Job 对象,可选择性的添加各种配置将 Job 任务提交到集群 4.词频统计 4.1
我们需要继承类,来自于:org....
4.1.1 窥见源码 4.1.1.1类
类提供了四个泛型,分别是输入参数的键值对类型、输出参数的键值对类型
public class Mapper {...}
?? 注意:这里我们不适用 Java 提供的类型,而是使用实现的序列化类型,公共接口为
如果读文本,通常默认的 KEYIN 类型为(可表示当前行文本的位置、字节偏移量), 的类型为 Text(表示当前行文本内容),输出的类型为 Text(表示输出值的键),输出的的类型为 (可表示为数量) 。