Big Data Note
大数据相关笔记
理论基础
大数据特征
5V:容量(Volume)大量化、速率(Velocity)快速化、多样性(Variety)多样化、真实性(Veracity)、价值(Value)价值密度低
有时不谈真实性 只有4V
不同数据类型
结构化数据
结构化数据遵循一个标准的模型,或者模式,并且常常以表格的形式存储。该类型数据通常用来捕捉不同对象之间的关系,并且存储在关系型数据库中。
非结构化数据
非结构化数据是指不遵循统一的数据模式或者模型的数据。存储和处理非结构化数据通常需要专用的逻辑,如存储一部视频,需要正确的编码和解码。非结构化数据不能被直接处理或者用SQL语句查询。如果他们需要存储在关系型数据库中,它们会以二进制大型对象(BLOB)的形式存储在表中。当然,NoSQL数据库作为一个非关系型数据库,能够用来同时存储结构化和非结构化数据。
半结构化数据
半结构化数据有一定的结构或一致性约束,但本质上不具有关系型。半结构化数据是层次性的或基于图像的。这类数据常常储存在文本文件中,如XML文件和JSON文件是两类常见的半结构化数据。
元数据
元数据提供了一个数据集的特征和结构信息。这种数据主要由机器生成,并且能够添加到数据集中。搜索元数据对于大数据存储、处理和分析是至关重要的,因为元数据提供了数据系谱信息,以及数据处理的起源。例如XML文件中提供作者和创建日期信息的标签、数码照片中提供文件大小和分辨率的属性文件。
大数据存储概念
集群
一个集群是紧密耦合的一些服务器或节点。这些服务器通常有相同的硬件规格并且通过网络连接在一起作为一个工作单元。一个集群通常是多台机器组合提供一个服务。
分布式文件系统
一个分布式文件系统作为一个文件系统,可以存储分布在集群节点上的文件。对于客户端来说,文件似乎在本地,但物理形式上文件分布于整个集群。
NoSQL
Not-only SQL是一个非关系型数据库,具有高度的可扩展性、容错性,并专门设计用来存储半结构化和非结构化数据。NoSQL数据库通常会提供一个能被应用程序调用的基于API的查询接口。NoSQL数据库也支持SQL以外的查询语言。
分片
分片是水平地将一个大的数据集划分成较小的、更易于管理的数据集的过程,这些数据集叫碎片。碎片分布在多个节点,而节点是一个服务器或者一台机器。每个碎片存储在一个单独的节点上,每个节点只负责存储在该节点上的数据。所有碎片都是同样的模式,所有碎片集合起来代表完整的数据集。
PS:就是把表的行存在不同的节点上
分片对于客户端来说通常是透明的。分片允许处理负荷分布在多个节点上以实现水平可伸缩性。这样做,每个节点只负责整个数据集的一部分,整行读写可化为多个节点的并行操作。
PS:若纵向切割,则每个节点保有某个属性的一部分,单行操作可以化为多个节点的并行操作。
复制
复制在多个节点上存储数据集的多个拷贝,被叫做副本。复制因为相同的数据在不同的节点上复制的原因提供了可伸缩性和可用性。数据容错也可以通过数据冗余来实现。数据冗余确保单个节点失败时数据不会丢失。
有两种不同的方法用于实现复制:
- 主从式复制
- 对等式复制
主从式复制
主从式复制中,节点被安排在一个主从配置中,所有数据都被写入主节点,一旦保存,数据就被复制到多个从节点。
一个从节点可以作为备份节点配置主节点。如果主节点失败,直到主节点被恢复为止将不能进行写操作。主节点要么时从主节点的一个备份中回复,要么在从节点中选择一个作为新的主节点。
读写不一致问题:
如果一个从节点在被更新到主节点的新状态之前,被用户读取,便会产生这样的问题。为了确保读一致性,可以实现一个投票系统,若大多数从节点都包含相同版本的记录,则可以声明一个读操作是一致性的。实现这样的投票系统需要从节点之间有相应的快速可靠通讯机制。
场景:
- 用户A更新数据
- 数据从主节点复制到节点a
- 在数据复制到节点b之前,用户B试图从节点b读取数据,导致不一致的读操作
- 当数据从主节点复制到从节点b之后,数据一致
对等式复制
对等式复制,所有节点在同一水平上运作。各个节点之间没有主从节点的关系。每个称为对等的节点也同样能够处理读请求和写请求。每个写操作复制到所有对等节点中去。
对等式复制容易造成写不一致,写不一致发生在同时更新同一个数据的多个对等节点的时候。这可以通过实现一个悲观或乐观并发策略来解决这个问题。
- 悲观并发是一种防止不一致的有前瞻性的策略。它使用锁来确保一个记录上同一个时间只有一个更新操作可能发生。然而这种方法的可用性较差,因为正在被更新的数据库记录一直是不可用的,直到所有锁被释放。
- 乐观并发是一个被动的策略,它不使用锁。相反,它允许不一致性在所有更新都被实现后,最终可以获得一致性的前提下发生。实现上可以使用一个时间戳,接受时间戳最新的更新。
场景:
用户A更新数据
数据被复制到对等节点A
数据被复制到对等节点B
在数据被复制到对等节点C之前,用户B试图从对等节点C读取数据,导致读不一致
最终数据将被更新到对等节点C中,数据库一致
分片+复制
为了改善分片机制所提供的有限的容错能力(部分行可用),而另外受益于增加的复制的可用性和伸缩性,可以将分片和复制组合使用。
- 分片和主从式复制
- 分片和对等式复制
分片和主从式复制
多个主分片分布在各个节点中。从分片提供读服务,并通过主分片进行更新,为读操作提供可扩展性和容错性。
如果主分片变为不可操作或网络出现故障,写操作的容错能力将受到影响。
分片和对等式复制
每个碎片被复制到多个对等节点,每个对等节点仅仅负责整个数据集的一个子集。总的来说,这有助于实现更好的可扩展性和容错性。由于不涉及主节点,所以不存在单点故障,并且支持读操作和写操作的容错性。
同样的,也继承了对等复制的写不一致问题,大数据下多分片同步过程可能导致网络拥塞等
CAP定理
一致性(Consistency):从任何节点的读操作都是一致的
可用性(Availability):任何一个读/写请求总是会以成功或失败的形式得到相应
分区容忍(Partition tolerance):数据库系统可以容忍通信中断,通过将集群分成多个竖井,仍然可以队读/写请求提供服务(挂了几个节点还是部分可用)
CAP三角:CAP不能同时获得
- 如果CA是必需的,则需要保持通信,P不成立
- 如果CP是必需的,则不能保持可用性A
- 如果AP是必需的,则由于通讯时间等,不能保证一致性C
分布式数据库系统中,不能保证100%的通达可用,因此P是必需的,CAP通常是C+P OR A+P的组合
ACID
数据库设计原则与数据管理
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离(Isolation)
- 持久性(Durability)
BASE
BASE是一个根据CAP定理而来的数据库设计原则,它采用了使用分布式技术的数据库系统。
- 基本可用(Basically Available):始终相应用户请求,但可能由于网络原因,节点间通讯中断
- 软状态(Soft State):同步的中间状态,意味着读不一致可能出现
- 最终一致性(Eventual Consistency)
大数据处理概念
并行数据处理
将一个大规模的任务分成多个子任务同时进行,目的是减少处理时间。较为典型的方法是在一台机器上使用多个处理器或内核完成。
分布式数据处理
与并行数据处理非常相似,将一个大规模任务分成多个子任务。但不同的是,分布式数据处理通常在几个物理上分离的机器上进行,这些机器通过网络连接构成了一个集群。
Hadoop
Hadoop实现了MapReduce处理框架,被公认为当代大数据解决方案的工业平台。Hadoop可以作为ETL引擎与分析引擎来处理大量结构化、半结构化、非结构化数据。
这一部分的内容我将单独出blog
处理工作量
大数据的处理工作量被定义为一定时间内处理数据的性质与数量。处理工作量主要被分为以下两个类型
- 批处理型
- 事务型
批处理型
批处理也称脱机处理,这种方法通常成批地处理数据,因此会导致较大的延迟。
通常我们采用批处理完成大数据有序的读/写操作,这些读/写查询通常是成批的。
事务型
事务型处理也称为在线处理,这种处理方式通过无延迟的交互式处理使得整个回应延迟很小。事务型处理一般适用于少量数据的随机读/写操作
集群
集群能为水平可扩展的存储方案提供必要的支持,也能为分布式数据处理提供一种线性的扩展机制(即存储和计算的集群)。集群有极高的可扩展性,因而它可以把大的数据集分成多个更小的数据集,以分布式的方法并行处理,这种特性为大数据处理提供了理想的环境。
由于集群由物理连接上相互独立的设备组成,它具有固定的冗余与一定的容错性,因而当网络中某个节点发生错误时,它之前处理与分析的结果都是可恢复的。考虑到大数据处理过程偶尔有些不稳定,我们通常采用云主机基础设施服务或线程的分析环境作为集群的主干。
目前由很多分布式解决方案采用docker引擎,能够进一步提高冗余性,降低机器数量对集群稳定性的影响。
批处理模式
批处理模式中,数据总是成批地脱机处理,响应时长从几分钟到几小时不等。该模式本质上解决了大数据数据量大、数据特性不同的问题。
批处理是大数据处理的主要方式,相较于实时模式,它更简单、易于建立、开销也较小。
商务智能(BI)、预测性分析与规范性分析、ETL操作一般都使用批处理模式
MapReduce批处理
MapReduce是一种广泛用于实现批处理的架构,它采用“分治”的原则,把一个大的问题分成可以被分别解决的小问题的集合,拥有内部容错性与冗余,因而具有很高的可扩展性与可靠性。
MapReduce把数据处理算法分发到各个存储节点,数据在这些节点上被并行地处理,这种方法可以消除发送数据的时间开小。由于并行处理小规模数据速度更快,MapReduce不但可以节约网络带宽开销,更能大量节约处理大规模数据的时间开销。
Hadoop实现的MapReduce将中间结果存储在hdfs(文件系统)中,因此对磁盘大量的读写是性能瓶颈所在。
Spark针对Hadoop的问题,将中间结果保存在内存中,增加了性能的同时也提高了机器配置的需要。
Map和Reduce任务
一次MapReduce处理引擎的运行被称为MapReduce作业,它由Map和Reduce两部分任务组成,即映射-归约。
映射任务被分为映射(Map)、合并(combine)、分区(partition)三个阶段,其中合并时可选的
归约任务被分为洗牌和排序(shuffle and sort)、归约(reduce)两个阶段
映射
映射首先把大的数据文件分割成多个小数据文件,每个较小的数据文件的每条记录都被解析为一组键值对。
(K1, V1)-> list(K2, V2)
合并
对键值对进行合并,减少数据由映射任务节点传输到归约任务节点的带宽消耗
(K2, list(V2))-> list(K2, V2)
分区
当使用多个规约模块时,MapReduce模型就需要把映射模块或合并模块的输出分配给各个归约模块。在此,我们把分配到每个归约模块的数据叫做一个分区,也就是说,分区数与归约模块数时相等的。
(K2, V2)->(index)
一个分区包含很多记录,同一键的记录必须被分配在同一个分区。在此基础上,MapReduce模型会尽量保证随机公平地把数据分配到各个归约模块中。
由于上述分区模块特性,会导致分配到各个归约模块地数据量由差异,甚至分配给某个规约模块地数据量会远远超过其他。不均等地工作量将导致各个归约模块地工作结束时间不同,导致空等地情况发生,耗时增加。
洗牌和排序
洗牌包括由分区模块将数据传输到归约模块的整个过程,是规约任务的第一个阶段。由分区模块传输来的数据可能存在多条记录对应同一个键,这个模块将把这些相同的键进行组合,形成唯一的键值对列表。
(K2, V2)->K2, list(V2)
归约
最后一个阶段,对输入的记录进行进一步分析归纳,也可能对输入不做任何改变。在任何情况下,这个模块都在处理当条记录的同时将其他处理过的记录输出。
分配到每个归约模块的分区都将被合并成一个文件。
(K2, list(V2))-> list(K3, V3)
理解MapReduce算法
MapReduce编程遵循一套特定的逻辑,采用了分治的原则。
- 任务并行:将一个任务分为多个子任务,在不同的节点上并行。通常并行的子任务采用不同的算法,每个子任务的输入数据可以相同也可以不同,最后多个子任务的结果组成最终结果。
- 数据并行:将一个数据集分为多个子数据集在多个节点上并行地处理,数据并行的多个节点采用同一算法,最后多个子数据集的处理结果组成最终结果。
设计MapReduce算法时考虑的几点:
- 尽可能使用简单的算法逻辑,这样才能采用统一函数处理逻辑处理某个数据集的不同部分
- 数据集可以被分布式地划分在集群中
- 理解数据集的数据结构以保证选取有用的记录
- 将算法逻辑分为映射部分与归约部分
- 保证映射函数的输出时正确有效的
- 保证归约函数的输出时正确的
实时处理模式
实时模式中,数据通常在写入磁盘之前在内存中进行处理,侧重于提高大数据处理的速度。
SCV原则
速度(Speed)
数据生成后处理的速度,此处忽略获取数据的时间消耗,专注于实际数据处理的时间消耗
一致性(Consistency)
一致性指处理结果的准确性与精度,高一致性系统通常会利用全部数据来保证其准确度与精度,低一致性系统则采用采样技术
容量(Volume)
容量指系统能够处理的数据量
SCV不可能三角
如果保证数据处理系统的速度和一致性,就不能保证大容量
如果保证高一致性处理大容量数据,则处理速度必然减慢
如果保证高速的大容量数据处理,则系统的高一致性将受到影响
实时处理中,保证数据不丢失,对数据处理容量V的需求较大,因此需要在S和C中做权衡,实现S+V或C+V