【拓展】 大数据
目录
- 1 HDFS(存储)
- 1.1 HDFS优缺点
- 1.2 HDFS组成架构
- 1.3 HDFS文件传输过程
- 2 HBase
- 2.1 数据模型
- 2.2 物理存储
- 2.3 系统架构
- 2.4 算法流程
- 3 MapReduce
- 3.1 模型流程
- 3.2 主要功能
- 3.3数据存储
- 3.4重要机制
1 HDFS(存储)
HDFS是基于流数据访问模式的分布式文件系统,提供高吞吐量、高容错性的数据访问,能很好地解决数据的存储问题
在Hadoop生态圈中,HDFS负责底层基础,存储文件
1.1 HDFS优缺点
- 优点
- 高容错性:有容错恢复机制,副本丢失后,自动恢复
(一般三个副本,上传文件的数据结点上、与第一个副本不同的机架结点上、与第二个副本相同机架的其他结点上)
- 好处
- 减少机架间的数据传输,提高写操作效率
- 减少读取数据所需的网络传输总带宽(数据块只放在两个不同机架上)
- 改进了写操作的性能(一个副本在一个机架的一个节点上,另外两个副本在另一个机架的不同结点上)
- 高可靠性:自动保存多个副本(一般三个)
- 适合大数据处理(TB,PB级文件)
- 适合批处理。一次性写入,多次读取
- 低成本运行:可以用在很多低成本的硬件之上
- 缺点
- 不适合低延迟数据访问
- 不适合大量的随机读
- 不适合处理大量小文件
- 不能并发写入(一次只能有一个写入者比如HBase写入,并发的机制是并发使用HBase,HBase作为一个调节的中介写入)
- 不能任意修改文件(文件只能增加和删除,如果修改,就是整个块删掉,然后换掉)
1.2 HDFS组成架构
- HDFS Client:客户端(忽略)
- NameNode:负责保存文件属性信息的结点
是HDFS的管理者,负责保存和管理元数据主要功能如下
- 管理维护HDFS命名空间
- 管理DataNode上的数据块
- 接收客户端的请求
管理文件有两个:
- edits:操作日志文件(客户端执行的操作记录放到editlog里面)
- fsimage:命名空间镜像文件(包含HDFS元信息如修改时间、访问时间、数据块信息等)
- DataNode:负责保存文件数据的节点
负责存储数据,把Block(数据块,一般是128M)以Linux文件的形式保存在磁盘上,根据Block标识和字节范围来读写块数据
主要职责有三
- 保存数据块:一个数据块在多个DataNode冗余备份,一个DataNode最多只有一个备份
- 负责客户端的io请求:客户端执行读写操作时,DataNode之间会相互通信,保证一致性
- 定期和NameNode进行心跳通信,接收NameNode的指令
- Secondary NameNode:NameNode的热备
NameNode不能宕机!!!因此要一直有一个热备,NameNode出现故障立刻顶上,一般来说一个集群只有一个secondaryNameNode,因为如果多了会增加NameNode压力。
- 工作流程
定期把NameNode中的edits文件和fsimage文件下载,edits文件和fsimage文件合并为fsimage.ckpt(ckpt是checkpointing的意思是),将fsimage.ckpt复制到NameNode中,同时NameNode的edits文件生成edits.new文件,这两个分别替换原NameNode中的edits和fsimage文件
这样做的目的:使得edits大小保持在限定范围内,减少重启NameNode时合并fsimage和edits的耗时 - 工作职责
- 防止edits过大
- 做冷备份呢,在NameNode失效时恢复部分fsimage
1.3 HDFS文件传输过程
文件读取过程如下
- 客户端程序通过分布式文件系统打开需要读取的文件
- 分布式文件系统向远程的NameNode发起远程调用,得到文件的数据块信息,返回数据块列表
- 分布式文件系统返回一个文件输入流对象给客户端,客户端调用文件输入流对象的 read() 方法读取数据。
- 通过对数据流反复调用 read() 方法,把数据从数据节点传输到客户端。
- 当一个节点的数据读取完毕时,文件输入流对象 会关闭与此数据节点的连接,然后连接此文件 下一个数据块 的最近数据节点。
- 当客户端读取完数据时,调用 文件输入流对象 的 close() 方法关闭输入流。
2 HBase
Apache HBase是基于Hadoop构建的一个分布式的、可伸缩的海量数据存储系统。
实际上HBase就是一个很大的稀疏表格,与常规表格的行列二维定位有去别的是,HBase的是四维定位(行、列族、列、时间戳)
2.1 数据模型
- Row key
用来标记一行记录的主键 - Region分区(也就是通常说的HRegion)
可以理解为将HBase数亿行的大表横向切割成一个个“子表”Region
Region是HBASE中负载均衡的基本单元,当增长到一定大小以后会自动分裂成两个 - Column Family(列族)
- 时间戳:不同的版本的数据
- Cell:是唯一确定的单元,数据没有类型,全是字节码形式存储
2.2 物理存储
- Table中的所有行都按照row key字典序列排序
- Table在行的方向上分割为多个Hregion
- region按大小分割,每个表一开始只有一个region,region不断增大,当增大到一个阈值的时候等分为两个新的HRegion。当table行不断增多,就会有越来越多的hregion
- Hregion是HBase中分布式存储和负载均衡的最小单元,因此不同的Hregion可以分布在不同的Hregion server上,但是一个Hregion不会拆分到多个server上
- Hregion是分布式存储的最小单元,但不是存储的最小单元
- Hregion由一个或多个Store组成
- store保存一个columns family
- store又由一个memstore和storeFile组成
- StoreFile以Hfile格式保存在HDFS上
- HFile六个部分
- Data Blocks :保存表中的数据,这部分可以被压缩(实际上就是分成多个datablock放在hdfs里面的DataNode了)
- Meta Block(可选的):保存用户自定义的kv对,可以被压缩。
- File Info:Hfile的元信息,不被压缩,用户也可以在这一部分添加自己的元信息。
- Data Block Index:Data Block的索引。每条索引的key是被索引的block的第一条记录的key。
- Meta Block Index(可选的):Meta Block的索引。
- Trailer:这一段是定长的。保存了每一段的偏移量,读取一个HFile时,会首先 读取Trailer,Trailer保存了每个段的起始位置(段的Magic Number用来做安全check),然后,DataBlock Index会被读取到内存中,这样,当检索某个key时,不需要扫描整个HFile,而只需从内存中找到key所在的block,通过一次磁盘io将整个 block读取到内存中,再找到需要的key。DataBlock Index采用LRU机制淘汰。
- HLog(WAL log)
WAL意为write ahead log,用来做灾难恢复,记录数据的所有变更,一旦修改就可以恢复
每个Region Server维护一个Hlog
2.3 系统架构
系统框架如图所示
- Client
包含访问hbase的接口,维护着一些cache来加快对Hbase的访问,比如region位置信息 - Zookeeper
- 保证任何时候,集群中只有一个master
- 存贮所有Region的寻址入口。
- 实时监控Region Server的状态,将Region server的上线和下线信息实时通知给Master
- 存储Hbase的schema,包括有哪些table,每个table有哪些column famil
- Master
- 为Region server分配region
- 负责region server的负载均衡
- 发现失效的region server并重新分配其上的region
- GFS上的垃圾文件回收
- 处理schema更新请求
这里解释一下schema,schema是一个文档,是元数据的一个抽象集合,主要是元素与属性声明、复杂与简单数据类型的定义等,不用了解太详细。
- Region Server
- 维护Master分配给它的region,处理这些region的IO请求
- 负责切分在运行过程中变得过大的region
2.4 算法流程
- 三层region定位
- 第一层:zookeeper里面的文件,持有root region的位置
- 第二层:root region中.META.表中的第一个region保存了其他region的位置,通过root region访问META文件
- 第三层META文件每一行就是一个region的位置信息
- 读写过程
- client向region server提交写请求
- region server找到目标region
- region检查数据是否与schema一致
- 如果客户端没有指定版本,则获取当前系统时间作为数据版本
- 将更新写入WAL log
- 将更新写入Memstore
- 判断Memstore的是否需要flush为Store文件。
3 MapReduce
是Hadoop项目的一个技术,是目前面向海量数据处理最成功的技术
- 基于集群的高性能并行计算平台
- 并行程序开发与运行框架
- 并行程序设计模型的方法
3.1 模型流程
- 把数据划分成m片,通常每片是64M;把程序的一份拷贝传给集群中的每台机器(不传输数据而传输程序的思想,程序小)
- 选择一个为主节点,其他是从节点,主节点选择空闲结点分配M个map任务和R个reduce任务
- map任务读取相应的输入数据块,调用用户定义的map函数,产生中间结果键值对缓存在本地内存
- 缓存的中间键值对周期性的写入本次磁盘,同时根据划分函数划分成R个部分,将缓存键值对的位置信息传给主节点,主节点再将其传送给reduce结点
- reduce结点从map结点的本地磁盘远程读中间键值对,根据中间结果的建来混洗(shuffle)中间结果键相同的键值对被分到一个组
- reduce节点把分组的中间键值对传递给用户定义的Reduce函数,将结果写到输出文件
- 所有map任务和reduce任务完成之后返回用户程序
3.2 主要功能
- 任务调度:主要负责分配计算任务和调度计算节点,同时监控节点执行状态,也负责计算性能的优化处理
- 数据/代码互定位:一个计算节点尽可能处理本地数据
- 出错处理:因为打过莫经常出现bug,所以检测隔离出错结点并重新分配新的结点接管出错结点的计算任务
- 分布式数据存储和文件管理
- Combiner和Partitioner:为减少数据通信开销,中间结果数据进入reduce结点前需要进行合并(combine)处理,避免重复传送;一个reduce结点处理的数据可能来自多个map结点,因此map输出的中间结果需要进行适当的划分(partition)处理,保证相关数据发送到同一个reducer结点
3.3数据存储
- 源文件:HDFS
- Map处理结果:本地
- Reduce处理结果:HDFS
- 日志:HDFS
3.4重要机制
- 任务调度与数据本地化
- 任务调度策略:
- 空闲节点向Master发出新任务请求
- Master优先将数据存储在节点本地或附近的任务分配给该节点执行
调度次序为:本地任务、本机架任务、任意任务
- 效果
- 绝大部分任务只需要本地读取文件作为输入节省数据读取时间
- 容错机制
- Worker故障
- 周期性地发出相应信息给Master,如果Master在一个确定的时间段内没有收到worker返回信息就标记失效。
- 对于map:选择worker重新执行所有map任务
- 对于reduce:选择worker执行未完成的reduce任务,已完成的不执行
- Master故障
- 定期写入检查点数据
- 从检查点恢复
- 任务投机执行机制
- 作业临近结束时,剩余的任务启动多个副本执行,限制性完成的作为实际执行,其他副本放弃
- kill和失效机制
- 允许用户使用kill指令终止该任务,重新进入队列等待分配,不影响执行
- 默认600s为超时,自动重启任务
- 反复重启超过四次认为任务失效,不再进行分配