Spark通过Spark-SQL使用hive 语句,操作hive,底层运行的还是 spark rdd。
(1)就是通过sparksql,加载hive的配置文件,获取到hive的元数据信息
(2)spark sql获取到hive的元数据信息之后就可以拿到hive的所有表的数据
(3)接下来就可以通过spark sql来操作hive表中的数据
如何使用SparkSql连接Hive
工具
Hive :
hive cli : 命令行
hiveserver2: 允许使用JDBC方式连接hive
hiveserver2提供了:beeline(jdbc客户端),需要先启动hiveserver2,以提供10000端口号
hivemetastore service: 读写元数据、
区别:
hive cli 和 hiveserver2 功能: 解析HQL ———> 读写元数据————->翻译为Job提交允许
hivemetastore service : 提供元数据的操作服务
<br />Spark: <br /> spark-sql : 命令行,只接受sql<br /> thriftserver: 支持JDBC方式访问,类比hiveserver2<br /> thriftserver提供了: beeline(jdbc客户端)
区别:
类似上面。
Hive元数据操作
直连模式
使用JDBC的方式直接去mysql中读取元数据,称为直连模式
需要的条件:
- 连接Mysql的驱动,已经放入到$HIVE_HOME/lib下
- 创建连接时,需要有url,username,password,driveClassName,在hive-site.xml中配置
```xml
<?xml version=”1.0”?>
<?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>
javax.jdo.option.ConnectionURL jdbc:mysql://hadoop104:3306/metastore(修改此可以使用不同的元数据库)?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8 javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver javax.jdo.option.ConnectionUserName root javax.jdo.option.ConnectionPassword 123321 hive.metastore.schema.verification false
// 将存储位置从本地改为hdfs
或在spark/conf/spark-defaults.conf中添加 spark.sql.warehouse.dir hdfs://hadoop102:9820/user/hive/warehouse
或者直接复制hive中的hive-site.xml文件,到spark的conf目录中
hive-cli,hiveserver2, hive metastoreservice都是采取直连模式获取元数据!<br />因为:<br />1)hive-cli的启动: <br />hive中:
```powershell
hive
实际上,等价于
spark中:
hive --service cli
2)hiveserver2的启动:
hive中
hiveserver2
实际上,等价于
spark中:
hive --service hiveserver2
3)hive metastoreservice的启动:
启动该指令才能连接idea
spark中:
hive --service metastore
hive命令在启动时,会读取hive-site.xml配置文件,加载lib下所有的jar!
代理模式
指第三方程序(非hive的程序,例如sparksql程序,presto,impala),希望读取Hive中的元数据!
有两种方式:
- 直连模式(不安全,不推荐)
- 代理模式
在idea中的resources文件夹中天街hive-site.xml文件
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop102:9083</value>
</property>
</configuration>
在IDEA连接Hive
①添加依赖
依赖后置
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.12</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>3.1.2</version>
</dependency>
-----------------------------------------------
// jackson文件依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.10.1</version>
</dependency>
②添加hive-site.xml,向其中配置获取元数据的方式
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop102:9083</value>
</property>
/
在Hive安装的机器,开启元数据服务:
hive --service metastore
③idea中:配置SparkSession
private val sparkSession: SparkSession = SparkSession.builder
.enableHiveSupport().
config("spark.sql.warehouse.dir", "hdfs://hadoop102:9820/user/hive/warehouse").
config(conf).getOrCreate()