HDFS的文件操作流

2019-03-28 14:14|来源: 网络

大家可能对本地文件系统中的文件I/O流已经是非常的熟悉了,那么,像HDFS这种分布式的文件I/O流——基于网络 I/O流的数据流,又是如何实现的呢?这就是本文的重点之一:HDFS的文件写入流。

     熟悉HDFS的人可能知道,当我们调用DistributedFileSystem的create方法时,将会返回一个FSDataOutputStream对象,通过这个对象来对文件进行数据的写入。还是贴一张该对象的类图吧!


现在,我们以调用FSDataOutputStream的write(byte[],int,int)为例来看看HDFS是如何完成文件的数据写入操作的。先see一下这个过程的序列图:


从上图中,我们可以很容易的看出,文件的写入操作,关键是是要看DFSOutputSream,所以,下面我将详细的讨论DFSOutputSream类。

     当创建一个DFSOutputSream实例的时候,它会首先根据设置的一个packet的大小和一个校验块的大小来计算一个packet应该包含多少个校验块(数据块+加校验和)以及这个packet的实际大小。源代码如下:

其中,原始的packet的大小来自配置文件中参数dfs.write.packet.size的设置,校验数据块的大小来自配置文件中参数io.bytes.per.checksum的设置。然后调用ClientProtocol的create远程方法,最后启动线程DataStreamer。整个创建过程的源代码如下:

现在,一切问题就都纠结在DataStream到底是个啥东东,究竟干了些神马勾当才能和DataNode节点联系起来呢?

     实际上,在DataStream中,它总是不停的从packet队列中取出待发送的packet给DataNode节点,当然在这个过程中,它要不断地向NameNode节点申请Blocks,即:当没有Block或申请的一个Block已满时,它会调用ClientProtocol的addBlock远程方法得到一个LocatedBlock,也就是要知道它应该要把这个Block的packet发送到那些DataNode节点上。当然,HDFS对于Block的副本copy采用的是流水线作业的方式:client把数据Block只传给一个DataNode,这个DataNode收到Block之后,传给下一个DataNode,依次类推,...,最后一个DataNode就不需要下传数据Block了。噢,当DataStream把一个Block的所有Packet传送完毕之后,必须要等待所有的Packet被ack之后才能重新申请新的Block来传送后面的packet。

相关问答

更多
  • 恭喜啊,学习hadoop需要先学好命令啊。 想学Linux命令就去www.linuxsky.cn,里面也可以学习脚本和svn的命令,哈哈
  • 都可以,hbase也是建立在hdfs之上的,,Hive更适合于数据仓库的任务,Hive主要用于静态的结构以及需要经常分析的工作。Hive与SQL相似促使其成为Hadoop与其他BI工具结合的理想交集。 Pig赋予开发人员在大数据集领域更多的灵活性,并允许开发简洁的脚本用于转换数据流以便嵌入到较大的 应用程序。 Pig相比Hive相对轻量,它主要的优势是相比于直接使用Hadoop Java APIs可大幅削减代码量。 Hive和Pig都可以与HBase组合使用,Hive和Pig还为HBase提供了高层语言支持 ...
  • hadoop fs -chomd +x /upload/Hello 你这句话是错误的,chmod使用u+x 试试 ,不能单独使用+x来修改文件的权限.
  • hdfs的数据实际上是存储在本地文件系统中的。在配置hadoop时你需要配置hdfs的存储文件夹,如果你的用户名为root,文件夹位置是/root/tmp。那么你的hdfs的数据存储在/root/tmp/dfs/data/current中。其中block是块文件,也就是数据文件,.meta是元数据。hadoop是java写的,因此hadoop存储的数据的方式使用的也是java的方式。
  • 如何上传的?api么?你写两个不同的文件试试 先确定问题在哪,如果有错误日志贴出来
  • 您可以从hadoop ls命令检索时间戳并使用awk解析它。文件/目录时间戳有模式。 对于文件它是 permissions number_of_replicas userid groupid filesize modification_date modification_time filename 它是目录 permissions userid groupid modification_date modification_time dirname 文件的第6和第7个字段为您提供修改日期和时间。 您可以 ...
  • 看起来这还有待解决: https : //jira.spring.io/browse/XD-992 。 你可以投票了。 如果您想贡献,欢迎您。 有关如何开发模块的示例,请参阅Spring XD文档和https://github.com/spring-projects/spring-xd-modules 。 另外,仅供参考:有hdfs-dataset sink模块支持Avro / Parquet格式。 https://github.com/spring-projects/spring-xd/blob/mast ...
  • HBase没有更新 。 当您在HBase中执行删除操作(整行或特定单元格)时,会将特殊删除标记添加到单元格中。 即将到来的扫描或获取操作不会看到该单元格。 当您执行插入操作时,只需使用当前时间戳创建一个新单元格。 扫描并获取操作将返回更新版本的单元格。 真正的物理删除是在HBase 主要压缩过程中执行的。 另外,减少了HFile的压缩次数以提供更快的读取操作。 There are no updates in HBase. When you perform a delete in HBase (the who ...
  • 正如第一个链接中提到的那样 许多管理HDFS命令需要作为“hdfs”操作系统用户运行,这是默认的HDFS超级用户 默认超级用户通常是hdfs ,但不一定。 ...... Hadoop没有固定的超级用户。 Hadoop的系统超级用户只是启动NameNode的操作系统用户。 HDFS超级用户不必是NameNode主机的root用户 HDFS中没有真正的“用户/组”。 默认情况下,它是来自本地操作系统用户的所有字符串。 任何用户都可以覆盖 。 没有Kerberos,Hadoop绝对没有真正的授权。 如果启用per ...
  • 启用WAL时,数据将被序列化并保存到HDFS中。 因此,您的所有假设都是正确的,HDFS文件变得更大。 但是,它会通过单独的过程进行清理。 我没有得到解释这个的实际参考,但你可以在源代码中看到它。 此外,它还会引入更长的处理时间,因为这些流程与您的转换和操作一起运行 When you enable WAL, data is being serialized and saved into HDFS. Therefore, all your assumptions are right, HDFS file ge ...