Hadoop权威指南:HDFS-数据流

剖析文件读取

  1. 客户端通过调用FileSystem对象的open()方法来打开希望读取的文件,对于HDFS来说, 这个对象是分布式文件系统的一个实例
  2. DistributedFiltSystem通过使用RPC来调用namenode,以确定文件起始块的位置.
  • 对于每一个块,namenode返回存有该块副本的datanode 的地址,这些datanode根据它们与客户端的距离来排序(根据集群的网络拓扑)
  • DistributedFileSystem类返回一个FSDataInputStream对象(一个支持文件定位的输入流)给客户端并读取数据
  • FSDataInputStream 类转而封装 DFSInputStream 对象, 该对象管理着 datanodenamenode 的 I/O操作.
  1. 接着, 客户端对这个输入流调用read()方法
  2. 存储着文件起始几个块的datanode地址的DFSInputStream随即连接距离最近的datanode, 通过对数据流反复调用read()方法, 可以将数据从datanode传输到客户端
  3. 到达块的末端时,DFSInputStream关闭与该datanode的连接, 然后寻找下一个块的最佳datanode

客户端只需要读取连续的流,并且对于客户端都是透明的

  1. 客户端从流中读取数据时,块是按照打开DFSInputStreamdatanode新建连接的顺序读取的.一旦客户端完成读取,就对FSDataInputStream调用cloase()方法

几点说明

  • 在读取数据的时候,如果DFSInputStreamdatanode通讯时遇到错误,会尝试从这个块的另外一个最邻近datanode读取数据,也会记住那个故障datanode
  • namenode告知客户端每个块中最佳的datanode, 并让客户端直接连接到该datanode检索数据
  • namenode只需要相应块位置的请求(这些信息储存在内存中)

剖析文件写入

  1. 客户端通过对DistributedFileSystem对象调用create()函数来新建文件
  2. DistributedFileSystemnamenode创建一个RPC调用, 在文件系统的命名空间中新建一个文件, 此时该文件中还没有相应的数据块
  3. namenode检查文件是否存在及客户端是否有该文件的权限
  • 检查通过,namenode就会为创建新文件记录一条记录
  • 否则,文件创建失败,并向客户端抛出一个IOException异常
  1. DistributedFileSystem向客户端返回一个FSDataOutputStream对象,由此客户端可以开始写入数据

    FSDataOutputStream封装一个DFSOutputStream对象, 该对象负责处理datanodenamenode之间的通讯

  2. 在客户端写入数据时,DFSOutputStream将它分成一个个的数据包, 并写入内部队列, 称为 "数据队列". DataStreamer处理数据队列,它的责任是根据datanode列表来要求namenode分配适合的新块来储存数据副本

  3. 客户端完成数据的写入后, 对数据流调用close()方法,该操作将剩余的所有数据包写入datanode管线,并在联系到namenode且发送文件写入完成信号之前,等待确认

  4. namenode已经知道文件由哪些块组成(通过DataStreamer请求分配数据块),所以它在返回成功前只需等待数据块进行最小量复制

一致模型

文件系统的一致模型(coherency model)描述了文件读写的数据可见性,HDFS为性能牺牲了一些POSIX要求

  • 新建一个文件之后,能在文件系统的命名空间中立即可见, 但是文件的内容不保证能立即可见,及时数据流已经刷新(out.flush())并存储
  • 当前正在写入的块对其他reader不可见,HDFS提供一个方法来使所有缓存与数据节点强行同步,即对FSDataOutputStream调用sync()方法.当sync()方法返回成功后,对所有新的reader而言,HDFS能保证文件中到目前为止写入的数据均到达所有datanode的写入管道并且对所有新的reader均可见
  Path p = new Path("p");
FSDataOutputStream out = fs.create(p);
out.write("content".getBytes("UTF-8"));
out.flush();
out.sync();
  • 在HDFS中关闭文件其实还隐含执行sync()方法

如果不调用sync()方法,在客户端或系统发生故障时可能还丢失数据块

