我认为我的问题最好用一个例子来解释。假设您将图像存储在 HDFS 上。该图像足够大,可以在 HDFS 上分成四个独立的较小文件。当您执行返回该图像的操作时,Hadoop 是否会返回这 4 个可以组合回原始图像的小文件?还是 Hadoop 会自动将 4 个小文件重新组合回原始文件?
谢谢!
Hadoop 分布式文件系统 (HDFS) 将每个文件存储在一个或多个块中(每个块被复制一次或多次)。
对于每个文件,您可以配置文件块大小和复制因子(如果未提供,则使用默认值)。
当您执行任何基于文件的操作时,您正在处理数据流,名称节点是将文件路径映射到块及其位置(数据节点)的中央存储库。
举个例子,假设您有一个 32 MB 的文件块大小和一个 50MB 的文件 - 这将被分成 2 个块(32 MB 和 18 MB)。如果配置的文件复制因子是 3,那么 NameNode 将尝试并确保每个块被复制到集群中的 3 个数据节点。
当您尝试从该文件中读取数据时,会返回一个 FSInputStream,它与大多数输入流一样,您可以查找文件中的某个字节位置。DFSClient 将您从细节中抽象出来,但它知道特定的字节偏移量,它与哪个块相关并无缝获取字节(即使您在块边界之间跨步)。
因此,总结并解决您的问题 - 对于从 HDFS 读取的客户端,它看起来像一个连续的输入流,但实际上是根据需要拼接在一起的 4 个块
我不确定该示例是否完全符合 Hadoop 的正常使用方式。
但是,如果您的结果是一个大文件,那么它将作为较小的子文件存储在 HDFS 中。如果您通过 HDFS 文件系统操作检索它,那么它将作为单个逻辑文件返回。