Hadoop的思想之源:Google
面对的数据和计算难题
大量的网页怎么存储
搜索算法
带给我们的关键技术和思想,三篇论文
GFS--------------->HDFS
Map-Reduce-->MapReduce
Bigtable--------->HBaseHadoop作者Doug cutting,名字来源于Doug Cutting儿子的玩具大象
提升处理速度方法:
并行(分布式运行):提升速度的关键、分而治之
计算向数据移动: 计算与数据在一起,移动计算较快
Hadoop 1.x 简介
分布式存储系统 HDFS (Hadoop Distributed File System )
分布式存储系统
提供了高可靠性、高扩展性和高吞吐率的数据存储服务
分布式计算框架 MapReduce
分布式计算框架
具有易于编程、高容错性和高扩展性等优点
数据模型
文件被线性切割成块(Block):偏移量 offset ( byte )
默认数据块大小为64MB (hadoop1.x , hadoop2.x默认128M),可配置
若文件大小不到64MB ,则单独存成一个block。
按大小被切分成若干个block ,存储到不同节点上
默认情况下每个block都有三个副本
文件的每个Block块大小一致,文件与文件可以不一致
Block可以设置副本数,副本分散在不同集群节点中( 1、备份,2、来更好支持计算向数据移动 )
文件上传时可以设置Block大小和副本数
已上传的文件 Block副本数可以调整,Block Size不可变更
副本数不要超过节点数量
只支持一次写入多次读取,同一时刻只有一个写入者,可以append追加数据
架构模型
文件:
元数据MetaData
(主)NameNode 节点保存文件元数据:单节点
HdfsClient 与 NameNode 交互元数据信息
数据本身
(从)DataNode 节点保存文件 Block 数据:多节点
HdfsClient 与 DataNode 交互文件Block数据
从NameNode获取 block 块位置
DataNode 与 NameNode 保持心跳,提交 Block 列表给 NameNode
NameNode(NN)
主要功能:
接受客户端的读写服务
收集DataNode汇报的Block列表信息
保存metadate信息包括:
文件 owership 和 permissions
文件大小,时间
Block列表:Block偏移量、位置信息
Block保存在哪个DataNode:由DataNode启动时上报( 位置信息是个变量,有可能因为机器损坏而变化 )
基于内存存储 :不会和磁盘发生交换
只存在内存中,由内存大小决定存储大小
持久化:SNN
NameNode的metadate信息在启动后会加载到内存
metadata 存储到磁盘文件名为”fsimage”,以保证数据不会丢失( metadata 数据丢失则定位不到文件)
Block 的位置信息不会保存到 fsimage
edits 记录未持久化时对 内存metadata 的操作日志
SecondaryNameNode(SNN)(Hadoop 2.x 由HA代替)
主要工作:帮助NN合并edits log,减少NN启动时间。
它不是NN的备份(但可以做备份)
利用SecondaryNameNode可以 定期将NameNode中的内存数据定期的保存到硬盘中,
同时 又减小NameNode的持久化存储的运算压力,并有一定备份的作用
SNN执行合并时机:
根据配置文件设置的时间间隔 fs.checkpoint.period 默认3600秒
根据配置文件设置edits log大小 fs.checkpoint.size 规定edits文件的最大值默认是64MB
DataNode(DN)
主要工作:
本地磁盘目录存储数据(Block),文件形式
同时存储Block的元数据信息文件(记录block块的校验和等信息,保证数据的完整性)
启动DN线程的时候会向NN汇报block信息:
通过向NN发送心跳保持与其联系(3秒一次),
如果NN 10分钟没有收到DN的心跳,则认为其已经lost,并把其上的block 从备份的节点copy到新的DN
Block的副本放置策略
第一个副本:放置在上传文件的DN,如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点。
第二个副本:放置在于第一个副本不同的 机架的节点上。
第三个副本:与第二个副本相同机架的节 点。
更多 副本:随机节点
HDFS优点:
高容错性
数据自动保存多个副本
副本丢失后,自动恢复
适合批处理
移动计算而非数据
数据位置暴露给计算框架
适合大数据处理
GB 、TB 、甚至PB 级数据
百万规模以上的文件数量
10K+ 节点
可构建在廉价机器上
通过多副本提高可靠性,就不需要“高价的硬件上冗余”的服务器
提供了容错和恢复机制
HDFS缺点:
高延迟数据访问
比如不支持毫秒级
高吞吐率高但是读取或写入时间慢
小文件存取
占用NameNode 大量内存
寻道时间超过读取时间
并发写入、文件随机修改
一个文件只能有一个写者
仅支持append
HDFS写流程
1、Client:
切分文件Block
按Block 线性 和NN获取DN列表(副本数)
验证DN列表后以更小的单位流式传输数据
各节点,两两通信确定可用
2、Block传输结束后:
DN向NN汇报Block信息
DN向Client汇报完成
3、Client向NN汇报完成
4、获取下一个Block存放的DN列表
5、 。。。。。。
6、最终Client汇报完成
7、NN会在写流程更新文件状态
ClientNode上传block块文件时,在datanode间是以 pipeline管道方式 传递:
既并不是一次性上传一个block块,之后再求这个datanode传递这个block给其他节点
而是传输的单位更小,datanode1边从客户端读文件,边给datanode2复制,
这样就能提高上传速度
HDFS读流程
Client:
和NN获取一部分Block副本位置列表
线性 和DN获取Block,最终合并为一个文件
在Block副本列表中按距离择优选取
HDFS文件权限
与Linux文件权限类似:
r: read; w:write; x:execute,
权限x对于文件忽略,对于文件夹表示是否允许访问其内容
如果Linux系统用户zhangsan使用hadoop命令创建一个文件,那么这个 文件在HDFS中owner就是zhangsan。
HDFS的权限目的:阻止好人错错事,而不是阻止坏人做坏事。HDFS 相信,你告诉我你是谁,我就认为你是谁。
安全模式
1、 namenode启动的时候,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作。
2、一旦在内存中成功建立文件系统元数据的映射,则创建一个新的fsimage文件(这个操作不需要SecondaryNameNode)和一个空的编辑日志。
此刻namenode运行在安全模式。即namenode的文件系统对于客户端来说是只读的。
(只可以显示目录,显示文件内容等。写、删除、重命名都会失败)。
3、在此阶段Namenode收集各个datanode的报告,当数据块达到最小副本数以上时,会被认为是“安全”的, 在一定比例(可设置)的数据块被确定为“安全”后,再过若干时间,安全模式结束
系统中数据块的位置并不是由namenode维护的,而是以块列表形式存储在datanode中,由datanode上报。
4、当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数,