cassandra spark connector读取性能

时间:2015-10-07 16:58:37

标签: apache-spark spark-cassandra-connector

我有一些Spark体验,但刚刚开始使用Cassandra。我试图做一个非常简单的阅读并且表现得非常糟糕 - 无法说明原因。这是我正在使用的代码:

sc.cassandraTable("nt_live_october","nt")
  .where("group_id='254358'")
  .where("epoch >=1443916800 and epoch<=1444348800")
  .first

enter image description here

所有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. 几乎花了两分钟才得到会话错误 - 我将3个节点的IP传递给Spark Cassandra连接器 - 有没有办法告诉它更快地跳过失败的连接?
  2. 任务被发送给不是Cassandra节点的Spark工作者 - 这对我来说似乎很奇怪 - 有没有办法获取有关调度程序选择将任务发送到远程节点的原因的信息? / LI>
  3. 即使任务被发送到远程节点,该工作人员的输入大小(Max)也显示为334.0 B / 1,但执行者时间为1.3分钟(见图片)。这似乎真的很慢 - 我希望有时间花在反序列化上,而不是计算...... enter image description here
  4. 有关如何调试此问题的任何提示,在哪里寻找潜在问题非常感谢。使用带有连接器1.4.0-M3的Spark 1.4.1,cassandra ReleaseVersion:2.1.9,可调连接器参数的所有默认值

1 个答案:

答案 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节点,以便通过分区键分配查询。