【问题标题】:Writing to a file in HDFS in Hadoop在 Hadoop 中写入 HDFS 中的文件
【发布时间】:2012-11-07 14:51:11
【问题描述】:

我一直在寻找一个磁盘密集型 Hadoop 应用程序来测试 Hadoop 中的 I/O 活动,但我找不到任何这样的应用程序可以保持磁盘利用率高于 50% 或一些实际上保持磁盘繁忙的应用程序。我尝试了 randomwriter,但令人惊讶的是它并不是磁盘 I/O 密集型的。

所以,我编写了一个小程序来在 Mapper 中创建一个文件并在其中写入一些文本。此应用程序运行良好,但仅在主节点中使用率很高,主节点也是名称节点、作业跟踪器和从属节点之一。在其他任务跟踪器中,磁盘利用率为零或可以忽略不计。我无法理解为什么任务跟踪器中的磁盘 I/O 如此之低。如果我做错了什么,有人可以将我推向正确的方向吗?提前致谢。

这是我在 WordCount.java 文件中编写的示例代码段,用于创建 UTF 字符串并将其写入文件-

Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
Path outFile;
while (itr.hasMoreTokens()) {
    word.set(itr.nextToken());
    context.write(word, one);
    outFile = new Path("./dummy"+ context.getTaskAttemptID());
    FSDataOutputStream out = fs.create(outFile);

    out.writeUTF("helloworld");
    out.close();
    fs.delete(outFile);
  }

【问题讨论】:

  • 对于 I/O 基准测试,您还可以查看 TestDFSIO:answers.oreilly.com/topic/460-how-to-benchmark-a-hadoop-cluster
  • @LorandBendig 我做了,我发现我的 14 个节点集群的 TestDFSIO 的最高磁盘利用率仅为 2.4%,平均值约为 0.07%。我正在通过 iostat 命令测量磁盘利用率,该作业运行了大约 300 秒。有什么我在做却不知道的傻事吗?
  • 您可以使用参数(文件数量,大小),但我认为您已经这样做了。您可以尝试进一步的测试,这里描述得很好:michael-noll.com/blog/2011/04/09/…
  • @Lorand 我确实尝试过。我将复制因子更改为 1 并使用参数,即使在那之后,我也看到只有主节点(也是从节点)忙于执行 IO(100% 利用率!)而其他节点的利用率为 0%!

标签: hadoop hdfs word-count


【解决方案1】:

我认为任何在每一行中为每个单元格创建 java 对象并在将 java 对象保存到磁盘之前运行任何序列化的机制都很少有机会利用 IO。
以我的经验,序列化以每秒几 MB 或更高的速度工作,但不是每秒 100 MB。
因此,您在输出路径上避免 hadoop 层的做法是非常正确的。 现在让我们考虑写入 HDFS 是如何工作的。数据通过本地数据节点写入本地磁盘,然后根据您的复制因子同步到网络中的其他节点。在这种情况下,您不能将更多数据写入 HDFS,然后您的网络带宽。如果您的集群相对较小,那么物有所值。对于 3 节点集群和三重复制,您会将所有数据路径到所有节点,因此整个集群 HDFS 写入带宽约为 1 GBit - 如果您有这样的网络。
所以,我建议:
a) 将复制因子减少到 1,从而不再被网络绑定。
b) 在一次调用 mapper 中写入更大的数据块

【讨论】:

  • 我将复制因子更改为 1,并将块大小分别更改为 1KB 和 1MB。我的观察是 map-reduce 运行非常缓慢,并且 IO 仅在主节点中再次很高。我还尝试在 mapper 中编写一次,这与上面的代码不同,在上面的代码中,我在找到每个单词时写入文件。不过,行为保持不变。
  • 同时运行多少个映射器?您观察到的每个节点的磁盘带宽是多少?
  • 已启动 map 任务 =3,已启动 reduce 任务 =1,mapred.tasktracker.map.tasks.maximum =2,mapred.tasktracker.reduce.tasks.maximum =2。 3 个节点上的磁盘利用率几乎为 0,而在主节点上为 100%。
  • Launched map tasks=3 看起来很低 - 可能没有足够的输入拆分。还请确保集群的所有从节点上都运行着 datanode 守护进程
【解决方案2】:

好的。我一定是真的很愚蠢,之前没有检查过。实际的问题是我所有的数据节点都没有真正运行。我重新格式化了 namenode,一切都恢复原状,我得到了 15-20% 的利用率,这对 WC 来说还不错。我将为 TestDFSIO 运行它,看看我是否可以更多地利用磁盘。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多