Spark Sql写代码方式(yarn)以及 spark sql整合hive详解

引入部分:通常我们在IDEA中写spark代码中如果设置了loacl参数,基本都是在IDEA本地运行,不会提交到 standalone或yarn上运行,在前几篇文章中写的大多数都是该种形式的spark代码,但也写到了如何将spark代码提交到standalone或yarn上运行,但是提交的代码都是spark-core形式的代码,今天我们谈一谈使用Spark Sql写代码的几种方式,并在yarn上执行

一、IDEA里面将代码编写好打包上传并提交打到yarn上运行

提交命令:

spark-submit --master yarn --deploy-mode client/cluster --class 主类名 --conf spark.sql.shuffle.partitions=1 jar包名

注意:--conf spark.sql.shuffle.partitions=1该参数为指定分区数

参数的优先级(从高到低):代码的参数 > 命令行设置的参数 > 配置文件设置的参数

这种方式在前面文章中写过,在此不再赘述,文章链接:http://t.csdnimg.cn/gN6tj

二、Spark Shell(repl)

repl:read-eval-print loop

简介:类似于写python代码的jupyter notebook,spark shell是spark中的交互式命令行客户端,可以在spark shell中使用scala编写spark程序。spark-shell的本质是在后台调用了spark-submit脚本来启动应用程序的,启动命令为

spark-shell --master  xxx

注意:

--master用来设置context将要连接并使用的资源主节点,master的值是standalone模式中spark的集群地址、或yarn、或mesos集群的URL,或是一个local地址

例如指定本地核数为2:spark-shell --master local[2]

如果需要指定jar包路径,也可以在后面加参数 --jars  jar包路径

回归正题,我们现在使用以下命令与yarn交互:

spark-shell --master yarn --deploy-mode client

可以看到yarn已经开了一个任务供使用,可以在yarn上查看

此时我们就可以在spark shell中写代码了

注意:

1、spark-shell中可以写scala, python(启动pyspark服务),spark-core,spark sql,spark streaming等形式的代码

2、spark-shell不支持yarn-cluster,如果我们的启动命令是spark-shell --master yarn --deploy-mode cluster,那么会报错,spark-shell启动不了

三、Spark SQL 命令行界面(CLI)

简介:Spark SQL 命令行界面(CLI)是一个交互式工具,允许用户直接通过 SQL 语句来查询和分析存储在 Spark 集群中的数据。它提供了一个方便的方式来查询各种数据源,如 Hive、Parquet、JSON、CSV 等,并返回结果给用户。当启动 Spark SQL CLI 时,它会连接到 Spark 集群,并为你提供一个类似于传统 SQL 数据库管理系统的命令行界面。在这个界面中,你可以输入 SQL 语句,然后 Spark SQL 会将这些语句转换为 Spark 作业,在集群上执行,并将结果返回。

启动命令:

spark-sql --master yarn --deploy-mode client

注意:与Spark Shell中类似,spark-sql --master yarn --deploy-mode cluster 命令是不能启动一个交互式的 Spark SQL 命令行界面(CLI)。

使用流程:

1、首先在linux环境中创建一个文件夹

mkdir spark-sql-master

2、进入该文件夹中并启动CLI

spark-sql --master yarn --deploy-mode client

在此界面我们可以只能写纯sql语法,就像使用传统的SQL 数据库一样。

现在进入spark-sql-master文件夹下,发现多出了一些文件,这些文件存储的就是刚刚在命令行创建数据库、数据表的信息数据,元数据信息,以及日志信息。如果我们将此文件夹删除,那么在就意味着创建的数据库、数据表等信息也将不存在。

这种启动方式的数据库是以文件的形式存储在本地的,但观察启动时的日志发现,其实默认应该是在hive中的,只是我们没有指定,所以就在本地存储了。

现在,我们开始使用spark sql去整合hive,hive底层默认是使用MapReduce框架进行计算的,因此速度很慢,现在使用spark框架结合hive,能使速度大大提升。

四、spark sql整合hive

1、vim hive-site.xml

在hive的hive-site.xml修改以下配置,增加了这一行配置之后,以后在使用hive之前都需要先启动元数据服务。其实这个配置我们在hive启动beline模式时就已经配置过,否则beline模式是开启不了的。

<property>
<name>hive.metastore.uris</name>
<value>thrift://master:9083</value>
</property>

 

2、将hive-site.xml 复制到spark conf目录下

使spark jars共用hive的元数据信息

cp /usr/local/soft/hive-3.1.2/conf/hive-site.xml /usr/local/soft/spark-3.1.3/conf/

 

3、将mysql 驱动包复制到spark jars目录下

 cp /usr/local/soft/hive-3.1.2/lib/mysql-connector-java-8.0.29.jar /usr/local/soft/spark-3.1.3/jars/

 

4、整合好之后在spark-sql里面就可以使用hive的表了

4.1启动hive元数据服务与hiveserver2服务

nohup hive --service metastore &

nohup hiveserver2 &

4.2 进入Spark SQL 命令行界面

spark-sql --master yarn --deploy-mode client

如果测试的资源不够,也可以指定参数进入:

spark-sql --master yarn --deploy-mode client --conf spark.sql.shuffer.partitions=1 --executor-memory 512m --total-executor-cores 1

此时,我们查询的数据库或表就是hive中的了:

4.3 spark sql 与 hive sql 查询速度对比

执行以下sql语句,对比查询速度:

SELECT clazz, COUNT(1) AS stu_num FROM datax_students GROUP BY clazz ORDER BY stu_num DESC;

经过测试使用spark差不多速度比hive要快10倍左右(spark官网写的是100倍   ^_^)

五、在IDEA使用代码操作spark整合的hive

1、添加以下依赖

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-hive_2.12</artifactId>
</dependency>

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
</dependency>

<dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-exec</artifactId>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.10.0</version>
</dependency>
 
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.10.0</version>
<dependency>

2、将以下四个配置文件加入到资源文件夹下

hive中的hive-site.xml和hadoop中的其他三个文件

3、编写代码测试

import org.apache.spark.sql.SparkSession

object SparkSqLOnHive {
  def main(args: Array[String]): Unit = {
    val sparkSession: SparkSession = SparkSession.builder()
      .master("local")
      .appName("spark读取hive数据")
      .enableHiveSupport()
      .config("spark.sql.shuffle.partitions", 1)
      .getOrCreate()

    import sparkSession.implicits._
    import org.apache.spark.sql.functions._

    sparkSession.sql("show databases")
    sparkSession.sql("select * from bigdata29.emp").show()

  }

}

结果:

六、在linux命令行写spark-sql

1、方式一:spark-sql -e

-- 执行一条sql语句,执行完,自动退出
spark-sql -e "select * from bigdata29.emp"

2、方式二:spark-sql -f

2.1 创建比编写sql脚本文件

vim test.sql

2.2 命令行执行该文件

spark-sql -f  test.sql

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值