在我的代码中,我将一个现有的Cassandra表中的数据读取到一个火花DataFrame中,并将其转换为构建一组具有原始数据反向映射的新表(最终目标是为通过REST提供的搜索查询提供服务)。
最近,我添加了一些追踪,发现了一件我无法解释的事情。下面是一段Scala代码来说明这个问题。
// df: org.apache.spark.sql.DataFrame
//
// control point 1: before writing the data to Cassandra
val inputCount = df.count
// write data to new C* table
df.createCassandraTable(keyspaceName, tableName, <otherArgs>)
df.write.mode("append").cassandraFormat(tableName, keyspaceName).save()
// read data back
val readbackDf = sqlContext.read.cassandraFormat(tableName, keyspaceName).load().cache
// control point 2: data written to C* table
val outputCount = readbackDf.count
// Produces different numbers
println(s"Input count = ${inputCount}; output count = ${outputCount}")
如果在将数据写入新创建的表之前计算数据的.count
,它与从这个新表中读取数据所得到的数据的.count
不同。
因此,我有两个问题:
inputCount
和outputCount
的不同值?outputCount
,那么正确的方法是什么?发布于 2018-01-31 10:44:22
这个问题确实与Cassandra的一致性设置有关。非常感谢Anurag指出这一点。
结果发现,在我的测试环境中,我使用默认的读写策略,即LOCAL_ONE
。所以这很容易解释这种分歧。
最后,我把它们都设置为LOCAL_QUORUM
spark.cassandra.input.consistency.level=LOCAL_QUORUM
spark.cassandra.output.consistency.level=LOCAL_QUORUM
说了这些之后,我想指出,我也尝试过只设置对LOCAL_QUORUM
的读取
spark.cassandra.input.consistency.level=LOCAL_QUORUM
spark.cassandra.output.consistency.level=LOCAL_ONE
这几乎抵消了分歧。
至今,我仍然能够观察到(有时是中的1/ 3-4 )与我的一些ETL作业之间的细微差异。
虽然我没有看到将读/写一致性设置为LOCAL_QUORUM
会显著降低性能,因此问题不会再阻止我,但我仍然很好奇,为什么只将读设置为LOCAL_QUORUM
并不能完全解决问题。
有人能对此提出“假人”的解释吗?
https://stackoverflow.com/questions/48309935
复制相似问题