我有一些Spark体验,但刚刚开始使用Cassandra。我试图做一个非常简单的阅读并且表现得非常糟糕 - 无法说明原因。这是我正在使用的代码:
sc.cassandraTable("nt_live_october","nt")
.where("group_id='254358'")
.where("epoch >=1443916800 and epoch<=1444348800")
.first
所有3个参数都是桌面上关键的一部分:
PRIMARY KEY( group_id,epoch, group_name,auto_generated_uuid_field) )具有聚类顺序(epoch ASC,group_name ASC,auto_generated_uuid_field ASC)
我从驱动程序看到的输出是这样的:
15/10/07 15:05:02 INFO CassandraConnector:连接到Cassandra cluster:shakassandra 15/10/07 15:07 :02 ERROR Session:Error 创建池到attila./198.xxx:9042 com.datastax.driver.core.ConnectionException: [attila./198.xxx:9042]意外错误 在传输初始化期间 (com.datastax.driver.core.OperationTimedOutException:[attila /198.xxx:9042]操作超时)
15/10/07 15:07:02 INFO SparkContext:开始工作:接受 CassandraRDD.scala:121
15/10/07 15:07:03 INFO BlockManagerInfo: 在内存中添加了broadcast_5_piece0 osd09 :39903(大小:4.8 KB,免费:265.4 MB)
15/10/07 15:08:23 INFO TaskSetManager:阶段6.0中完成的任务0.0 (TID 8)在 osd09 (1/1)
上的80153毫秒15/10/07 15:08:23 INFO TaskSetManager:阶段6.0中完成的任务0.0(TID 8) 在osd09(1/1)上的80153毫秒
15/10/07 15:08:23 INFO DAGScheduler:ResultStage 6(参见CassandraRDD.scala:121) 完成于80.958 s 15/10/07 15:08:23 INFO TaskSchedulerImpl:已删除 TaskSet 6.0,其任务已全部完成,来自池
15/10/07 15:08:23 INFO DAGScheduler:工作5完成:接受 CassandraRDD.scala:121, 81.043413 s
我希望这个查询真的很快但它花了一分钟。我突然想到了一些事情
有关如何调试此问题的任何提示,在哪里寻找潜在问题非常感谢。使用带有连接器1.4.0-M3的Spark 1.4.1,cassandra ReleaseVersion:2.1.9,可调连接器参数的所有默认值
答案 0 :(得分:1)
我认为问题在于分区之间的数据分配。您的表有一个集群(分区)密钥 - groupId,epoch只是一个集群列。数据仅通过groupId在集群节点上分发,因此您有一个巨大的分区,其中groupId =&#39; 254358&#39;在群集上的一个节点上。 当您运行查询时,Cassandra使用groupId =&#39; 254358&#39;达到非常快速的分区。然后过滤所有行以查找记录在1443916800和1444348800之间的记录。如果有很多行,查询将非常慢。实际上这个查询不是分布式的,它总是在一个节点上运行。
更好的练习提取日期甚至小时,并将其添加为分区键,在您的情况下类似
PRIMARY KEY ((group_id, date), epoch, group_name, auto_generated_uuid_field)
WITH CLUSTERING ORDER BY (epoch ASC, group_name ASC, auto_generated_uuid_field ASC)
要验证我的假设,您可以在cqlsh中运行当前查询,并启用跟踪阅读here如何执行此操作。所以问题与Spark无关。
关于获取它的错误和时间,一切都很好,因为您在超时发生后收到错误。
此外,我还记得spark-cassandra-connector的建议,将Spark奴隶联合放置到Cassandra节点,以便通过分区键分配查询。