【发布时间】:2015-11-04 04:35:33
【问题描述】:
我只有 10 MB 大小的文件。我认为在 HDFS 中,第一个文件消耗 10 MB,其余 54 MB 被释放到可用空间中。 我的问题是——
- 第二个 10 MB 文件(或下一个 10 MB 文件序列)会继续添加到此文件中,直到变为 64 MB? 例如- 如果我们总共消耗 2 个 64 MB 的块和 20 MB 的第 3 个块,那么输入拆分将提供 3 个输出 2 64MB 和 1 20MB?是真的吗?
【问题讨论】:
我只有 10 MB 大小的文件。我认为在 HDFS 中,第一个文件消耗 10 MB,其余 54 MB 被释放到可用空间中。 我的问题是——
【问题讨论】:
参考 Hadoop - The Definitive Guide:
HDFS 存储小文件效率低,因为每个文件都存储在一个块中,并且块元数据由名称节点保存在内存中。因此,大量的小文件会占用 namenode 上的大量内存。 (但是请注意,小文件占用的磁盘空间不会超过存储文件原始内容所需的空间。例如,以 128 MB 块大小存储的 1 MB 文件使用 1 MB 的磁盘空间,而不是 128 MB。)
所以你说得对,“HDFS 第一个文件消耗 10 MB,其余 54 MB 被释放到可用空间。”
但是,HDFS 块不是物理存储分配单元,而是逻辑存储分配单元。所以它不会一直添加到这个块,直到它变成 64 MB 或块大小。(作为释放的磁盘空间已添加到可用存储空间)
映射器的数量取决于 inputsplit 的数量,并且 Job Client 会根据运行作业时指定的位于 HDFS 上的输入路径中的数据计算输入拆分。因此根据您的示例,它将创建 3 个输入分割,2 64MB 和 1 20MB(假设默认 HDFS 块大小)。
【讨论】:
块大小(64MB 或 128MB)指的是文件分割大小的最大值。即使您的文件大小小于 64 也意味着它将被视为块/拆分。
考虑块大小为 64MB,那么如果假设你要保存 10MB 的文件意味着它只需要 10MB,那就是你的文件的块/拆分。 如果假设您要保存 70MB 文件,则意味着您的文件将在存储中将其拆分为 64MB 和 6MB 块/拆分。没有什么像块应该有 64MB 或 128MB。
【讨论】: