浅析Hadoop(一)之HDFS
再次看hadoop权威指南,又有了一些不一样的收获,所以心血来潮,就想将我理解和整理的东西写出来,还有很多不足,欢迎大家指正。
1. hdfs的特点
一次写入,多次读取硬件要求低高延时性,高吞吐量,牺牲低延时,获得高吞吐不适合大量的小文件存储Hdfs的文件只能有一个writer,写操作只能追加,而不能修改。 2. hdfs的数据块大小3. 分布式文件系统带来的好处
一个文件的大小可以大于网络中任意一个磁盘的容量,文件的块并不需要存储在同一磁盘上,因此他们可以利用集群上的任意一个磁盘进行存储使用块作为基本存储单元,而不是文件的好处就是大大简化了系统的设计,因为块的大小是固定的。块还非常适合数据备份从而提供数据容错能力和提高可用性,hdfs会将块复制到少数几个独立的节点上,默认副本为三个,这样确保在节点故障时数据不会丢失。 4. namenode和datanode在hdfs上的作用6. fsimage和edits到底是什么东西?
Edits:文件系统客户端在对hdfs执行写操作时,这些操作首先会被记录到edits文件中,也就是编辑日志文件,namenode在内存中维护文件系统的元数据;当编辑日志文件被修改时,相关元数据信息也会同步更新。内存中的元数据可支持客户端的读请求。Fsimage:fsimage文件是文件系统元数据的一个永久性检查点,其中包含文件系统中的所有目录和文件inode的序列化信息。每个inode是一个文件或目录的元数据的内部描述方式。对于文件来说,包含的信息有复本级别,修改时间,访问时间,访问许可,块大小,组成一个文件的块等信息;对于目录来说,包含的信息有修改时间,访问许可和配额元数据等信息。数据块存储在datanode中,但是fsimage文件并不会描述datanode,namenode将这种数据块和datanode的具体映射关系放在内存中。当namenode每次启动的时候,会向datanode索取当前的数据块列表以建立映射关系,namenode还会定期征询datanode以确保它拥有最新的块映射。 7. 安全模式期间都做了什么事情?
8. 描述hdfs的读写机制
写入机制: 1) client通过DistributedFileSystem对象调用create方法,该对象对namenode创建一个RPC调用,在文件的命名空间中新建一个文件,此时的文件并没有对应的数据块,namenode检查用户权限和是否已经存在该文件名,检查通过后DistributedFileSystem向client返回一个FSDataOurputStream,client通过该对象向文件中写入数据。 2) client写入数据时,FSOutputStream 将数据分成一个个的数据包,并写入内部队列,DataSreamer处理该队列,DataStreamer负责的是根据datanode列表要求namenode分配合适的新块用于存储数据复本。默认是3个副本,所以会有三个datanode组成一个管线,DataStreamer将数据包传输给管线中的第一个节点,第一个节点存储成功后将其传输给第二个节点,第二个节点存储成功后传输给第三个节点。 3) DataOutputStream维护着一个内部数据包队列来等待datanode的收到确认回执,收到管线中所有节点的确认信息,该数据包才会从确认队列中删除。 4) 客户端写完数据后,调用close方法,该操作会将剩余的所有数据包写入管线,并在联系到namenode且发送文件写入完成信号之前,等待确认。
读取机制: 1) Client通过调用DistributedFileSystem对象的open方法,该对象通过RPC调用namenode确定起始块的位置,namenode返回所有存储该文件块的复本地址并按照与client的距离来排序,client会从距离自己最近的datanode上读取数据块。 2) Client对输入流(FSDataInputStream)调用read方法来连续的读取数据,读取到块的末尾时,DFSInputSteam关闭与该datanode的连接,转去寻找下一个块的最佳datanode,直到读取结束。对FSDataInputStream调用close方法。