hadoop学习笔记2

hadoop权威指南

Hadoop文件系统:

    • namenode管理文件系统的命名空间,维护文件系统树及整颗树内所有文件和目录,这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件和编辑日志文件。

    • datanode也记录着每个该文件中各个块所在的数据节点信息,但不永久保存块的位置信息,因为这些信息会在系统启动时由数据节点重建。

  • HDFS的块比磁盘的块大,其目的是为了最小化寻址开销(磁盘传输时间远大于寻址时间)

  • 通过HTTP访问HDFS两种方式:

    • 直接访问,hdfs后台进程直接服务于来自客户端的请求

    • 通过代理(一对多)访问,客户端通常使用DistributedFilesystem API访问HDFS。

      • 通常情况下通过代理服务器,实现在不同数据中心中部署的Hadoop集群之间的数据传输。

PathFilter对象:过滤器由Path表示,只能作用于文件名,不能针对文件的属性(例如创建时间)来构建过滤器。数据流:

  • 文件读取:

    1. 客户端通过调用HDFS的一个实例对象的open()方法来打开希望读取的文件

      • DistributedFileSystem通过使用RPC来调用namenode,以确定文件起始块 的位置

      • 对于每个块,namenode返回存有该块副本的DataNode地址,DataNode根据与客户端的距离排序(如集群的网络拓扑),优先先从本地DataNode读取数据。

      • DistributedFileSystem类返回一个FSDataInputStream对象(一个支持文件定位的输入流)给客户端,该对象管理着DataNode和namenode的I/O。

    2. 客户端对这个输入流调用read()方法

    3. 存储着文件起始几个块的DataNode地址的DFSInputStream连接距离最近的DataNode,通过反复调用read()方法,将数据从DataNode传输到客户端

    4. 到达块的末尾,DFSInputStream关闭与该DataNode的连接,然后寻找下一个块的最佳DataNode。

    5. 客户端完成读取,就对DFSInputStream调用close()方法。

  • 文件写入:

    1. 客户端通过对DistributedFileSystem对象调用create()来新建文件

      • DistributedFileSystem对namenode创建一个RPC调用,在文件系统的命名空间中新建一个文件,此时改文件中无数据块

      • namenode执行各种检查(确保文件不存在以及客户端有新建该文件的权限),检查通过,namenode为创建新文件记录一条记录。否则,创建文件失败并向客户端抛出IOException

      • DistributedFileSystem向客户端返回一个FSDataOutputStream对象(封装一个DFSOutputstream对象,负责处理namenode和datanode之间的通信),由此客户端可以开始写入数据。

    2. 客户端写入数据时,DFSOutputStream将它分成一个个的数据包,并写入内部队列(数据队列)。

    3. DataStreamer处理数据队列,它根据DataNode列表要求namenode分配适合的新块来存储数据副本。这一组DataNode构成一个管线--假设副本数为3,则管线有3个节点。DataStreamer将数据包流式传输到关系那种第一个DataNode,该DataNode存储数据包并将它发送到管线中第2个DataNode,第2个DataNode存储该数据包并发送给管线中第3个datanode.

    4. DFSOutputStream也维护着一个内部数据包队列(确认队列)来等待datanode的收到确认回执,收到管道中所有datanode确认信息后,该数据包才会从确认队列删除。

    5. 客户端完成数据的写入后,对数据流调用close()方法,该操作将所有的数据包写入datanode管线

    6. 并在联系到namenode且发送文件写入完成信号之前等待确认。namenode已经知道文件由哪些块组成(通过DataStreamer请求分配数据块),所以它在返回成功前只需等待数据块进行最小量的复制。

  • 副本放置(默认):

    1. 第一个副本放在运行客户端的节点上,若客户端在集群之外,就随机选择一个节点

    2. 第2个副本放在与第一个机架不同的随机选择的机架节点上

    3. 第3个副本放在与第2个副本同一个机架上不同的节点上

    4. 其他副本放在集群中随机选择的节点上

  • 一致模型--文件读写的数据可见性

    • 当前正在写入的块对其他reader不可见

    • HDFS提供一个方法来使所有缓存与数据节点强行同步--对FSDataOutputStream调用sync()方法。保证文件中到目前为止写入的数据均达到所有datanode的写入管道并且对所有新的reader均可见。

  • Flume:将大规模流数据导入HDFS

  • Sqoop:将数据从结构化存储设备(如关系数据库)批量导入HDFS。---如:将白天生产的数据库中的数据在晚间导入hive数据仓库中进行分析


猜你喜欢

转载自blog.csdn.net/pugongying_95/article/details/79573183