国科大大数据课程复习笔记(1)
个人复习笔记Mark,图片内容大多来自老师提供ppt,感谢大数据课的陈老师、孙老师的辛苦授课~
目录
(2)分布式事务处理:事务读写的数据分布在不同机器上,代价昂贵
1 大数据背景与趋势
1.1 计算机硬件的发展
晶体管数量-摩尔定律,指数级增加
- CPU体系结构发展
- 2005年以前-提高主频,功耗、散热等限制主频的进一步增加
- 转向核的增加:单核单线->多核多线->众核
- 多种类型的处理器:GPU/ARM/…
- 存储层次结构
- 外存(硬盘、闪存)->DRAM内存->L3缓存->L2缓存->L1缓存->寄存器 =>速度快,容量低,价格高
- 内存:容量符合摩尔定律,带宽有一定的方法增加,访问速度比指令执行慢100倍
- 硬盘:容量指数级增加,性能(访问速度慢,带宽受限于盘片转速,顺序访问比随机访问好)
- 固态:以闪存为存储介质,随机读性能、顺序读写性能优于机械,但随机写性能差
1.2 数据管理系统的发展
- 关系型数据库(1970-1980)
- 第一个关系型数据库:System R
- 事务处理(Transaction Processing)
- 大量并发用户,少量随机读写操作
- 典型:银行业务,订票,购物等
- 数据仓库:读取大量数据的分析操作 1990
- 数据流处理、GIS、多媒体数据库等 2000
- 大数据 2010
1.3 大数据的挑战
- 三个重要概念&挑战
- 数据量巨大 Volume
- 数据的产生速度、更新速度快 Velocity
- 数据种类繁多 Variety
1.4 大数据管理系统
2 关系型数据管理系统
2.1 关系型数据模型
(1)Table/Relation (表)
- Column 列
- 一个属性,有明确的数据类型
- 必须是原子类型,不可再分,无内部结构
- Row 行
- 一个记录,记录之间无序
- 表型瘦长,列数较少,行数成千上万
- 原子类型:无内部嵌套结构
- Int,Double,Char…及Int基础上表达类型(Date等)
- 数学定义
- Schema vs Instance
- Schema:类型,只需定义一次
- Instance:具体取值,每列具体值
(2)Key(键)
- 特殊的列
- 用处:取值唯一,唯一确定一个记录
- Primary Key:主键,唯一确定本表中的一个纪录(例如学生信息表的ID,选课信息表中学生ID和课程ID的组合)
- Foreign Key:外键,是另一个表的主键,唯一确定另一个表的一个记录(例如选课信息表的学生ID和课程ID),可理解为指针或引用
2.2 关系型运算 & SQL语言
SQL:主流的关系型数据库语言
- 一般运算
- SQL Create Table +声明主键、外键
- SQL Insert
- 插入完整记录
- 插入特定列
- 插入完整记录
- SQL Delete
- SQL Update
- 主要关系运算
- Selection 选择
- 从一个表中提取一些行
- Projection 投影
- 从一个表中提取一些列
- Selection 选择
|
=>SQL 选择+投影
|
- Join 连接(等值连接 Equi-join)
- R表中的a列与S表中的b列,找到两个表中互相匹配的记录
- Group by 分组统计
- Having 在group by基础上选择
- Order by 排序
- desc (descending 减少)表示从大到小排序;asc (ascending 增加) 表示从小到大排序
- 如何计算平均成绩?
2.3 数据库系统架构
(1)概述
- DBMS(Database Management System)数据库管理系统
- RDBMS (Relational Database Management System) 关系型数据库管理系统
- 目前主流的三大商用系统:Oracle, Microsoft SQL Server, IBM DB2
- 通常的系统为典型的Client/Server
(2)RDBMS系统架构(单机)
- 前端:思考用户需求
- SQL Parser:将SQL语句的程序变为解析好的内部表达
- 语法解析,语法检查,表名、列名、类型检查
- Query Optimizer:将SQL内部表达变为执行方案(Query Plan)
- 产生可行的执行方案,估计其运行时间和空间代价,并在多个方案中选择最佳
- SQL Parser:将SQL语句的程序变为解析好的内部表达
- 后端:如何存数据、完成运算
- Execution Engine :将执行方案转为SQL语句的结果
- 根据执行方案完成相应的运算和操作,数据访问,关系型运算的实现
- Buffer Pool :在内存中缓存硬盘数据
- Data storage and indexing : 在硬盘上存储数据 & 高效访问数据
- Transaction management:事务管理
- 实现ACID,进行logging写日志,locking加锁,保证并行Transaction事物的正确性
- Execution Engine :将执行方案转为SQL语句的结果
2.4 数据存储与访问
- 数据库 vs 文件系统
- 数据在硬盘上的存储
- 硬盘最小存储访问单位:一个扇区512b
- 文件系统访问硬盘单位:4kb
- RDMS最小存储单位:database page size,可设置为1至多个文件系统的page,例如4、8、16kb
- 文件系统访问硬盘单位:4kb
- Page
- 内部结构:page header,slot and tuples ->方便存储变长的记录,记录超出页面大小需要特殊处理
- Tuple结构
- 硬盘最小存储访问单位:一个扇区512b
<center>tuple长度 |变长的列的起始地址 |定长的列的内容 |变长的列的内容
<center>eg:
- 索引
- 数据的顺序访问:顺序读取表的每个page->顺序访问page的每个tuple->检查条件成立与否->成立的读取对应内容
- 有选择性的访问:使用索引index
- Tree based index:有序,支持点查询和范围查询
- Hash based index:无序,只支持点查询
- 链式哈希表 Chained Hash Table
- H(hey) % size (H是对key位运算产生一个整数,size是hash表中header数组的元素个数)
- 在硬盘上存储时,bucket =page
- B+树
|
|
- 叶子节点
|
|
- 内部节点
|
|
- Search
|
|
- Insertion
|
|
- Deletion
- Range Scan
- Clustered index(主索引)与 Secondary index(二级索引)
- Clustered: 记录就存在index中,记录顺序就是index顺序
- Secondary: 记录顺序不是index顺序,index中存储page ID 和in-page tuple slot ID
- 比较顺序访问&二级索引访问
- 顺序访问:需要处理每一个记录,顺序读每一个page
- 二级索引访问:有选择的处理记录,随机读相关的page
- 如何选择:由选中多大比例的记录决定,根据预测的selectivity、硬盘顺序读和随机读的性能,估算两种方式的执行时间,最终选时间小的方案->query optimizer的一个任务
- Buffer Pool:用于提高性能,减少I/O
- 数据访问局部性
- 时间局部性:同一个数据元素可能会在一段时间内多次被访问 ->Buffer pool
- 空间局部性:位置相近的数据元素可能会被一起访问 ->Page为单位读写
- 组成
- 内存空间分成page大小的单元->frame,每个frame可以缓冲硬盘中的一个page
- 如果一个page在缓冲池中,可直接访问,节省了i/o操作;不在则找到一个可用的frame,读取page后放入
- Replacement 替换
- 如果没有空闲frame,需要找到一个已缓存的page(victim page)替换掉;如果page被修改,需要写回硬盘
- 如何选择victim?->替换策略
-
常见替换策略:
- LRU
- 实现方法1:Buffer Head记录访问时间戳,令时间戳最早的页为victim ->问题:替换操作O(N)
- 实现方法2:当一页被访问时,将其移动到最前端,令最后一个page为victim ->代价O(1),但存在修改队列和代价和多线程共享队头的问题
- Clock算法
- 数据结构:Buffer Head记录R,取值为0、1
- 访问一个页时,令R=1;替换时,顺时针旋转查看下一页,如果R为1则令R=0并继续旋转,如果R为0则选中为victim
2.5 运算的实现
(1)Operator tree
(2)Selection & Projection
(3)Join(三种思路)
- Nested loop
- 最早
|
|
- Block Nested Loop
- Index Nested Loop
- Hashing
- Simple hash join:读R建立哈希表,读S访问表找到所有的匹配
- 如果R比内存大->I/O partitioning,将R和S划分为小块,
- PartitionID = hash(join key) % PartitionNumber
- Rj中记录的匹配只存在于相应的Sj中
- PartitionID = hash(join key) % PartitionNumber
- Grace hash join:对R和S进行I/O partitioning,对于每个Partition进行simple hash join
- Sorting
- 思路:将R按照R.a顺序排序,S按照S.b顺序排序,可Merge找出所有匹配
2.6 事务处理
大量并发用户,少量随机读写操作
(1)事务(Transaction)
一个事务可能包含多个操作(select、insert等),事务中的所有操作满足ACID性质
表现形式:一般每个SQL语句被认为是一个事务,或者引入特殊语句(begin transaction等)则为一组语句
(2)ACID:DBMS保证事务的ACID性质
- Atomicity(原子性):要么完全执行,要么完全没执行
- Consistency(一致性):从一个正确状态转换到另一个正确状态
- Isolation(隔离性):每个事务与其它并发事务互不影响
- Durability(持久性):Transaction commit后,结果持久有效,crash也不消失
(3)Concurrency Control (并发控制)
- 数据竞争:不同的执行顺序会导致不同的结果->写读:读脏结果
读写:不可重复读
写写:更新丢失
- 如何判断一组事务正确执行?->Serializable(可串行化),判断一组并行Transactions是否正确执行的标准
- 解决方案:采用机制保证数据竞争不会出现或提交前检查存在数据竞争与否
- 加锁:2 Phase Locking 两阶段加锁->有一个集中的加锁阶段和一个集中的解锁阶段
读写的锁不同
锁的粒度不同
死锁
重要条件:循环等待,多个事务相互等待
处理:1->死锁避免:人为规定顺序,对数据库系统不适用
2->死锁检测:周期性检测,存在则选一个杀掉
- 不采用加锁:分为读、验证、写三个阶段。决定提交时,检查是否有冲突,存在则终止事务,清空私有工作区;不存在则验证通过
- 优点:冲突较少时没有加锁的开销
- 缺点:冲突很多时,需要不断重试,浪费大量资源,甚至无法前进
- Snapshot Isolation 快照 : 提交时检查冲突,有则回到上一个快照
在某些情况下,并不是可串行化的
(4)Crash Recovery (崩溃恢复)
- Transaction commit后,结果持久有效,crash不消失
- 解决方案->WAL (Write Ahead Logging)
- 事务日志记录(记录写操作)、commit日志记录(提交操作)、abort日志记录(回滚操作)->日志记录按LSN顺序被追加到日志文件末尾
- Write-Ahead:总是先写日志,再去做实际操作
- 如何保证持久度Durability:条件为日志是持久的,可根据日志确定所有操作
-
如何实现?保证日志记录先于修改后的数据出现在硬盘上
|
|
- Checkpoint(检查点):使崩溃时间可控,内容包括
- 当前活动的事务表:包括事务的最新日志的LSN
- 当前脏页表:每个页最早的尚未写回硬盘的LSN
- Log Truncation:如果LSN之前的所有日志记录都不需要了,那么就可以删除LSN之前的Log
- Crash Recovery:分析阶段->Redo阶段(将系统恢复到未崩溃前)->Undo阶段(清除未提交事务的修改)
2.7 数据仓库
读取大量数据的分析操作
(1)OLAP
Online Analytical Processing(联机分析处理),在数据仓库的基础上实现的
- 基本数据模型:多维矩阵->data cube
- 基本操作:roll up(date to week)、drill down(week to date)、slice(choose x month)、dice(choose many months)
(2)行式与列式数据库
- 行式数据存储:每个记录中把所有的列相邻地存放
- 优点:多个列的值,可以一次I/O都得到;适合于OLTP,同时需要读写同一个记录的多个列的值
- 缺点:对于数据分析操作,只使用少数列
- 列式数据存储:每个列产生一个文件,存储所有记录中该列的值
- 优点:降低读的数据量;每个文件存储相同数据类型的值,具有更高压缩比
- 缺点:对于调用多个列的情况下的拼装代价很大
2.8 分布式数据库
(1)系统架构
- 三种类型
- Shared memory 共享内存:多芯片、多核
- Shared disk 共享硬盘:多机连接相同的数据存储设备
- Shared nothing :由以太网连接多台服务器,机群系统
- 关键技术
- Partitioning(划分):把数据分布在多台服务器上,通常采用Horizontal partitioning(把不同的记录分布在不同的服务器上)
- Hash partitioning: machine ID = hash(key) % MachineNumber->哈希随机
- Range partitioning:每台服务器负责一个key的区间,有序划分不重叠
- Partitioning(划分):把数据分布在多台服务器上,通常采用Horizontal partitioning(把不同的记录分布在不同的服务器上)
Join操作的并行执行:
- 若partition key就是join key,可以并行执行,每台机器单机join
- 不是,则需要在Join key上进行分布式partitioning,然后再join
- Replication(备份):为了提高可靠性
(2)分布式事务处理:事务读写的数据分布在不同机器上,代价昂贵
- 2 Phase Commit
- Participant: 完成分布式事务的部分读写操作;Coordinator: 协调分布式事务的进行
- phase 1 (voting):Coordinator向每个participant发送是否提交事务的询问消息,每个participant根据本地情况回答yes 或 no,只要有一个No,整个就不能提交
- phase 2 (completion):1.当所有的回答都是yes, 事务提交,Coordinator向每个participant发送commit消息。Participant 回答acknowledgment,当至少一个的回答是no, transaction 将abort,coordinator向每个participant发送abort消息,Participant 回答acknowledgment
- 崩溃恢复