我是Spark和Cassandra的新学习者 . 我正面临一个重大的性能问题 . 我在Spark中每5秒从Kafka传输数据,然后使用JRI对R语言中的数据进行分析,最后将数据保存到Cassandra各自的列族中 . 将数据保存到Cassandra的持续时间(以毫秒为单位)随着输入请求的数量而迅速增加[每个请求为200KB] .
火花代码:
sessionData.foreachRDD(new Function<JavaRDD<NormalizedData>, Void>() {
public Void call(JavaRDD<NormalizedData> rdd) {
System.out.println("step-3 " + System.currentTimeMillis());
javaFunctions(rdd).writerBuilder("keyspace",normalized_data",mapToRow(NormalizedData.class)).saveToCassandra();
System.out.println("step-4 " + System.currentTimeMillis());}}
3 回答
通过在同一台服务器上使用Spark和Cassandra,我能够提高性能 . 这种延迟是因为Spark和Cassandra虽然位于AWS上的同一区域,但却位于不同的服务器上 . 网络延迟是影响数据位置的主要原因 . 谢谢 .
您可以参考这个blog进行Spark-Cassandra连接器调整 . 您将了解可以预期的性能数据 . 此外,您可以尝试另一个开源产品SnappyData,这是Spark数据库,它将为您的用例提供非常高的性能 .
我也使用Cassandra Spark组合来进行实时分析 . 以下是一些最佳实践:
Data Locality - 在Spark独立的情况下运行带有Worker节点的Cassandra守护进程或在Yarn的情况下运行节点管理器],Mesos的Mesos worker
Increase the parallelism 即创建更多分区/任务
使用Cassandra连接池来提高吞吐量