【发布时间】:2011-12-19 14:42:25
【问题描述】:
Hadoop分布式文件系统中的一个块是存储多个小文件,还是一个块只存储一个文件?
【问题讨论】:
Hadoop分布式文件系统中的一个块是存储多个小文件,还是一个块只存储一个文件?
【问题讨论】:
多个文件不会存储在一个块中。顺便说一句,单个文件可以存储在多个块中。文件和block-ids之间的映射被持久化在NameNode中。
根据Hadoop : The Definitive Guide
与单个磁盘的文件系统不同,HDFS 中小于单个块的文件不会占用整个块的底层存储空间。
HDFS 旨在处理大文件。如果有太多小文件,那么 NameNode 可能会被加载,因为它存储了 HDFS 的名称空间。查看article,了解如何缓解小文件过多的问题。
【讨论】:
hadoop fsck / -files -blocks -locations -racks 提供文件到块的映射,但没有说明块位于实际文件系统上的哪个目录(即它是在 subdirectory9 还是 subdirectory61 中)。
dfs.datanode.data.dir 属性确定 DFS 数据节点应在本地文件系统上存储其块的位置。如果这是一个逗号分隔的目录列表,那么数据将存储在所有命名的目录中,通常在不同的设备上。不存在的目录将被忽略。
dfs.datanode.data.dir 或该目录下的子目录中(由 Datanode 创建)。有没有办法找到哪个块存储在哪里(作为顶级文件或某个子目录中)?
Hadoop 块大小是 Hadoop 存储概念。每次当您在 Hadoop 中存储文件时,它都会划分为块大小,并根据复制因子和数据位置分布在集群中。
详情:
当您在 HDFS 上推送文件时,它将被分成块。每个块就像一个单独的文件,具有块大小所描述的最大大小。
每个块都会包含一个 .meta 文件,用于将块的元数据信息存储在 Hadoop 上。
如果文件非常小,则整个文件将在一个块中,并且块(存储文件)将与文件和元文件具有相同的大小。
一些命令:
(目录根据我的集群 - /data2/dfs/dn/):
块大小:1 GB
cd /data/dfs/dn -> current -> Finalized -> subDir0 -> (这是黄金)
块仅使用 KB 的存储空间来存储小文件,或者当文件大小为我的块大小 + 一些 KB 时可能会用到
-rw-r--r-- 1 hdfs hdfs 91K Sep 13 16:19 blk_1073781504
-rw-r--r-- 1 hdfs hdfs 19K Sep 13 16:21 blk_1073781504_40923.meta
当文件更大时,块的大小将如下所示
-rw-r--r-- 1 hdfs hdfs 1.0G 8月31日12:03 blk_1073753814
-rw-r--r-- 1 hdfs hdfs 8.1M 8 月 31 日 12:04 blk_1073753814_12994.meta
我希望它能解释块存储的东西。如果您想了解文件如何存储在块中的详细信息,请运行
hdfs fsck -blocks -locations
如果我在这里遗漏了什么,请告诉我。
【讨论】:
您可以使用 HAR(Hadoop 存档)文件系统来做到这一点,该文件系统尝试将多个小文件打包到由 HAR 文件系统管理的特殊部分文件的 HDFS 块中。
【讨论】:
一个块将存储一个文件。如果您的文件比 BlockSize(64/128/..) 大,那么它将被划分为多个具有相应 BlockSize 的块。
【讨论】:
在hdfs中需要理解的重点,file is partioned into blocks based on size而不是内存中会有一些块,存储文件的地方(这是误解)
基本上多个文件不会存储在一个块中(除非它是存档或 Har 文件)。
【讨论】: