【问题标题】:How data in an HDFS block is stored?HDFS 块中的数据如何存储?
【发布时间】:2015-01-10 02:55:00
【问题描述】:

我正在阅读有关 HDFS 的内容,想知道是否有任何特定格式可以排列块中的数据。

假设有一个 265 MB 的文件被复制到 Hadoop 集群,并且 HDFS 块大小为 64 MB。所以文件被分成 5 个部分——64 MB + 64 MB + 64 MB + 64 MB + 9 MB,并分布在数据节点之间。对吗?

  1. 我怀疑存储数据的 64 MB 块中是否存在任何格式?
  2. 如果有任何格式/结构将数据存储在块中,则存储的数据应小于 64 MB,因为数据结构/标头等本身可能会占用一些空间。
  3. 由于 HDFS 数据节点是一个逻辑文件系统(它运行在 linux 之上,HDFS 没有单独的分区),所有的块都应该作为文件存储在 linux 分区中。正确吗?
  4. 如何知道linux上实际存储64 MB HDFS块的文件名?

任何人,如果可以回答这些疑问/问题,那就太好了。提前致谢。

问候,

(*Vipul)();

【问题讨论】:

    标签: linux hadoop hdfs


    【解决方案1】:
    1. 不,数据只是在 64MB 边界上拆分。元数据存储在一个单独的小文件和 Namenode 上
    2. 不,这正是您指定的大小,并且数据在 64MB 的确切边界上被分割。如果您有 5 个部分 - 64 MB + 64 MB + 64 MB + 64 MB + 9 MB,那么最后一个文件将是 9MB,所有其他文件都是 64MB
    3. 是的,块存储为一个文件,每个块都表示为一个单独的文件,其中一些元数据存储在一个单独的文件中
    4. hdfs fsck / -files -blocks -locations

    以下是如何以 128MB 块大小存储块文件的示例:

    -rw-r--r--. 1 hdfs hadoop 134217728 Jan 12 09:17 blk_1073741825
    -rw-r--r--. 1 hdfs hadoop   1048583 Jan 12 09:17 blk_1073741825_1001.meta
    -rw-r--r--. 1 hdfs hadoop 134217728 Jan 12 09:18 blk_1073741826
    -rw-r--r--. 1 hdfs hadoop   1048583 Jan 12 09:18 blk_1073741826_1002.meta
    -rw-r--r--. 1 hdfs hadoop 134217728 Jan 12 09:18 blk_1073741827
    -rw-r--r--. 1 hdfs hadoop   1048583 Jan 12 09:18 blk_1073741827_1003.meta
    -rw-r--r--. 1 hdfs hadoop 134217728 Jan 12 09:18 blk_1073741828
    -rw-r--r--. 1 hdfs hadoop   1048583 Jan 12 09:18 blk_1073741828_1004.meta
    -rw-r--r--. 1 hdfs hadoop 134217728 Jan 12 09:19 blk_1073741829
    -rw-r--r--. 1 hdfs hadoop   1048583 Jan 12 09:19 blk_1073741829_1005.meta
    -rw-r--r--. 1 hdfs hadoop 134217728 Jan 12 09:19 blk_1073741830
    -rw-r--r--. 1 hdfs hadoop   1048583 Jan 12 09:19 blk_1073741830_1006.meta
    -rw-r--r--. 1 hdfs hadoop  87776064 Jan 12 09:19 blk_1073741831
    -rw-r--r--. 1 hdfs hadoop    685759 Jan 12 09:19 blk_1073741831_1007.meta
    

    【讨论】:

    • 谢谢 0x0FFF,我执行了你指定的命令“hadoop fsck / -files -blocks -locations”,它给出了一个长的结果和这样的行 - /user/vpathak/testData/u。项目 236344 字节,1 个块:OK 0。 blk_-7097388478926784482_1004 len=236344 repl=1 [127.0.0.1:50010] 但是,如何知道块“blk_7097388478926784482_1004”存储在我的 Linux 文件系统上的什么位置?
    • 您可以对单个文件执行此命令,而不是对整个文件系统:hdfs fsck /user/vpathak/testData/u.item -files -blocks -locations。从输出中可以看到,文件位于[127.0.0.1:50010],这是datanode存储块的IP和端口。转到此数据节点上的hdfs-site.xml 文件并查看参数dfs.datanode.data.dir - 它是存储物理块的目录(或目录列表)。现在您知道了目录和块名称,您可以轻松找到它
    • 知道了,谢谢。我想知道的另一件事是 Map/Reduce 框架为每个块创建的 InputSplits 的数量。框架如何决定要创建的输入拆分的数量 - (a) 当属性告诉 Map 和 Reduce 任务计数时,设置。
    • 简而言之,它完全取决于您使用的 InputFormat 类。在 TextInputFormat 最简单的情况下,它将是一个 HDFS 数据块的输入拆分,除非使用不可拆分算法(如 gzip 压缩文本文件)压缩整个文件,在这种情况下,您将有一个输入拆分对于整个文件
    • 很好,但是是否可以从一个节点上的一个块创建多个输入拆分?
    猜你喜欢
    • 2019-03-27
    • 1970-01-01
    • 2018-12-27
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 2016-04-24
    相关资源
    最近更新 更多