一、Hadoop
Hadoop是一套大数据计数组件,三大核心组件:
① HDFS:Hadoop分布式文件系统。解决分布式系统的文件存储问题,本质是提供一套跨机器的文件管理服务。
② MapReduce:Hadoop的分布式运算程序编程框架
③ Yarn:Hadoop的分布式运算资源调度系统。解决分布式运算程序的启动、资源调度和资源回收。
Hadoop外围组件:
① Hive:基于HDFS和MapReduce的sql工具
② HBase:基于HDFS实现的分布式Nosql数据库
③ Flume:分布式日志采集系统
④ Sqoop:数据迁移工具(关系型数据库 <——>Hadoop存储系统)
1.1 MapReduce
① 核心思想:分而治之。通过一定划分方法将数据分成多个较小的(互不依赖的)具有同样计算过程的数据块,并非给不同节点去处理
② 特点:易于编程;具有良好拓展性;高容错性;适合海量数据离线处理
(缺点:实时计算性能差,不能进行流式计算)
③ MapReduce处理过程:
Map阶段:
a. 设置InputFormat类,将读取的数据切分成键值对(k1-v1:k1每行数据相对于文件开头的偏移量;v1是每行数据)
b. 自定义map逻辑,将k1-v1转换为k2-v2,输出结果。(继承Mapper类,重写Map方法)
(Shuffle阶段)
c. 对输出的k2-v2进行分区(根据key-value或Reduce数量来决定当前数据由哪个Reduce任务处理)
d. 对不同分区的key按相同key排序(环形缓冲区的数据写入磁盘前会进行二次快速排序,首先根据所属分区partition排序,每个partition中根据key排序)
e 对分组后的数据进行初步规约
(在map阶段读取数据产生k2,v2之后,我们可以通过使用combiner规约来将map阶段的k2进行合并,v2生成集合,也就是从而减少生成文件的大小,减少reduce读取map阶段文件的网络传输。也就是本该在reduce阶段进行相同key合并,value形成新的集合的这个过程在map阶段通过使用规约提前完成了)
(map数量由块的数量决定,读几个block就有几个mapTask)
Reduce阶段:
(Shuffle阶段)
a. 复制:Reduce段默认由5个复制线程从map段拉取数据
b. 合并:复制的输出存放环形缓冲区,缓冲区溢出则写入磁盘文件,将溢写文件归并到一起
(Shuffle阶段结束)
c. 对k2-v2进行排序及合并。编写Reduce函数实现k2-v2转换到k3-v3并输出
d. 设置OutputFormat处理并爆出输出的key-value(k3-v3)数据
④ 优化:数据倾斜
数据倾斜:处理数据时,大量数据呗分配到一个分区中,导致单个节点忙碌、其他节点空闲的问题。这背离了MapReduce并行计算的初中,降低了处理数据的效率。
解决方法:
a. 重新设计key:在Mapper中给key加上一个随机数,附带随机数的key不会呗大量分配到同一个节点,传到Reducer后去掉随机数即可。
b. 使用Combiner(局部聚合):选择性地把大量key相同的数据先合并,再传递给Reduce阶段处理,降低Map阶段向Reduce发送地数据量。
c. 增加Reduce任务数:增加处理数据的节点
d. 增加虚拟机内存:提高运行效率
e. 自定义分区:随机
⑤ Shuffle缺点:频繁设计数据再内存、磁盘间的多次往复
2. HDFS
一种通过网络实现在多台主机上分布进行分布式存储的分布式文件系统
① 多种服务角色
a. NameNode:负责管理元数据(维护文件系统的目录树,包括每个文件具体路径、块信息、物理存储位置、副本数量),并为客户端提供查询服务,是访问HDFS的唯一入口。
b. DataNode:负责管理文件块(存储块、读取块),是在单独机器上运行的软件。一般以机架形式组织。
c. Secondary NameNode
Hadoop集群一般包含1个Name Node和大量DataNode
② 写数据流程
a. 客户端通过RPC(远程过程调用)向Name Node发送写入文件的请求(参数:路径+名字,副本数量,切块规格)
b. NameNode执行各种检查判断,返回一个输入流
c. 客户端请求写入第一个block
d. NameNode相应,给DataNode名(默认三个),给block_id
e. 客户端向DataNode1发送请求(带block_id,其他DataNode编号).DataNode1向DataNode2发送请求,DataNode2向DataNode3发送请求,建立PipeLine(要反向进行ack校验)
f. DataNode响应请求。Client向DataNode1发送数据,DataNode1向2发送数据,2向3发。
g. 发送完毕,关闭PipeLine(若还有块要写入,则重复c-g)
h. 向Name Node汇报完成写入,Name Node记录元数据
(Pipeline充分利用每个机器的带宽,避免网络平静和高延迟连接,最小化推送所有数据的延时)
③ 读数据流程
a. 客户端向Name Node发送读数据请求
b. NameNode给客户端发送元数据
c. 客户端从最近的存数据的DataNode开始请求读取数据,响应后读取
d. 重复c
④ 副本放置策略(默认三个副本)
副本a存放在客户端所在节点上(若Client不在集群范围,则随机)
副本b存放在与a不同机架的一个节点上
副本c和b在同一个机架,随机放在不同节点 (若有更多副本,则随机放置)
⑤ 元数据管理机制
NameNode中两个重要文件(a)fsimage镜像文件:NameNode启动时对整个文件系统的快照(备份)(b)edits日志文件:存储上次fsimage保存至下次fsimage保存之间的所有HDFS操作
SecondaryNameNode每隔一小时进行一次镜像备份,对edits和fsimage文件进行合并
NameNode不持久化存储每个文件中各个块送在的DataNode的位置信息,这些信息会在系统启动时从DataNode重建
3. Hive
是基于Hadoop的数仓工具,提供了操作简单的sql查询语言hql。hql语句可转换为MapReduce任务执行。Hive处理的真实数据存储在Hadoop文件系统中,即HDFS
4. Yarn集群
是通用的资源管理系统和调度平台。MapReduce运行在Yarn集群上
① Yarn三大组件:a. (集群物理层面)ResourceManager:负责整个计算任务的调度和分配
b. (集群物理层面)NodeManager:负责执行具体运算
c. (App层面)Appmstr
② 流程:a. 客户端提交计算任务,ResourceManager接收,并启动组件
b. 启动AppMstr,AppMstr向ResourceManager申请资源
c. ResourceManager回复资源列表给AppMstr
d. 要求NodeManager分配资源
e. NodeManager启动MapTask执行具体计算任务(ReduceTask)
f. NodeManager将状态和计算结果汇报给AppMstr
g. AppMstr汇报结果给ResourceManager
③ 调度器:a. FIFO先进先出调度器
b. Capacity Scheduler 容量调度器(默认):以队列为单位划分资源,每个队列可设定一定比例的资源最低保证和使用上限
c. Fair 公平调度器
二、 Spark
是一种基于内存的快速、通用,可扩展的大数据分析计算引擎(本质是批计算)
1. 特点:运行速度快;易用性好;通用性强;随处运行
2.Spark vs. Hadoop
根本差异:多个作业之间的数据通信问题。Spark基于内存,Hadoop基于磁盘。
① 速度:a. Spark迭代过程数据存在内存;Hadoop存在磁盘,随后的计算需要从磁盘读结果。而从内存读数据比从磁盘读时间低两个数量级。 b. 复杂的数据计算任务需要多个步骤实现,对于步骤间的依赖性,Hadoop需要借助其他工具处理。Spark在执行任务前,将步骤根据依赖关系形成DAG图(有向无环图),任务执行按图索骥,可以优化I/O操作。
② Spark容错性高:引进了弹性分布式数据集,如果数据集丢失,可以根据“血统”重建
③ Spark更通用:Hadoop只提供Map和Reduce,Spark提供多种操作(可分为两类:转换操作/行动操作)
三、 Flink
是一个分布式大数据处理引擎,可对有界数据流(批计算)和无界数据流(流计算)进行有状态计算。可部署在各种集群环境,对各种大小的数据规模进行快速计算。
特点:高吞吐,低延迟,高性能;支持事件时间(Event Time);支持有状态计算;支持高度灵活窗口操作;基于轻量级分布式快照(CheckPoint)实现的容错;基于JVM实现的独立的内存管理;Save Point保存点
四、Kafka
是一个分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时处理领域。
1. 消息队列的好处:
① 解耦: 允许独立扩展和修改两边的处理过程,只要接口约束相同
② 可恢复性: 系统一部分组件失效时不会影响整个系统,降低耦合度
③ 缓冲:控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况
④ 灵活性 & 峰值处理能力
⑤ 异步通信
2. 消息队列两种模式: ① 发布/订阅模式(消息可传给多个消费者使用。基于拉取的,消费者的消费速度可以自己决定);② 点对点模式:
3. 缺点:要维持长轮询,消费者要一直拉取状态