2011-12-19 78 views

回答

13

多个文件不存储在一个块中。顺便说一句,单个文件可以存储在多个块中。文件和block-id之间的映射被保存在NameNode中。

按照Hadoop : The Definitive Guide

不同于单个磁盘文件系统,HDFS中的文件比单块小不占用底层存储的整个数据块的价值。

HDFS旨在处理大型文件。如果有太多的小文件,那么NameNode可能会被加载,因为它存储了HDFS的名称空间。检查此article如何缓解太多小文件的问题。

+0

你知道如何找到块到文件的映射吗? 'hadoop fsck/-files -blocks -locations -racks'给出文件来阻止映射,但是并没有说实际文件系统上的哪个目录是位于哪个块(即它在子目录9或子目录61中)。 – Eugen 2011-12-19 15:39:58

+0

'dfs.datanode.data.dir'属性决定了本地文件系统上DFS数据节点应该存储其块的位置。如果这是以逗号分隔的目录列表,则数据将存储在所有已命名的目录中,通常位于不同的设备上。不存在的目录被忽略。 – 2011-12-19 16:33:14

+0

不,我的意思是当物理块被存储时,它们可以存储在'dfs.datanode.data.dir'或者该目录下的子目录中(由Datanode创建)。有没有办法找到哪个块存储在哪里(作为顶级文件或在某个子目录中)? – Eugen 2011-12-19 22:22:14

3

那么你可以使用HAR(Hadoop Archive)文件系统来尝试将多个小文件打包到由HAR文件系统管理的特殊部分文件的HDFS块中。

3

块将存储单个文件。如果你的文件大于BlockSize(64/128/..),那么它将被分成多个块,并且分别具有BlockSize。

0

主要点需要在HDFS理解,file is partioned into blocks based on size且不会有在存储器中,存储文件的某些块(这是误解)

基本上多个文件不存储在单个块(除非它是档案或Har文件)。

2

Hadoop块大小是Hadoop存储概念。每次当您将文件存储在Hadoop中时,它将被划分为块大小,并且基于复制因子和数据局部性,它将分布在群集中。

有关详情:

  • 当你推HDFS上的文件时,它将被划分成块。每个块就像块大小所描述的具有最大大小的单个文件。

  • 每个块都会包含一个.meta文件,以便在Hadoop上存储该块的元数据信息。

  • 如果文件非常小,那么整个文件将在一个块中,并且块(存储文件)将具有与文件和元文件相同的大小。

一些命令:

  • 连接到群集上的任何数据节点[如果你有机会;)。然后转到该节点的存储目录,您可以看到存储在数据节点上的实际块如下所示。

(DIR的是按我的簇 -/DATA2/DFS/DN /):

块大小:1 GB

坎德拉/数据/ DFS/DN - >电流 - >最终确定 - > subDir0 - >(这里是黄金

块只使用KB的存储对于小文件或者文件大小是我的块大小+一些KB的

012可能是

-rw-R - R-- 1个HDFS HDFS 91K年09月13十六时19 blk_1073781504

-rw-R - R-- 1个HDFS HDFS 19K年09月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 Aug 31 12:04 blk_1073753814_12994.meta

我希望它能解释块存储的东西。如果您想知道您的文件如何存储块中的细节,然后运行

HDFS的fsck -blocks -locations

让我知道如果我在这里漏掉了什么。