HDFS Datanode与Client之间的数据传输

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

在HDFS之中,Datanode与Namenode之间是通过RPC进行通信的;在Datanode和Client之间的通信通过两种方式来完成,一种是通过RPC(主要有三个方法recoverBlock、getBlockInfo、getBlockLocalPathInfo),另外一种方式是通过普通的socket。Client与Datanode之间的数据传输就是通过普通的socket来进行传输的。

在类Datanode中包含DataXceiverServer的一个实例,该实例实现ServerSocket功能,主要是接受Client的socket的连接。DataXceiverServer接受socket连接后,启动一个线程DataXceiver。DataXceiver具体负责与Client之间进行block的传输与操作,具体有一下几种操作:

  • OP_READ_BLOCK:client从Datanode中读取一个block
  • OP_WRITE_BLOCK:client写一个block到Datanode
  • OP_REPLACE_BLOCK:Receive a block and write it to disk, it then notifies the namenode to remove the copy from the source.
  • OP_COPY_BLOCK:Read a block from the disk and then sends it to a destination
  • OP_BLOCK_CHECKSUM:获取一个block的校验和

DataXceiver通过BlockSender和BlockReceiver来完成block的发送与接收。BlockSender具体负责将block发送到Client;BlockReceiver具体负责接收Client的block,并将其写入到本Datanode以及管线的其他Datanode。

相关问答

更多
  • 我没用过Hive,但HDFS的存储机制都是一样的。 你所谓的物理位置指的是在操作系统中的磁盘路径? 这个路径是在Hadoop配置的时候写在hdfs-site.xml文件的dfs.datanode.data.dir字段里的,在每个datanode的这个文件夹里存着该节点上存储的所有数据块block,以blk_打头。 dfs.namenode.data.dir指定的文件夹在namenode中则存在元数据。 所以即便你知道这个所谓的物理路径也没什么用,数据都是以block形式存在的,大的数据还由好多个block组 ...
  • 你的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. ...
  • 您可以使用表单示例subprocess.call或sh库执行任意shell命令,所以这样的东西应该可以正常工作: import subprocess some_path = ... subprocess.call(["hadoop", "fs", "-rm", "-f", some_path]) 如果您使用Python 2.x,您可以尝试使用spotify/snakebite : from snakebite.client import Client host = ... port = ... cli ...
  • 正如第一个链接中提到的那样 许多管理HDFS命令需要作为“hdfs”操作系统用户运行,这是默认的HDFS超级用户 默认超级用户通常是hdfs ,但不一定。 ...... Hadoop没有固定的超级用户。 Hadoop的系统超级用户只是启动NameNode的操作系统用户。 HDFS超级用户不必是NameNode主机的root用户 HDFS中没有真正的“用户/组”。 默认情况下,它是来自本地操作系统用户的所有字符串。 任何用户都可以覆盖 。 没有Kerberos,Hadoop绝对没有真正的授权。 如果启用per ...
  • Apache NiFi提供站点到站点功能,用于在两个实例之间传输数据。 你可以在这里读到它: https://nifi.apache.org/docs/nifi-docs/html/user-guide.html#site-to-site Apache NiFi provides the site-to-site feature for transferring data between two instances. You can read about it here: https://nifi.apac ...
  • HDFS只是一个分布式文件系统,如果不通过中间组件,则无法查询文件。 Hbase是一个nosql数据库,可以将数据保存在HDFS上,当您需要随机访问数据时使用它。 如果要将文件按原样存储在HDFS上并进行查询,可以使用Hive在其上创建外部表。 HDFS is just a distributed file system, you cannot query your files without passing by an intermidiate component. Hbase is a nosql da ...
  • 不,它不会删除3个块。 所以这是它的工作原理,我们假设块4位于FSDataOuputStream维护的队列的下一个队列中。 由于某些网络问题而写入一些x字节后,数据节点失败,首先关闭管道并删除写入该数据的任何数据,新的良好数据节点被赋予新的标识并被添加到队列中并传达给队列name节点更新块4的元数据信息,然后数据将从该块的第1个字节开始写入新识别的datanode。 “权威指南”中的文件写作剖析可以帮助您更好地理解它是如何完成的。 No it will not delete the 3 blocks. So ...
  • 使用Teradata DB本身 - 没有。 然而:),Teradata提供所谓的UDA ( 统一数据架构 ),其中Teradata,Aster DB和Hadoop(HDFS)相互连接,几乎可以无缝地协同工作:)。 通常,如果您只想使用非结构化数据,请选择Aster。 这是Teradata的产品,您可以直接与HDFS连接。 HDFS在这里用作廉价且快速的数据存储。 更有趣的解决方案将提出新的Aster版本(6),其中将实现AFS ( Aster文件系统 )。 ASR是一种类似于HDFS的分布式文件系统。 我也 ...
  • 实现自己的DFS接口并使其与hadoop一起使用相对简单。 您所需要的只是文件和目录的文件系统概念与您的存储之间的某种逻辑映射。 在NoSQL的情况下(如果我假设KeyValue),您应该决定如何表示目录。 您可以执行一些特殊节点,也可以将路径放入密钥。 另一个决策点 - 决定您是否关心数据位置 关于文档,我认为s3n DFS实现的来源最好从一开始。 我认为关闭的例子是由DataStax完成的Cassandra上的Hadoop http://www.datastax.com/ 另一个例子(我们稍后做的事情) ...
  • 使用NUTCH 使用卡夫卡水槽 使用spring xd scrapper import.io 生产者消费者的java程序 Using NUTCH Using Kafka flume Using spring xd scrapper import.io java program by producer consumer