HDFS架构详解
HDFS底层架构:
1.分布式文件系统:
·物理层存储的分布式
基于客户机/服务器模式
通常一个分布式文件系统提供多个供用户访问的服务器
·通常情况下都会提供备份和容错的功能
·通常情况下都基于操作系统的本地文件系统
-ext3,ext4
-NTFS
·分布式文件系统优点
1)传统文件系统最的问题是容量和吞吐量的限制
2)多用户多应用的并行读写是分布式文件系统产生的根源
一块硬盘的读写性能,比不上多块硬盘同时读写的性能
1HDD(硬盘)=75MB/sec
1000HDDs=75GB/sec
3)扩充存储空间的成本低廉
4)可提供冗余备份
5)可以为分布式计算提供基础
2.HDFS基本概念:
·HDFS是一个分布式文件系统
·HDFS是一个使用Java实现的、分布式的、可横向扩展(代表可以动态的创建和卸载节点)的文件系统
·HDFS是Hadoop的核心组件
·基于*nix
·HDFS具有很高的容错性,提供了高吞吐量的数据访问
·HDFS适用于一次写入多次查询的情况,不支持并发写情况,小文件不合适
·HDFS前提和设计目标
·硬件错误是常态
错误检测和快速、自动的恢复是HDFS最核心的架构目标
·存储超大文件
HDFS适合大量存储,总存储量可以达到PB、EB级
HDFS适合大文件,单个文件一般在百MB级以上
文件数目适中
·流式数据访问
HDFS适合用于处理批量,而不适合随机定位访问
·简单的一致性模型
HDFS的应用程序需要对文件实行一次性写。多次读的访问模式
不能修改已写入的数据
·程序采用“数据就近”原则分配节点执行
移动计算比移动数据的代价要低
·运行在普通廉价的服务器上
HDFS设计理念之一就是让它能运行在普通的硬件之上,即便硬件出现故障,也可以通过容错策略来保证数据的高可用
·HDFS局限性
·不适合低延迟数据访问
高吞吐量可能要求以高延迟作为代价
HBase可以弥补不足
·无法搞笑存储大量小文件
文件数量大小的限制由NameNode来决定
·不支持多用户写入及任意修改文件
·HDFS基本概念--块
·HDFS基本存储单位是块,传统的块存储介质中,块是读写的最小数据单位(扇区)
·HDFS也使用的块的概念,Hadoop1.X版本默认大小为64M,2.X默认为128M
可自行在hdfs-site.xml中配置:
1.X版本修改:dfs.block.size,2.X版本修改:dfs.blocksize
默认单位为比特,兆与比特计算方法:128*1024*1024
每个块有一个自己的全局ID
·HDFS将一个文件分为一个或数个块来存储
每个块是独立的存储单位
以块为单位在集群服务器上分配存储
·HDFS基本概念--块带来的好处
·一个文件的大小可以大于网络中任意一个磁盘的容量
·简化了存储子系统的设计,简化了存储管理,消除了对元数据的顾虑
·块适合用于数据备份,提供了容错能力和可用性
·HDFS基本概念--块的冗余备份
·每个块在集群上会存储多份副本
默认复制份数为三份
可针对每个文件配置,由客户端指定
可以动态修改
·简化了存储子系统的设计,简化了存储管理,消除了对元数据的顾虑
·块适合用于数据备份,提供了容错性和可用性
3.HDFS体系架构
·HDFS的元数据包括
-文件系统目录树信息
文件名,目录名
文件和目录的从属关系
文件和目录的大小,创建及最后访问时间
文件和目录的权限
-文件和块的对应关系
文件有哪些块组成
·NameNode职责详解
·管理文件系统的命名空间
·记录每个文件数据块在各个DataNode上的位置和副本信息
·协调客户端对文件的访问
·记录命名空间内的改动或空间本身属性的改动
·NameNode使用事物日志记录HDFS元数据的变化。使用映像文件存储文件系统的命名空间,包括文件映射,文件属性等
·通过检查点(Checkpoint)更新影像文件,Secondary NameNode辅助完成处理
NameNode主要功能:接受客户端的读写服务
NameNode保存metadate信息包括:
·文件owership和permissions
·文件包含哪些块
·Block保存在哪个DataNode(由DataNode启动时上报)
NameNode的metadate信息在启动后会加载到内存
·metadata存储到磁盘文件名为”fsimage”
·Block的位置信息不会保存到fsimage
·edits记录对metadata的操作日志
Secondary NameNode不是NameNode的备份(但可以做备份),它的主要工作是帮助NameNode合并edits log。减少NameNode启动的时间
Secondary NameNode执行合并时机:
·根据配置文件设置的时间间隔fs.checkpoint.period 默认3600秒
·根据配置文件设置edits log大小fs.checkpoint。Size 规定edits文件的最大值默认是64MB
·DataNode职责详解
·负责所在物理节点的存储管理
·一次写入,多次读取(不修改)
·文件用数据块组成,典型的块大小事64MB和128MB
·数据块尽量散布到各个节点
DataNode:
·存储数据(Block)
·启动DataNode线程的时候会向NameNode汇报block信息
·通过向NameNode发送心跳保持与其联系(3秒一次),如果NameNode10分钟没有收到DataNode的心跳,则认为其已经lost,并copy其上的block到其他DataNode
Block的副本放置策略
·第一个副本:放置在上传文件DataNode;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点
·第二个副本:放置在于第一个副本不同的机架的节点上
·第三个副本:与第二个副本相同机架的节点
·更多副本:随机节点
·HDFS读文件流程
·HDFS写文件流程
HDFS文件权限:
·与Linux文件权限类似
r:read;w:write;x:execute,权限x对于文件忽略,对于文件夹表示是否允许访问其内容
·如果Linux系统用户xxx使用hadoop命令创建一个文件,那么这个文件在HDFS中owner就是xxx
·HDFS的权限目的:阻止好人做错事,而不是阻止坏人做坏事。HDFS相信,你告诉我你是谁,我就认为你是谁
2.HDFS可靠性:
·冗余副本策略
可以在hdfs-site.xml中设置复制因子指定副本数量
所有数据块都有副本
DataNode启东时,遍历本地文件系统,产生一份hdfs数据块和本地文件的对应关系列表汇报给namenode
·机架策略
集群一般放在不同的机架上,机架间带宽要比机架内带宽要小
默认在一个机架内存放两个副本,在另一个机架内再放一个副本,这样可以防止机架失效时丢失数据,也可以提高带宽利用率
·心跳机制
NameNode周期性从datanode接收心跳信号和块报告
NameNode根据块报告验证元数据
没有按时发送心跳的datanode会被标记为宕机,不会再给它任何I/O请求
如果datanode失效造成副本数量下降,并且低于预先设置的阙值,namenode会检测出这些数据块,并在合适的时机进行重新复制
重新复制的原因还包括数据副本本身损坏、磁盘错误,复制因子被增大等
·安全模式
NameNode启动时会先经过一个“安全模式”阶段
安全模式阶段不会产生数据写
在此阶段NameNode收集各个datanode的报告,当数据块达到最小副本数以上时,会被认为是“安全”的
在一定比例(可设置)的数据块被确定为“安全”后,再过若干时间,安全模式结束
在检测到副本数不足的数据块时,该块会被复制至到达到最小副本数
·校验和
HDFS客户端软件实现了对HDFS文件内容的校验和(Checksum)检查
在文件创立时,会计算每个数据块的校验和
校验和会作为单独一个隐藏文件保存在命名空间下
客户端获取文件时可以检查数据块对应的校验和是否和隐藏文件中的相同,从而发现数据块是否损坏
如果正在读取的数据块损坏,则可以继续读取其他副本
·回收站
删除文件时,其实是放入回收站/trash
回收站里的文件可以快速恢复
可以设置一个时间阈(yu)值,当回收站里文件的存放时间超过这个阈值,就被彻底删除,并且释放占用的数据块
默认的回收站是关闭的,可以通过在core-site.xml中添加fs.trash.interval来打开并配置时间阈值,时间单位是分
·元数据保护
映像文件和事务日志是NameNode的核心数据。可以配置为拥有多个副本
副本会降低NameNode的处理速度,但增加安全性
NameNode依然是单点,如果发生故障要手工切换,Hadoop2.X的版本中可配置NameNode HA解决问题
HDFS Shell操作
·HDFS Shell文档地址
http://hadoop.apache.org/docs/r2.7.2/hadoop-projrct-dist/hadoop-common/FileSystemShell.html
·HDFS集中式缓存管理文档地址
http://hadoop.apache.org/docs/r2.7.2/hadoop-mapreduce-client/hadoop-mapreduce-client-core/DistributedCacheDeploy.html
·HDFS小文件归档文档地址
http://hadoop.apache.org/docs/r2.7.2/hadoop-archives/HadoopArchives.html
1.hadoopfs
2.hadoopdfs
3.hdfsdfs
*hadoop fs使用于任何不同的文件系统,比如本地文件系统和HDFS文件系统
*hadoop dfs只能适用于HDFS文件系统
*hdfs dfs跟hadoopdfs的命令作用一样,也只能适用于HDFS文件系统
Hdfs -help hdfs帮助命令
Hdfs dfs -mkdir -p <path>(路径) 创建一个目录
Hdfs dfs -put 指定文件路径 指定hdfs传输路径 通过put命令上传文件
Hdfs dfs -cat 指定文件路径 查看文件
Hdfs dfs -get 指定文件路径 .(这个点表示当前路径) 下载文件
Hdfs dfs -rm -r 指定文件路径 删除文件
Hdfs dfs -ls har:///conf(指定路径)/conf.har(har(归档)文件) 压缩文件
Hdfs dfs -cp har:///conf(指定路径)/conf.har(har(归档)文件)/har 解压缩文件
Linux开发环境搭建:
·Linux基础环境配置
·JDK、Maven、XManager配置
·Linux编码演示
HDFS java 编程:
·上传文件
·删除文件
·下载文件
·HDFS Java API文档地址
http://hadoop.apache.org/docs/current/api/
Hadoop高可用集群
1.HDFS HA架构详解:
1)HDFS HA背景
· HDSF集群中NameNode存在单点故障(SPOF)。对于只有一个NameNode的集群,如果NameNode机器出现意外downtime,那么整个集群将无法使用,直到NameNode重新启动
· 影响HDFS集群不可用主要包括以下两种情况
NameNode机器宕机,将导致集群不可用,重启NameNode之后才可使用
计划内的软件或硬件升级(NameNode节点),导致集群在短时间内不可用
· HDFS的HA就是为了解决上述问题,通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,比如处理来自客户端的RPC请求,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,以便能够在它失败时快速进行切换。
2)HDFS HA架构:
3)HDFSHA配置要素
·NameNode机器:两台配置对等的物理机器,它们分别运行Active和StandbyNode。
·JouralNode机器:运行JouralNodes的机器。JouralNode守护进程相当的轻量级,可以和hadoop的其他进程部署在一起,比如NameNode、DataNode、ResourceManager等,至少需要3个且为奇数,如果你运行了N个JNS,那么它可以允许(N-1)/2个JNS进程失效并且不影响工作
·在HA集群中,standby namenode还会对namespace进行checkpoint操作(继承Backup Namenode的特性),因此,就不需要在HA集群中运行SecondaryNamenode、CheckpointNode或者BackupNode。
·hdfs-site.xml重要配置
·dfs.nameservices - HDFS NN的逻辑名称,例如:myhdfs
·dfs.ha.namenodes.myhdfs - 给定服务逻辑名称myhdfs的节点列表
·dfs.namenode.rpc-address.myhdfs.nn1 - myhdfs中nn1对外服务的RPC地址
·dfs.namenode.http-address.myhdfs.nn1 - myhdfs中nn1对外服务http地址
·dfs.namenode.shared.edits.dir - NameNode元数据在JournalNode存放位置
·dfs.namenode.edits.dir - JournalNode在本地磁盘存放数据的位置
·dfs.ha.automatic-failover.enabled - 开启NameNode失败自动切换
·dfs.ha.fencing.methods - 配置隔离机制,通常为sshfence
HDFS自动故障转移:
·在自动故障转移中,主要由两个组件组成
·zookeeper集群:
1.故障监控:失效检测,每个NameNode将会和zookepper建立一个持久session,如果NameNode失效。那么次session将会过期失效,此后zookeeper将会通知另一个Namenode,然后触发Failover。
2.NameNode选举:Zookeeper提供了简单的机制来实现Active Node选举,如果当前Active失效,Standby将会获取一个特定的排它锁(lock),那么获取(持有)锁的Node接下来将会成为Active。
· ZKFC是一个zookeeper客户端,它主要用来监测和管理NameNodes的状态,每个NameNode机器上都会运行一个ZKFC程序,它的职责为:
1.健康监测:ZKFC间歇性的ping NameNode,得到NameNode返回状态,如果NameNode失效或者不健康,那么ZKFC将会标记其为不健康
2.Zookeeper会话管理:当本地Nanenode运行良好时,ZKFC将会持有一个zookeeper session,如果本地NameNode为Active,它同时也持有一个“排他锁”(znode),如果session过期,那么次lock所对应的znode也将会被删除
3.选举:当集群中其中一个NameNode宕机,ZK会自动将另一个激活
2.Zookeeper集群安装:
1)Zookeeper概述
Zookeeper是一个开源分布式协调服务,独特的Leader-Follwer的集群结构,很好的解决了分布式单点问题。目前主要用于诸如:统一命名服务、配置管理、锁服务、集群管理等场景。
·Zookeeper中的角色主要有以下三类,如下表所示:
·Zookeeper系统模型
·Zookeeper设计目的
·最终一致性:client不论连接到哪个Server,展示给它都是同一个视图
·可靠性:具有简单、健壮、良好的性能,如果消息m被到一台服务器接受,那么它将被所有的服务器接受
·实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延迟等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要更新数据,应该在读数据之前调用sync()接口
·等待无关性:慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待
·原子性:更新智能成功或者失败,没有中间状态
·顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布。则在所有Server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面
·Zookeeper总结
- 核心特性:解决单点问题,数据一致性
- API使用:简单清晰
- 使用场景:统一命名服务、配置管理、锁服务、集群管理
- 稳定性:权限,监控,容灾
1)Zookeeper单节点安装
·前置环境
- 主机名、IP、防火墙、selinux、java环境配置
·下载解压
- http://archive.apache.org/dist/zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gz
·配置
- 复制配置文件:cp conf/zoo_sample.cfg conf/zoo.cfg
- 配置数据存储目录:dataDir=/usr/local/zookeeper-3.4.5/data
- 启动:bin/zaServer.shstart
- 查看状态:bin/zkServer.shstartus
- 进入命令行:bin/zkCli.sh
Dain修改zoo.conf
- server.1=hadoop01.jkxy.com:2888:3888
- server.2=hadoop02.jkxy.com:2888:3888
- server.3=hadoop03.jkxy.com:2888:3888
- maxClientCnxns=0 #服务器最大连接数,默认是10,改为0表示没限制
- dataDir=/usr/local/zookeeper-3.4.5/data #数据存储目录
- autopurge.snapRetainCount=3 #快照数
- autopurge.purgeInterval=1 #快找清理时间,默认为0
3.HDFSHA配置
1)HDFS架构回顾
4.YARNHA架构详解
1)YARN HA架构
Shell操作:
Hdfs路径的写法:1)hdfs://chen:9000/ 2)/ 3)a
|more 可以分页显示信息
HDFS的Trash回收站:
和Linux系统的回收站设计一样,HDFS会为每一个用户创建一个回收站目录:/user/用户名/.Trash/,每一个被用户通过Shell删除的文件/目录,在系统回收站中都有一个周期,也就是当系统回收站中的文件/目录在一段时间之后没有被用户回复的话,HDFS就会自动的把这个文件/目录彻底删除,之后,用户就永远也找不回这个文件/目录了。
配置:在每个节点(不仅仅是主节点)上添加配置core-site.xml,增加如下内容:
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>