我在本地使用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”之间)。我做错了什么或这是预期的时间?任何建议
答案 0 :(得分:0)
所以我在我的所有工作中使用了大小写匹配并且它杀死了性能,比我引入json解析器时更多。还可以尝试在StreamingContext上调整批处理时间。这对我来说有点不同。你还有多少本地工人?