【发布时间】:2016-02-19 16:03:06
【问题描述】:
我有一个 spark 流用例,我计划在每个执行器上保持广播和缓存数据集。流式传输中的每个微批次都将从 RDD 中创建一个数据帧并加入该批次。下面给出的我的测试代码将为每个批次执行广播操作。有没有办法只播放一次?
val testDF = sqlContext.read.format("com.databricks.spark.csv")
.schema(schema).load("file:///shared/data/test-data.txt")
val lines = ssc.socketTextStream("DevNode", 9999)
lines.foreachRDD((rdd, timestamp) => {
val recordDF = rdd.map(_.split(",")).map(l => Record(l(0).toInt, l(1))).toDF()
val resultDF = recordDF.join(broadcast(testDF), "Age")
resultDF.write.format("com.databricks.spark.csv").save("file:///shared/data/output/streaming/"+timestamp)
}
对于每个批次,都会读取此文件并执行广播。
16/02/18 12:24:02 INFO HadoopRDD: Input split: file:/shared/data/test-data.txt:27+28
16/02/18 12:24:02 INFO HadoopRDD: Input split: file:/shared/data/test-data.txt:0+27
16/02/18 12:25:00 INFO HadoopRDD: Input split: file:/shared/data/test-data.txt:27+28
16/02/18 12:25:00 INFO HadoopRDD: Input split: file:/shared/data/test-data.txt:0+27
对广播数据集有任何建议吗?
【问题讨论】:
标签: scala apache-spark apache-spark-sql spark-streaming broadcast