Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 使用检查点位置偏移从Kafka主题读取流的正确方法_Apache Spark_Apache Kafka_Apache Spark Sql_Spark Structured Streaming_Spark Streaming Kafka - Fatal编程技术网

Apache spark 使用检查点位置偏移从Kafka主题读取流的正确方法

Apache spark 使用检查点位置偏移从Kafka主题读取流的正确方法,apache-spark,apache-kafka,apache-spark-sql,spark-structured-streaming,spark-streaming-kafka,Apache Spark,Apache Kafka,Apache Spark Sql,Spark Structured Streaming,Spark Streaming Kafka,我正在尝试开发一个小的Spark应用程序(使用Scala)来读取来自Kafka(Confluent)的消息,并将它们写入Hive表。除了一个重要的特性——重新启动(提交)应用程序时管理偏移量外,所有功能都按预期工作。这使我困惑 从我的代码中删除: def main(args: Array[String]): Unit = { val sparkSess = SparkSession .builder .appName("Kafka_to_Hive&

我正在尝试开发一个小的Spark应用程序(使用Scala)来读取来自Kafka(Confluent)的消息,并将它们写入Hive表。除了一个重要的特性——重新启动(提交)应用程序时管理偏移量外,所有功能都按预期工作。这使我困惑

从我的代码中删除

  def main(args: Array[String]): Unit = {

    val sparkSess = SparkSession
      .builder
      .appName("Kafka_to_Hive")
      .config("spark.sql.warehouse.dir", "/user/hive/warehouse/")
      .config("hive.metastore.uris", "thrift://localhost:9083")
      .config("hive.exec.dynamic.partition", "true")
      .config("hive.exec.dynamic.partition.mode", "nonstrict")
      .enableHiveSupport()
      .getOrCreate()

    sparkSess.sparkContext.setLogLevel("ERROR")

    // don't consider this code block please, it's just a part of Confluent avro message deserializing adventures
    sparkSess.udf.register("deserialize", (bytes: Array[Byte]) =>
      DeserializerWrapper.deserializer.deserialize(bytes)
    )
    

    val kafkaDataFrame = sparkSess
      .readStream
      .format("kafka")
      .option("kafka.bootstrap.servers", 'localhost:9092')
      .option("group.id", 'kafka-to-hive-1')
      // ------>   which Kafka options do I need to set here for starting from last right offset to ensure completenes of data and "exactly once" writing?   <--------
      .option("failOnDataLoss", (false: java.lang.Boolean))
      .option("subscribe", 'some_topic')
      .load()

    import org.apache.spark.sql.functions._
    
    // don't consider this code block please, it's just a part of Confluent avro message deserializing adventures
    val valueDataFrame = kafkaDataFrame.selectExpr("""deserialize(value) AS message""")
    val df = valueDataFrame.select(
      from_json(col("message"), sparkSchema.dataType).alias("parsed_value"))
      .select("parsed_value.*")


    df.writeStream
      .foreachBatch((batchDataFrame, batchId) => {
        batchDataFrame.createOrReplaceTempView("`some_view_name`")
        val sqlText = "SELECT * FROM `some_view_name` a where some_field='some value'"
        val batchDataFrame_view = batchDataFrame.sparkSession.sql(sqlText);
        batchDataFrame_view.write.insertInto("default.some_hive_table")
      })
      .option("checkpointLocation", "/user/some_user/tmp/checkpointLocation")
      .start()
      .awaitTermination()
  }
def main(args:Array[String]):单位={
val sparkSess=SparkSession
建设者
.appName(“卡夫卡到蜂巢”)
.config(“spark.sql.warehouse.dir”,“/user/hive/warehouse/”)
.config(“hive.metastore.uris”thrift://localhost:9083")
.config(“hive.exec.dynamic.partition”,“true”)
.config(“hive.exec.dynamic.partition.mode”,“非严格”)
.enableHiveSupport()
.getOrCreate()
Sparkess.sparkContext.setLogLevel(“错误”)
请不要考虑这个代码块,它只是汇合AVRO消息的一部分。
寄存器(“反序列化”,(字节:数组[Byte])=>
DeserializerWrapper.deserializer.deserialize(字节)
)
val kafkaDataFrame=Sparkesss
.readStream
.格式(“卡夫卡”)
.option(“kafka.bootstrap.servers”,“localhost:9092”)
.option(“group.id”,“kafka-to-hive-1”)
//------>我需要在此处设置哪些卡夫卡选项,以便从最后一个右偏移量开始,以确保数据的完整性和“恰好一次”写入{
batchDataFrame.createOrReplaceTempView(`some\u view\u name`)
val sqlText=“从'some\u view\u name'中选择*,其中some\u字段='some value'”
val batchDataFrame_view=batchDataFrame.sparkSession.sql(sqlText);
batchDataFrame_view.write.insertInto(“默认的一些配置单元表”)
})
.option(“checkpointLocation”,“/user/some_user/tmp/checkpointLocation”)
.start()
.终止
}
问题(这些问题相互关联):

  • 对于每次提交spark应用程序时从最后一个右偏移开始,我需要在
    readStream.format(“Kafka”)
    上应用哪些卡夫卡选项
  • 我是否需要手动读取checkpointLocation/offsets/latest_批处理文件的第三行,以查找要从Kafka读取的最后一个偏移?我的意思是:
    readStream.format(“kafka”).option(“startingOffsets”,“some_topic”:{“2”:35079,“5”:34854,“4”:35537,“1”:35357,“3”:35436,“0”:35213}>”
  • 阅读卡夫卡(合流)主题中的流的正确/方便方式是什么?(我没有考虑卡夫卡的引擎)
  • “每次提交spark应用程序时,从最后一个右偏移开始,我需要在readStream.format(“Kafka”)上应用哪些Kafka选项?”

    您需要设置
    startingoffset=latest
    并清理检查点文件

    “我是否需要手动读取checkpointLocation/offsets/latest_批处理文件的第3行以查找要从Kafka读取的最后偏移量?我的意思是:readStream.format(“Kafka”).option(“startingOffsets”),“{”some_topic:{“2”:35079,“5”:34854,“4”:35537,“1”:35357,“3”:35436,“0”:35213}”“。”

    与第一个问题类似,如果将StartingOffset设置为json字符串,则需要删除检查点文件。否则,spark应用程序将始终获取存储在检查点文件中的信息,并覆盖
    startingOffsets
    选项中给出的设置

    “从卡夫卡(合流)主题中读取流的正确/方便方式是什么?(我不考虑卡夫卡的引擎)


    询问“正确的方式”可能会得到基于意见的答案,因此在Stackoverflow上是离题的。无论如何,根据我的经验,使用Spark结构化流媒体已经是一种成熟的、可用于生产的方法。然而,KafkaConnect也值得一试。

    亲爱的@mike,关于你的前两个答案:当你说“清理检查点文件”时,你的意思是实际删除
    检查点位置/offset/
    目录下的所有文件?是否有从代码中调用它的内置功能?是的,您需要在文件系统中物理删除它们。没有用于删除正在运行的查询的检查点文件的内置功能。请记住,您尝试实现的行为(从每次提交作业的最新偏移量开始)只是出于测试目的,您可能永远不会在生产中执行此操作。如果您需要在生产上这样做,您可以考虑批处理作业,而不是流式作业:-如果在生产中不删除检查点文件,作业将读取检查点文件中的内容,以从其停止的地方继续消费。如果保留检查点文件,代码中的
    startingoffset
    设置将被忽略。是的,从这个角度看,代码看起来不错(我没有查看foreachBatch部分)。