查询完整的 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 Cassandra 连接器 - 分区键上的范围查询