HDFS主要包括NameNode、DataNode、SecondaryNameNode,在HDFS中主要进行的是数据的存取,而在MapReduce中进行的是数据的处理。总结一下它们的过程如下:
HDFS的读流程:当客户端发送读请求后,通过DistributedFileSystem API调用open函数,发送请求到NN节点获得block的位置信息,NN返回block的位置信息,客户端收到后开始读。通过新的FSDataInputStream API 并发的读各个block,读完之后关闭流,最后在客户端形成统一的文件。
HDFS的写流程:客户端通过DistributedFileSystem API 调用create方法创建一个文件,发送请求给NN,同时将文件名、文件大小、文件的拥有者信息发送给NN,NN根据文件大小确定需要切成多少个block块,这些block块分布在哪些DN上等信息返回给客户端。客户端根据FSDataOutputStream API 将一个block写到一个DN上,由DN创建线程按照副本放置原则将block复制到其他DN上,然后返回给客户端一个回馈信息,客户端上传完成后再汇报给NN,NN返回给客户端上传成功的信息。
MR的处理流程:将HDFS中的原始数据通过split切成数据片段(通常情况下一个split对应一个block块),每一个split由一个map task线程执行,map以key value的形式将结果输出给shuffer,在shuffer中进行合并和排序,key值相同的在一个数据块中,然后将数据传给reduce执行,reduce产生最终的结果。
在该过程中需要注意的问题主要有:在HDFS的读流程中由于每个block默认有三个副本,客户端在读的过程中是随机的读其中的一个副本,同时并发的读其他的block。在HDFS的写流程中需要特别注意的一点是block的复制是不需要客户端进行操作的,是DN自己进行复制。
分布式文件系统HDFS命令
HDFS操作命令帮助:
所有的hdfs命令都是以hadoop fs开头
HDFS的shell命令在线帮助
1.hadoop fs
使用此命令可以查看HDFS的所有常用命令语法
2.hadoop fs help
使用此命令可以查看HDFS的所有常用命令语法
3. hadoop fs –help 命令
查看某个命令的具体功能
HDFS的fs命令
-help [cmd] //显示命令的帮助信息
-ls( r) <path> //显示当前目录下所有文件
-du(s) <path> //显示目录中所有文件大小
-count[-q] <path> //显示目录中文件数量
-mv <src> <dst> //移动多个文件到目标目录
-cp <src> <dst> //复制多个文件到目标目录
-rm(r ) //删除文件(夹)
-put <localsrc> <dst> //本地文件复制到hdfs
-copyFromLocal //同put
-moveFromLocal //从本地文件移动到hdfs
-get [-ignoreCrc] <src> <localdst> //复制文件到本地,可以忽略crc校验
-getmerge <src> <localdst> //将源目录中的所有文件排序合并到一个文件中
-cat <src> //在终端显示文件内容
-text <src> //在终端显示文件内容
-copyToLocal [-ignoreCrc] <src> <localdst> //复制到本地
-moveToLocal <src> <localdst>
-mkdir <path> //创建文件夹
-touchz <path> //创建一个空文件