HDFS读写流程

HDFS读流程:

HDFS读写流程

首先客户端通过调用Distributed FileSystem API的open方法发送请求到NameNode,NameNode将相应文件的Block的位置信息(元数据中存在这些信息)返回给客户端,客户端通过FSData InputStream的read方法并发的读每个Block(即图中4,5是并发执行的,每个block都有多个副本,程序会找相对空闲的DataNode节点去读相应副本),最后关闭该输入流,在客户端将读取的所有block合并形成一个统一的文件(一个大文件在存储时会切分为多个Block,因此读取全部Block后,需要合并)。

注意:此处客户端不能读超大的文件,因为磁盘空间可能不够。

 

HDFS写流程:

HDFS读写流程

客户端调用Distributed FileSystem的create方法请求NameNode创建一个文件(包括文件名,文件大小,文件拥有者等),根据文件大小,将文件切分为多个Block,将此信息(包括有多少个Block以及每个Block存在哪些DataNode上)返回给客户端,客户端通过FSData OutputStream的write方法,首先把一个Block写到其中一个DataNode上(注意:每个Block默认都有3个副本,这三个副本不是都由客户端向三个DataNode上写的,而是由客户端向其中一个DataNode上写一份,然后由该DataNode创建新线程,按照副本放置规则向其他节点上复制该副本),全部完成之后,关闭输出流,反馈给客户端一个完成信息,并将该信息汇报给NameNode。

 

HDFS文件权限

-- 与Linux文件权限类似,分为r(read),w(write),x(execute)

-- 文件拥有者,就是客户端上传文件时所用的用户名。(此用户名与Linux系统的用户名不同,如Linux系统会有一个root用户,Windows系统默认用户为Administrator,如果在Windows系统上上传一个文件,那么该文件的拥有者就是Administrator,即使Linux系统中没有Administrator这个用户,但是在HDFS中会有这个用户)

-- HDFS的权限目的:阻止好人做错事,而不是阻止坏人做坏事。HDFS相信,你告诉我你是谁,我就认为你是谁。即不做密码验证,你使用什么用户名,那么该用户名所拥有的所有文件你也拥有。但是0.23版本已经加入了密码验证功能,但是该功能会导致读取速度变慢,因为每次读取都要进行密码验证,所以使用该功能的并不多。

 

什么是HDFS的安全模式?

当你重新启动HDFS时,在启动之后马上会进入安全模式。在安全模式下,我们不可以对HDFS上的文件操作,只能查看目录。

那么安全模式的功能是什么呢?为什么不能进行操作?

因为在安全模式下,Block的位置信息要汇报给NameNode,汇报的过程是需要时间的,这个时间段就是安全模式的时间段。在安全模式下,除了汇报Block的位置信息,还会检测Block的副本数是否足够。在该时间段内若要强制读取文件,需要通过命令强制退出安全模式,而这可能造成数据丢失等各种问题,所以除非必要,否则不建议退出安全模式。若文件总体不大,安全模式持续的时间也不会很长;若文件总体很大,那么也不会频繁的进行重启活动。