使用 Apache Spark SQL 和 Java 直接运行 sql 查询

Posted

技术标签:

【中文标题】使用 Apache Spark SQL 和 Java 直接运行 sql 查询【英文标题】:Run directly sql query with Apache Spark SQL with Java 【发布时间】:2016-10-07 09:50:25 【问题描述】:

我试图弄清楚如何使用 Spark SQL 直接执行查询。我的意思是:

SQLContext sql = new SQLContext(ctx);
sql.sql("QUERY HERE");

但是如何设置数据库的连接信息呢?我正在使用 Oracle 数据库。在我使用sql.read().jdbc.. 方式之前。在那里我将连接 URL 作为参数传递。但与 SQL 控制台上的直接查询(0.05 秒)相比,这种方式确实很慢(4 秒)。

问候

【问题讨论】:

【参考方案1】:

您可能缺少 Spark SQL 的概念。

它不是实时代理数据库的引擎。对于快速缓存,您可能需要使用数据网格,例如 Oracle Coherence、Hazelcast 或 Apache Ignite(随机顺序)

Spark 用于对海量数据集进行快速计算。在 Databricks 博客上的 03.10 中,article 使用了 CERN 的 Spark 用例 - 在数据库上运行 12 小时的大查询在 Spark 中只需要 2 分钟!

那么,为什么您的查询很慢? Spark SQL 更类似于 OLAP 系统,而不是 OLTP。它可以非常快速地处理海量数据集。但是这些数据必须从数据库中读取,然后在 Spark 中计算。这就是为什么在您的情况下时间要大得多的原因,它是加载时间 + 计算时间。数据库引擎可以一步完成读取和计算(当然,近似值,实现可能不同)。

当您拥有更多数据时,加载时间占执行时间的百分比会更小,处理时间会更长。然后Spark会尽力而为。这是因为数据库引擎中的处理速度比 Spark 中慢得多——Spark 可以更好地并行化查询。

如何调整查询?读取一次,然后缓存到内存中,然后在查询中使用。在小数据集上它仍然可能会更慢,但在大数据集上以及大量使用此 DataFrame 时它会有所帮助

【讨论】:

那么如果现在数据增加一倍或三倍或更多,Spark 是否又需要 4 秒?最后一部分。因此,在应用程序启动时,我缓存了我的所有数据帧,例如 DataFrame dfCached = sql.read().jdbc(URL, "TABLE", props).cache();,然后只在这个 df 上工作? 如果有更多数据到达,Spark 必须从数据库中读取它们。所以是的,2 倍的数据 = 2 倍的数据加载时间。但是请记住执行时间,在那里您可以节省很多时间。关于第二个问题 - 是的,完全正确。第一次查询会很慢(然后 Spark 会读取数据),但接下来会快得多。您可以通过registerTempView 在 SQL 查询中使用 dfCached 2x more data = 2x time of loading data. 所以 Spark 慢了 2 倍? Atm Im 用一个从属设备进行所有测试。那么有了更多的奴隶,Spark 应该会更快吗?再说第二个:但是经常变化的数据呢,缓存不太好。 大约。 Spark 当然可以分发加载数据,但是更多的数据将需要更多的时间。您必须在自己的环境中进行性能测试。是的,当数据经常变化时,Spark SQL 并不好——它只是不是 Spark SQL 的用例。但是,也许 Spark Streaming 会很好?仅接收新数据并与历史数据联合 我尝试了 Spark Streaming,但不明白如何接收我的数据来构建 Object i Java。我有一个包含 spark 应用程序的 tomcat。以及如何正确缓存。如果表是 10gb 大,我不能把所有的东西都放在内存中。如果我需要加入等等,我需要缓存更多。

以上是关于使用 Apache Spark SQL 和 Java 直接运行 sql 查询的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的“org.apache.spark.sql”下面没有“SparkSession”[重复]

Apache Sqoop 和 Spark

教程:Apache Spark SQL入门及实践指南!

值 avro 不是 org.apache.spark.sql.DataFrameReader 的成员

Spark Streaming的样本demo统计

SparkStreaming wordcount demo