Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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 使用Apache Spark Streaming,多个使用者只需处理一次_Apache Spark_Spark Streaming - Fatal编程技术网

Apache spark 使用Apache Spark Streaming,多个使用者只需处理一次

Apache spark 使用Apache Spark Streaming,多个使用者只需处理一次,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我希望处理队列中的元素(Kafka或Amazon Kinesis),并对每个元素执行多个操作,例如: 将其写入HDFS集群 调用RESTAPI 在空闲时触发通知 对于这些操作中的每一个,我都希望有一个精确的语义,这在ApacheSpark中是可以实现的吗?如何实现?您需要手动管理唯一的密钥:但鉴于这种方法,在使用 KafkaUtils.createDirectStream 从Spark文档: 进近2:直接进近(无接收机) 每个记录都通过Spark Streaming接收 即使失败,也能有效

我希望处理队列中的元素(Kafka或Amazon Kinesis),并对每个元素执行多个操作,例如:

  • 将其写入HDFS集群
  • 调用RESTAPI
  • 在空闲时触发通知

对于这些操作中的每一个,我都希望有一个精确的语义,这在ApacheSpark中是可以实现的吗?如何实现?

您需要手动管理唯一的密钥:但鉴于这种方法,在使用

KafkaUtils.createDirectStream
从Spark文档:

进近2:直接进近(无接收机)

每个记录都通过Spark Streaming接收 即使失败,也能有效地执行一次

这里是
幂等性
要求-例如,在
Postgres
中保存每条消息的唯一键:

为了实现 对于结果的输出,您的输出 将数据保存到外部数据存储的操作必须是 幂等元,或保存结果和偏移量的原子事务 (有关详细信息,请参阅主编程指南中的输出操作语义。) 进一步资料)

以下是管理唯一密钥所需的代码类型(从):


需要管理唯一的每条消息ID。

当操作是幂等的时,仅一次是至少一次处理语义的副作用。在您的例子中,如果所有3个操作都是幂等的,那么您可以只得到一次语义。另一种获得一次语义的方法是将所有3个操作和Kafka偏移存储打包到一个事务中,这是不可行的

 stream.foreachRDD { rdd =>
    rdd.foreachPartition { iter =>
    // make sure connection pool is set up on the executor before writing
    SetupJdbc(jdbcDriver, jdbcUrl, jdbcUser, jdbcPassword)

    iter.foreach { case (key, msg) =>
      DB.autoCommit { implicit session =>
        // the unique key for idempotency is just the text of the message itself, for example purposes
        sql"insert into idem_data(msg) values (${msg})".update.apply
      }
    }
  }
}