首页 > 解决方案 > 如何为 hadoopRDD 中的每条记录分离计算和网络 I/O

问题描述

我在我的 1 节点 spark 集群上运行 spark grep 应用程序。(本身就是主从)。我在 hdfs 服务器的远程源上有一个 913MB 的文本文件。文本文件分为 128MB 的块,复制设置为无。我的 spark 应用程序读取文本文件并应用过滤器转换,以搜索关键字,然后在输出到 hdfs 中,仅输出具有该关键字的行。为了深入了解 spark 的工作原理,我在 spark 源代码中记录了更多详细信息并构建它以运行修改后的版本。我在 hadoopRDD.scala 中的 getNext(K,V) 中使用 reader.getpos() 记录了字节读取信息,最多 10 条记录。我还在过滤操作中记录了一些消息,以获取计算实际开始的时间。由于 spark 使用延迟加载,因此登录过滤器会在读取任何数据字节之前显示。

while(iter.hasNext){
  logInfo(s"value of the iterator: ${iter.next}")
}

上面的代码在文本文件中记录下一行,每次读取一条记录(这里的记录将是文本文件中的一行,作为默认的 hadoop 读取记录器操作)。但之后不执行任何过滤,我得到一个空输出。如果我只是在过滤操作后打印日志,结果只有在读取所有记录并关闭 hadoop 阅读器后才会显示。

我试图至少在第一组字节中分离计算和网络 I/O 以显示性能瓶颈,但我不确定 spark 是否真的在每条记录上执行计算,或者一旦为任务读取了所有记录?以及如何单独计算?

标签: scalaapache-spark

解决方案


推荐阅读