一、HDFS
1、概述
Hadoop Distributed File System(Hadoop分布式文件系统)谷歌公司GFS分布式文件系统的开源实现其思想是将成百上千的计算机组成一个集群,每个计算机作为一个节点。
通过构建一个能够跨越计算机或网诺系统的单一文件命名空间(统一文件目录结构),用户通过HDFS终端命令可以操作其中的文件和目录,就像操作本地文件一样。
2、基本概念
数据块:
传统文件系统中,一个族就是一个数据块,文件被分割成大小为4KB的一个一个的族保存,文件字节数小于4KB就占据整个族
HDFS文件系统,支持“一次写入,多次读取”文件模型,默认数据块大小是128MB,文件大小小于128MB时,文件不会占用整个数据块存储空间。
元数据节点NameNode:
作用:管理分布式文件系统的命名空间,所有文件和目录被保存到Linux本地文件系统目录及客户端对文件的访问。
VERSION:保存命名空间ID、HDFS集群ID。
seen_txid:存放transactionID,NameNode重启时扫描该文件判断是否有元数据丢失。
fsimage:加密二进制文件,存HDFS元数据,内容有NameNode管理的所有DataNode中的文件,数据块,及个数据块在DataNode的元数据信息。
edits:临时存储元数据,时机成熟后写入fsimage文件中。
数据节点DataNode:
作用:保存HDFS文件的内容
执行NameNode下发的存文件任务,DataNode存文件时自动调整每个目录下的最佳文件数目。
DataNode启动时扫描Linux本地文件系统,产生一个与这些本地文件对应的所有HDFS数据块块的列表(状态报告),发送到NameNode
客户端读文件时先访问NameNode,获取每个数据块所在的DataNode,连接这些DataNode,获取文件内容。
辅助元数据节(Secondary NameNode):
周期性合并edits,fsimage两个文件,防止日志过大,合并后保存一份fsimage文件,以便在元数据镜像文件失败后恢复。
文件系统的命名空间:
HDFS支持传统文件目录结构,即我们可以进行,创建删除文件及目录。
3、特点
优点:
1、支持超大文件存储:
2、支持流式访问数据:“一次写入,多次读取”,保证一次写入一个数据,一个字节总是被附加到另一个字节末尾,字节流以写入的顺序先后存储。
3、运行在廉价的商用机器集群上:
缺点:
1、不适合低延迟数据访问:高吞吐量的代价就是高延迟。
2、无法高效存储大量小文件
map任务数量是由splits数据块分片数目决定的,MapReduce处理大量的的小文件时产生大量的map任务,线程开销大,况且,Hadoop处理小文件时,FileInputFormat不会对小文件进行分片,每一个文件被当作一个分片分配一个map任务,效率低下。
3、不支持多用户写入和任意修改文件:只能一个写入者
4、体系结构
HDFS设计目标
1、能检测和快速回复硬件故障:廉价的硬件易出问题。
2、支持流式的数据访问:访问数据集都是数据流。
3、支持超大规模数据集:TB级数据量计算。
4、简化一制模型:“一次写入,多次读取”保证数据不变。
5、移动计算逻辑代价比移动数据代价低:将计算逻辑离其操作的数据越近效率越高,海量数据更是如此。
6、具备良好的异构软硬件平台间的可移植性:方便大规模数据应用平台的推广。
HDFS结构模型:
Master/Slave主从架构
NameNode:
一个集群只有一个
管理文件的命名空间(文件的打开、重命名),以及客户端对文件的访问
DataNode:
一个集群若干个
管理它所在节点数据的存储
处理文件系统客户端的读写,在NameNoded的调度下进行数据块的创建、删除、复制。
文件读写:
读:客户端向NameNode发送数据读操作请求——通过NameNode获取文件数据块列表(哪些机架rack的哪些DataNode中)——客户端直接从DataNode中读取数据。
读过程:
1、使用HDFS提供的客户端开发库Client,向远程的Namenode发起RPC请求;
2、Namenode会视情况返回文件的部分或者全部block列表,对于每个block,Namenode都会返回有该block拷贝的DataNode地址;
3、客户端开发库Client会选取离客户端最接近的DataNode来读取block;如果客户端本身就是DataNode,那么将从本地直接获取数据.
4、读取完当前block的数据后,关闭与当前的DataNode连接,并为读取下一个block寻找最佳的DataNode;
5、当读完列表的block后,且文件读取还没有结束,客户端开发库会继续向Namenode获取下一批的block列表。
6、读取完一个block都会进行checksum验证,如果读取datanode时出现错误,客户端会通知Namenode,然后再从下一个拥有该block拷贝的datanode继续读。
写:
客户端向NameNode发送数据写操作请求——通过NameNode获取哪些机架rack的哪些DataNode进行写入——客户端直接将文件写入到相应的DataNode中。
写过程:
1、使用HDFS提供的客户端开发库Client,向远程的Namenode发起RPC请求
2、Namenode会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会为文件创建一个记录,否则会让客户端抛出异常;
3、当客户端开始写入文件的时候,开发库会将文件切分成多个packets,并在内部以数据队列"data queue"的形式管理这些packets,并向Namenode申请新的blocks,获取用来存储replicas的合适的datanodes列表,列表的大小根据在Namenode中对replication的设置而定。
4、以pipeline(管道)的形式将packet写入所有的replicas中,开发库把packet以流的方式写入第一个datanode,该datanode把该packet存储之后,再将其传递给在此pipeline中的下一个datanode,直到最后一个datanode,这种写数据的方式呈流水线的形式。
5、最后一个datanode成功存储之后会返回一个ack packet,在pipeline里传递至客户端,在客户端的开发库内部维护着"ack queue",成功收到datanode返回的ack packet后会从"data queue"移除相应的packet。
6、如果传输过程中,有某个datanode出现了故障,那么当前的pipeline会被关闭,出现故障的datanode会从当前的pipeline中移除,剩余的block会继续剩下的datanode中继续以pipeline的形式传输,同时Namenode会分配一个新的datanode,保持replicas设定的数量。
高可用机制:
1、磁盘的数据错误、心跳检测、重新复制:
2、集群均衡:DataNode上的空间不够请求时,自动将数据的转移到其他数据节点
3、数据完整性:通过CRC32校验码实现
4、元素据磁盘错误:NameNode出现错误后,自动重启或在另一台机器上做故障转移
5、快照:基于时间点的数据备份复制。
6、安全模式:启动NameNode后接收心跳信息及块状态报告的那段时间,检查每个数据块的副本数目是否达到要求的最小值,当超过一定的百分比才会退出安全状态,然后对没有达到最小副本值的数据块进行复制,使其达到最小副本块数要求。
数据组织机制:
1、数据复制及心跳检测:通过心跳消息保证DataNode正常工作、块状态报告保证数据的复制。
2、副本存放与机架感知:两个策略。
每个机架放一个策略:负载均衡、但增加了写操作代价
更优策略:减少机架传输,提高写操作效率、1/3在一个机架上,2/3在另一个相同节点上。
机架Ri节点Hx放一个副本
机架Ri节点Hy放一个副本
机架Rj节点Hz放一个副本
若client为DataNode节点,那存储block时,规则为:副本1,同client的节点上;副本2,不同机架节点上;副本3,同第二个副本机架的另一个节点上;其他副本随机挑选。
若client不为DataNode节点,那存储block时,规则为:副本1,随机选择一个节点上;副本2,不同副本1,机架上;副本3,同副本2相同的另一个节点上;其他副本随机挑选。
3、数据复制过程及流水线:先透明的存储到本地够一个数据块就请求NameNode,每个DataNode与其副本间转发数据实现副本操作。
4、文件系统元数据的持久化:edits与fsimage。
5、存储空间的回收与文件的删除和恢复:并不是直接删除,而是传递到/trash后过一定时间再进行删除,给文件的恢复留有余地。
二、MapReduce:分析大数据的型
1、传统计算处理方式:多线程
缺点:
任务的划分不容一平均,因为小文件的大小不一致。
合并计算耗时。
任务集中于一台计算机,处理能力受限。
2、MapReduce思想:分治
方案:
数据预处理
生成初始的key-value对
映射转换
合并映射结果并排序
归约得最终结果
优势:
处理多种类型的数据
本地计算
动态灵活的资源分配与调度
高扩展性
高可靠性
3、基本概念:
map:处理分片的数据
reduce:汇总map处理完的结果
4、模式:
数据分片—一片一个map进行处理,产生中间结果—reduce进行归约得结果。
5、框架:
ResourceManager:管理集群资源,系统资源管理分配。
ApplicationMaster:应用程序管家,管理集群中运行的每个应用程序。
NodeManager:节点管理器,管理个节点。
Container:容器,集群中资源的抽象,CPU,内存等
提交作业—ResourceManager接收请求,获取NodeManager状态信息,分配合适的Container作为ApplicationMaster给NodeManager给作业——NodeManager执行任务,维护Container状态并向ResourceManager汇报——同时NodeManager的各个任务会向ApplicationMaster汇报状态和进度。
6、shuffle(数据混洗)过程:
shuffle:把map的的输出结果有效的传送到reduce端
要求:
完整地从map端提取数据到reduce。
跨节点拉取数据时,尽可能地减少对带宽的不必要消耗。
减少磁盘I/O对任务的影响。
过程:
map端:
处理分片:输入map的数据来自HDFS的block,进行分片处理后传给map处理。
partition:对数据进行Hash,最后的分区数目等于reduce的数目。
combine:将多个溢出文件进行排序合并。
将分区中的数据复制到对应的reduce任务
reduce端:
接收数据:获得map任务传来的数据,每个数据都是有序的。
合并数据:合并每一个reduce。
归约数据。
7、