一个本地 table 和一个数据库 table 之间的连接操作背后的机制

The mechanism behind the join operation between one local table and one DB table

当我从本地 RDD 注册一个 table 并从数据库注册一个 table 时,我发现两个 table 之间的连接操作非常慢。

来自DB的table实际上是一个SQL有多个join操作,而本地RDD只有20条记录

很好奇背后的机制

我们是否从远程数据库拉取数据并在本地 Spark 集群中执行所有任务?

或者我们是否有一个 'interesting' SQL 引擎来向数据库发送优化查询并等待返回查询结果?在我看来,这种方式没有意义,因为查询在数据库中执行得非常快。

Spark SQL 将 运行 查询放在一边。当您在第一步定义一些 tables 加入查询时,它将在集群中获取 tables 并将它们保存在内存中作为 RDDDataframe,最后 运行s 一些任务来做查询操作。

在您的示例中,我们假设第一个 RDD 已经在内存中,但第二个需要获取。 数据源 将请求您的 SQL 引擎占用 table 秒。但是在交付 table 之前,因为它是一个具有多重连接的查询,您的 SQL 引擎将 运行 在它的一侧进行查询(不同于 spark 集群)并在 table准备好了。假设 SQL 引擎花费 TA 秒进行 运行 查询(总结果,而不是当您在 SQL 客户端中看到的最高结果),并且将数据移动到 sql 集群(可能通过网络)需要 TB 秒。在 TA+TB 之后,第二个数据准备好发送到 运行。

并且如果TC是join操作的时间,那么总的时间就是total = TA+TB+TC。你需要检查你的瓶颈在哪里。我认为 TB 可能是大数据的关键。

但是,当使用具有两个或更多 worker 的集群时,请确保所有节点都参与操作。有时,由于编码错误,spark 会只使用一个节点进行操作。确保您的数据分布在集群中以受益于 数据局部性