我试图了解卡桑德拉和火花是如何协同工作的,特别是当时 数据分布在各个节点上。
我使用DSE使用两个节点集群进行cassandra + spark设置。
架构是
CREATE KEYSPACE foo WITH replication = {'class': 'SimpleStrategy','replication_factor':1}
CREATE TABLE bar (
customer text,
start timestamp,
offset bigint,
data blob,
PRIMARY KEY ((customer, start), offset)
)
我用大量的测试数据填充了表格。后来想出了钥匙 在“nodetool getendpoints”命令的帮助下,它位于不同的节点上。 例如,在我的情况下,日期为“2014-05-25”的特定客户数据已启用 node1和'2014-05-26'是node2。
当我从spark shell运行以下查询时,我看到了spark worker node1正在mapPartitions阶段运行任务。
csc.setKeyspace("foo")
val query = "SELECT cl_ap_mac_address FROM bar WHERE customer='test' AND start IN ('2014-05-25')"
val srdd = csc.sql(query)
srdd.count()
并且对于以下查询,node2上的spark worker正在运行该任务。
csc.setKeyspace("foo")
val query = "SELECT cl_ap_mac_address FROM bar WHERE customer='test' AND start IN ('2014-05-26')"
val srdd = csc.sql(query)
srdd.count()
但是当我给两个日期时,只有一个节点工作者被利用。
csc.setKeyspace("foo")
val query = "SELECT cl_ap_mac_address FROM bar WHERE customer='test' AND start IN ('2014-05-25', '2014-05-26')"
val srdd = csc.sql(query)
srdd.count()
我当时认为这应该同时使用两个节点 mapPartitions阶段。我错过了什么。
答案 0 :(得分:0)
我认为您正在尝试理解Spark和Cassandra之间的相互作用以及Cassandra中的数据分布。
基本上来自spark应用程序,将向Cassandra节点之一发出请求,该节点充当该特定客户端请求的协调者。More details可以在此处找到。
只有Cassandra系统才会照顾data partitioning and replication。