开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:SparkSQL 读写_Hive_写入数据_配置】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/690/detail/12062
SparkSQL 读写_Hive_写入数据_配置
内容介绍:
一、步骤
二、实操
前面的课程中已经了解了如何使用 SparkSQL 访问已经存在的 Hive 表对以及如何创建 Hive 表,接下来将会学习如何通过 SparkSQL 将一些数据插入到创建好的 Hive 表中,该过程分为整合和编写代码并提交程序两部分进行学习,本节课主要学习整合的过程。
一、步骤
这里的整合与之前学习的整合不太一样,这里的整合是让 SparkSQL 可以访问 Hive。
1、导入 Maven 依赖
上节课使用 SparkSQL 创建 Hive 表时写的相关程序是在 SparkShell 中运行的,而这种运行是建立在 spark 已经和 Hive 进行了整合,且已经把 Hive 的配置文件拷贝到 spark 当中,在集群中运行的基础上的,反之则不能执行。但是否采取这样的运行方式就无法以编写 spark 的独立程序的方式来提交任务呢?答案是否,我们也可以使用 SparkSubmit 的方式把已经打包好的程序放在集群当中执行。若如此,我们就需要在 IDEA 当中去编写程序并打包了。而若要编写程序,spark-hive 依赖必须要导入。
原始代码如下:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive 2.11</artifactId>
<version>${sparkversion}</version>
</dependency>
2、配置 SparkSession
如果在 SparkShell 当中编辑代码并执行,其实是 SparkShell 自动创建出了 SparkContext,是实际上,若要编写独立程序,SparkSession 是要自行创建的。因此,在创建 SparkSession 时,还有一小部分整合工作要做。
二、实操
1、将 Maven 依赖导入工程,并整理环境
(1)导入 Maven 依赖
进入 IDEA,打开 pom.xml,选取在文件的任一位置,其实导入大部分 spark 的包都可以样做。比如此时要导入 Hive 的整合包,因为有一部分 Hive 的内容,并没有包含在 sparksql 和 sparkcore 包下,因此先复制 core 依赖的声明,然后将其中的“core”改为“hive”即可。此时 Maven 依赖就已经成功导入。
2、配置 SparkSession
(1)创建文件
创建一个新的 Scala Class,其类型为 object,因此无法用 Line 编写了,因为我们最终要将其打包放在集群中,让集群去执行某个类,故而应写 main 方法。
package cn.itcast.spark.sql
Object HiveAccess{
//创建类并将其命名为 Hive.Access
def main(args:Array[string]):unit = {
//创建 main 方法
以上即完成了整合的第一步导入 Maven 依赖并整理环境。
(2)开启 HiveContext 支持
在 SparkSession 创建的时候还应开启几个内容。在最古老 Spark1.x 时,分为了几个 SparkContext,比如说,SparkContext 是用于去执行 RDD 程序的,但要想 Sql 语句,就要编写 SqlContext。而最初的支持是通过 Spark 自己的 SQL 解析器来支持的,但该 SQL 解析器是直接使用了 scala 的 passer,比较简陋,有许多问题。接下来,又创建了新的 Context 用于支持 Hive 的 SQL,也就是存在两个 Context。
当下的 Spark2.0 中这三者已经整合到 SparkSession 中了,在默认创建 SparkSession 时开启的是 SqlContext,而现在要写 Hive 代码,则要开启 HiveContext。
(3)设置 WareHouse 的位置
(4)设置 MetaStore 的位置
(2)(3)(4)具体操作如下:
val spark=SparkSession
//创建 SparkSession
.builder()
.appName("hive example")
.config("spark.sql.warehouse.dir" "hdfs://node01:8020/
dataset/hive")
config("hive.metastore.uris" "thrift://node01:9083")
//导入两个参数分别配置一下 warehouse.dir 和 metastore.urls,而这两个参数在 Hiveset.xml 中都有配置,但是此处还要单独配置(第二个参数 hive metastore.urls 可以不进行配置,因为已经进行过 SparkSQL 和 Hive 的整合,直接去配置文件即可读取到参数,但第一个参数必须要配置),因为该参数的开头的 spark,已经不再读取 Hiveset.xml 中的 warehouse.dir 了,因此,在指定数据仓库位置时,就需要在 SparkSession 中进行手动配置了。
.enableHiveSupport()
.getOrCreate()
接下来回到 Object HiveAccess 进行配置 SparkSession:
package cn.itcast.spark.sql
Object HiveAccess{
//创建类并将其命名为 Hive.Access
def main(args:Array[string]):unit = {
//创建 main 方法
//创建 SparkSession
//开启 Hive 支持
//指定 MetaStore 的位置
//指定 WareHouse 的位置
val spark=SparkSession.builder()
//导入 SparkSession.builder 的包,通过这个包进行构建
.appName("hiveaccess1")
//不需要指定 master,因为该程序最终要提交到集群当中使用 SparkSubmit 来运行的,而其 master 地址是确定已知的,不能单独指定,否则就会报错。
.enableHiveSupport()
//开启 Hive 支持
.config("hive.metastore.uris" ,"thrift://node01:9083")
//指定 MetaStore 的位置,路径为 node01:9083 端口,其使用的协议是 thrift,与其他的不太相同,它是一个 Rpc 框架
.config("spark.sql.warehouse.dir", "/dataset/hive")
//指定 WareHouse 的位置,指定为上一个文件的位置,该文件要确保在 hdfs 目录下,稍后会进行上传,这里指定为/dataset/hive 文件夹作为 WareHouse 的地址
.getOrCreate()
//进行相应的获取
}
}
总之整合应分为两大步骤,即导入 Maven Jar 包和创建 SparkSession 并指定参数。