独立的Kafka Spark Sinks(多个生产商和经纪人)

时间:2018-06-07 15:57:50

标签: scala apache-spark apache-kafka bigdata spark-streaming

所以我在使用Spark Streaming时Kafka Sinks遇到问题,同时将JSON发送到多个主题和不可靠的kafka经纪人。以下是代码的一些部分:

val kS = KafkaUtils.createDirectStream[String, TMapRecord]
(ssc,
PreferConsistent,
Subscribe[String, TMapRecord](topicsSetT, kafkaParamsInT))

然后我迭代RDD的

kSMapped.foreachRDD {
  rdd: RDD[TMsg] => {
    rdd.foreachPartition {
      part => {
        part.foreach { ........... 

在foreach中我做了

kafkaSink.value.send(kafkaTopic, strJSON)

kafkaSinkMirror.value.send(kafkaTopicMirrorBroker, strJSON)

镜像代理关闭时,整个流应用程序正在等待它,我们不会向主代理发送任何内容。

你会怎么处理它?<​​/ p>

对于你提出的最简单的解决方案,想象一下,我只是跳过那些意图发送给失败的经纪人的消息(例如,那是CASE 1)

对于CASE 2,我们会做一些缓冲。

P.S。稍后我将使用Kafka Mirror,但目前我没有这样的选项,所以我需要在我的代码中做一些解决方案。

1 个答案:

答案 0 :(得分:0)

我已经找到了这个问题的几个决定:

  1. 您可以在worker和checkpoints上使用抛出任何超时异常。 Spark尝试在spark.task.maxFailures属性中描述多次重启坏任务。可以增加重试次数。如果最大重试后流式传输作业失败,则只有在代理可用时才会从检查点重新启动作业。或者你可以manually stop the job when it fails
  2. 您可以配置允许以尽可能快的速度接收数据的backpressure spark.streaming.backpressure.enabled=true
  3. 您可以将两个结果发回给您的技术Kafka主题,稍后再通过其他流媒体工作处理。
  4. 你可以为这种情况制作Hive或Hbase缓冲区,然后在批处理模式下发送未处理的数据。