6

我一直在寻找一个磁盘密集型 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);
  }
4

2 回答 2

1

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

于 2012-11-20T14:29:37.643 回答
0

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

于 2012-11-27T20:18:54.047 回答