我有一个spark作业,它运行从一个cassandra表读取数据,并将结果转储回两个表中稍作修改。我的问题是这项工作需要比预期更长的时间。
代码如下:
val range = sc.parallelize(0 to 100)
val rdd1 = range.map(x => (some_value, x)).joinWithCassandraTable[Event](keyspace_name, table2).select("col1", "col2", "col3", "col4", "col5", "col6", "col7").map(x => x._2)
val rdd2: RDD[((Int, String, String, String), Iterable[Event])] = rdd1.keyBy(r => (r.col1, r.col2, r.col3, r.col4 )).groupByKey
val rdd3 = rdd2.mapValues(iter => someFunction(iter.toList.sorted))
//STORE 1
rdd3.map(r => (r._1._1, r._1._2, r._1._3, r._1._4, r._2.split('|')(1).toDouble )).saveToCassandra(keyspace_name, table1, SomeColumns("col1","col2", "col3","col4", "col5"))
//STORE 2
rdd3.map(r => (to, r._1%100, to, "MANUAL_"+r._1+"_"+r._2+"_"+r._3+"_"+r._4+"_"+java.util.UUID.randomUUID(), "M", to, r._4, r._3, r._1, r._5, r._2) ).saveToCassandra(keyspace_name, table2, SomeColumns("col1", "col2", "col3", "col4", "col5", "col6", "col7", "col8", "col9", "col10", "col11"))
对于大约一百万条记录,STORE 1需要接近40秒,而STORE 2(稍微修改为rdd3)需要超过一分钟。我不确定我哪里出错了,或者为什么要花这么多时间。我的火花环境如下:
DSE 4.8.9,包含6个节点 70 GB RAM 每个12个核心
感谢任何帮助。
答案 0 :(得分:0)
让我猜猜看。需要日志,性能监视输出和C *数据模型才能获得更精确的答案。 但有些数学:
(我希望saveToCassadndra占用一半的时间) 如果您在需要减去12-20秒之前没有运行任何查询,那么火花就可以启动执行程序和其他东西
对于6个节点上的1M条目以及40秒,您获得了: 1000000/6/40 = 4166记录/秒/节点。那不错。每个节点10K / s,混合工作负载是一个很好的结果。
第二次写入是2倍大(11列与5相比)并且它在第一次写入之后运行,因此我预计Cassandra会在此时开始将先前的数据溢出到磁盘,因此您可以在此处获得更多的性能降级。
我是否正确理解当你添加rdd3.cache()时,第二次运行没有改变?那很奇怪。
并且可以通过调整C *数据模型和Spark / C *参数来获得更好的结果