Apache spark 使用Apache Spark Streaming,多个使用者只需处理一次
我希望处理队列中的元素(Kafka或Amazon Kinesis),并对每个元素执行多个操作,例如: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接收 即使失败,也能有效
- 将其写入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
}
}
}
}