使用 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”[重复]