HDFS 数据流:
1.文件读取:
客户端通过调用FileSystem 对象的open()方法来打开希望读取的文件,对于hdfs来说,这个对象是分布式文件系统的一个实例。
DistributedFileSystem 通过rpc来调用namenode,以确定文件起始块的位置,对于每一个块,namenode返回存有该块副本的
datanode地址。datanode根据他们与客户端的距离来排序。
DistributedFileSystem 类返回一个FSDataInputStream 对象给客户端并读取数据,FSDataInputStream 类转而封装
DFSInputStream 类,DFSInputStream 管理datanode 与namenode的I/O
客户端对这个输入流调用read(),存着datanode文件起始块的DFSInputStream 随即连接距离最近的datanode,反复对数据流
read()方法,可将数据从datanode 传输到客户端,到达块的末端时,DFSInputStream 会关闭与该datanode的连接。
2.文件的写入:
DistributedFileSystem 对象的 create()来创建文件,DistributedFileSystem 对namenode RPC 调用,在文件系统命名空间中
创建一个文件,namenode则执行各种检查。通过则创建文件,DistributedFileSystem 给客户端返回一个FSDataOutputStream 对象。
FSDataOutputStream 封装了DFSoutputStream 来实现datanode之间及datanode与namenode的数据交互。
客户端写入数据时,DFSoutputStream 将数据拆分成一个个的数据包,数据包有指定的大小,写入内部队列,成为数据对列,
DataStream处理数据队列,它的责任是根据datanode列表来要求namenode分配适合的新快来存储数据备份,这一组datanode组成 一个管线,同时DFSoutputStream 也维护这一个内部队列,知道datanode返回确认存储的信息才删除内部队列
3.复本的布局
一个机架内的随机节点A
与A不同的机架的随机节点B
与B同一机架的另一不同节点
4.文件一致性
HDFS 提供一个方法来强制所有的缓存与数据节点同步,对FSDataOutputStream 调用sync()方法,sync()返回成功后则所有reader
可见
5.dictcp 并行复制
应用在两个集群见传输数据(版本一样,保持rpc版本一致)
bin/hadoop distcp hdfs://namenode1/sourcefile hdfs://namenode2/distfile
可选择override 及 update 属性
6.hadoop存档
bin/hadoop archiveName files.har /my/files my
将 /my/files 所有文件存档为 file.har 存储到 my 文件夹下
bin/hadoop fs -lsr har://my/files.har
……………………