一. Hadoop
1. 特性
Hadoop是Apache开源分布式计算平台.
擅长存储任意的,半结构化的数据,甚至非结构化的数据,用于存储大容量数据,支持在恰当时间存储和获取数据,并对大文件的存储,批量访问和流式访问做了优化.
3. Hadoop与SQL的区别
- 由向外扩展代替向上扩展
- 用键值对代替关系表
大型数据集往往都是非结构化或半结构化的,键值对更灵活的表述这种关系 - 用函数式编程(MapReduce)代替声明式查询(SQL)
SQL使用查询语句.MapReduce使用脚本和代码. - 用离线批量处理代替在线处理
Hadoop是专为离线处理和大规模数据分析而设计的
2. Hadoop2.0版本的主要组件
- Hadoop Distributed File System (HDFS) for data storage.
HDFS作为底层存储层,它的机制包含了冗余,容错性和可扩展性. - Yet Another Resource Negotiator (YARN), introduced in Hadoop 2, a general-
purpose scheduler and resource manager. Any YARN application can run on a
Hadoop cluster. -
MapReduce, a batch-based, distributed computational engine after Google's paper on MapReduce. In Hadoop 2, MapReduce is
implemented as a YARN application.
2. Hadoop的计算及存储架构
Hadoop程序主要是关于数据处理的,运行在一组分布的计算机上.
,分布式计算和分布式存储都采用主从架构.在开发过程中,应该从非分布式的(即本地)模式到单点伪分布式模式,最后到全分布式模式.
- NameNode位于HDFS的主端,指导从端的DataNode执行底层的IO任务.
NameNode跟踪文件的元数据-描述系统中所包含的文件以及每个文件如何被分割成数据块. - DataNode提供数据块的备份存储,并持续不断的向NameNode报告,以保持元数据为最新状态.
- JobTracker会确定代码的执行计划,作为主节点,监控MapReduce作业的整个执行过程,每个TaskTracker负责执行由JobTracker分配的单项任务.
-
SecondeNameNode是一个用于监控HDFS集群状态的辅助守护进程.
Hadoop专用的序列文件适用于存储键值对的可压缩的二进制文件格式,保持可拆分性并支持二进制的键和值.
4. MapReduce
MapperReduce分两个阶段,mapper将输入进行过滤和转换,reducer负责聚合.中间可能还包括data splitting(数据分割)和shuffling(洗牌),也可定制Partitioning(分组)和Combining(合并).
两个阶段的数据变化情况:
Map:(K1, V1) -> list(K2, V2)
Reduce:(K2, List(V2)) -> List(K3, V3)
Hadoop的RPC框架要求远程方法中的参数都实现Writable接口,进而能够序列化对象并进行远程传输.
各阶段流程图:
- Partitioning:
Partitioning is to club the data which should go to the same reducer based on keys. One common partitioning approach is hash based partitioning in which partition number is calculated using hash(key) % number_of_reducers. - Shuffle:
Shuffling is basically transferring map output partitions to the corresponding reduce tasks. - Combiner:
Reducing the data on map node from map output so that reduce task can be operated on less data.
以降低网络和reducer上的压力. - Sorting:
It is just sorting the data based on keys. - Merging:
This happens on reducer side. Reducer can get data from multiple map tasks and through merging it merges the data of different map tasks in one single unit, maintaining the sorting order.
重分区连接时,mapper首先用组键和标签封装每个记录,组键为连接属性,标记为记录的数据源(在SQL术语中为table),在分区和洗牌阶段,相同组键的所有记录被分配到一组,最后,在具有相同组键的数据集上调用Reducer.
Combine()的作用是将所有值都连接成一个单个记录来输出.
BoomFilter是一种集合的紧凑表示法,是一个数据集的摘要,仅支持特定的查询,查询答案存在小概率的误报,但不会漏报.
为了让键值对可以在集群上移动,MapReduce框架提供一种序列化键值对的方法.
4. Streaming
hadoop Streaming API允许通过Unix命令或可执行脚本编程.
Streaming擅长于快速生成一个用于特性分析的MapReduce作业,优势在于处理一次性的查询,不擅于处理频繁执行的任务.
二. Hive
1. 特性
Hive是建立在Hadoop大规模可扩展系统结构之上的数据仓库层,是一种类SQL(HiveQL)数据仓库基础设置.
2. 存储结构
Hive将表作为基本的数据模型.Hive将元数据存储在标准关系数据库中,Hive自带Derby这个开源,轻量,嵌入式的SQL数据库.
不同于关系型数据库在列上使用索引来加速对这些列的查询,Hive使用分区列(partition column)的概念,根据列的值将表划分为多个分区.分区列和常规的数据列是不同的.
Hive使用桶(Bucket)提供对随机样本数据的高效查询,基于对桶列(bucket column)的散列,桶将分区的数据进一步划分为特定数目的文件.
3. 支持的数据类型
TINYINT 单字节整数
SMALLINT 双字节整数
INT 四字节整数
BIGINT 八字节整数
DOUBLE 双精度浮点数
STRING 字符序列
三. HBase
1. 特性
HBase是建立在Hadoop文件系统之上的分布式面向列的,分布式的,持久的,强一致性的数据库.
HBase是一个仿照谷歌的大表结构的数据模型,使用Java编写,可以快速随机访问海量结构化数据,利用了Hadoop的文件系统(HDFS)作为底层存储系统以提供容错能力,达到完全分布式和高可用性.
HBase是一个可扩展的数据存储系统,旨在用于随机读写(访问)结构化数据.
Hadoop只能进行批处理,按照顺序存储的行为访问数据.
只考虑单一的索引,保证行原子性和"读-修改-写"操作.
在进行负载均衡和故障恢复时对客户端是透明的.
2. 存储结构
2.1 列式存储
HBase是按照BigTable模型实现的是一个稀疏的,分布式的,持久的多维排序映射,有行键,列键和时间戳索引.HBase以列式存储的格式在磁盘上存储数据,属于非关系型数据库Not-Only-SQL(NoSQL).
列式存储数据库
以列为单位聚合数据,然后将列值顺序的存入磁盘.
列式存储的出现主要基于这样一种假设:对于特定的查询,不是所有的值都是必须的,尤其在分析型数据库里,
优点是减少I/O,由于列的数据类型相似所以压缩率更高.
2.2 存储单元
最基本的单位是列,一列或多列形成一行,并由唯一的行键(row key)来确定存储.一个表有若干行,
行数据的存取操作是原子的,可以读写任意数目的列.
一行由若干列组成,若干列又构成一个列族(Column Family).一个列族的所有列存储在一个底层的存储文件HFile里.
每一列的值或单元格的值都具有时间戳.
以下为HBase的表结构示例:
2.3 存储文件
HFile存储的是经过排序的键值映射结构,文件内部由连续的块组成,块的索引信息存储在文件的尾部.当把HFile打开并加载到内存中时,索引信息会优先加载到内存中,每个块的默认大小是64KB.
每个HFile都有一个块索引,通过一个磁盘查找就可以实现查询.
存储文件通常保存在Hadoop分布式文件系统(HDFS)中,HDFS提供了一个可扩展的,持久的,冗余的HBase存储层.
2.4 存储过程
每次更新数据时,先预写日志(write-ahead log),将数据记录在提交日志(commit log)中,然后才会将这些数据写入内存中的memstore中,一旦内存数据达到最大值,会将这些数据移除内存作为HFile文件刷写到磁盘中.
3. 架构
3.1. Region
HBase中扩展和负载均衡的基本单元称为region.
region本质上以行键排序的连续存储的区间.表中每行数据只由一台服务器所服务,因此具有强一致性.
Region等同于数据库分区中用的范围划分(range partition)
3.2. 架构
HBase中有三个主要组件:客户端库,一台主服务器,多台region服务器,可动态增加和移除region服务器.主服务器主要负责利用Apache ZooKeeper为region服务器分配region.
master服务器负责跨region服务器,对全局region进行负载均衡和集群管理,还提供了元数据的管理操作(例如建表和创建列族).
region服务器负责为他们服务的region提供读写请求,客户端直接与region服务器通信,处理所有数据相关的操作.
3.2. 分区
HBase支持自动分区,分区(Sharding),主要描述了逻辑上水平划分数据的方案.这个方案的特点是将数据份文件或分服务器存储,而不是连续存储.
数据库分区的方式:
范围分区,散列分区,列表分区,符合分区(范围-散列分区,范围-列表分区)
HBase有单机,伪单机,全分布式运行模式.