【问题标题】:Does Hadoop copyFromLocal creates 2 copies? - 1 inside hdfs and other inside datanode?Hadoop copyFromLocal 会创建 2 个副本吗? - 1 在 hdfs 内部和其他内部数据节点?
【发布时间】:2015-10-10 23:56:08
【问题描述】:

我在 Ubuntu 上安装了一个伪分布式独立 hadoop 版本,存在于我的 windows10 上安装的 vmware 中。

我从网上下载了一个文件并复制到ubuntu本地目录/lab/data

我在 ubuntu 中创建了名称为 namenodep 和 datan1 的 namenode 和 datanode 文件夹(不是 hadoop 文件夹)。我还在 hdfs 中创建了一个文件夹作为 /input。

当我将文件从 ubuntu 本地复制到 hdfs 时,为什么该文件存在于以下两个目录中?

$ hadoop fs -copyFromLocal /lab/data/Civil_List_2014.csv /input

$hadoop fs -ls /input/
input/Civil_List_2014.csv   ?????

$cd lab/hdfs/datan1/current
blk_3621390486220058643   ?????
blk_3621390486220058643_1121.meta

基本上我想了解它是否创建了 2 个副本,1 个在 datan1 文件夹内,另一个在 hdfs 内?

谢谢

【问题讨论】:

    标签: hadoop


    【解决方案1】:

    没有。仅创建一个副本。

    当您在 HDFS 中创建文件时,文件的内容存储在数据节点的磁盘之一上。数据节点存储数据的磁盘位置由配置参数确定:dfs.datanode.data.dir(存在于 hdfs-site.xml 中)

    查看该属性的描述:

    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:///e:/hdpdatadn/dn</value>
        <description>Determines where on the local filesystem an DFS data node
        should store its blocks.  If this is a comma-delimited
        list of directories, then data will be stored in all named
        directories, typically on different devices.
        Directories that do not exist are ignored.
        </description>
        <final>true</final>
      </property>
    

    如上,您的文件 HDFS 文件“/input/Civil_List_2014.csv”的内容存储在物理位置:lab/hdfs/datan1/current/blk_3621390486220058643。

    “blk_3621390486220058643_1121.meta”包含“blk_3621390486220058643”中存储的数据的校验和。

    此文件可能足够小,可以放在一个文件中。但是,如果文件很大(假设 > 256 MB 并且 Hadoop 块大小为 256 MB),则 Hadoop 会将文件的内容拆分为“n”个块并将它们存储在磁盘上。在这种情况下,您将在数据节点的数据目录中看到“n”个“blk_*”文件。

    此外,由于复制因子通常设置为“3”,因此会创建同一块的 3 个实例。

    【讨论】:

    • 感谢 Manjunath 的回复,我有几个澄清__ 1)如果它是一个多节点集群(比如 3 个数据节点),那么如果文件是 1 TB,那么 .meta 文件和实际文件在哪里将被存储?将它在3个datanode之间划分。 2)如果复制因子为3,.meta的副本将存储在其他节点还是.meta和实际文件都将被复制我没有hadoop集群来设置和测试,因此发布这些查询....谢谢
    • 1) 假设块大小为 512MB,则可能至少有 2,048 个块(对于每 1 GB,可以有 2 个块)。 NameNode 将尝试在 3 个数据节点之间平均分配块。在每个数据节点中,数据存储在由配置参数dfs.datanode.data.dir标识的物理磁盘上。相应的“.meta”文件存储在同一文件夹中。 2) 如果复制因子为 3,则为每个块创建 3 个副本,并为每个副本创建相应的“.meta”文件。 “.meta”包含校验和,用于确保数据不损坏。
    • 所以 manjunath 你是说在根据复制因子制作副本时,每个数据节点都会拥有实际文件和 .meta 文件的副本?还有没有办法检查连接到集群的节点数量及其状态?
    • 是的。无论哪个节点存储数据块,它也会存储相应的 .meta 文件。这是确保没有数据损坏所必需的。数据节点定期检查存储在每个块中的数据,为此它们需要存储文件校验和的 .meta 文件。我正在使用 Hadoop 2.7.1 (YARN)。在 RM(资源管理器)UI 中,您可以看到活动节点的数量。当您单击“节点”链接时,它将提供有关每个节点的详细信息(节点状态、节点地址、上次运行状况更新等)
    • 感谢 Manjunath,我认为 2.7.1 Yarn 比它的前身先进得多。
    【解决方案2】:

    hadoop fs -ls /input/ 命令的输出实际上是向您显示元数据信息,实际上并不是一个物理文件,它是围绕数据节点托管的文件的逻辑抽象。此元数据信息由 NameNode 存储。

    实际的物理文件被分割成块,并由数据节点托管在您的情况lab/hdfs/datan1/current的配置中指定的路径中。

    【讨论】:

    • Ashrith,感谢您的回复。
      您能否告诉我,当文件在多节点集群中拆分时,是否会放置一个文件的不同部分(文件大小>1TB)在不同的节点?
    • 是的。默认情况下,Hadoop 将文件拆分为 128MB 的块,并将它们分布在数据节点上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 2013-01-01
    • 1970-01-01
    相关资源
    最近更新 更多