Apache spark Spark Structured Streaming无法查看记录详细信息

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(“将(键作为字符串)转换为键”,“将

我正在尝试处理readstream中的记录,并尝试打印该行。 然而,在我的驱动程序日志或执行程序日志中,却看不到任何打印的语句。 可能有什么问题

  • 对于每个记录或批次(理想情况下),我都要打印消息
  • 对于每个批次,我都要执行一个流程

  • 我复制了您的代码,没有
    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()
    
    }