我在使用dse 4.5.3
从spark到cassandra的数据生成方面遇到了麻烦我有一个包含8个节点的集群(非常强大的节点),我想从spark生成一些测试数据。
我的火花作业是从cassandra表读取5M的行(它代表一天的数据),然后将它们缓存在内存中(每个节点32 GB,所以没问题)最后将它们保存n次另一个cassandra表,用于模拟更多天的数据。
val table = sc.cassandraTable[RecordData]( "data", "one_day" ).cache
val firstDate = table.first.gets_dt_tm
val start = 1
val end = 10
for(i <- start to end){
table.map(row => {
//modify row to increment row timestamp day according to i
java.lang.Thread sleep 2
row
}).saveToCassandra("data","ten_days")
}
我也放了一个睡眠来减慢写入过程,但它没有帮助。问题是在我的集群中我得到了很多提示,我不得不连续修复节点。 请记住,我需要生成600天的数据。
这是我表格的结构
CREATE TABLE ten_days(
YEAR int,
MONTH int,
DAY int,
ID decimal,
... other fields
S_DT_TM timestamp,
PRIMARY KEY ((ID,C_TRX_REF),YEAR,MONTH,DAY,S_DT_TM));
ID和C_TRX_REF是一天内的唯一键,但不是多天。 (ID,C_TRX_REF)的独特计数是5M。
S_DT_TM是具有第二分辨率的时间戳,因此它在我的数据集中不是唯一的。
为什么火花写入cassandra会产生提示?你需要更多信息吗? 从spark开始向cassandra写入数百万行的最佳做法是什么?
由于
答案 0 :(得分:3)
语句中的睡眠很可能实际上并不会减慢此查询的执行速度。由于操作是基于每个分区应用的,我的猜测是睡眠只是在整个分区开始写入之前暂停。
对于真正的问题。您将生成提示的唯一原因是,您的某个节点无法跟上您的spark作业写入的数据量。这意味着在执行突变期间节点无法访问,因此协调节点在无法到达的节点重新联机时保存了突变的序列化副本。您可以使用
降低批处理大小以降低并发写入量spark.cassandra.output.batch.size.rows:每个行的行数 批量;默认为'auto',表示连接器将调整 基于每行中数据量的行数
或
spark.cassandra.output.batch.size.bytes:最大总大小 批量字节;默认为64 kB。
https://github.com/datastax/spark-cassandra-connector/blob/master/doc/5_saving.md
但是,通过确保群集中的所有硬盘都在SSD上,并且commitlog / spark目录也都在SSD上,您最有可能更好地提高吞吐量。