SparkSQL跨异构数据源查询的计算执行位置技术问询
Spark SQL跨数据源计算位置说明
核心结论:计算逻辑的执行位置没有固定答案,取决于你使用的连接器下推能力、以及查询本身的逻辑
计算下沉到机器2数据源侧的场景
当你使用的官方/第三方Spark连接器支持谓词下推、聚合下推,且查询逻辑是数据源本身可原生执行的类型时,Spark会尽量把运算推到数据源侧完成:
- 比如对接MySQL、Hive这类支持SQL的数据源时,你执行的单表Min/Max、平均值计算,Spark会直接把对应聚合语句转换为数据源原生查询语句发给机器2的服务执行,最终仅把聚合后的小结果返回给机器1的Spark,不会拉取全量数据到Spark侧
- Cassandra、优化过的HBase连接器也支持简单的聚合、过滤算子下推,符合下推规则的简单分析任务都会直接在机器2端执行完成
计算在机器1的Spark侧执行的场景
满足以下任意一种情况时,运算会在Spark部署的机器1侧完成:
- 使用的数据源连接器不支持对应算子的下推,比如部分第三方HBase连接器没有适配聚合下推能力,Spark会先把需要计算的全量数据拉取到本地内存,再执行Min/Max、平均值等计算
- 查询涉及跨数据源的关联、计算,比如同时关联机器2上HBase的用户表和MySQL的订单表做聚合,这类跨源逻辑无法在单个数据源侧执行,只能把两边需要的数据都拉到Spark侧统一运算
验证方法
你可以在Spark SQL中执行EXPLAIN <你的查询语句>,查看执行计划中是否存在PushedFilters、PushedAggregation相关配置,就能直观判断哪些逻辑被下推到了数据源侧。
内容的提问来源于stack exchange,提问作者mmaher
相关产品推荐
相关产品推荐

