對於Cassandra(2.1.11)和Spark(1.4.1)我都很新,並且有興趣知道是否有人看到/開發了用於原子寫入兩個不同Cassandra表的解決方案使用Spark Streaming。Atomic通過Spark Streaming提交給Cassandra
我目前有兩個表保存相同的數據集,但具有不同的分區鍵。爲了簡單起見,我將使用熟悉的用戶表的例子來解釋:
CREATE TABLE schema1.user_by_user_id
(
user_id uuid
,email_address text
,num int //a value that is frequently updated
,PRIMARY KEY (user_id)
);
CREATE TABLE schema1.user_by_email_address
(
email_address text
,user_id uuid
,num int //a value that is frequently updated
,PRIMARY KEY (email_address)
);
的email_address
柱將具有高基數(實際上這將是50%和user_id
值的數量的100%之間) 。高基數使得二級索引表現不佳,因此需要第二個表。
我正在使用Spark Streaming來處理num
列中的更改並更新這兩個表。據我所知,saveToCassandra()
方法執行寫入在一個UNLOGGED BATCH RDD中的每個項目,從而執行原子寫入(如「保存對象的集合」部分here部分所述)。但是,saveToCassandra()
只能用於保存到單個表中。爲了保持兩個schema1.user_by_user_id
和schema1.user_by_email_address
表同步的,我必須發出兩個獨立的saveToCassandra()
電話:
rdd.saveToCassandra("schema1","user_by_user_id",SomeColumns("user_id","email"address","num"))
rdd.saveToCassandra("schema1","user_by_email_address",SomeColumns("user_id","email"address","num"))
的寫入每次通話以原子的方式完成內ocurring,但在這兩個電話一起不是原子。第二次調用中的一些錯誤會使兩個表不同步。
顯然我的數據集和實際的表結構比這更復雜,但我試圖以儘可能簡單的方式傳達我的問題的要點。雖然我的問題是能夠保存到兩個表格,但我希望對數據模型更改提出任何其他建議,以完全消除此需求。
謝謝你的迴應!我錯過了刪除寫入批處理日誌以避免性能衝突消除原子性的事實。至於解決方法,我認爲這是我需要的一個很好的解決方案。 – JakeElliott44