我想通过测量每个读/写操作所花费的时间来测量每个数据节点的吞吐量。阅读数百万个函数并找出发生这种情况的位置非常令人困惑。有人可以列出在读取/写入数据块时进行的一系列调用吗?我使用的是 1.0.1 版。或者,如果已经有一个 API 可以在数据节点上进行测量,我可以使用该信息。
1 回答
要研究以测量吞吐量的重要类是FSDataOutputStream
用于写入和FSDataInputStream
读取。
文件读取:open()
节点在读取文件时所做的第一件事是调用FileSystem
对象。此时,您知道该节点将很快开始读取,您可以在此调用成功返回后放置代码以准备测量。open()
在 HDFS 上调用会实例化DistributedFileSystem
与 NameNode 通信的 who,以收集块位置(根据调用节点的接近度排序)。最后,该DistributedFileSystem
对象返回FSDataInputStream
(“看到”读取文件),该对象依次包装DFSInputStream
(“看到”读取块,处理失败)。您的测量值将在read()
和close()
调用范围内FSDataInputStream
。
文件写入:节点将调用create()
. FileSystem
此时会进行各种检查,包括文件权限、可用性等,但在成功完成后,它会返回一个FSDataOutputStream
包装DFSOutputStream
. 同样的概念适用于一个人看到连续写入,另一个处理复制因子的一致性(即一次写入=三次写入)和失败的情况。与读取类似,您的测量范围将在.write()
和.close()
FSDataInputStream
为了对集群中的所有节点全局执行此操作,您需要覆盖这些方法,作为您在集群中共享的 Hadoop 分布的一部分。