【问题标题】:Hadoop HDFS is not distributing blocks of data evenlyHadoop HDFS 没有均匀分布数据块
【发布时间】:2015-03-07 00:13:43
【问题描述】:

我目前正在运行一个有 2 个节点的集群。 1个节点是主/从,另一个只是从。我有一个文件,我将块大小设置为该文件大小的一半。然后我做

hdfs dfs -put file /

文件被复制到 HDFS 没有问题,但是当我检查 HDFS 站点时,我看到创建的两个块都在一个数据节点中(这些块在我使用 -put 命令的数据节点上)。我什至尝试调用平衡器脚本,但两个块仍在同一个数据节点上。

我需要数据在所有节点之间(尽可能地)均匀分布。

我错过了什么吗?

【问题讨论】:

  • hdfs dfs -ls /file 怎么说?
  • 文件将是纯文本文件。我不确定我是否理解你的问题。
  • 您确实误解了我的问题。让我重新表述一下。你能发布命令hdfs dfs -ls /file的结果吗?
  • 抱歉回复晚了,我刚开始工作。但这是你要求的。 bash-4.1$ hdfs dfs -ls /input/data1.txt 15/03/09 08:51:29 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... 在适用的情况下使用内置 java 类 - rw-r--r-- 1 blahblah 超群 390 2015-03-06 16:57 /input/data1.txt

标签: hadoop filesystems hdfs hadoop-yarn


【解决方案1】:

正如hdfs dfs -ls 输出所示,您的复制因子设置为1,因此hdfs 没有令人信服的理由在数据节点上分配数据块。

您需要将复制级别至少提高到2 才能获得您所期望的,例如:

hdfs dfs -setrep 2 /input/data1.txt

【讨论】:

  • 这与在 hdfs-site.xml 中将 dfs.replication 更改为 2 本质上是一样的吗?
  • 我建议的命令将只针对该文件执行此操作,而您的命令将影响该文件系统上的所有文件。
  • 只是好奇,有没有办法让 hdfs 分发块而不复制它?例如,假设我将块大小设置为输入文件大小的一半,节点 1 将只包含一半的块,而节点 2 将包含块的其余部分。
  • 默认行为是将所有块存储在与编写器相同的服务器上(请参阅svn.apache.org/repos/asf/hadoop/common/trunk/…)。您可以实施自己的政策来实现您的分配目标。
  • 非常感谢,这真的很有帮助。
【解决方案2】:

当我们将数据写入 hdfs 时,为了节省带宽利用率和网络往返,初始副本试图保存在我们执行 hadoop put 命令的同一节点上。作为您的复制 1 ,它就是这样发生的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 2011-12-05
    • 2015-01-18
    • 1970-01-01
    相关资源
    最近更新 更多