1MapReduce概述
1.1MapReduce定义
MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架
MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上
1.2优缺点
优点
1)易于编程:他简单的实现一些接口,就可以完成一个分布式程序
2)良好的扩展性:计算资源不足时可以简单的增加机器来扩展计算能力
3)高容错性:设计初衷就是使程序能部署在廉价的PC上,一台机器挂了可以把计算任务转移到另外一个节点上运行而不至于任务运行失败,且这一过程由Hadoop内部自己完成
4)适合PB级以上海量数据的离线处理:能实现上千台机器并发工作
缺点
1)不擅长实时计算:不能像MySQL一样极速返回结果
2)不擅长流式计算:流式计算的输入是动态的,他是一种用于实时处理连续流数据的计算模型,它可以实时地对数据进行处理、分析和转换,并在数据流持续不断地到达时立即产生结果。与传统的批处理不同,流式计算能够以低延迟、高吞吐量的方式处理数据,适用于需要实时响应的应用场景。而MR的输入数据集是静态的,不能动态变化(由于自身设计特点)
3)不擅长DAG(有向无环图)计算:
即多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出,MR也能做,但每个作业的输出结果都会写进磁盘,造成大量的磁盘IO,导致性能十分低下
1.3MR核心思想
1)分布式的运算程序往往需要分成至少两个阶段
2)第一阶段的MapTask并发实例,完全并行运行,互不相干
3)第二阶段的ReduceTask并发实例互不相干,但他们的数据依赖于上一阶段的所有MapTask并发实例的输出
4)MR编程模型只能包含一个Map阶段和一个Reduce阶段,如果用户业务逻辑很复杂,就只能多个MR程序,串行运行
总结:分析WordCount数据流走向深入理解MR核心思想
1.4MR进程
一个完整的MR程序在分布式运行时有三类实例进程:
1)MrAppMaster:负责整个程序的过程调度及状态协调
2)MapTask:负责Map阶段的整个数据处理流程
3)ReduceTask:负责Reduce阶段的整个数据处理流程
1.7MR编程规范(不是语言,是一种编程模型,一般用Java实现)
用户编写的程序分成三个部分:Mapper、Reducer和Driver
Mapper阶段
1)用户自定义的Mapper要继承自己的父类
2)Mapper的输入数据是KV对的形式,类型可自定义
3)Mapper的业务逻辑写在map()方法里
4)Mapper的输出数据是KV对形式,类型可自定义
5)map()方法(MapTask进程)对每一个<K,V>调用一次
Reducer阶段
1)用户自定义的Reducer要继承自己的父类
2)Reducer的输入数据类型对应Mapper的输出数据类型,也是KV
3)业务逻辑写在reduce()方法中
4)ReduceTask进程对每一组相同k的<K,V>调用一次reduce()方法
Driver阶段
相当于YARN集群的客户端,用于提交我们整个程序到YARN集群,提交的是封装了MapReduce程序相关运行参数的job对象
WordCount实例理解
实际操作
环境准备:要在IDEA创建Maven工程——pom.xml添加依赖——……
编写程序
提交集群测试
1)用maven打jar包,添加需要添加的打包插件依赖
2Hadoop序列化
2.1序列化概述
1)什么是序列化
序列化就是把内存的对象,转换成字节序列(或其他数据传输协议)以便于存储到磁盘(持久化)和网络传输
反序列化就是将收到字节序列或者是磁盘的持久化数据,转换成内存中的对象
2)Why
一般来说,对象只生存在内存里,关机断电就没有了,而且只能由本地进程使用,不能通过网络发送给另一台计算机,而序列化可以存储对象,可以将对象发送到远程计算机
3)为什么不直接使用Java序列化
Java序列化是一个重量级序列化框架(Serialiazable),一个对象被序列化后,会附带很多额外信息,不便于在网络中高效传输。所以,Hadoop自己开发了一套序列化机制(Writable)
4)优点:
1)紧凑:高效使用存储空间 2)快速:读写数据额外开销小 3)互操作:支持多语言的交互
2.2自定义bean对象实现序列化接口(Writable)
案例分析
3MapReduce框架原理
3.1InputFormat数据输入
切片与MapTask并行度决定机制
1)问题引出
MapTask的并行度决定Map阶段的任务处理并发度,进而影响到整个Job的处理速度
2)MapTask并行度决定机制
数据块:Block是HDFS物理上把数据分成一块一块。数据块是HDFS存储数据单位
数据切片:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。数据切片是MapReduce程序计算输入数据的单位,一个切片会对应启动一个MapTask
FileInputFormat切片机制
FileInputFormat切片大小的参数配置
TextInputFormat
1)FileInputFormat以接口实现MapReduce读取不同数据类的文件
常见的接口实现类包括:TextInputFormat、KeyValueTextInputFormat、NlineInputFormat、CombineTextInputFormat和自定义InputFormat等
2)TextInputFormat
是默认的FileInputFormat实现类。按行读取每条记录。键是存储在该行在整个文件中的起始字节偏移量,LongWritable类型。值是这行的内容,不包括任何行终止符(换行符和回车符),Text类型
CombineTextInputFormat切片机制
默认机制不管文件多小都会是单独切片,如果有大量小文件,产生大量MapTask,效率低下
CombineTextInputFormat用于小文件过多的场景,可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个MapTask
3)切片机制
生成切片过程包括:虚拟存储过程和切片过程二部分
3.2MapReduce工作流程
3.3Shuffle过程
图(7-16),Map方法之后,Reduce方法之前的数据处理过程称为Shuffle
1)MapTask收集map()方法输出的KV对,放到内存缓冲区中
2)从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件
3)多个溢出文件会被合并成大的溢出文件
4)溢出过程及合并过程,都要调用Partitioner进行分区和针对key进行排序
5)ReduceTask根据自己的分区号,去各个MapTask机器上取相应的结果分区数据
6)ReduceTask会抓取到同一个分区的来自不同MapTask的结果文件,ReduceTask会将这些文件再进行合并(归并排序)
7)合并成大文件后,Shuffle过程结束,进入ReduceTask逻辑运算过程
Partition分区
问题引出:将统计结果按照条件输出到不同的文件中
默认Partitioner分区是根据key的hashCode对ReduceTasks个数取模得到的,用户不能控制哪个key存到哪个分区
自定义Partitioner步骤
分区总结
WritableComparable排序
排序 是MR框架中最重要的操作之一,MapTask和ReduceTask都会对数据按照key排序,这属于Hadoop的默认行为,任何应用程序中的数据都会被排序,而不管逻辑上是否需要
默认排序是按照字典顺序排序,且实现该排序的方法是快速排序
排序分类
自定义排序WritableComparable
需要实现WritableComparable接口重写compareTo方法,就可以实现排序
Combiner合并(可选)
3.4OutputFormat数据输出
OutputFormat接口实现类
OutputFormat是MR输出的基类,所有实现MR输出都实现了OutputFormat接口
几种常见的OutputFormat实现类
1)默认输出格式TextOutputFormat
2)自定义OutputFormat
3.5MapReduce内核源码解析
MapTask工作机制
ReduceTask工作机制
ReduceTask并行度决定机制
MapTask并行度由切片个数决定,切片个数由输入文件和切片规则决定
ReduceTask并行度(个数)则可以手动设置,可以实验测试多少个合适
3.6Join应用
数据倾斜(Data Skew)是指在数据处理过程中,某些数据分区(Partition)中的数据量远远大于其他分区,导致部分节点负载过重,影响整体任务的执行效率和性能。数据倾斜可能发生在各种分布式计算场景中,如MapReduce、Spark、Hive等,常见于以下情况:
-
Key 值分布不均匀:如果数据集中的某些键值在分区中的出现频率远高于其他键值,就会导致数据倾斜。
-
Join 操作中的数据倾斜:当进行连接操作时,如果连接字段的分布不均匀,或者有大量的重复键值,就会导致数据倾斜。
-
聚合操作中的数据倾斜:当进行聚合操作(如求和、计数)时,如果聚合键的分布不均匀,就会导致某些分区中的数据量远大于其他分区。
-
数据分桶不合理:在数据分桶(Bucketing)操作中,如果分桶策略选择不合理,可能会导致数据倾斜。
数据倾斜会严重影响分布式计算的性能和可靠性,因为负载过重的节点可能会导致任务执行缓慢甚至失败。为了解决数据倾斜问题,可以采取以下一些策略:
-
重新分区:重新设计分区策略,将数据均匀地分布到各个分区中,避免出现数据倾斜。
-
增加分区数:增加分区数,使得每个分区中的数据量更加均匀。但需要注意,分区数过多可能会增加通信开销。
-
数据预处理:在进行连接、聚合等操作之前,对数据进行预处理,如去重、过滤、均匀分布等,减少数据倾斜的可能性。
-
使用自定义分区器:针对特定场景设计自定义的分区器,根据数据分布情况动态调整分区策略,使得数据能够更加均匀地分布到各个节点上。
-
数据倾斜处理:针对数据倾斜的分区进行特殊处理,如单独处理倾斜分区、采用更复杂的算法等,以减轻节点负载压力。
3.7数据清洗(ETL)
ETL是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取、转换、加载至目的端的过程。ETL一词较常用在数据仓库,但对象不只限于数据仓库
在运行核心业务MapReduce之前,往往要先对数据进行清洗,清洗过程往往只需要运行Mapper程序,不需要运行Reducer程序(job.setNumReduceTask(0))。
3.8MR开发总结
4Hadoop数据压缩
4.1概述
1)压缩的好处坏处
优:以减少磁盘IO、减少磁盘存储空间
缺:增加CPU开销
2)压缩原则
运算密集型的Job,少用压缩
IO密集型的Job,多用压缩
4.2MR支持的压缩编码
1压缩算法对比介绍
2压缩性能的比较
4.3压缩方式选择
选择时重点考虑:压缩解压缩速度、压缩率、压缩后是否可以支持切片
Gzip:优点:压缩率高,缺点:不支持切片;速度一般
Bzip2:压缩率高,支持切片,但速度慢
Lzo:速度较快,支持切片,但压缩率一般;想支持切片需要额外创建索引
Snappy:速度快,但不支持切片,压缩率一般
压缩位置选择
压缩可以在MapReduce作用的任意阶段启用
4.4压缩参数配置
1)为了支持多种压缩解压缩算法,Hadoop引入了编码器解码器
2)要在Hadoop启用压缩,可以配置如下参数
即时MR输入输出都是未压缩文件,仍然可以对Map任务的中间结果做压缩因为要写在硬盘并通过网络传输到Reduce节点,压缩可以提高性能,只需设置两个属性
Mapper、Reducer均保持不变
Reduce同理