火花和隔离时间

时间:2020-03-19 14:27:49

标签: apache-spark performance-testing

我最近开始使用Spark处理大量数据(〜1TB)。并且也能够完成工作。但是,我仍在尝试了解其工作原理。请考虑以下情形:

  1. 设置参考时间(例如t ref

  2. 执行以下两项任务之一:

    a。使用SciSpark将数万个文件中的大量数据(〜1TB)读取到RDD(OR)中

    b。如上所述读取数据,并进行其他预处理工作并将结果存储在DataFrame中

  3. 根据需要打印RDD或DataFrame的大小,并将时间差wrt打印到t ref (即t 0a / t 0b

  4. 进行一些计算
  5. 保存结果

换句话说,1b处理完与1a中完全一样的RDD后,就会创建一个DataFrame。

我的查询如下:

推断t 0b – t 0a =预处理所需的时间是否正确?在哪里可以找到相同的可靠参考?

编辑:为问题的来源添加了说明...

我的怀疑来自Spark的惰性计算方法及其执行异步作业的能力。它可以/是否启动在读取数千个输入文件时可以计算的后续(预处理)任务?怀疑的根源在于令人难以置信的性能(经验证的结果还可以),我认为它看起来太奇妙了,难以置信。

感谢您的回复。

1 个答案:

答案 0 :(得分:1)

我相信这样的事情可以辅助(使用Scala):

def timeIt[T](op: => T): Float = {
  val start = System.currentTimeMillis
  val res = op
  val end = System.currentTimeMillis
  (end - start) / 1000f
}

def XYZ = {
 val r00 = sc.parallelize(0 to 999999)
 val r01 = r00.map(x => (x,(x,x,x,x,x,x,x)))
 r01.join(r01).count()
}

val time1 = timeIt(XYZ)
// or like this on next line
//val timeN = timeIt(r01.join(r01).count())

println(s"bla bla $time1 seconds.")

您需要发挥创造力,并逐步处理导致实际执行的操作。因此,这具有局限性。惰性评估等。

另一方面,Spark Web UI记录每个动作,并记录该动作的阶段持续时间。

通常:在共享环境中进行性能评估很困难。在嘈杂的群集中,Spark中的动态分配意味着您在阶段中会保留已获取的资源,但是在同一阶段或下一个阶段的连续运行中,您可能会获得较少的资源。但这至少是指示性的,您可以在较不忙的时段内运行。