本篇作为Spark SQL的第一篇文章,会从以下几个方面来进行阐述:
1、Spark SQL的由来
2、Spark SQL的特性
3、Spark SQL的功能入口
4、Spark SQL与Hive集成方式
5、Spark SQL的开发以及使用方式
首先讲一下Spark SQL的前世今生,Spark SQL并不是Spark一开始就推出的,最早使用的是Hadoop自己的HIve查询引擎。
![60d4113dd9874e6c9d5c607a7d5b64fc.png](https://i-blog.csdnimg.cn/blog_migrate/289416d18e0c21136c12794578fc2322.jpeg)
Hive的诞生,主要是因为开发MapReduce程序对Java的要求比较高,而很多数据分析师往往并没有很好的Java基础,为了让他们能够操作HDFS上的数据,推出了Hive。Hive与他们熟悉的RDBMS的SQL模型比较类似,容易掌握,Hive中的查询语言叫Hive SQL(HQL)。Hive底层是将SQL语句解析成MapsReduce程序执行,实质上还是运行的MapReduce程序。Hive的主要作用是能够让数据分析人员,以及数据开发人员方便的使用Hive进行数据仓库的建设。,使用SQL对数据仓库中的数据进行统计和分析。Hive的主要缺陷在于它的底层是基于MapReduce的,MapReduce程序的执行往往比较慢。
在Spark 0.x版的时候推出了Shark,Shark与Hive是紧密关联的,Shark底层很多东西还是依赖于HIve,但是修改了内存管理、物理计划、执行三个模块,底层使用Spark的基于内存的计算模型,性能上比Hive提升了很多倍。
在Spark 1.x的时候Shark被淘汰。在2014 年7月1日的Spark Summit 上,Databricks宣布终止对Shark的开发,将重点放到Spark SQL 上。Spark SQL 将涵盖Shark的所有特性,用户可以从Shark0.9 进行无缝的升级。
Databricks 推广的Shark相关项目一共有两个,分别是Spark SQL 和新的Hive on Spark 。
至于终止Shark的原因,Databricks表示,Shark更多是对Hive的改造,替换了Hive的物理执行引擎,因此会有一个很快的速度。然而,不容忽视的是,Shark继承了大量的Hive代码,因此给优化和维护带来了大量的麻烦。此后就重点放在Spark SQL的开发上,下Spark SQL不仅仅针对Hive中的数据,可以支持其他很多数据源。从性能上来说Shark比Hive要高出数倍,而Spark SQL比Hive又有了数倍的提升。下图是Spark SQL的发展时间线。
![5a4d122b41913f8af3fdb9e5916e289d.png](https://i-blog.csdnimg.cn/blog_migrate/e680036e7453ad7d496c67f3961b7296.jpeg)
比较一下Spark SQL和Apache Hive
![04bc4c2df5e90c9a7a0eb3e66abc780a.png](https://i-blog.csdnimg.cn/blog_migrate/51440517b1bc9884efcf9cae0447c7fe.jpeg)
2、Spark SQL的特性
Spark SQL有如下特点:
1、支持多种数据源,Hive、RDD、Parquet、Json、JDBC等
2、多种性能优化技术
3、组件扩展性,对于SQL的语法解析器、分析器以及优化器,用户可以自己重新开发,且可以动态扩展。
从下面的图中可以更直观的看出
![d368f7db1733cef0c93d66453c708a0c.png](https://i-blog.csdnimg.cn/blog_migrate/7a222fa2d953e8f4afd80ed05731f501.jpeg)
3、Spark SQL的功能入口
在之前Spark-core的时候我们知道,每个Spark-core应用程序都有一个功能入口SparkContext。同样的在Spark SQL中也有一个功能入口,在Spark 1.x的时候Spark SQL的入口有两个,SQLContext和HiveCOntext,两者的关系见下图:
![f5994c0b8be90a2a507e1760af4b0993.png](https://i-blog.csdnimg.cn/blog_migrate/bdbaeabd333c5c8fc83da32dbcb75fd6.jpeg)
SqlContext:主要负责对MySql这样的RDBMS的数据访问,还有可以对json parque文件的处理 HiveContext(是SqlContext的子类):主要负责读取Hive的元数据,处理Hive的数据 主要目的:让Spark应用可以读取hive的元数据,从而可以读取Hive中的表数据 在Spark2.x的时候:
在Spark 2.0之后,官方放弃了1.x时候的SQLContext和HiveContext的时候这样的容易让人困惑的两个入口,统一使用SparkSession作为Spark SQL的功能入口,用来创建DataFrame/DataSet。
SparkSession的构建方式有两种
// 方式一、通过SparkSession构建
val spark = SparkSession
.builder()
.master("local[2]")
.appName("Spark SQL")
// 如果要读取Hive中的表,必须使用这个
// 如果确定不使用Hive中的数据,建议不用开启,启动的时候会去连接Hive
.enableHiveSupport()
.getOrCreate()
// 方式二、通过SparkConf构建
// 建议通过方式二构建,SparkConf不仅Spark SQL可以使用,其他的Spark模块也可以使用
val conf = new SparkConf()
.setAppName("Spark SQL")
.setMaster("local[2]")
val spark = SparkSession
.builder()
.config(conf)
.enableHiveSupport()
.getOrCreate()
4、Spark SQL与Hive集成方式
步骤:
- Spark集成hive,就是spark编译的时候给定了hive的相关参数;如果是idea环境, 需要在项目中集成sparksql的相关jar文件,也就是在pom.xml中配置spark-sql的依 赖
- 将hive-site.xml文件添加到spark的项目的classpath环境变量中 直接将hive-site.xml拷贝到spark安装的目录下的conf中 需要在hive-site.xml在配置以下参数 a.连接mysql数据库的url 用户名 密码 b.必须配置metastore,同时先启动 完成SparkSQL和Hive的集成
- 进入${Hive_HOME},执行拷贝
- 启动Hive的metasore服务(先启动hdfs的相关进程),注意这个是一个单例的进程, 不能重复启动,在启动一个新的服务前必须将原来的先停止
<property>
<name>hive.metastore.uris</name>
<value>thrift://hostname:9083</value>
<description>Thrift URI for the remote metastore. Used by metastore
client to connect to remote metastore.</description>
</property>
5、Spark SQL的开发以及使用方式
Spark SQL的开发方式主要有两种: 1.SQL(标准SQL + HiveQL)
val sqlStr = "select empno, xxx from emp sssss"
val resultDF = sqlContext.sql(sqlStr)
resultDF.write.table()jdbc()....
2.DSL
链式编程
val df = sqlContext.read.table()json()parquet()jdbc()...
val resultDF = df.select("").group().aggr().sortBy()
resultDF.write.table()jdbc()....
使用Spark SQL的方式主要有四种:
第一种:spark-shell命令
spark.sql("select col1,col2 from a where col3 ==
xx").registerTmpTable("b").sql("select * from b")
- 使用DSL语句:倾向于RDD的使用方式,就是将sql的关键字封装成函数(算子)
df.select("col1","col2").where("col3"=="xx").group().agg()
第二种:spark-sql
shell命令行,参考bin/hive,可以直接写sql或者hql
第三种:spark-thirft 也就是 JDBC方式 shell命令行 参考hive中的bin/beeline
- 需要在hive-site.xml在配置以下参数
<property>
<name>hive.server2.thrift.bind.host</name>
<value>[hostname]</value>
<description>Bind host on which to run the HiveServer2 Thrift
service.</description>
</property>
- 拷贝到${SPARK_HOME}/conf/
- 在${SPARK_HOME}/启动spark的thrift服务,注意不是hive的
# 启动
$ sbin/start-thriftserver.sh
# 停止
$ sbin/stop-thriftserver.sh
第四种:IDEA开发工具 参考第一种