繁体   English   中英

Spark-写入前收集卡夫卡偏移量给驱动程序

[英]Spark - Collect kafka offsets to driver before writing

我有一个大量的kafka主题,我想从中编写批处理偏移量。 我目前正在使用以下方法。 在这种情况下,stream是一个InputDStream(我最终在较早的DStream中使用了GenericRecord值)。

val my_offsets = stream.foreachRDD { rdd =>
  val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
  rdd.foreachPartition { iter =>
    val o: OffsetRange = offsetRanges(TaskContext.get.partitionId)
    val tOffsets = (o.topic, o.partition, o.untilOffset)

    writeOffsetsToMyDatasource(tOffsets)
  }
}

但是,这会导致每个kafka分区一次写入任何给定的数据存储区(MySQL,ZK,Hbase等),这在尝试使用大量分区进行小批量时可能会产生不良结果。

我找不到一种将offsetRanges收集到驱动程序的方法,这将是首选,因为每批写入一次(例如,对于mysql)具有指定的值将节省很多不必要的写入。

val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges

您的offsetRanges 在driver中 您可以将offsetRanges序列offsetRanges首选内容,然后将其写入所需的任何源。

顺便说一下, val o: OffsetRange = offsetRanges(TaskContext.get.partitionId)

您的offsetRanges数组的长度始终与rdd的分区数相等,并且具有foreachRDD和默认设置( spark.streaming.concurrentJobs = 1 )。我认为can have undesirable results when trying to do small time batches with a large number of partitions.这种情况can have undesirable results when trying to do small time batches with a large number of partitions. 反正不会发生。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM