赞
踩
RDD的运行会完全按照开发者的代码执行, 如果开发者水平有限,RDD的执行效率也会受到影响。而SparkSQL会对写完的代码,执行“自动优化”, 以提升代码运行效率,避免开发者水平影响到代码执行效率。这是因为:
RDD:内含数据类型不限格式和结构。
DataFrame:100% 是二维表结构,可以被针对SparkSQL的自动优化,依赖于Catalyst优化器。
为了解决过多依赖Hive的问题,SparkSQL使用了一个新的SQL优化器替代Hive中的优化器,这个优化器就叫Catalyst,整个SparkSQL架构大致如下:
具体流程如下:
主要为了优化,例如col=col这样的条件,下面是一个简略图:
从两种常见的优化开始,简单介绍:
断言下推
将Filter这种可以减少数据集的操作下推,放在Scan的位置,这样可以减少操作时候的数据量。比如第一步中的sql,正常流程是先做JOIN再做WHERE。断言下推后,会先过滤age,然后再join,减少join的数据量提高性能。
列值裁剪
在断言下推后执行裁剪,由于people表之上的操作只用到了id列,所以可以将其他的列裁减掉,这样可以减少处理的数据量,从而优化处理速度,如下图:
上面的过程生成的AST其实最终没有办法直接运行,AST叫做逻辑计划,结束后需要生成物理计划,从而生成RDD来运行。
在生成物理计划的时候,会经过成本模型对整棵树再次执行优化,选择一个更好的计划。在生成物理计划后,因为会考虑到性能问题,所以会使用代码生成,在机器运行。
可以使用queryExecution方法查看逻辑执行计划,使用explain方法查看物理执行计划。
总结
Catalyst的优化大致分为两点:
列值裁剪有一种非常适合的存储系统:parquet。
对于Hive来说,核心的是:
根据原理,就是Spark能够连接上hive的metastore即可。所以首先需要启动metastore,然后Spark需要配置Metastore的IP端口号。
因为需要连接元数据,会有部分功能连接到mysql。
hive配置文件目录内有:hive-site.xml
前提:确保metastore服务启动好的
Spark中有一个服务,叫ThriftServer,可以启动并监听10000端口。这个服务对外提供功能,我们可以用数据库工具或者代码连接,直接写sql可以操作Spark。
当使用ThriftServer后,相当于是一个持续性的Spark On Hive集成模式,它提供10000端口,持续对外提供服务,外部可以通过这个端口连接上来,写sql,让Spark运行。
确保:配置好Spark on Hive,启动了ThriftServer。
我使用的是远程Python解释器,同时要使用pyhive的包来操作。
为了安装pyhive包 需要安装一些Linux软件,可以执行如下命令:
安装好前置依赖后,安装pyhive包
代码测试
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。