火花流foreach多作者

时间:2018-08-16 13:57:01

标签: scala apache-spark apache-spark-sql spark-structured-streaming

我想从JSON文件读取结构化流,并处理数据并将数据写入Kafka和Parquet接收器。我在下面看到了相同的示例代码

datasetOfString.writeStream.foreach(new ForeachWriter[String] {
 def open(partitionId: Long, version: Long): Boolean = {
   // open connection
 }

 def process(record: String) = {
   // write string to connection
 }

 def close(errorOrNull: Throwable): Unit = {
   // close the connection
 }
})

但是如何在这里通过多个作家?像下面吗?

datasetOfString.writeStream.foreach(kafkaWriter).start()
datasetOfString.writeStream.foreach(parquetWriter).start()

如果我喜欢这样做,那么使用foreach writer的目的是什么?只是为了在编写时获得更多控制权?

1 个答案:

答案 0 :(得分:1)

foreach()操作是一个动作。

  

它不返回任何值。

     

它在RDD的每个元素上执行输入功能

引用Spark结构化流的spark official documentation

流查询当前绑定到单个接收器,因此多路复用 无法通过相同的流查询使用现有接收器进行写入。 在当前的功能实现中,您将有效地处理数据两次。就个人而言,我仍然不建议这样做,您可以按照 小批量,然后使用foreach或自定义接收器 写卡夫卡主题和镶木地板来源