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

3
我正在尝试弄清如何使用Spark SQL直接执行查询。我指的是使用以下方法:
SQLContext sql = new SQLContext(ctx);
sql.sql("QUERY HERE");

但是如何为数据库设置连接信息呢?我正在使用Oracle DB。之前我使用sql.read().jdbc..的方式,传递连接URL作为参数。但是这种方式相对于在SQL控制台上直接查询(0.05秒)而言非常慢(4秒)。

问候

1个回答

4

也许您缺乏关于Spark SQL的概念。

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

Spark用于处理大规模数据集的快速计算。在Databricks博客中的03.10上,有一篇文章介绍了CERN使用Spark的案例 - 在数据库上运行12小时的大查询在Spark上只需2分钟!

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

当你拥有更多的数据时,加载时间将成为执行时间的较小百分比,处理时间将会更长。然后Spark将尽其所能。这是因为数据库引擎中的处理速度比Spark要慢得多- Spark可以更好地并行化查询。

如何调整您的查询?阅读一次,然后缓存到内存中,然后在查询中使用。对于小数据集,它仍可能较慢,但对于大数据集并且经常使用此DataFrame,则可以帮助提高性能。


如果有更多的数据到达,Spark必须从数据库中读取它们。所以是的,2倍的数据= 2倍的加载数据时间。但是请记住执行时间,您可以在那里节省很多时间。关于第二个问题-是的,完全正确。第一个查询将会很慢(Spark将读取数据),但下一个查询将会快得多。您可以使用registerTempView在SQL查询中使用dfCached。 - T. Gawęda
2倍的数据意味着加载数据需要2倍的时间。这样Spark就会变慢2倍吗?目前我正在使用一个从节点进行测试。那么如果有更多的从节点,Spark应该会快得多吧?再说一遍,但是对于经常更改的数据,缓存效果不太好怎么办? - R3Tech
我尝试使用Spark Streaming,但不知道如何接收数据以构建Java对象。我有一个包含Spark应用程序的Tomcat。我该如何正确地进行缓存?如果表格大小为10GB,则无法将所有内容放入内存中。如果需要进行连接等操作,则需要缓存更多数据。 - R3Tech
Spark不应嵌入Servlet容器...它应该有自己的专用集群。或者至少是一个单独的进程。Spark在多节点和多核环境下具有良好的表现,需要大量的RAM。如果您连10 GB RAM都没有,那么Spark对您来说并不必要,或者您必须购买更多内存的服务器。 - T. Gawęda
@R3Tech 谢谢 ;) 如果您有下一个问题,可以在SO上发布。我更喜欢Spark Driver的独立机器(即您使用spark-submit的地方),或者在集群模式下,在其中一个worker/master上运行。将其与Web应用程序结合可能会导致其他问题,但这只是我的建议。我强烈建议不要将Spark嵌入Web应用程序中;) - T. Gawęda
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接