Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在Spark中强制立即缓存最有效的方法是什么?_Scala_Apache Spark_Caching_Rdd - Fatal编程技术网

Scala 在Spark中强制立即缓存最有效的方法是什么?

Scala 在Spark中强制立即缓存最有效的方法是什么?,scala,apache-spark,caching,rdd,Scala,Apache Spark,Caching,Rdd,出于计时目的,我需要在执行函数之前强制缓存。 我最初的方法是使用count操作,因为这将跨所有分区缓存RDD,这与take不同,但是有没有更有效的方法来强制它执行计算、通信或时间 // Load data, partition and mark to be cached val data = sc.textFile("input.txt").map(_.toInt) val partitioner = new RangePartitioner(16, data) val partitioned_

出于计时目的,我需要在执行函数之前强制缓存。 我最初的方法是使用count操作,因为这将跨所有分区缓存RDD,这与take不同,但是有没有更有效的方法来强制它执行计算、通信或时间

// Load data, partition and mark to be cached
val data = sc.textFile("input.txt").map(_.toInt)
val partitioner = new RangePartitioner(16, data)
val partitioned_data = data.partitionBy(partitioner).cache()

// Force cache with count or something more efficient
partitioned_data.count()

// Do something
something(partitioned_data)

所有这一切都取决于你想做什么。如果您注意到您的环境已接近其持久内存的极限,我建议使用“保存到本地”、“清除缓存”、“重新加载”和“重新缓存”技术。然而,下面我已经使用了所有的easy函数,并在2M记录文件中运行它们,以显示它们的相对运行时间

讲台是这样的:

第一个三向平局:Take1,Take1000,第一;时间:9秒

第四:计数;时间:17秒

第五:收集;时间:21秒

免责声明-1:是的,我知道count lost,但我宣布它为秘密赢家,因为它获得了一系列任意风格的分数,主要是因为我认为这个答案正在慢慢变成“到底是谁的线”

免责声明-2:除了collect之外,所有测试都可以使用默认的Spark内存配置运行,我需要将其设置为大约更高的一个因数,并且它提供了21秒的运行时间

如果您想在家里尝试,以下是您可以运行的代码,播放老掉牙的gameshow音乐:


无需强制缓存,因为缓存将在调用操作时自动触发,在上述情况下计数。Spark DAG将根据转换和操作自动创建缓存数据的计划。如果确实要强制执行,只需触发操作即可。例如,将其写入文件。@hagarwal我知道缓存是惰性的,因此只有在调用某个操作时才会触发,我的问题是,我能调用的触发缓存的最便宜的操作是什么,有什么比count更好的吗?感谢您进行此比较,我决定坚持使用count,因为take只缓存它从中获取的分区,而不是所有分区
val inputDF = spark.read.format("").load("")

var arrayOfCommand : Array[String] = Array("")
var arrayOfTime : Array[Long] = Array("0".toLong)

inputDF.count

val inputDF2 = inputDF.selectExpr("*", "'Count Run' as CommandColumn").persist

val countStartTime = System.nanoTime()
inputDF2.count

val countEndTime = System.nanoTime()
val countRunTime = (countEndTime-countStartTime)/1000000000

arrayOfCommand = Array("Count")
arrayOfTime = Array(countRunTime)

spark.catalog.clearCache
val inputDF3 = inputDF.selectExpr("*", "'Take 1 Run' as CommandColumn").persist

val takeStartTime = System.nanoTime()
inputDF3.take(1)

val takeEndTime = System.nanoTime()
val takeRunTime = (takeEndTime-takeStartTime)/1000000000

arrayOfCommand = arrayOfCommand ++ Array("Take(1)")
arrayOfTime = arrayOfTime ++ Array(takeRunTime)

spark.catalog.clearCache
val inputDF4 = inputDF.selectExpr("*", "'Take 1000 Run' as CommandColumn").persist

val takeStartTime2 = System.nanoTime()
inputDF4.take(1000)

val takeEndTime2 = System.nanoTime()
val takeRunTime2 = (takeEndTime2-takeStartTime2)/1000000000

arrayOfCommand = arrayOfCommand ++ Array("Take(1000)")
arrayOfTime = arrayOfTime ++ Array(takeRunTime)

spark.catalog.clearCache
val inputDF5 = inputDF.selectExpr("*", "'Collect Run' as CommandColumn").persist

val collectStartTime = System.nanoTime()
inputDF5.collect

val collectEndTime = System.nanoTime()
val collectRunTime = (collectEndTime-collectStartTime)/1000000000

arrayOfCommand = arrayOfCommand ++ Array("Collect")
arrayOfTime = arrayOfTime ++ Array(collectRunTime)


spark.catalog.clearCache
val inputDF6 = inputDF.selectExpr("*", "'First Run' as CommandColumn").persist

val firstStartTime = System.nanoTime()
inputDF6.first

val firstEndTime = System.nanoTime()
val firstRunTime = (firstEndTime-firstStartTime)/1000000000

arrayOfCommand = arrayOfCommand ++ Array("First")
arrayOfTime = arrayOfTime ++ Array(firstRunTime)