【SparkSQL】介绍、与Hive整合、Spark的th/beeline/jdbc/thriftserve2、shel

时间:2022-01-22 04:30:40

 

目录

一、Spark SQL介绍

二、Spark和Hive的整合

三、Spark的thriftserve2/beeline/jdbc

四、shell方式使用SQL

一、Spark SQL介绍

官网:http://spark.apache.org/sql/

学习文档:http://spark.apache.org/docs/latest/sql-programming-guide.html

 

SQL on Hadoop框架:

1)Spark SQL

2)Hive

3)Impala

4)Phoenix

Spark SQL是用来处理离线数据的,他的编程模型是DF/DS

 

Spark SQL的特点:

1)集成:可以和各种复杂SQL:spark.sql("")

2)统一的数据访问:连接Hive, Avro, Parquet, ORC, JSON, and JDBC外部数据源统一的方式:spark.read.format("").load("")

3)与Hive的集成:由于共享元数据库的存在,表、UDF都可以共享。impala、Hive、Spark SQL都是共享metastore元数据的

4)jdbc方式:需要启动服务,比如Hive的hiveserver2、mysql。

 

 Spark的SQL框架:

1)Spark分支: Spark SQL

2)Hive:Hive on Spark


交互Spark SQL的方式:SQL、DF/DS

DataFrame 是1.3版本出来的,DataSet1.6出现的。
DataFrame=RDD schema
DataFrame=Dataset[Row]

DF支持使用Scala, Java, Python, and R进行开发。但是DS只支持Scala and Java. Python暂时不支持,所以使用Python是有局限性的。

 

二、Spark和Hive的整合

只需要两步:

1)将Hive元数据的配置文件放到Spark/conf下:

cd $SPARK_HOME
cd conf 
cp /home/hadoop/app/hive-1.1.0-cdh5.7.0/conf/hive-site.xml .(hive-site.xml中配置了元数据的连接)

2)在Spark中加入mysql的driver驱动包(因为Hive元数据是存储在MySQL上)。有多种方式添加jar包:

1)方式1:加在spark-shell或者spark-submit后:
启动的时候通过--jars加入,但是有的时候并不能传到driver端,所以还需要再使用--driver-class-path:
spark-shell
--jars /home/hadoop/lib/mysql-connector-java-5.1.43-bin.jar
--driver-class-path /home/hadoop/lib/mysql-connector-java-5.1.43-bin.jar

如果包多的时候使用--package。

2)方式2:cp包进SPARK_HOME/jars
3)方式3:把jar包配置在spark-default.conf下:
多包的时候使用:
spark.executor.extraClassPath=/home/hadoop/wzq_workspace/lib/*
spark.driver.extraClassPath=/home/hadoop/wzq_workspace/lib/*
单个包的时候使用(本人):
spark.executor.extraClassPath=/home/hadoop/lib/mysql-connector-java-5.1.43-bin.jar
spark.driver.extraClassPath=/home/hadoop/lib/mysql-connector-java-5.1.43-bin.jar

注意:

1)Hive底层是HDFS,一定要保证HDFS进程是开启的。
2)mysql的服务需要是开启的。
3)想要使用Spark整合Hive,在编译Spark的时候需要在编译指令中加入-Phive -Phive-thriftserver。
4)因为Spark配置中加入了hive-site.xml,所以默认的文件系统就是 HDFS。
     否则就是本地文件系统,create table的时候就会在本地创建/user/hive/warehouse目录 。

SparkSession是Spark SQL程序的入口。在Spark Shell中SparkSession的别名是spark。

 

三、Spark的thriftserve2/beeline/jdbc

hive有hiveServer2,spark中也有类似的thriftserve2。
位置:spark/sbin

步骤:
1)将${HIVE_HOME}/conf/hive-site.xml 拷贝到${SPARK_HOME}/conf下。
2)添加mysql驱动。

启动thriftserver服务:
sbin$ ./start-thriftserver.sh --jars ~/software/XXX/mysql-connector-java-5.1.27-bin.jar
会提示日志文件的位置,通过`tail -f XX.log`可以查看这个server是否启动成功。
占用的端口是10000。

启动beeline客户端:
bin$ ./beeline -u jdbc:hive2://localhost:10000 -n hadoop   #通过过JDBC连接hive
jdbc:hive2://localhost:10000>  #成功连接
jdbc:hive2://localhost:10000>  show tables;
jdbc:hive2://localhost:10000> select * from emp;

注意:
要在`$SPARK_HOME/bin`下通过`./beeline`启动start-thriftserver.sh对应的客户端,否则启动启动成hive的客户端,因为环境变量中配置了`HIVE_HOME/bin`,也配置了`SPARK_HOME/bin` ,所以要明确位置进行使用。

开启server之后,也可以在windows上的IDEA中使用JDBC进行连接服务。同样不需要写用户名和密码。

观察Spark UI界面:
1)应用的名称是Thrift JDBC/ODBC Server
2)页面上多了一个JDBC/ODBC Server的页签,并且展示SQL的很多信息和SQL的执行计划。

 

四、shell方式使用SQL

实际上就是访问操作Hive表。

shell方式使用SQL有两种方式:

1)spark-shell进入:

scala> spark.sql("show databases").show(false)
scala> spark.sql("use hive")
scala> spark.sql("show tables").show(false)
scala> spark.sql("select * from test").show(false)

2)spark-sql进入:

bin$ ./spark-sql --jars
spark-sql(default)> show tables;
spark-sql(default)> select * from emp;
spark-sql (default)> show databases; #直接写SQL,用;符号结束
用exit;退出spark-sql
spark-sql 底层调用的也是spark-submit。