【问题标题】:Apache Spark makes SQL query faster?Apache Spark 让 SQL 查询更快?
【发布时间】:2017-06-09 22:37:33
【问题描述】:

来自apache-spark-makes-slow-mysql-queries-10x-faster

对于长期运行的(即报告或 BI)查询,可能需要很多 由于 Spark 是一个大规模并行系统,因此速度更快。 MySQL 只能使用一个 每个查询的 CPU 核心,而 Spark 可以使用所有集群上的所有核心 节点。在下面的示例中,MySQL 查询在 Spark 中执行 并且运行速度提高 5-10 倍(基于相同的 MySQL 数据)。

看起来不错,但我想不出实际的查询示例,其中查询可以划分为子查询,而多核 van 使其更快 在一个核心上运行它?

【问题讨论】:

  • 这完全取决于数据的大小。如果只是选择前 10 行,也许纯 SQL 会更快。但是,当您谈论以大表的形式获取大量数据,然后对其执行一些操作(如连接等)时,那么普通的旧 SQL 就会筋疲力尽。 SparkSQL 将这些操作转换为使用多个内核的 map-reduce 作业,并最终提高了执行速度。你不需要大炮来杀死一只苍蝇,但你不能用铲子淹死一艘船!
  • @satnam 我的问题是 join 之类的操作如何在 spark 中比 MySQL 之类的 RelationDB 执行得更好,在 MySQL 中我们也可以使用索引,但首先我们必须执行诸如排序和查找之类的额外任务(只是一个示例) ?

标签: java apache-spark apache-spark-sql


【解决方案1】:

假设我们有两个表 Customers 和 Orders,每个表都有 1 亿条记录。

现在我们必须在 Customer 和 Order 表中的列 customer_id 上连接这两个表以生成报告,这几乎是不可能的 MySQL,因为单个系统必须在大量数据上执行此连接数据。

在 Spark 集群上,我们可以根据连接列对这些表进行重新分区。现在通过散列 customer_id 来分发两个数据帧的数据。所以这意味着orders和customers表在spark的同一个工作节点中都有一个客户的所有数据,它可以执行一个本地连接,如下面的sn-p所示。

val customerDf = //
val orderDf = //
val df1 = customerDf.repartition($"customer_id")
val df2 = orderDf.repartition($"customer_id")
val result df1.join(df2).on(df1("customer_id") == df2("customer_id")) 

因此,这 1 亿条记录连接现在在数十或数百个工作节点上并行执行,而不是像 MySQL 那样在单个节点中完成。

【讨论】:

  • 同意通过散列 customer_id 重新分区会有所帮助,但即使我们无法使用列索引,而 df1.join(df2).on(df1("customer_id") == df2("customer_id")) 可以在 db 中使用。不是吗?我认为要使用高效的连接,spark 必须进行排序(如倒排索引)然后连接,这可能会很昂贵。对吗?
  • 列索引主要用于查找。它们很少用于连接,尤其是当您必须连接表中的所有或大部分数据时。所以索引在这里扮演的角色很小。
  • 我相信即使你必须连接表中的所有或大部分数据,也会使用索引。假设您选择了属于 id 为 100 的客户的第一个订单。现在如果 customer_id 没有被索引,DBMS 必须迭代地搜索该客户。所以我认为即使完全加入索引也会有帮助\
  • 是的,这里将使用索引,因为您正在进行查找 (cust_id 100)。但是没有查找,只有纯粹的连接,所以不会使用索引。此外,spark 支持 ORC,Parquet 数据格式,支持带索引的列数据。 \
  • 感谢流氓一号。我想我之前的评论并不清楚。我的意思是说我想获取所有下订单的客户姓名。我的查询将是这样的select * from order,customer where order.cust_id = customer.cust_id 。现在,如果客户表上的 cust_id 列上没有索引,假设 DBMS 从 cust_id =100 的订单表中选择了第一个订单,现在执行连接 (order.cust_id = customer.cust_id),即要从客户表中获取第 100 个 cust_id,它将使用在客户表的 cust_id 列上创建的索引。对吧?
猜你喜欢
  • 2015-06-05
  • 1970-01-01
  • 2018-06-16
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多