我听到很多人都说Spark艺术擅长排序和分布式计算。目前,团队对火花和斯卡拉进行了一些研究。我们将在spark上实现一个排序服务。现在,我已经设置了spark集群,并尝试在spark集群上运行和排序示例,但排序的成本时间似乎很长。这是我的代码。
import org.apache.spark.{SparkConf, SparkContext}
import scala.collection.mutable.ListBuffer
import scala.util.Random
/**
* Created by on 1/1/15.
*/
object AdvancedSort {
/**
* bin/spark-submit --master spark://master:7077 --executor-memory 1024M --class com.my.sortedspark.AdvancedSort lib/sortedspark.jar 100000 3
* @param args
*/
def main(args: Array[String]) {
val sampleSize = if (args.length > 0) args(0).toInt else 100000
val slice = if (args.length > 1) args(1).toInt else 3
sort(sampleSize, slice)
}
def sort(listSize: Int, slice: Int): Unit = {
val conf = new SparkConf().setAppName(getClass.getName)
val spark = new SparkContext(conf)
val step1 = System.currentTimeMillis()
val data = genRandom(listSize)
val step2 = System.currentTimeMillis()
println(">>>>>>>>>> genRandom : " + (step2 - step1))
val distData = spark.parallelize(data, slice)
val step3 = System.currentTimeMillis()
println(">>>>>>>>>> parallelize : " + (step3 - step2))
val result = distData.sortBy(x => x, true).collect
val step4 = System.currentTimeMillis()
println(">>>>>>>>>> sortBy and collect: " + (step4 - step3))
println(">>>>>>>>>> total time : " + (step4 - step1))
printlnArray(result, 0, 10)
spark.stop()
}
/**
* generate random number
* @return
*/
def genRandom(listSize: Int): List[Int] = {
val range = 100000
var listBuffer = new ListBuffer[Int]
val random = new Random()
for (i <- 1 to listSize) listBuffer += random.nextInt(range)
listBuffer.toList
}
def printlnList(list: List[Int], start: Int, offset: Int) {
for (i <- start until start + offset) println(">>>>>>>>> list : " + i + " | " + list(i))
}
def printlnArray(list: Array[Int], start: Int, offset: Int) {
for (i <- start until start + offset) println(">>>>>>>>> list : " + i + " | " + list(i))
}
}
将上述代码部署到spark集群后,我在Master的Spark Home:
下运行以下命令bin/spark-submit --master spark://master:7077 --executor-memory 1024M --class com.my.sortedspark.AdvancedSort lib/sortedspark.jar 100000 3
以下是我最终获得的成本时间。
>>>>>>>>>> genRandom : 86
>>>>>>>>>> parallelize : 53
>>>>>>>>>> sortBy and collect: 6756
这看起来很奇怪,因为如果我在本地机器上通过scala的排序方法运行100个Int的随机数据,那么花费的成本时间就会更快。
import scala.collection.mutable.ListBuffer
import scala.util.Random
/**
* Created by on 1/5/15.
*/
object ScalaSort {
def main(args: Array[String]) {
val list = genRandom(1000000)
val start = System.currentTimeMillis()
val result = list.sorted
val end = System.currentTimeMillis()
println(">>>>>>>>>>>>>>>>>> cost time : " + (end - start))
}
/**
* generate random number
* @return
*/
def genRandom(listSize: Int): List[Int] = {
val range = 100000
var listBuffer = new ListBuffer[Int]
val random = new Random()
for (i <- 1 to listSize) listBuffer += random.nextInt(range)
listBuffer.toList
}
}
scala在本地计算机上的排序方法的成本时间
>>>>>>>>>>>>>>>>>> cost time : 169
在我看来,以下因素会影响火花的分拣时间:
Master和Worker之间的数据转换
在Worker上排序很快,合并可能会很慢。
任何火花大师都知道为什么会这样吗?
答案 0 :(得分:0)
Spark是为BigData制作的。 当您向其插入微小数字时,它的行为会变慢,因为在所有核心/群集上的分配花费的时间比正常排序时间要长。 尝试使用更大的数据或代替Spark使用Scala中的ParCollections:
collection.par.<any code here>