Hadoop权威指南:HDFS-数据流的更多相关文章

  1. Hadoop权威指南:压缩

    Hadoop权威指南:压缩 [TOC] 文件压缩的两个好处: 减少储存文件所需要的磁盘空间 加速数据在网络和磁盘上的传输 压缩格式总结: 压缩格式 工具 算法 文件扩展名 是否可切分 DEFLATE ...

  2. 《Hadoop权威指南》读书笔记1

    <Hadoop权威指南>读书笔记 Day1 第一章 1.MapReduce适合一次写入.多次读取数据的应用,关系型数据库则更适合持续更新的数据集. 2.MapReduce是一种线性的可伸缩 ...

  3. Hadoop权威指南:通过FileSystem API读取数据

    Hadoop权威指南:通过FileSystem API读取数据 [TOC] 在Hadoop中,FileSystem是一个通用的文件系统API 获取FileSystem实例的几个静态方法 public ...

  4. Hadoop权威指南:从Hadoop URL读取数据

    [TOC] Hadoop权威指南:从Hadoop URL读取数据 使用java.net.URL对象从Hadoop文件系统读取文件 实现类似linux中cat命令的程序 文件名 HDFSCat.java ...

  5. Hadoop权威指南:数据完整性

    Hadoop权威指南:数据完整性 [TOC] 常用的错误检测码是CRC-32(循环冗余校验) HDFS的数据完整性 HDFS会对写入的所有数据计算校验和,并在读取数据时验证校验和 datanode负责 ...

  6. Hadoop权威指南:HDFS-Hadoop存档

    Hadoop权威指南:HDFS-Hadoop存档 [TOC] 每个文件按块方式存储, 每个块的元数据存储在namenode的内存中 Hadoop存档文件或HAR文件是一个更高效的文件存档工具,它将文件 ...

  7. Hadoop权威指南:通过distcp并行复制

    Hadoop权威指南:通过distcp并行复制 distcp是一个分布式复制程序,改程序可以从Hadoop文件系统间复制大量数据,也可以将大量的数据复制到Hadoop中 distcp的典型应用是在两个 ...

  8. Hadoop权威指南:HDFS-目录,查询文件系统,删除文件

    Hadoop权威指南:HDFS-目录,查询文件系统,删除文件 [TOC] 目录 FileSystem实例提供了创建目录的方法 public boolean mkdirs(Path f) throws ...

  9. Hadoop权威指南:HDFS-写入数据

    Hadoop权威指南:HDFS-写入数据 FileSystem类有一系列的新建文件的方法.最简单的方法是给准备建的文件指定一个Path对象,然后返回一个用于写入数据的输出流: public FSDat ...

随机推荐

  1. MongoDB 基本命令

    ./mongo  进入命令行. 1.show dbs 显示当前数据库服务器上的数据库 2.use pagedb 切换到指定数据库pagedb的上下文,可以在此上下文中管理pagedb数据库以及其中的集 ...

  2. Manacher 最长回文子串。

    最长回文子串就是一个字符串的一个子串,他从左往右读和从右往左读是一样的. 可以用 Manacher 算法来求,他的复杂度是 O(n) . 可以看这篇文章 http://blog.csdn.net/yw ...

  3. Spring ---annotation (重点)--AutoWired 不常用

    1. 默认按类型 by type, 如果想用byname, 使用@Qualifier 2. 如果写在set上, @qualifier需要写在参数上 bean.xml: 默认bytype去找set方法, ...

  4. 原理图及PCB设计

    原理图以及元件的绘制1. 画数据总线时,需要给总线一个Net Label,例如:databus[0..7],并且还需要在每个入口和出口处设置一致的标号.2. ERC 电气规则检查,Electronic ...

  5. Post data using ajax in laravel 5

    转自:http://www.tuicool.com/articles/2u2mmmu Post data using ajax in laravel 5 to controller If you ar ...

  6. iOS开发——modifying the autolayout engine from a background thread

    很多时候,我们需要用到多线程的东西,比如红外线检测是否有人经过.这种情况需要搞个子线程在后台不断的检测,这个线程可能是第三方提供的,你调用它给的方法,然后显示提示框的时候,问题就来了. 提示信息:Th ...

  7. Xcode的版本问题

    1. 已经安装了Xcode6,如何再安装Xcode5,并使两者共存? 2. Xcode6升级到Xcode7 适配问题 3. XCODE6中使用iOS7 SDK的方法: 从XCODE 5的目录中: /A ...

  8. iOS学习笔记(十三)——获取手机信息(UIDevice、NSBundle、NSLocale)

    iOS的APP的应用开发的过程中,有时为了bug跟踪或者获取用反馈的需要自动收集用户设备.系统信息.应用信息等等,这些信息方便开发者诊断问题,当然这些信息是用户的非隐私信息,是通过开发api可以获取到 ...

  9. 苹果App Store开发者帐户从申请,验证,到发布应用(4)

    苹果App Store应用内支付(In-App Purchase) IAP简介 IAP的全称是In-App Purchase,应用内付费.这种业务模式允许用户免费下载试用,对应用内提供的商品选择消费, ...

  10. Led控件

    在 WindowMobile 上的模拟LED 显示屏插件 一个简单Led控件 一个经典的控制Led的单片机程序 Led控件(2)——Led显示屏模拟