我正在使用spark streaming来处理大量数据。它包括两个步骤。第一步是检索数据并做一些基本处理,然后第二步是对数据进行实际处理。
dstream.foreachRDD ( rdd =>
//Step 1: retrieve data from web
val data = rdd.mapPartitions( partition =>
{
var finalResult = ArrayBuffer[String]()
val results = Obatinfromwebandcleaning("path/to/web")
results.foreach( result => finalResult += result )
finalResult.iterator
})
//Step 2: handle data
val data_df = sparkSession.read.json(data)
val res_df = compute(data_df)
res.write.json("path/to/storage")
)
奇怪的是,如果我单独运行第1步或第2步,它运行得非常快。但是当我将它们组合在一起时,它变得慢了5倍。我就是这样做的。
dstream.mapPartitions( partition =>
{
var finalResult = ArrayBuffer[String]()
val results = Obatinfromwebandcleaning("path/to/web")
results.foreach( result => finalResult += result )
finalResult.iterator
}).saveAsTextFiles("path/to/storage")
以上运行速度很快。
dstream.foreachRDD ( rdd =>
//Step 2: handle data
val data_df = sparkSession.read.json(rdd)
val res_df = compute(data_df)
res.write.json("path/to/storage")
)
这也很快。 但是,当我将上述两个步骤结合在一起时,它们运行得慢得多。
所以我想我以错误的方式使用了分区和foreachrdd。但只是想不通。