下面的代码工作正常,但是当我们有大量的事务流入时,写入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"))
}
}
我们能以任何方式实现这一目标吗?
答案 0 :(得分:0)
由于您已经在使用直接流,因此有两种方法可以提高并行度。
增加Kafka分区的数量。使用直接流时,Spark会自动创建与Kafka一样多的分区。但是,根据您的设置,这可能不可行。
使用Spark的repartition
。在大多数情况下,最好是repartition
输入而不是输出。
val num: Int = ? // Number of partitition
val parsedStream = stream.repartition(num).map(_._2).map(EmpParser.parse(_))
parsedStream.saveToCassandra(...)
如果您只需要使用parsedStream
一次,则无需缓存它。