使用Apache Spark Streaming处理多个消费者

时间:2016-06-18 10:00:27

标签: apache-spark spark-streaming

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

  • 将其写入HDFS群集
  • 调用rest API
  • 触发关于松弛的通知。

在这些操作中的每一个上,我都期待一次只有语义,这是否可以在Apache Spark中实现?如何实现?

2 个答案:

答案 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/