我最近开始使用Spark处理大量数据(〜1TB)。并且也能够完成工作。但是,我仍在尝试了解其工作原理。请考虑以下情形:
设置参考时间(例如t ref )
执行以下两项任务之一:
a。使用SciSpark将数万个文件中的大量数据(〜1TB)读取到RDD(OR)中
b。如上所述读取数据,并进行其他预处理工作并将结果存储在DataFrame中
根据需要打印RDD或DataFrame的大小,并将时间差wrt打印到t ref (即t 0a / t 0b )
换句话说,1b处理完与1a中完全一样的RDD后,就会创建一个DataFrame。
我的查询如下:
推断t 0b – t 0a =预处理所需的时间是否正确?在哪里可以找到相同的可靠参考?
编辑:为问题的来源添加了说明...
我的怀疑来自Spark的惰性计算方法及其执行异步作业的能力。它可以/是否启动在读取数千个输入文件时可以计算的后续(预处理)任务?怀疑的根源在于令人难以置信的性能(经验证的结果还可以),我认为它看起来太奇妙了,难以置信。
感谢您的回复。
答案 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中的动态分配意味着您在阶段中会保留已获取的资源,但是在同一阶段或下一个阶段的连续运行中,您可能会获得较少的资源。但这至少是指示性的,您可以在较不忙的时段内运行。