将kafka分区映射到特定的spark执行器

时间:2017-03-13 13:31:51

标签: scala apache-spark apache-kafka

所以我需要指定执行者应该如何使用kafka主题中的数据。

假设我有两个主题:t0和t1各有两个分区,两个执行器e0和e1(两者都可以在同一个节点上,因此分配策略不起作用,因为在多执行器节点的情况下它可以工作在循环调度中,无论第一个可用的执行程序是否使用主题分区)

我想要做的是让e0从t0和t1消耗分区0,而e1从t0和t1消耗分区1。除了搞乱日程安排外,还有办法吗?如果是这样,最好的方法是什么。

执行此操作的原因是执行程序将写入cassandra数据库,因为我们将处于并行化上下文中,一个执行程序可能会与另一个执行程序“冲突”,因此数据将丢失,通过分配我想强制执行的分区执行者按顺序处理数据。

2 个答案:

答案 0 :(得分:1)

Spark 2.x支持使用assign选项分配分区,更多信息here

示例:

Dataset<Row> ds2 = spark
  .readStream()
  .format("kafka")
  .option("kafka.bootstrap.servers", "host1:port1,host2:port2")
  .option("subscribe", "t0,t1")
  .option("assign", '{"t0": [0], "t1": [0]}')
  .load()

答案 1 :(得分:0)

以下是我对KafkaRDD和DirectKafkaInputDStream撰稿人的回答:

“Spark真的不适合尝试将特定计算固定到特定执行程序,特别是如果你依赖它来获得正确性。”

编辑:因此它很好地与coalesce一起工作,我能够找到解决我的问题的方法:Altough不直接处理执行程序,一个好的远程处理是通过分配策略将指定的分区分配给特定的流并合并到然后,单个分区对不同流上的剩余主题重复相同的过程,最后执行这些流的并集。

整个过程中没有进行随机播放,因为rdd分区已折叠为单个