火花流动性能缓慢

时间:2014-11-19 13:45:48

标签: performance batch-file streaming apache-spark execution-time

我在本地使用spark streaming 1.1.0(不在群集中)。 我创建了一个简单的应用程序来解析数据(大约10.000个条目),将其存储在流中,然后对其进行一些转换。这是代码:

def main(args : Array[String]){

    val master = "local[8]"
    val conf = new SparkConf().setAppName("Tester").setMaster(master)
    val sc = new StreamingContext(conf, Milliseconds(110000))

    val stream = sc.receiverStream(new MyReceiver("localhost", 9999))

    val parsedStream = parse(stream)

    parsedStream.foreachRDD(rdd => 
        println(rdd.first()+"\nRULE STARTS "+System.currentTimeMillis()))

    val result1 = parsedStream
       .filter(entry => entry.symbol.contains("walking") 
       && entry.symbol.contains("true") && entry.symbol.contains("id0"))
       .map(_.time)

    val result2 = parsedStream
       .filter(entry =>
        entry.symbol == "disappear" && entry.symbol.contains("id0"))
       .map(_.time)

    val result3 = result1
      .transformWith(result2, (rdd1, rdd2: RDD[Int]) => rdd1.subtract(rdd2))

    result3.foreachRDD(rdd => 
    println(rdd.first()+"\nRULE ENDS "+System.currentTimeMillis()))

   sc.start()
   sc.awaitTermination()
}

def parse(stream: DStream[String]) = {

    stream.flatMap { line =>
        val entries = line.split("assert").filter(entry => !entry.isEmpty)
        entries.map { tuple =>

            val pattern = """\s*[(](.+)[,]\s*([0-9]+)+\s*[)]\s*[)]\s*[,|\.]\s*""".r

            tuple match {
              case pattern(symbol, time) =>
              new Data(symbol, time.toInt)
            }
         }
    }
}

case class Data (symbol: String, time: Int)

我的批处理持续时间为110.000毫秒,以便一次接收所有数据。我相信,即使在当地,火花也很快。在这种情况下,执行规则大约需要3.5秒(在“RULE STARTS”和“RULE ENDS”之间)。我做错了什么或这是预期的时间?任何建议

1 个答案:

答案 0 :(得分:0)

所以我在我的所有工作中使用了大小写匹配并且它杀死了性能,比我引入json解析器时更多。还可以尝试在StreamingContext上调整批处理时间。这对我来说有点不同。你还有多少本地工人?