Apache spark Spark Structured Streaming无法查看记录详细信息
我正在尝试处理readstream中的记录,并尝试打印该行。 然而,在我的驱动程序日志或执行程序日志中,却看不到任何打印的语句。 可能有什么问题Apache spark Spark Structured Streaming无法查看记录详细信息,apache-spark,databricks,spark-structured-streaming,Apache Spark,Databricks,Spark Structured Streaming,我正在尝试处理readstream中的记录,并尝试打印该行。 然而,在我的驱动程序日志或执行程序日志中,却看不到任何打印的语句。 可能有什么问题 对于每个记录或批次(理想情况下),我都要打印消息 对于每个批次,我都要执行一个流程 我复制了您的代码,没有runProcess函数调用,它运行良好 如果您计划做两件不同的事情,我建议在从Kafka topic中选择相关字段后进行两次单独的查询: val kafkaSelection=kafka.selectExpr(“将(键作为字符串)转换为键”,“将
我复制了您的代码,没有
runProcess
函数调用,它运行良好
如果您计划做两件不同的事情,我建议在从Kafka topic中选择相关字段后进行两次单独的查询:
val kafkaSelection=kafka.selectExpr(“将(键作为字符串)转换为键”,“将(值作为字符串)转换为值”)
1.对于每个记录或批次(理想情况下),我都要打印消息
val query1=kafkaSelection
.writeStream
.outputMode(“追加”)
.格式(“控制台”)
.trigger(trigger.ProcessingTime(“30秒”))
.选项(“检查点位置”,检查点位置1)
.start()
2.对于每个批次,我都要执行一个流程。
val query2=kafkaSelection
.writeStream
.foreach(新ForeachWriter[行]{
覆盖def open(partitionId:Long,epochId:Long):布尔值=true
覆盖def过程(行:行):单位={
logger.info(
s“数据帧中接收到的记录为->”+row.mkString)
runProcess()//要在每个微批处理中运行一些进程吗
}
覆盖def close(errorOrNull:Throwable):单位={}
})
.outputMode(“追加”)
.选项(“检查点位置”,检查点位置2)
.trigger(trigger.ProcessingTime(“30秒”))
.start()
还要注意,我已经为每个查询单独设置了检查点位置,这将确保对卡夫卡偏移量的一致跟踪。确保每个查询有两个不同的检查点位置。您可以并行运行这两个查询
在等待查询终止之前定义这两个查询很重要:
query1.waittermination()
查询2.1终止()
使用Spark 2.4.5进行测试:
您可以看到消息“数据框中接收到的记录是->”在哪里?在驱动程序日志或执行程序日志中?是否需要添加检查点位置才能看到我的每批消息?我正在使用数据记录…不确定为什么在删除输出后无法看到所有日志。格式(“控制台”),我可以在驱动程序日志中看到。这里的runProcess将在每个执行器中运行。我可以让某个程序只运行一次,如果返回true,则停止spark作业。
val kafka = spark.readStream
.format("kafka")
.option("maxOffsetsPerTrigger", MAX_OFFSETS_PER_TRIGGER)
.option("kafka.bootstrap.servers", BOOTSTRAP_SERVERS)
.option("subscribe", topic) // comma separated list of topics
.option("startingOffsets", "earliest")
.option("checkpointLocation", CHECKPOINT_LOCATION)
.option("failOnDataLoss", "false")
.option("minPartitions", sys.env.getOrElse("MIN_PARTITIONS", "64").toInt)
.load()
import spark.implicits._
println("JSON output to write into sink")
val consoleOutput = kafka.selectExpr("CAST(key AS STRING) as key", "CAST(value AS STRING) as value")
//.select(from_json($"json", schema) as "data")
//.select("data.*")
//.select(get_json_object(($"value").cast("string"), "$").alias("body"))
.writeStream
.foreach(new ForeachWriter[Row] {
override def open(partitionId: Long, epochId: Long): Boolean = true
override def process(row: Row): Unit = {
logger.info(
s"Record received in data frame is -> " + row.mkString )
runProcess() // Want to run some process every microbatch
}
override def close(errorOrNull: Throwable): Unit = {}
})
.outputMode("append")
.format("console")
.trigger(Trigger.ProcessingTime("30 seconds"))
.start()
consoleOutput.awaitTermination()
}