查询完整的Cassandra表时,Spark Job只是停顿了

时间:2018-12-03 11:29:02

标签: scala apache-spark cassandra datastax

我有一个特别的问题。在DSE Spark分析引擎中,我会生成频繁的统计信息,并将其存储在小表中的cassandra中。由于我将表修剪整齐,并且应该使用统一的信息为Web界面提供服务,因此我只想在spark中查询整个表并通过API发送结果。为此,我尝试了两种方法:

  
      
  1. val a = Try(sc.cassandraTable [Data](键空间,表).collect())。toOption

  2.   
  3. val查询=“ SELECT * FROM keyspace.table”
      val df = spark.sqlContext.sql(query)   val list = df.collect()

  4.   

我正在scala程序中执行此操作。当我使用方法1时,火花作业神秘地卡住,直到永远显示12的阶段10。在日志和Spark作业页面中验证。当我使用第二种方法时,它只是告诉我不存在这样的表:

未知异常:org.apache.spark.sql.AnalysisException:未找到表或视图:keyspace1table1;第1行pos 15; '项目[*]    +-'未解决的关系keyspace1table1

有趣的是,我在集群的spark shell中测试了这两种方法,它们都很好用。我的程序还有许多其他使用方法1进行的查询,它们都可以正常工作,关键的区别在于,在每个查询中,主分区键始终对此具有条件(与该查询相同)(对于该特定表也是如此)。

这是表结构:

CREATE TABLE keyspace1.table1 (
    userid text,
    stat_type text,
    event_time bigint,
    stat_value double,
    PRIMARY KEY (userid, stat_type)) 
WITH CLUSTERING ORDER BY (stat_type ASC)

对于问题的可靠诊断或解决方法将不胜感激

1 个答案:

答案 0 :(得分:0)

在cassandra中不带where子句的情况下执行select *时,实际上是在执行全方位查询。这不是cassandra中的预期用例(除了查看数据之外)。只是为了好玩,尝试用select * from keyspace.table limit 10代替,看看它是否可行,它可能...

无论如何,我的直觉表明您的问题不是火花,而是卡桑德拉。如果您对Cassandra指标具有可见性,请查找范围查询延迟。

现在,如果上面的代码完成了-方法1冻结,而方法2没有冻结的原因是,方法1包含一个动作(collect),而方法2不涉及任何火花动作,只是模式推断。如果您将方法2 df.collect添加到cassandra中,则会遇到相同的问题