一.大数据的认识
1.定义:大数据(big data)指在一定时间范围内不能以常规软件工具处理(存储和计算)的大而复杂的数据集。大数据是就是使用单台计算机没法再规定时间内处理完,或者压根就没法处理的数据集。
2.特性
(1)大量(Volume)——数据规模巨大
含义:数据的体量非常庞大,起步通常以TB(太字节),PB(拍字节)甚至EB(艾字节)为单位,远超传统单台服务器或关系型数据库的存储和处理能力。
来源:社交媒体的图文视频,电商交易记录,物联网传感器数据,各种系统日志等。
技术应对:这也就是为什么需要分布式存储(如你之前问HDFS把大文件切块存到多台机器上)
(2)Velocity(高速) ——产生和处理速度快
含义:包含两层意思:一是数据产生的速度极快(如双十一购物节每秒几十万笔交易);二是要求数据处理的速度极快(如实时风控,实时推荐,必须在毫秒或秒级给出结果)。
技术应对:传统批处理已经不够用了,需要引入流式计算(如kafka,Flink,Spark Streaming)进行实时处理。
(3)Variety(多样)——数据类型繁多
含义:大数据不仅仅是传统的表格数据。包括三种类型:
结构化数据:高度组织化的数据,如关系型数据库中的二维表(占比约10%-20%)。
半结构化数据:有一定结构但不符合关系型数据库模型,如JSON,XML,HTML,日志文件。
非结构化数据:没有固定结构的数据,如视频,音频,图片,办公文档(占比最大,约80%)。
技术应对:催生了NoSQL数据库(如MongoDB,HBase)以及各类分布式文件系统。
(4)Value(价值) ——价值密度低,整体价值高
含义:这是大数据最核心的特征。以视频监控为例,连续录制24小时,可能只有几秒钟是有用的(如事故发生瞬间)。数据量越大,单条数据价值密度往往越低。但是,通过海量数据的关联分析和挖掘(沙里淘金),可以得出极具商业价值的宏观法律。
技术应对:需要强大的数据清洗,数据挖掘和机器学习算法
(5)Veracity(真实性/准确性)——数据质量参差不齐
含义:由于数据来源广泛,充斥着大量的噪声,缺失值,异常值,甚至虚假数据(如水军评论,错误传感器读数)。garbage in,garbage out垃圾进,垃圾出,如果数据不准确,分析结果毫无意义。
技术应对:需要进行严格的数据治理,数据质量校验和清洗机制。
二.Hadoop
1.架构的选择
在大数据处理上,Hdoop并非唯一的分布式处理架构,但是对于大部分企业来说,基于Hadoop已经能够满足绝大部分的数据需求,因此才会成为现在的主流选择。
2.Hadoop概述
生动类比一下:北冥有鱼,其名为鲲,鲲之大,一锅炖不下
鲲代表海量数据(大数据),而一锅炖不下就是传统单机服务器面临的窘境(存储和算力撑爆了)
为了解决炖不下的难题,Hadoop这位大厨派出了三位核心干将:HDFS(存储),MapReduce(计算),YARN(调度)。
(1)HDFS(分布式存储系统)——怎么存放这只鲲,一个锅(单机)塞不下
1.切块(Block):既然一锅炖不下,那就把鲲切成块(默认每块128MB)。把200斤的鲲切成无数个小块。
2.分布式存放(DataNode):所有锅(集群),把切好的鲲放到不同的锅里面去。
3.多副本(备份):为了防止某个锅突然坏了,还要多备几个锅存放鲲(高容错)。
4.总账本(NameNode):所有的鲲都下锅了,要有一个负责人来拿个小本本记一下鲲的左胸肉在哪锅,鲲的头在哪锅,如果厨师要做的话,问负责人你要做哪个部位就行,相当于一个目录,这就是系统底层细节透明的分布是基础架构
(2)MapReduce(分布式计算框架)——怎么把鲲做熟,相当于干活的厨子
Map(分工):总管一声令下,所有厨师(计算结点)同时开火,1号锅前的厨子做红烧鱼,2号锅前的厨子做清蒸鱼,3号锅前的厨子做成水煮鱼,4号锅前的厨子做酸菜鱼,5号锅前的厨子做剁椒鱼头...,把大任务拆分成无数个小任务,大家一起干。
Reduce(汇总):每个厨子做完自己的那部分后,把菜端到一个桌子上,由一个总厨负责拼盘(汇总结果),最终端出一道全鱼宴,这就是分布式计算的核心精髓:计算向数据靠拢,分而治之。
(3)资源调度框架(YARN)——谁来指挥这群厨子(YARN:大总管)
作用:好几万个锅,几万个厨子,有的想用大火,有想用蒸锅,有的想停工休息(算力资源分配)。如果乱成一锅粥,不仅做不完菜,厨房还会炸掉。
资源调度:YARN就是后厨的调度员。它负责盯着所有的切菜板,炉灶(CPU和内存)。如果你这组做红烧鱼需要3个灶台,它就去分配,用完立刻收回,给下一组清蒸鱼
支持其他菜系(生态开放):以前Hadoop的后厨只能用MapReduce这把菜刀。现在有了YARN这个调度员,后厨甚至可以请来做川菜的Spark厨师,或者做快餐的Flink厨师。YARN能“细粒度地管理和调度任务”,让大家和谐共处。
Hadoop体系,就是在你发现“鲲一锅炖不下”时,为你提供地一套完整分布式解决方案
HDFS负责把鲲切块,多备份,放不同锅里(解决放不下)
MapReduce负责把做法拆解给所有人同时做(解决算不动)
YARN负责把所有的灶台和切菜板合理分配给不同的任务(解决资源乱)
3.Hadoop标准定义
Hadoop 是 Apache软件基金会下一个开源分布式计算平台,以 HDFS(Hadoop Distributed File System)、MapReduce(Hadoop2.0加入了YARN,Yarn是资源调度框架,能够细粒度的管理和调度任务,还能够支持其他的计算框架,比如spark)为核心的 Hadoop 为用户提供了系统底层细节透明的分布式基础架构。hdfs的高容错性、高伸缩性、高效性等优点让用户可以将Hadoop部署在低廉的硬件上,形成分布式系统。
是一个由 Apache 基金会所开发的分布式系统基础架构,主要解决海量数据的储存和海量数据的分析计算问题。广义上说,Hadoop 是一个更广泛的概念,Hadoop 生态圈。
4.分布式
通俗点:把一整块大东西分成小东西
分布式通常指分布式系统,把多台独立计算机(节点)通过网络连接起来,让它们分工协作,对外表现得像一个整体系统。
可以这样理解:
多节点:不是一台机器干活,而是多台机器共同完成。
靠网络通信:节点之间通过消息传递协调,而不是共享同一块内存
对外像一个系统:用户可能感觉不到背后有很多机器。
可扩展:机器不够就加节点,提升处理能力或存储容量。
容量:某个节点坏了,其他节点可以继续工作
有协调成本:更多要考虑一致性,网络延迟,分区,故障,数据复制等问题。
5.HDFS产生背景
分布式文件管理系统中得一种
通过目录树来定位条件
适合一次写入,多次读出。一个文件经过创建,写入和关闭之后就不需要改变。
架构概述:
NameNode(nm):存储文件得元数据,如文件名,文件目录结构,文件属性(生成时间,副本数,文本权限),以及每个文件得块列表和块所在的DataNode等;配置副本策略;处理的客户端的读写请求。
DataNode(dn):在本地文件系统存储文件块数据,以及块数据的校验和;执行数据块的读/写操作
Secondary NameNode(2nm):每隔一段时间对NameNode元数据备份;并非热备,当NameNode挂掉的时候,并不能马上替换NameNode并提供服务;紧急情况,可辅助恢复NameNode。
Client:将上传到HDFS的文件切分成块(128M/256M);与NameNode交互,获取文件位置信息;与DataNode交互,读取写入数据;管理HDFS,例如NameNode格式化,对HDFS增删改查。
优缺点
优点:
数据规模能够达到GB TB,PB级别
文件规模能够处理百万规模以上的文件数量
高容错性:数据自动给保存多个副本,某一个副本丢失之后,可以自动恢复
适合处理大数据:
可构建在廉价的机器上:通过多副本机制,提高可靠性。
缺点:
不适合低延时数据访问:毫秒级的存储数据
无法高效的对大量小文件进行存储:存储大量小文件的话,会占用NameNode大量的内存来存储文件目录和块信息。NameNode的内存总是有限的;小文件的存储寻址时间会超过读取时间,违反HDFS的设计目标
不支持并发写入,文件随机修改:一个文件只能有一个写,不允许多个线程同时写,仅支持数据追加,不支持文件的随机修改。
6.写数据流程
(1)概念的部分
Client(客户端):负责发起文件写入请求,将文件切分为Block,并最终将数据流式发送。
NameNode(元数据节点):负责管理文件系统的命名空间(Namespace)和Block映射信息,不负责实际数据的存储。
DataNode(数据节点):负责实际数据的存储。在写入过程中,多个DataNode会构成一条数据传输管道(Pipeline)。
Block(数据块):HDFS默认的存储单元(图中为128M)。图中的ss.avi为200M,将被物理切分为0-128M和128-200M两个Block
Packet(数据包):数据传输的基本单位(默认64KB).
Chunk(数据片段):Packet的组成部分,每个Chunk默认512字节,并附带4字节的Checksum(校验和)用于数据完整性验证。
(2)流程
阶段一:元数据交互与节点分配
1.请求创建文件:客户端(DistributedFileSystem)向NameNode发起RFC请求,请求在指定路径(/user/atguigu/ss.avi)创建文件
2.权限与目录校验:NameNode收到请求后,检查目录树结构(判断目标是否存在,父目录是否存在)以及客户端是否具备写权限。校验通过后,向客户端返回响应。
3.请求分配Block:客户端开始将文件逻辑切块。向NameNode请求上传第一个Block(0-128M),并询问该Block应存放的DataNode地址。
4.返回存储节点列表:NameNode根据机架感知策略(Rack Awareness),为当前Block分配3个副本节点(dn1,dn2,dn3),并将节点列表返回客户端。
阶段二:构建数据管道
5.建立传输管道:客户端获取节点列表后,并非同时向三个节点发送数据,而是串行建立连接。客户端与dn1建立Socket连接,dn1请求与dn2建立连接,dn2请求与dn3建立连接。由此形成一个链式Pipeline。
6.反向ACK应答:连接建立完成后,dn3向dn2发送确认(ACK),dn2向dn1发送确认,dn1最终向客户端发送确认。只有当整条Pipeline均返回成功,客户端才会开始传输数据。
阶段三:数据流式传输与完成
7.流式传输数据(Packet):客户端开始向dn1发送数据。数据以Packet(64KB)为单位进行发送。每个Packet 内部包含多个512Byte的Chunk以及其对应的4Byte校验和。
传输机制:dn1收到数据后,一边写入本地磁盘(先写入内存Bytebuffer,再刷盘blk-1),一边将数据原样转发给dn2;dn2同理转发给dn3,形成流水线复制。
8.传输完成与元数据更新:第一个Block传输完成后,客户端继续请求上传第二个Block(循环步骤3-7)。当所有Block传输完毕,客户端向NameNode发送完成信号(close),NameNode最终提高元数据,完成整个文件的写入
7.读数据流程
阶段一:获取元数据
1.请求下载文件:客户端调用DistributedFileSystem的open()方法,向NameNode发起RPC请求,请求读取路径为/user/atguigu/ss.avi的文件
2.返回目标文件元数据:NameNode收到请求后,校验权限,并查询元数据目录树。然后向客户端返回该文件的元数据信息。
注:图中返回的信息为{[blk_1,blk_2],[blk_1,blk_2],[blk_1,blk_2]。这表示该文件由blk_1和blk_2两个数据块组成,且每个数据块有3个副本块(分别存在于dn1,dn2,dn3上)。
阶段二:拉取数据
3.请求读取第一个Block:客户端拿到元数据后,创建FSDataInputStream。根据就近原则,客户端从blk_1的副本列表中挑选一个距离最近的DataNode(图中选择了dn1),请求读取blk_1(0-128M)
4.传输数据:DataNode1从磁盘读取对应的blk_1,通过数据流源源不断地发送给客户端。
5.请求读取第二个Block:当blk_1读取完毕后,客户端接着向拥有blk_2的DataNode发起请求(图中选择了dn2),请求读取blk_2(128M-200M).
6.传输数据:DataNode2将blk_2的数据传输给客户端
注:
1.就近原则(短路读取)
客户端在向NameNode请求数据时,NameNode会返回包含该Block副本的所有DataNode列表。
客户端并非随机选一个,而是会计算自己与各个DataNode的网络距离(机架感知)。优先选择同一机架的节点,甚至可以做到“短路读取(Short-Circuit Read)"(即客户端直接读取本地DataNode的磁盘文件),极大节省网络带宽。
2.串行读取Block,并行读取节点
读Block是串行:如图1-6步所示,客户端必须先读完blk_1,才能读取blk_2(因为最终要拼接成一个有序的文件流)。
读DataNode是并行:HDFS支持客户端并行从多个不同的DataNode节点拉取不同的Block
3.异常重试与容错机制
步骤4读取过程中,DataNode1突然宕机或网络中断,客户端不会直接报错。
客户端会:记录该节点故障——>向NameNode报告——>自动拥有blk_1的下一个节点(如dn2)发起请求,实现无缝切换,保证读取的连续性。
4.Checksum校验
读数据时,DataNode发出的数据同样包含校验和。客户端收到数据后,会用FSDataInputStream内部的校验机制进行计算比对,确保网络传输过程中数据没有损坏。
8.NameNode工作机制
Fsimage文件:HDFS文件系统源数据的一个永久性的检查 点,其中包含HDFS文件系统的所有目录和文件inode的序列化信息。
Edits文件:存放HDFS文件系统的所欲哦更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到Edits文件中
默认1小时检查执行一次,1分钟检查一次操作次数,当操作次数达到100w时,SecondaryNameNode执行一次。
9.DataNode工作机制
10.MapReduce
定义
MapReduce是一个分布式运算程序的编程框架,是用户开发基于Hadoop的数据分析应用的核心框架
MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上
优缺点
优点:
易于编程:用户只需要关心业务逻辑,实现框架的接口。
良好的扩展性:可以动态增加服务器,解决计算资源不够的问题。
高容错性:任何一台机器挂掉,可以将任务转移到其他节点
适合海量数据计算(TB/PB):几千台服务器共同计算
缺点
不擅长实时计算(Mysql)
不擅长流式计算(SparklessStreaming/Flink)
不擅长DAG有向无环图(计算出来的结果作为下一次计算的参数,迭代计算)计算(Spark)
架构概述
Map阶段并行处理输入数据
Reduce阶段对Map结果进行汇总
MapReduce核心思想
一个完整的MapReduce程序在分布式运行时有三类实例进程
MrAppMaster:负责整个程序的过程调度及状态协调
MapTask:负责Map阶段的整个数据处理流程
ReduceTask:负责Reduce阶段的整个数据处理流程