Spark Streaming - 使用foreachPartition和saveToCassandra实现更好的并行化

时间:2016-07-21 14:14:47

标签: apache-spark cassandra

下面的代码工作正常,但是当我们有大量的事务流入时,写入cassandra需要时间。

val stream = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topics)
val parsedStream = stream.map(_._2).map(EmpParser.parse(_)).cache()

下面的代码是顺序写入cassandra并在一个执行程序中执行。

parsedStream.saveToCassandra("test", "ct_table", SomeColumns("emp_id","emp_name","emp_sal","emp_dept"))

但我想通过foreachPartition将写入并行化到cassandra。但我在foreachPartition上看不到saveToCassandra选项。

parsedStream.foreachRDD{rdd =>
  rdd.foreachPartition { partition =>
      partition.saveToCassandra("test", "ct_table", SomeColumns("emp_id","emp_name","emp_sal","emp_dept"))
    }
}

我们能以任何方式实现这一目标吗?

1 个答案:

答案 0 :(得分:0)

由于您已经在使用直接流,因此有两种方法可以提高并行度。

  1. 增加Kafka分区的数量。使用直接流时,Spark会自动创建与Kafka一样多的分区。但是,根据您的设置,这可能不可行。

  2. 使用Spark的repartition。在大多数情况下,最好是repartition输入而不是输出。

    val num: Int = ? // Number of partitition
    val parsedStream = stream.repartition(num).map(_._2).map(EmpParser.parse(_))
    parsedStream.saveToCassandra(...)
    
  3. 如果您只需要使用parsedStream一次,则无需缓存它。