hadoop - 为什么HDFS客户端会将文件数据缓存到一个临时的本地文件中?

标签 hadoop caching hdfs

为什么HDFS客户端不能直接发送到DataNode?

HDFS客户端缓存有什么优势?

  1. 创建文件的应用程序请求不会立即到达 NameNode。
  2. 事实上,HDFS 客户端最初会将文件数据缓存到一个临时的本地文件中。
  3. 应用程序写入透明地重定向到这个临时本地文件。
  4. 当本地文件积累了至少一个 HDFS block 大小的数据时,客户端联系 NameNode 创建一个文件。
  5. NameNode 然后按照创建部分中的描述继续进行。客户端将数据 block 从本地临时文件刷新到指定的DataNodes。
  6. 当文件关闭时,临时本地文件中剩余的未刷新数据将传输到DataNode。
  7. 然后客户端告诉NameNode文件已经关闭。
  8. 此时,NameNode 将文件创建操作提交到持久存储中。如果 NameNode 在文件关闭之前死亡,则文件丢失。

最佳答案

听起来您正在引用 Apache Hadoop HDFS Architecture文档,特别是标题为 Staging 的部分.遗憾的是,此信息已过时,不再是对当前 HDFS 行为的准确描述。

相反,客户端立即向 NameNode 发出一个 create RPC 调用。 NameNode 在其元数据中跟踪新文件,并回复一组可以接收 block 数据写入的候选 DateNode 地址。然后,客户端开始向文件写入数据。当客户端写入数据时,它正在写入到 DataNode 的套接字连接上。如果写入的数据变得大到超过 block 大小边界,那么客户端将再次与 NameNode 交互以进行 addBlock RPC 在 NameNode 元数据中分配一个新 block 并获得一组新的候选 DataNode位置。客户端写入本地临时文件是没有意义的。

但是请注意,替代文件系统(例如与 Amazon S3 集成的 S3AFileSystem)可能支持缓冲到磁盘的选项。 (如果您对此有兴趣,请参阅 Integration with Amazon Web Services 的 Apache Hadoop 文档。)

我已经提交了 Apache JIRA HDFS-11995跟踪更正文档。

关于hadoop - 为什么HDFS客户端会将文件数据缓存到一个临时的本地文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44606691/

相关文章:

hadoop - 50 个节点 hadoop passphraseless

c++ - 如何使用 C++ 在 HDFS 上写入 Parquet 文件?

docker - 在hadoop-3.1.3中运行一个mapper和reducer程序

mongodb - 如何将子文档数据数组从mongodb加载到Hive

java - 如何在 LoadingCache 中有效存储可能具有多个键的对象

当内存带宽受限时 SSE 和 AVX 的性能

hadoop - 删除 DataNode 目录时的 HDFS 行为

hadoop - Spark Shell - __spark_libs__.zip 不存在

hadoop - 启用 hadoop 和 kerberos 的 datastax enterprise 出错

c++ - 绳索: "large enough to benefit from cache effects"是什么?