天天看点

spark-之访问Hive数据源(外部、内部Hive、thrift server)spark-之访问Hive数据源(外部、内部Hive、thrift server)

spark-之访问Hive数据源(外部、内部Hive、thrift server)

spark本身就使用的是Hive的Catalog作为内部shema的标准,如果在类路径下访问不到Hive的conf文件,那么就会在本地生成Hive相关的元数据、数据目录,这些内容被称为Spark的内置hive,通常我们需要连接的数据源是外部hive.

由于不管是哪种模式,就算是最简单的local模式,我们也可以连接hive数据源进行相关操作,以下操作都是基于local模式,当然你可以使用standalone和yarn进行操作也是okay的。

1 访问内部hive

  1. 啥也不用做,解压之后进入spark-home目录。
  2. 执行

    bin/spark-sql

    或者

    bin/spark-shell

    ,进入交互式命令行之后,使用SQL进行查询:

    spark.sql("show tables").show

  3. 然后尝试创建表,插入数据.
  4. 然后在退出客户端,进入spark-home的目录下,你就会发现生成了

    derby.log

    ,

    spark-warehouse

    目录,以及

    metadata_db

    目录,这就是内部hive的目录结构.
  5. 此时进入

    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,然后执行

    select * from tablename

    ,你就会发现现在访问的是外部hive的数据.

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,显示更少的日志
           

继续阅读