常见存储方式
- 关系型数据库
- NoSQL:泛指非关系型数据库,比如 MongoDB
- 全文检索框架:Elasticsearch
存储的区别
- 行式存储:大数据量查询,如果没有索引,则会遍历
- 列式存储:可以大量的压缩空间
- 位图索引
不同形式存储的对比
ID | name | age | sex | aihao |
---|---|---|---|---|
1 | 小明 | 21 | 男 | 女 |
2 | 隔壁老王 | 25 | 隔壁孩子 |
MySQL 形式存储:
1 |
|
HBase 的形式存储:
1 |
|
- HBase 是一个分布式列式存储系统,记录按列簇集中存放,通过主键(row,key)和主键的 range 来检索数据。
- HBase 表中每个列都属于某一个列簇
- 列簇是表的 Schame 的一部分,但是列不是,列名都是以列簇作为前缀。
- 传统表中使用 Alter 子句来修改表结构,而 HBase 直接插入就可以修改表结构
ES 方式
文档 id | 文档内容 |
---|---|
doc1 | how are you? fine, thank you, and you? I fine too, thank you! |
doc2 | good morning, LiLei, good morning, Hanmeimei |
倒排索引示例:ES 的存储(倒排索引)的结果如下
- 应该将查询频率高的单词放在前面(越高越前)
- ES 默认将文档存储,也可以配置不存储文件信息
- TF-IDF 算法:参见Tec1-TF-IDF 算法
dictionary | posting-list |
---|---|
fine | -> doc1 |
Hanmei | -> doc2 |
good | -> doc2 |
LiLei | -> doc2 |
... | ... |
you | -> doc1 -> doc2 |
列存储和行存储
列存储 | 行存储 | |
---|---|---|
关注点 | 经常关注一张表某几列而非整表数据的时候 | 关注整张表的内容,或者需要经常更新数据 |
计算需要 | 数据表列有非常多行数据并且需要聚集计算的时候 | 不需要聚集运算,或者快速查询需求 |
计算方式 | 基于一列或者比较少的列计算的时候 | 需要经常读取某行数据 |
数据形式 | 数据表拥有非常多的列的时候 | 数据表本身数据行并不多 |
数据特性 | 数据表列有非常多的重复数据,有利于高度压缩 | 数据表的列本身有太多唯一的数据 |
读写的区别
聚簇索引和非聚簇索引
物理存储的最小的单位是块(Block)
聚集索引 | 非聚集索引 |
---|---|
MySQL
- 查询:
Select (tuple) from database
- 插入:
Insert into database value
- 更新:
Update database set xxx = xxx where statement
- 删除:
Delete from database where xxx
HBase
HBase 对 LSM 的实现
LSM,Log-Structured Merge-Tree,日志结构合并树
- 假设内存非常大,有限的使用内存存储,结合日志结构实现。
- 有数据更新不是立马更新,而是先驻留数据,积累到一定条目后归并排序,然后追加到磁盘的队列中,这样子可以显著减少磁盘的开销,一次性大规模写入,减少随机的 I/O,不能命中会导致较多的磁盘消耗。
HBase 的实现
- 查询
- 插入
- 更新&删除:看做一个插入操作,使用时间戳和 Delete 标识来标识
memstore:插入时优先放置到 memstore,驻存内存,到了一定程度后再刷新到 storeFile、插入都是写入操作
ES
ES 的部分实现方式、
- 一个 Node 是一个进程
- 容灾的话就是多副本容灾
ES 的操作
- 插入:和 HBase 相似,不是写入即可查询,建立 index 需要比较大的开销
- 读取
- 更新&删除
不同存储的容灾方式
存储方式 | 结构 |
---|---|
MySQL | 单节点,包含数据、日志两个层面的操作 |
HBase & HDFS | 分布式文件系统,每一个节点操作类似 MySQL 的单节点 |
ES | 各节点备份 |
Hadoop 介绍
Hadoop:一个 Apache 基金会开发的开源软件框架,支持在由普通计算机组成的集群中运行海量数据的分布式计算,他可以让应用程序轻松扩展到上千个节点和 PB 级别的数据。
Google 三大论文
MapReduce、GFS、Big Table
Doug Cutting 山寨项目
MapReduce、HDFS、HBase
大数据处理层次架构
Hadoop 核心
MapReduce:
- Map:任务的分解
- Reduce:结构的汇总
HDFS:
- NameNode
- DataNode
- Client
MapReduce
MapReduce 是一种并行编程模型,其实是分治算法的一种实现,适用于大规模数据集的并行计算
- map:
(k1,v1) -> list(k2,v2)
- reduce:
(k2,list(v2)) -> (k3, v3)
示例:曹冲称象
HDFS 的基本概念
- Block
- NameNode & Secondary NameNode
- Datanode
Block
- 块大小默认为 64M(v1.0)/128M(v2.0)
- 数据和元数据
1 |
|
- 备份
- 一次写入多次读取
NameNode
可以看做是分布式文件系统中的管理者,存储文件系统的 metadata,主要负责管理文件系统的命名空间,集群配置信息,存储块的复制。
两个文件:EditLog、FSImage
两个映射:Filename -> BlockSequence(FsImage)
、Block -> DatanodeList(BlockReport)
单点(NameNode)风险
Secondary NameNode
不是备用 NameNode,而是秘书
合并和保存 EditLog、FSImage:
- Checkpoint.period
- Checkpoint.size
Datanode
文件存储的基本单位。它存储文件块在本地文件系统中,保存了文件块的 meta-data,同时周期性的发送所有存在的文件块的报错给 Namenode
HDFS 文件读写
读文件:读取完之后会校验(Check Sum),未通过则告知错误
写文件:复制的策略,冗余数据放置在机柜中,跨机柜要经过交换机等设备
HBase
HBase 以谷歌的 BigTable 为模型,并用 Java 编写
HBase 是在 HDFS 上开发,提供了一种容错的方式存储大量的稀疏数据
一个 HBase 系统包括一组表,每个表包含行和列,就像传统的数据库一样。每个表都必须有一个定义为主键的元素,所有对 HBase 表的访问尝试都必须使用这个主键。一个 HBase Column 表示一个对象属性。
什么是 HBase
HBase 是一个分布式、非结构化、稀疏、面向列的数据库。
HBase 是基于 HDFS,山寨版的 BigTable,继承了可靠性、高性能、可伸缩性
HBase 架构
HBase 角色
角色 | 内容描述 |
---|---|
ZooKeeper | 1. 一个高效的、可扩展的协调系统 2. Hadoop 的子项目,不属于 HBase |
HMaster | 1. 管理网络对 Table 的增、删、改、查操作 2. 管理 HRegionServer 负载均衡 |
HRegionServer | 1. 管理一系列 HRegion 2. Region 读写的场所 |
角色 | 内容描述 |
---|---|
HRegion | 1. 对应 Table 的 Region 2. HStore 和 HLog |
HStore | 1. 对应了 Table 中的一个 Column Family 的存储 2. MemStore 3. StoreFile(HFile) |
StoreFile | 1. Compact 2. Split |
HBase 数据模型
Table & Column Family:
- RowKey:Table 的主键,记录按照 RowKey 排序;
- Timestamp:每次数据操作对应的时间戳,可以看作是数据的 version number(垃圾清理);
- Column Family:Table 在水平方向由一个或者多个 Column Family 组成,一个 Column Family 中可以由任意多个 Colum 组成。
Table & Region:
- 记录数不断增多后,Table 会逐渐分裂成多份 splits,成为 regions;
- 一个 region 由 [startkey,endkey) 表示;
- 不同的 region 会被 Master 分配给相应的 RegionServer 进行管理。
.META.
:记录用户表的 Region 信息,可以有多个 regoin-ROOT-
:记录.META.
表的 Region 信息,只有一个 regionZookeeper
:记录了-ROOT-
表的 location
数据导入
Sybase -> HBase:
- bcp out
- importtsv
1 |
|
访问接口
Hadoop & HBase 提供 JAVA 接口
Thrift 支持多语言访问 HBase,C++、C#、Cocoa、Erlang、Haskell、Java、Ocami、Perl、PHP、Python、Ruby、Smalltalk
Hive
Hive 是基于 Hadoop 的数据仓库工具
- 学习成本低
- 提供完整的 SQL 查询功能
- 可以将结构化的数据文件映射为一张数据库表。
- 可以将 SQL 语句转换为 MapReduce 任务进行运行。
- 可以通过类 SQL 语句快速实现简单的 MapReduce 统计,不必开发专门的 MapReduce 应用
Hive 体系结构
Hive 运维要点
Hive 相当于一套 Hadoop 的访问接口,运维如下几个问题需要注意:
- 使用单独的数据库存储元数据
- 定义合理的表分区和键
- 设置合理的 bucket 数据量
- 进行表压缩
- 定义外部表使用规范
- 合理的控制 Mapper,Reducer 数量
Pig
Apache Pig 架构:
- 严格用于使用 Pig 分析 Hadoop 中的数据的语言称为 Pig Latin,是一种高级数据处理语言。它提供了一组丰富的数据类型和操作符来对数据执行各种操作。
- 要执行特定任务时,程序员使用 Pig,需要用 Pig Latin 语言编写 Pig 脚本,并使用任何执行机制(Grunt Shell,UDFs,Embedded)执行它们。执行后,这些脚本将通过应用 Pig 框架的一系列转换来生成所需的输出。
- 在内部,Apache Pig 将这些脚本转换为一系列 MapReduce 作业,因此,它使程序员的工作变得容易。
Pig 组成组成
- Parser(解析器):最初,Pig 脚本由解析器处理,它检查脚本的语法,类型检查和其他杂项检查。解析器的输出将是 DAG(有向无环图),它表示 Pig Latin 语句和逻辑运算符。在 DAG 中,脚本的逻辑运算符表示为节点,数据流表示为边。
- Optimizer(优化器):逻辑计划(DAG)传递到逻辑优化器,逻辑优化器执行逻辑优化,例如投影和下推。
- Compiler(编译器):编译器将优化的逻辑计划编译为一系列 MapReduce 作业。
- Execution engine(执行引擎):最后,MapReduce 作业以排序顺序提交到 Hadoop。这些 MapReduce 作业在 Hadoop 上执行,产生所需的结果。
Pig 与 SQL 区别
- 使用延迟评价
- 使用 ETL
- 能够在管道中任何时刻存储数据
- 支持管道分裂
Pig Latin 是程序性的,它在管道范例中非常自然,而 SQL 则是声明性的。在 SQL 用户中,可以指定要连接两个表的数据,但不能指定要使用的连接实现。
Pig Latin 允许用户指定一个实现或实现的各个方面 ,以在多个方面执行脚本。Pig Latin 编程类似于指定查询执行计划。