查询完整的 cassandra 表时,Spark Job 只会停止

Posted

技术标签:

【中文标题】查询完整的 cassandra 表时,Spark Job 只会停止【英文标题】:Spark Job simply stalls when querying full cassandra table 【发布时间】:2019-05-04 16:42:22 【问题描述】:

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

    val a = Try(sc.cassandraTable[Data](keyspace, table).collect()).toOption

    val query = "SELECT * FROM keyspace.table" val df = spark.sqlContext.sql(查询) val list = df.collect()

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

未知异常:org.apache.spark.sql.AnalysisException:找不到表或视图:keyspace1.table1;第 1 行,第 15 行; '项目 [*] +- 'UnresolvedRelation keyspace1.table1

有趣的是,我在集群上的 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】:

当您在 cassandra 中不使用 where 子句执行 select * 时,您实际上是在执行全范围查询。这不是 cassandra 中的预期用例(可能除了偷看数据)。只是为了好玩,尝试用select * from keyspace.table limit 10替换,看看它是否有效,它可能......

无论如何,我的直觉说你的问题不是火花,而是卡桑德拉。如果您了解 cassandra 指标,请查找范围查询延迟。

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

【讨论】:

我用限制 10 参数尝试了你的想法,但问题是一样的,我不明白为什么它只是说表或视图不存在,而它在 shell 中完美运行。我知道用 select * 查询整个表不是最优的,但是这个特定的表只有几行(从 5 到 40 最大)所以它不会有太大的区别是的对不起我认为代码不完整(将编辑)因为我也已经在方法 2 上运行了一个收集 Cassandra 连接器逐段读取全表,与cqlsh 中的select * from ... 不同 是的,但相同的 cassandra 连接器在 dse spark shell(不是 cqlsh)中工作,只是在程序中失败

以上是关于查询完整的 cassandra 表时,Spark Job 只会停止的主要内容,如果未能解决你的问题,请参考以下文章

用于 Cassandra 的 Spark2 会话,sql 查询

使用 JDBC(例如 Squirrel SQL)用 Spark SQL 查询 Cassandra

通过 Spark SQL 查询 Cassandra UDT

Spark Cassandra 连接器 - 分区键上的范围查询

Cassandra system_schema 键空间在创建表时不是用户可修改的

更新表时如何改进 Spark 中的 SQL 查询? (子查询中的'NOT IN')