Spark SQL 整合 Hive

        spark SQL经常需要访问Hive metastore,Spark SQL可以通过Hive metastore获取Hive表的元数据。从Spark 1.4.0开始,Spark SQL只需简单的配置,就支持各版本Hive metastore的访问。注意,涉及到metastore时Spar SQL忽略了Hive的版本。Spark SQL内部将Hive反编译至Hive 1.2.1版本,Spark SQL的内部操作(serdes, UDFs, UDAFs, etc)都调用Hive 1.2.1版本的class。

方法

spaek-shell & spark-sql

        Spark SQL自己也可创建元数据库,并不一定要依赖hive创建元数据库,所以不需要一定启动hive,只要有元数据库,Spark SQL就可以使用。但是如果要像hive一样持久化文件与表的关系就要使用hive,当然可以不启动hive程序使用spark提供的HiveContext类即可。

1.将hive的hive-site.xml拷贝到放入$SPARK-HOME/conf目录下,里面配置的是Hive metastore元数据存放在数据库的位置,当然如果数据库不存在,我们可以定义一个数据库,然后程序在spark集群运行的时候就会自动创建对应的元数据库。

<!-- 该参数主要指定Hive的数据存储目录  -->
<property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse</value>
</property>
<!--配置mysql的连接字符串-->
<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://hadoop01:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<!--配置mysql的连接驱动-->
<property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
</property>
<!--配置登录mysql的用户-->
<property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
</property>
<!--配置登录mysql的密码-->
<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>123456</value>
</property>

这种方式直接绕过了master server 直接访问数据库种的元数据,不建议使用这种方法,因为实际开发中,是不会给你数据库的账号密码,而是给你master server的ip地址和端口来连接

建议使用,通过访问master server这个服务然后连接数据获取,

方法:

在操作的的电脑$SPARK-HOME/conf目录下,加个hive-site.xml文件,文件类容入下

<!--通过改kv属性连接-->
<property>
    <name>hive.metastore.uris</name>
    <value>thrift://hadoop01:9083</value>
</property>
<!-- 添加这个元数据路径是HDFS,不是本地  -->
<!-- 该参数主要指定Hive的数据存储目录  -->
<property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse</value>
</property>

2.如果hdfs配置了高可用,则还要把hadoop集群中的hdfs-site.xml和core-site.xml文件拷贝到spark/conf文件夹下面。

3.启动spark-shell时指定mysql连接驱动位置

spark集群模式

bin/spark-shell \
 --master spark://intsmaze:7077 \
 --executor-memory 512m \
 --total-executor-cores 2\
 --driver-class-path /home//mysql-connector-java-5.1.35-bin.jar

sprk on yarn模式

bin/spark-shell \
 --master yarn \
 --executor-memory 512m \
 --total-executor-cores 2\
 --driver-class-path /home/mysql-connector-java-5.1.35-bin.jar

4.执行sql语句

spark.sql(show databases)

spark sql如何向元数据中添加数据?因为元数据库中只是存放表对应数据在hdfs的地址,并没有存放表的数据信息,spark sql可以创建表,但是无法向表中添加数据比如insert语句。注意与把DF数据存储到数据库不是一个概念。

5.Thrift JDBC/ODBC server

         Spark SQL实现Thrift JDBC/ODBC server,这就意味着我们可以像HIVE那样通过JDBC远程连接Spark SQL发送SQL语句并执行。在这之前需要先将${HIVE_HOME}/conf/hive-site.xml 拷贝到${SPARK_HOME}/conf目录下,由于我的hive配置了元数据信息存储在MySQL中,所以Spark在访问这些元数据信息时需要mysql连接驱动的支持。

添加驱动的方式有三种

  第一种是在${SPARK_HOME}/conf目录下的spark-defaults.conf中添加:spark.jars /intsmaze/lib/mysql-connector-java-5.1.26-bin.jar。

  第二种是通过添加 :spark.driver.extraClassPath /intsmaze/lib2/mysql-connector-java-5.1.26-bin.jar这种方式也可以实现添加多个依赖jar,比较方便。

  第三种是在运行时添加 --jars /intsmaze/lib2/mysql-connector-java-5.1.26-bin.jar。

IDEA方式

创建Maven的项目,pom.xml添加

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-hive_2.11</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>1.2.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.11</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.7.6</version>
        </dependency>

创建resources资源目录,里面放上面一样的文件

 这样就可以开始写代码了

 System.setProperty("HADOOP_USER_NAME","root")
    val spark: SparkSession = SparkSession.builder().master("local")
        .appName("Spark2Hive")
        .enableHiveSupport().getOrCreate()
    spark.sql("select * from test.account").show

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值