1、HDFS:分布式文件系统,在hadoop中支持很多种文件系统,hdfs是使用最多的,可以看成是一个软件,将各个服务器的磁盘连成一体,来完成某项任务。
2、FileSystem是抽象类:有很多的实现类不同的实现类有不同的功能;①localfileSystem:本地文件系统(指代linux的文件系统)②:distributeFileSystem:分布式文件系统(HDFS);③ webhdfs:支持浏览器方式对文件系统操作;④harfilesystem:小文件操作
3、数据存入每个note节点,有些文件路径一样,我们需要在机器中记录具体是哪个node节点;当单个文件过大时,我们一个node节点存储容量不够,我们可以把文件切割split开(默认每块128M大小),然后存入两个node节点,此时我们在读取文件时,需要记录住两个node节点的地址,也就是一个数据存储在两个node上;在存储时,我们担心数据丢失,会对数据进行备份,默认备份2份,共3份(HDFS就做了上述内容,namenode管理元数据,datanode存储数据)
4、namenode和datanode之间具有心跳机制(保证name和data的连接,如果一定时间内没有心跳连接,则认为“死亡”)、负载均衡机制(某台机器快满,尽量存储到其他机器中)、副本机制(data会定时上报自己的块信息,name会实时查看上报信息中块的信息是否足够3个,不够就添加,多了就删除)这三个机制
5、namenode存储在内存中,datanode存储在本地磁盘中,且每个文件都有一个block.id
6、HDFS不准许用户对文件进行修改,只能读取操作。文件权限很弱,你告诉我你是谁,你就是谁
7、常用HDFS的操作命令:help(查看帮助)、ls(列出文件)、mkdir(创建目录)、put(上传)、get(下载)、mv(在hadoop系统中移动)、rm(删除)、cp(复制)、tail(查看后几行)、setrep(设置副本个数,默认3个)
8、HDFS高级命令:
文件限额配置:对某一个目录进行数量和空间大小的限制(比如百度网盘)------限制数量:hdfs dfsadmin -setQuota 2 lisi------限制大小:hdfs dfsadmin -setSpaceQuota 4k /user/root/lisi
安全模式:hadoop进入安全模式下,不准许用户进行增删改的操作,只能查询,hadoop在启动后的30s内(自检),是安全模式,之后退出安全模式------hdfs dfsadmin -safemode get/enter(关/开)
9、HDFS将所有的文件都抽象为block块来进行存储,在hadoop2中默认大小是128M,简化操作;不论存储的文件有多大,只要大于128M,我们就会对数据进行切割;可以针对每一个块设置备份,提高高可用。支持块缓存(某些文件经常使用,可以提取出来放在内存中,加快提取速度)
10、一个元数据大概120字节,128g的内存,大概能存10亿个文件。_
11、block的三个副本再存储的时候,会在同机架服务器上再存一个,第三个副本会存在于另一台机架服务器上,避免共同损失;不把三个副本全部分开存储是为了读取的时候会速度快,更方便。
12、hadoop写入数据流程
1、client客户端请求namenode,执行写入操作
2、namenode接收到客户端的请求后,验证是否有权限以及文件是否已经存在,如果没有权限或者文件存在,直接抛出异常,如果ok,通知client可以上传
3、客户端开始对文件进行切割,默认每个128M
4、client再次请求namenode,询问第一个block放置在哪些机器总
5、namenode根绝副本的数量和机架感知原理,以及网络拓扑关系寻找更为合适的机器,返回给客户端机器列表
6、client连接列表中第一台的节点,第一台节点连接第二台几点,第二台连接第三台节点,共同建立起pipeline管道
7、client开始往管道传输数据,数据以package(64kb)发送数据,当第一台接收到后,会将数据发送到第二台,第二台再把数据传输给第三台,每一次发送完成后,都会有一个应答队列
8、当每一个datanode接收到数据后,都给ack应答响应,告知已经接受完毕了
9、当第一块发送完成后,再次请求namenode,询问第二个block应该放置在哪些机器中,再次重复步骤操作,直至存储数据完成
13、在传输过程中,有三台机器接受数据,当接收机器过半后,就会认为存储成功,剩下的后面的机器没有接收完成,在namenode检查机制中会进行更新。
14、HDFS读取数据流程:
1、 Client向NameNode发起RPC请求,来确定请求文件block所在的位置;
2、 NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode 都会返回含有该 block 副本的 DataNode 地址; 这些返回的 DN 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后;
3、 Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是DataNode,那么将从本地直接获取数据(短路读取特性);
4、 底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类 DataInputStream 的 read 方法,直到这个块上的数据读取完毕;
5、 当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表;
6、 读取完一个 block 都会进行 checksum 验证,如果读取 DataNode 时出现错误,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的DataNode 继续读。
7、 read 方法是并行的读取 block 信息,不是一块一块的读取;NameNode 只是返回Client请求包含块的DataNode地址,并不是返回请求块的数据;
8、 最终读取来所有的 block 会合并成一个完整的最终文件。
如果出现某一个datanode和client处在同一个服务器中,采用短路策略,直接读取本datanode,不会再起询问namenode
15、个人总结的读取数据
1、客户端发送请求到namenode,询问是否可以读取对应的文件
2、客户端接收到请求后,验证用户的权限和是否存在这个文件,如果不通过,直接抛出异常,验证成功,返回部分或者全部的block地址列表
3、客户端根据namenode给出的block地址,并发访问对应的地址,获取block数据
4、如果namenode返回的是部分列表,再次请求namenode,继续获取剩余的地址列表
5、最终获取所有的block文件块,拼接成一个完整的文件。
16、namenode:管理元数据信息,元数据信息是保存在内存中的,断电消失。 因此元数据信息必定会持久在磁盘中
17、冷备份保存的是某时刻之前的信息,热备份是实时保存备份
1、snn当达到一定的时机后(空间大小100万次、时间大小1h),会通知我们的namenode切换edits文件,把带有inprogress文件进行切换
2、snn将namenode中edits文件和fsimage文件拷贝到自己的目录下(防止丢失),以发送http请求的方式
3、将edits文件和fslmage文件加载到自己的内存中,执行合并操作。问题:如果snn的内存没有namenode内存大,合并将会失败,所以实际生产中,snn的内存一定不小于namenode的内存
4、合并后,就会产生一个新的fslmage文件,将新的fslmage文件发送给namenode
5、namenode用新的fslmage替换旧的fslmage文件------(以上是一个冷备份)
18、HDFS是一个主/从(Mater/Slave)体系结构, 由三部分组成: NameNode和DataNode以及SecondaryNamenode
1、NameNode负责管理整个文件系统的元数据,以及每一个路径(文件)所对应的数据块信息
2、DataNode 负责管理用户的文件数据块,每一个数据块都可以在多个datanode上存储多个副本
3、Secondary NameNode用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。最主要作用是辅助namenode管理元数据信息
19、HDFS系统的操作:hdfs dfs -help 操作命令------主要记住ls(查看文件)、mkdir(创建文件夹)、put(将本地文件上传到hadoop系统中)、get(将hadoop中的文件下载到本地文件上)、mv(剪切,重命名)、cp(复制)、cat(查看文件内容)、tail(显示文件末尾部分)、chmod(修改权限421)、chown(改变文件的所属用户或所属组)、df(统计文件系统的可用空间信息)、du(统计文件夹的大小信息)、count(统计一个指定目录下的文件节点数量)
20、HDFS的高级命令
hdfs dfsadmin -setQuota 2 dir # 给该文件夹下面设置最多上传两个文件,发现只能上传一个文件
hdfs dfsadmin -clrQuota /user/root/dir # 清除文件数量限制
hdfs dfsadmin -setSpaceQuota 4k /user/root/dir # 限制空间大小4KB
21、假设我们设置的副本数(即参数dfs.replication)是3,那么在datanode上就应该有3个副本存在,假设只存在2个副本,那么比例就是2/3=0.666。hdfs默认的副本率0.999。我们的副本率0.666明显小于0.999,因此系统会自动的复制副本到其他dataNode,使得副本率不小于0.999。如果系统中有5个副本,超过我们设定的3个副本,那么系统也会删除多于的2个副本。 在安全模式状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求]()。在,当整个系统达到安全标准时,HDFS自动离开安全模式。30s
22、块缓存:通常DataNode从磁盘中读取块,但对于访问频繁的文件,其对应的块可能被显示的缓存在DataNode的内存中,以堆外块缓存的形式存在。提速!
23、Secondary NameNode的工作机制
1) Secondary NameNode询问namenode是否需要checkpoint。直接带回namenode是否检查结果。
2) Secondary NameNode请求执行checkpoint。
3) namenode滚动正在写的edits日志
4) 将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode
5) Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
6) 生成新的镜像文件fsimage.chkpoint
7) 拷贝fsimage.chkpoint到namenode
namenode将fsimage.chkpoint重新命名成fsimage
以上需要特别注意,fsmage.chkpoint是静止的,后面的更新是依据的编辑日志的更新,也就是edits的更新,所以,snn不需要再拿到镜像fsmage.chkpoint,用自己具有的和edits日志就可以合成新的了_(目前个人这样认为)
24、datanode的工作机制
1)一个数据块在datanode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
2)DataNode启动后向namenode注册,通过后,周期性(1小时)的向namenode上报所有的块信息。(dfs.blockreport.intervalMsec)
3)心跳是每3秒一次,心跳返回结果带有namenode给该datanode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个datanode的心跳,则认为该节点不可用。
4)集群运行中可以安全加入和退出一些机器
2.1)当DataNode读取block的时候,它会计算checksum
2.2)如果计算后的checksum,与block创建时值不一样,说明block已经损坏。
2.3)client读取其他DataNode上的block.
2.4)datanode在其文件创建后周期验证checksum