我希望处理队列中的元素(Kafka或Amazon Kinesis)并对每个元素执行多个操作,例如:
在这些操作中的每一个上,我都期待一次只有语义,这是否可以在Apache Spark中实现?如何实现?
答案 0 :(得分:1)
您需要手动管理唯一键:但是在使用
时,可以select mr.id,count(mm.id) as mtrial_cnt
from mreq Mr join mmrm mm on Mr.id = mm.mrid
where Mr.id in(1235,3355)
group by Mr.id
来自Spark文档http://spark.apache.org/docs/latest/streaming-kafka-integration.html:
方法2:直接接近(无接收者)
Spark Streaming收到每条记录 尽管有失败,但仍然有效。
以下是KafkaUtils.createDirectStream
要求 - 例如在idempotency
中为每封邮件保存唯一键:
为了实现 一次性语义输出结果,输出 将数据保存到外部数据存储的操作必须是 幂等,或保存结果和偏移的原子事务 (参见主编程指南中输出操作的语义 进一步的信息)。
以下是管理唯一密钥所需代码类型的概念(来自http://blog.cloudera.com/blog/2015/03/exactly-once-spark-streaming-from-apache-kafka/):
Postgres
需要管理唯一的每条消息ID。
答案 1 :(得分:0)
当操作是幂等的时,恰好一次是至少一次处理语义的副作用。在您的情况下,如果所有3个操作都是幂等的,那么您可以获得一次语义。获得完全一次语义的另一种方法是在一个事务中包装所有3个操作和Kafka偏移存储,这是不可行的。
https://pkghosh.wordpress.com/2016/05/18/exactly-once-stream-processing-semantics-not-exactly/