Hadoop-1.0.0 HDFS append操作深入分析

2019-03-28 13:56|来源: 网络

社区版Hadoop 1.0.0中对HDFS append操作进行了重新设计和实现,解决了之前append操作实现的很多缺陷。下图是对HDFS append操作详细的一般分析,该操作涉及到client,namenode和datanode的很多交付,可见其复杂性。

从Client角度来看,append一个文件首先需要调用DistributedFileSystem的append操作,该操作会返回一个FSDataOutputStream的流对象out,Client要向该文件append数据,可以调用out.write写入数据,最后调用out.close进行关闭。但是其内部的交互流程比较复杂,下面我们从上述三个client端的调用来进行逐一深入分析:

1. client调用fs的append操作:

1.1 首先调用namenode的getFileInfo RPC调用,获取该文件的信息

1.2 调用namenode的appendFile RPC调用,进行lease的检查(是否可以append,如果已经被别的client在append了,就不能再进行append),将该文件从INodeFile转换从INodeFileUnderConstruction,并且将该文件的最后一个Block以LocatedBlock的对象返回给Client。如果没有则返回null。注意,上述的流程图表示的是要append的文件之前已经成功关闭并且是一个INodeFile类型文件,否则需要判断拥有该文件append权限的client的lease是否过期,如果过期则进行lease recover操作并由namenode发起block recover操作来关闭文件。

1.3 如果上面的调用返回的LocatedBlock不为null,则在Client中创建Outputstream时调用processDatanodeError方法进行block recover操作。具体是从LocatedBlock中获取该block位于哪些datanodes上(这里假设是Datanode1, Datanode2和Datanode3),然后从这些Datanode中选取一个primaryDatanode,由该datanode(这里假设是datanode1)进行block recover的操作。在进行block recover的操作中,首先datanode1协调其他两个datanode进行startBlockRecovery操作,目的是强制终止该block file的写线程,然后调用syncBlock操作,在syncBlock操作中由datanode1调用namenode的nextGenerationStampForBlock操作获取新的GS,datanode1再协调相关datanode进行updateBlock操作,即将本地的block file更新长度和GS,最后datanode1向namenode汇报commitBlockSynchronization,至此该block recover完毕。另外,上面提到由namenode发起的block recover操作,其实流程跟由primary datanode发起的类似,只是参数有些区别而已。

2.向流对象out写数据:

2.1 在1.3调用processDatanodeError时也创建了写block的pipeline,通过该pipeline,client将数据写入pipeline中的datanodes中,这个操作是有datanode的dataxceiver.writeBlock来执行。

2.2 如果一个block写满了,Client会关闭pipeline,Datanode会把写入的block通过blockReceived汇报给namenode。然后client调用namenode的addBlock(getAdditionalBlock)获得新的block的信息(包括目标datanodes),client获得这些信息后再次建立pipeline,并写入,如此反复。注意,getAdditionalBlock会判断它前面的前面的block是否有datanode汇报上来了,如果没有,则会返回给client NotReplicatedYetException异常。

3.关闭流对象:

3.1 client关闭OutputStream时将buffer中的剩余数据通过flush的方式写入到datanode中,并标识为该block结束,datanode获取这些信息后,向namenode.blockReceived汇报block的接受信息。

3.2 client再调用namenode的completeFile,通知namenode该文件可以关闭,在completeFile函数中,namenode会检查该文件所有的block是否都至少有一个datanode汇报上来了,如果没有,则返回client继续等待的标识,如果是则将该文件的lease删除并将该文件从INodeFileUnderConstruction变回为INodeFile。

相关问答

更多
  • 恭喜啊,学习hadoop需要先学好命令啊。 想学Linux命令就去www.linuxsky.cn,里面也可以学习脚本和svn的命令,哈哈
  • hdfs的数据实际上是存储在本地文件系统中的。在配置hadoop时你需要配置hdfs的存储文件夹,如果你的用户名为root,文件夹位置是/root/tmp。那么你的hdfs的数据存储在/root/tmp/dfs/data/current中。其中block是块文件,也就是数据文件,.meta是元数据。hadoop是java写的,因此hadoop存储的数据的方式使用的也是java的方式。
  • hadoop hdfs的问题[2021-10-30]

    最下面那张图里环境变量设置的那一行多了一个$符号 export JAVA_HOME=/usr/java/jdk1.6.0_35
  • 你的hadoop参数配置正确了吗?在hdfs-site.xml中把以下属性修改为true才可以。 dfs.support.append true 下面有一段测试代码,你可以参考一下: package com.wyp; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io. ...
  • 终于摆脱了错误。 显然,必须关闭从filesystem调用create时返回的FSDataOutputStream 。 话虽这么说,这就是现在实现HDFSFileUtilImpl的方法createFileInCluster : @Override public void createFileInCluster(String uriOfFile) throws IOException { Validate.notEmpty(uriOfFile); FSDataOutputStream ...
  • HBase没有更新 。 当您在HBase中执行删除操作(整行或特定单元格)时,会将特殊删除标记添加到单元格中。 即将到来的扫描或获取操作不会看到该单元格。 当您执行插入操作时,只需使用当前时间戳创建一个新单元格。 扫描并获取操作将返回更新版本的单元格。 真正的物理删除是在HBase 主要压缩过程中执行的。 另外,减少了HFile的压缩次数以提供更快的读取操作。 There are no updates in HBase. When you perform a delete in HBase (the who ...
  • 您在构建时是否在./configure中启用了HDFS支持? 如果禁用HDFS,那就是你会得到的错误。 我认为你做了正确的改变让它发挥作用。 随意发送拉取请求以在macOS上查找.dylib。 Did you enable HDFS support in ./configure when building? That's the error you would get if HDFS is disabled. I think you made the correct change to make it wo ...
  • 因此,除非nltk能够识别HDFS,否则这将不可能完全实现。 但是像NLTK这样的大多数程序都允许您将数据直接传递给程序。 假设是这种情况,您可以使用我在其他答案中建议的内容, 如何在mapper或reducer中运行外部程序,将HDFS文件作为输入并将输出文件存储在HDFS中? 。 您基本上编写了一个小型java适配器,它打开HDFS文件的输入流并将其传递给您要运行的程序。 如果这听起来太麻烦,或者由于某种原因在你的情况下是不可能的,那么你总是可以使用HDFS获取将文件放入本地地址。 So this wo ...
  • 无论如何,我只是继续安装Kerberos,看看它是否可行。 现在存在/etc/krb5.conf,大的延迟消失了。 我想知道我是否可以在其中创建没有任何内容的文件。 Hrmmm ... sudo apt-get install krb5-kdc krb5-admin-server I just went ahead and install Kerberos anyways just to see if it would work. Large delays have disappeared now tha ...
  • 对我来说HDFS出现在这里: 但不在这里: 第一个新查询>来自其他来源对您来说是什么样的? For me HDFS shows up here: but not here: What does the first New Query > From Other Sources look like for you?