我只有10 MB大小的文件。我认为在HDFS中,第一个文件消耗了10MB,剩下的54MB被释放出来以广告到可用空间。我的问题是
- 第二个10MB的文件(或下一个10MB文件序列)会继续添加到这个文件中,直到它变成64MB?例如,如果我们总共消耗2个64MB的块和20 MB的第三个块,那么输入分割将给出3个输出2 64MB和1 20MB?这是真的吗
参考Hadoop-最终指南:
HDFS存储小文件的效率很低,因为每个文件都存储在一个块中,并且块元数据由namenode保存在内存中。因此,大量的小文件可能会占用名称节点上的大量内存。(但是,请注意,小文件占用的磁盘空间不会超过存储文件原始内容所需的磁盘空间。例如,块大小为128 MB的1 MB文件使用的是1 MB的磁盘空间,而不是128 MB。)
所以你说得对,"HDFS的第一个文件消耗了10 MB,剩下的54 MB被释放到可用空间。"
然而,HDFS块不是物理存储分配单元,而是逻辑存储分配单元。所以它不会一直添加到这个块中,直到它变成64MB或块大小。(当释放的磁盘空间添加到可用存储时)
映射程序的数量取决于输入拆分的数量,作业客户端在上计算输入拆分,该数据位于运行作业时指定的HDFS上的输入路径中。因此,根据您的示例,它将创建3个输入拆分,2个64MB和1个20MB(假设默认的HDFS块大小)。
块大小(64MB或128MB)指的是文件拆分大小的最大值。即使您的文件大小小于64,也意味着它将被视为块/拆分。
假设块大小为64MB,那么如果假设要保存10MB的文件意味着它只需要10MB,那就是文件的块/溢出。如果假设您要保存70MB的文件,则意味着您的文件将在存储中拆分为64MB和6MB的块/拆分。并没有什么比块应该有64MB或128MB更好的了。