在Hadoop的HDFS中写入文件

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);
  }

对于I/O基准测试,您也可以查看TestDFSIO:http://answers.oreilly.com/topic/460-how-to-benchmark-a-hadoop-cluster/ - Lorand Bendig
@LorandBendig,我已经查过了,在我的14个节点的集群中,TestDFSIO的最高磁盘利用率仅为2.4%,平均值约为0.07%。我是通过_iostat_命令来测量磁盘利用率的,该作业运行了约300秒。我是否有什么非常愚蠢而不知道的事情? - Gudda Bhoota
你可以尝试调整参数(文件数量、大小),但我想你已经这样做了。还有其他测试可以尝试,这里描述得非常好:http://www.michael-noll.com/blog/2011/04/09/benchmarking-and-stress-testing-an-hadoop-cluster-with-terasort-testdfsio-nnbench-mrbench/ - Lorand Bendig
@Lorand 我确实尝试过了。我将复制因子更改为1,并调整了参数,即使在这种情况下,我仍然只看到主节点(也是从节点)忙于进行IO操作(100%利用率!),而其他节点则为0%利用率! - Gudda Bhoota
2个回答

1

我认为任何在每行单元格中创建Java对象并在保存到磁盘之前对Java对象进行序列化的机制都很难利用IO。
根据我的经验,序列化速度大约为每秒几MB或更高,但不是每秒100 MB。
因此,你所做的避免在输出路径上使用hadoop层是正确的。 现在让我们考虑如何编写HDFS工作。数据通过本地数据节点写入本地磁盘,然后根据复制因子同步写入网络中的其他节点。在这种情况下,您无法将更多的数据写入HDFS比您的网络带宽。如果您的集群相对较小,则事情会变得更差。对于3个节点集群和三重复制,您将向所有节点传递所有数据,因此整个集群HDFS写入带宽约为1 GBit - 如果您拥有这样的网络。
因此,我建议:
a)将复制因子降至1,以停止受到网络限制。
b)一次调用映射器时写入更大的数据块


我将复制因子更改为1,并分别将块大小更改为1KB和1MB。我的观察是,MapReduce 运行非常缓慢,而 IO 仅在主节点上高。我还尝试了在 Mapper 中只写入一次,与上面的代码不同,其中每个单词找到时都会写入文件。然而,行为仍然保持不变。 - Gudda Bhoota
同时运行了多少个映射器?您观察到每个节点的磁盘带宽是多少? - David Gruzman
已启动的映射任务=3,已启动的归约任务=1,mapred.tasktracker.map.tasks.maximum =2,mapred.tasktracker.reduce.tasks.maximum =2。3个节点上的磁盘利用率几乎为0,主节点上的磁盘利用率为100%。 - Gudda Bhoota
启动的映射任务=3,看起来很少 - 可能没有足够的输入拆分。请确保数据节点守护程序在集群的所有从节点上运行。 - David Gruzman

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接