hadoop:hdfs文件写入和读取

ulydmbyx  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(436)

我有一个关于hdfs中文件写入和读取的基本问题。
例如,如果我正在使用默认配置编写一个文件,hadoop必须在内部将每个块写入3个数据节点。我的理解是,对于每个块,首先客户机将块写入管道中的第一个数据节点,然后该节点将通知第二个数据节点,依此类推。一旦第三数据节点成功地接收到块,它就向数据节点2并最终通过数据节点1向客户端提供确认。只有在接收到块的确认之后,写入才被认为是成功的,并且客户端继续写入下一个块。
如果是这样的话,那么写每个块所花的时间不是比传统的文件写多了吗-
复制因子(默认值为3)和
写入过程是一块接一块依次进行的。
如果我理解错误,请纠正我。另外,请回答以下问题:
我的理解是,hadoop中的文件读/写没有任何并行性,它的最佳性能与传统的文件读/写相同(即,如果复制设置为1)+分布式通信机制中涉及的一些开销。
并行性仅在通过map reduce的数据处理阶段提供,而在客户机读/写文件期间不提供。

ippsafx7

ippsafx71#

hdfs写入操作:
有两个参数 dfs.replication :默认块复制。创建文件时可以指定实际的复制次数。如果在创建时中未指定复制,则使用默认值 dfs.namenode.replication.min :最小块复制。
尽管 dfs.replication 设置为3,一旦dfs.namenode.replication.min,写入操作将被视为成功( default value : 1 )已复制。
但这种复制 dfs.replication 将在顺序管道中发生。第一个datanode写入块并将其转发给第二个datanode。第二个datanode写入块并将其转发给第三个datanode。 DFSOutputStream 还维护等待datanodes确认的数据包的内部队列,称为ack队列。只有当数据包已被管道中的所有数据节点确认时,才会从ack队列中删除该数据包。
看一下相关的se问题:Hadoop2.0数据写入操作
hdfs读取操作:
hdfs读取操作发生在 parallel 而不是顺序的写操作

xmakbtuz

xmakbtuz2#

尽管您对文件写入的上述解释是正确的,但datanode可以同时读取和写入数据。来自hdfs架构指南:
数据节点可以从管道中的前一个节点接收数据,同时将数据转发到管道中的下一个节点
写操作比在传统文件系统上花费更多的时间(由于带宽问题和一般开销),但不到3倍(假设复制系数为3)。

vyu0f0g1

vyu0f0g13#

我认为你的理解是正确的。
一个简单的hdfs客户机可能会写入一些数据,当至少写入了一个块副本时,它会收回控制,而hdfs会异步生成其他副本。
但是在hadoop中,hdfs是围绕着“写一次,读很多次”的模式设计的,所以重点不是写性能。
另一方面,您可以在hadoopmapreduce(也可以看到hdfs客户机)中找到并行性,hadoopmapreduce就是这样设计的。

相关问题