常见存储方式
- 关系型数据库
 - 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 算法](Tec1-TF-IDF 算法.md)
 
| 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 编程类似于指定查询执行计划。



