spark-之访问Hive数据源(外部、内部Hive、thrift server)
spark本身就使用的是Hive的Catalog作为内部shema的标准,如果在类路径下访问不到Hive的conf文件,那么就会在本地生成Hive相关的元数据、数据目录,这些内容被称为Spark的内置hive,通常我们需要连接的数据源是外部hive.
由于不管是哪种模式,就算是最简单的local模式,我们也可以连接hive数据源进行相关操作,以下操作都是基于local模式,当然你可以使用standalone和yarn进行操作也是okay的。
1 访问内部hive
- 啥也不用做,解压之后进入spark-home目录。
- 执行
或者bin/spark-sql
,进入交互式命令行之后,使用SQL进行查询:bin/spark-shell
spark.sql("show tables").show
- 然后尝试创建表,插入数据.
- 然后在退出客户端,进入spark-home的目录下,你就会发现生成了
,derby.log
目录,以及spark-warehouse
目录,这就是内部hive的目录结构.metadata_db
- 此时进入
目录,你就会发现自己刚才创建的表以及表中数据.spark-warehouse
2 访问外部Hive
- 将hive/conf/hive-site.xml 拷贝到spark的conf目录下.
- 将Hive元数据库MySQL的驱动jar包拷贝到spark的jars目录下,如果是Derby不需要拷贝.
- 如果访问不到HDFS,将hdfs-site.xml,以及core-site.xml拷贝到spark的conf目录下.
- 启动spark-sql,然后执行
,你就会发现现在访问的是外部hive的数据.select * from tablename
3 通过代码连接外部Hive
//1、配置maven依赖 :spark-hive、hive-exec、spark-core、spark-sql
//2、将hive-site.xml放入项目类路径下
//3、添加mysql驱动依赖 :mysql-connector-java
NOTE:
如果hive-site.xml在项目中的target目录下没有,那么我们需要手动将其拷贝到target目录下。
//1、首先引入依赖(包括hive exec和Mysql Driver),请看pom.xml文件
//2、开启enableHiveSupport()支持
//3、创建dataFrame,然后查询并在控制台输出
val conf = new SparkConf()
.setMaster("local[*]")
.setAppName("HiveSpark")
.set("spark.sql.warehouse.dir","hdfs://shufang101:9000/user/hive/warehouse")
.set("spark.sql.hive.metastore.version","1.2.2")
val spark = SparkSession.builder()
.enableHiveSupport() //开启hive支持
.config(conf)
.getOrCreate()
import spark.sql
// import spark.implicits._
sql("show tables").show()
4 spark通过beeline客户端操作Hive
spark thrift server是基于hiveServer2实现的的一个Thrift组件,无缝兼容Hiverserver2,所以thrift server可以取代HiveServer2,它界面更加美观,shema的结构展示也排版很好,具体操作步骤如下
- 将hive-site.xml拷贝到spark-home/conf目录下
- 元数据库MySQL驱动拷贝到对应的spark-home/jars目录下(使用原生derby不用操作)
- 如果访问不到HDFS,将hdfs-site.xml和core-site.xml拷贝到spark-home/conf目录下
- 启动Thrift Server
sbin/start-thriftserver.sh
- 使用beeline客户端使用jdbc的方式去连接thriftserver(hiveserver2)
[[email protected] sparklocal-2.1.1]$ bin/beeline -u jdbc:hive2://shufang101:10000 -n shufang -d com.mysql.cj.jdbc.Driver
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>
Connecting to jdbc:hive2://shufang101:10000
log4j:WARN No appenders could be found for logger (org.apache.hive.jdbc.Utils).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Connected to: Spark SQL (version 2.1.1)
Driver: Hive JDBC (version 1.2.1.spark2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 1.2.1.spark2 by Apache Hive
0: jdbc:hive2://shufang101:10000> show tables;
+-----------+------------+--------------+--+
| database | tableName | isTemporary |
+-----------+------------+--------------+--+
| default | emps | false |
+-----------+------------+--------------+--+
1 row selected (0.426 seconds)
0: jdbc:hive2://shufang101:10000> select * from emps;
+-------+-----------+--+
| id | name |
+-------+-----------+--+
| 1001 | superman |
| 1002 | biteman |
| 1003 | thisman |
+-------+-----------+--+
3 rows selected (4.167 seconds)
# 此时就连接成功了,让然我们可以设置日志级别为ERROR,显示更少的日志