一、hdfs写数据流程总结:即向hdfs上传文件
将源文件取128M做成一个block。
具体实现步骤 :
①client:向namenode请求上传文件; namenode:返回响应,可以上传;
②client:rpc请求上传第一个block,请返回datanode;namenode:返回dn1,dn3,dn4;
③client:向dn1请求建立bolock传输通道; datanode:dn1->dn3->dn4传递请求信号,dn4->dn3->dn1返回应答成功
④client:传送block,以packet为单位(packet里的chunk单位校验512byte);每个块只要有一个上传成功了,就算成功之后namenode会对datanode做异步的数据同步处理
备注:每传一个block都需要向namenode请求一次。反复③④步骤。某个block放在dn1上,其备份放在dn3,dn4上。此时副本量是3。
二、hdfs读数据流程总结:即在hdfs下载文件
(假如被分成两个block;就是说一个文件被分成两部分;副本数量是3,就是指每个block都复制了三分存在不同的机器上。3个副本,将每个block的位置返回,block1在dn1,其副本在dn2,dn3上;block2在dn2上其副本在dn1,dn4)
明确文件分块,每个块备份的过程。
具体步骤:
①client:请求下载文件a.avi; namenode:返回目标文件的元数据
②client:向datanode请求读数据block1;datanode:将某一台机器上的block1传输给client
③client:继续向datanode请求读数据block2..3....4.....;datanode:将某台机器上的block2..3...4....传给client。
client存储方式是追加存储,后个block追加到前block的后面最后形成一个文件。
三、元数据机制与checkpoint
元数据存在namenode中。
namenode主要负责三个功能,分别是(1)管理元数据 (2)维护目录树 (3)响应客户请求
①元数据:
元数据
(
Metadata
),又称
中介数据
、
中继数据
,为描述
数据
的数据(data about data),主要是描述数据
属性
(property)的
信息
,用来支持如指示存储位置、
历史
数据、
资源
查找、文件记录等功能。
Namenode中的元数据就是记录hdfs存储信息数据的数据。
hdfs的修改添加等信息先记录在edits.log;
必须了解元数据的格式 ,也就明确了元数据是什么:
如果存储在namenode节点的磁盘中,因为经常需要进行随机访问,还有响应客户请求,必然是效率过低。所以元数据metadata要存储在内存中!!!方便随机存储!
因此,元数据需要存放在内存中。但如果只存在内存中,一旦断点,元数据丢失,整个集群就无法工作了!!!
因此解决办法是元数据存储在内存中,但在磁盘中有备份,这个备份就是fsImage,存放在namenode节点对应的磁盘中。
(元数据->内存;edits.log,fsImage->磁盘;但三者都在Namenode中)
新的问题:当在内存中的元数据更新时,如果同时更新fsImage,就会导致效率过低,相当于第一种;但如果不更新,就会发生一致性问题,一旦namenode节点断点,就会产生数据丢失。
解决办法:引入edits.log文件(只进行追加操作,效率很高)。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到edits.log中。这样,一旦namenode节点断电,可以通过fsImage和edits.log的合并,合成元数据。
(datanode数据改变的记录在元数据中,元数据的改变记录在edits.log中)
但是,如果长时间添加数据到edit.log中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行fsImage和edits.log的合并。
如果这个操作有namenode节点完成,又会效率过低。因此,引入一个新的节点secondaryNamenode,专门用于fsImage和edits.log的合并。
合并操作发生在secondary namenode中。
具体的checkpoint执行过程如下:
以下即是checkpoint过程:
secondary namenode请求主Namenode停止使用edits文件,暂时将新的写操作记录到一个新文件中,如edits.new。
secondary namenode节点从主Namenode节点获取fsimage和edits文件(采用HTTP GET)
secondary namenode将fsimage文件载入到内存,逐一执行edits文件中的操作,创建新的fsimage文件
secondary namenode将新的fsimage文件发送回主Namenode(使用HTTP POST)
主Namenode节点将从secondary namenode节点接收的fsimage文件替换旧的fsimage文件,用步骤1产生的edits.new文件替换旧的edits文件(即改名)。同时更新fstime文件来记录检查点执行的时间
四、hdfs操作的常用命令行
hadoop fs -ls / 显示目录列表
hadoop fs -mkdir -p /a/b/c 在hdfs上创建目录
hadoop fs -cat /a.txt 显示该文件内容
hadoop fs -cp /a/a.txt /b/b.txt.2 拷贝文件
hadoop fs -mv /a/a.txt /b 移动文件
hadoop fs -get /a.txt 下载文件
hadoop fs -put /a.txt 上传文件
hadoop fs -rm /a.txt 删除文件或文件夹
hadoop fs -rmdir /a/b/c
hdfs目录简介:
①Input 用来存储所有的需要处理的数据文件。
②Output 用来存储所有的处理后的数据文件。
③ cenos-6.5-hadoop-2.6.4.tar.gz 用来做大型文件测试
⑤文本测试 test.txt
⑥wc的测试文本
⑦wc测试的输文本
hdfs可以用java客户端,也可以用linux命令行。一系列操作类似。