SparkSQL_Spark3.0.1 on Hive 配置及SparkSQL连接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。

Spark SQL和hive共用一套元数据库

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

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

<configuration>
        <property>
                <name>javax.jdo.option.ConnectionURL</name>
                <value>jdbc:mysql://192.168.19.131:3306/hivedb?createDatabaseIfNotExist=true</value>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionDriverName</name>
                <value>com.mysql.jdbc.Driver</value>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionUserName</name>
                <value>root</value>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionPassword</name>
                <value>hadoop</value>
        </property>
</configuration>

2.官网中显示还需要把hadoop集群中的hdfs-site.xml和core-site.xml文件拷贝到spark/conf文件夹下面。
也有人讲如果配置了hdfs高可用才需要拷贝这两个文件
在这里插入图片描述
3.启动spark-shell时指定mysql连接驱动位置

spark集群模式

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

sprk on yarn模式

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

4.执行sql语句
使用sqlContext.sql调用HQL

val rdd=sqlContext.sql("select * from default.person limit 2")//现在就可以直接使用sql语句了,只是要指定查询哪个库的哪张表。
rdd.write.json("hdfs://node4:9000/personresult")

使用org.apache.spark.sql.hive.HiveContext

import org.apache.spark.sql.hive.HiveContext
val hiveContext = new HiveContext(sc)
hiveContext.sql("select * from default.person ")

5.使用sprk-sql命令启动shell模式

启动spark-sql时指定mysql连接驱动位置(启动spark-sql那么就和hive的操作一样,里面可以直接写sql语句进行操作)

bin/spark-sql\
--master spark://node1:7077 \
--executor-memory 512m \
--total-executor-cores 3 \
--driver-class-path /home/opt/mysql-connector-java-8.0.17-bin.jar
# 里面直接写sql语句。
select * from default.person limit 2

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

6.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
    /node4/lib/mysql-connector-java-8.0.17-bin.jar。
  • 第二种是通过添加 :spark.driver.extraClassPath
    /node4/lib2/mysql-connector-java-8.0.17-bin.jar这种方式也可以实现添加多个依赖jar,比较方便。
  • 第三种是在运行时添加 --jars /node4/lib2/mysql-connector-java-8.0.17-bin.jar。
    启动thrift
    在spark根目录下执行:./sbin/start-thriftserver.sh 开启thrift服务器。
./start-thriftserver.sh --jars /home/hadoop/mysql-connector-java-8.0.17-bin.jar --master yarn

start-thriftserver.sh 和spark-submit的用法类似,可以接受所有spark-submit的参数,并且还可以接受–hiveconf 参数。不添加任何参数表示以local方式运行,默认的监听端口为10000

用beeline测试
在spark根目录下执行:

./bin/beeline

连接 JDBC/ODBC server

beeline> !connect jdbc:hive2://localhost:10000

连接后会提示输入用户名和密码,用户名可以填当前登陆的linux用户名,密码为空即可。

在java代码中用jdbc连接
用jdbc连接hiveserver2,连接hive的步骤同样如此。
在pom.xml添加以下依赖:

<dependency> 
        <groupId>org.apache.hive</groupId> 
        <artifactId>hive-jdbc</artifactId> 
        <version>2.3.7</version> 
</dependency> 
    
<dependency> 
        <groupId>org.apache.hadoop</groupId> 
        <artifactId>hadoop-common</artifactId> 
       <version>2.10.0</version> 
</dependency> 
   
<dependency> 
       <groupId>jdk.tools</groupId> 
       <artifactId>jdk.tools</artifactId> 
       <version>1.8</version> 
       <scope>system</scope> 
       <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath> 
   </dependency> 

驱动:org.apache.hive.jdbc.HiveDriver
url:jdbc:hive2://node3:10000/default
用户名:hadoop (启动thriftserver的linux用户名)
密码:“”(默认密码为空)

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
public class Test1 { 
    public static void main(String[] args) throws SQLException { 
        String url = "jdbc:hive2://192.168.19.131:10000/default"; 
        try { 
            Class.forName("org.apache.hive.jdbc.HiveDriver"); 
        } catch (ClassNotFoundException e) { 
            e.printStackTrace(); 
        } 
        Connection conn = DriverManager.getConnection(url,"hadoop",""); 
        Statement stmt = conn.createStatement(); 
        String sql = "SELECT * FROM personlimit 10"; 
        ResultSet res = stmt.executeQuery(sql); 
        while(res.next()){ 
            System.out.println("id: "+res.getInt(1)+"\tname: "+res.getString(2)+"\tage:" + res.getInt(3)); 
        } 
    } 

这种方式,可以在yarn的管理界面看到,会长起一个任务,该任务负责跑sql语句,但是不能并行跑sql语句,就是同时为两个用户输入的查询语句同时跑,必须等一个跑完了再跑第二个。

spark sql可视化

第一种方案:
将spark sql代码打包,sql语句和结果存储位置作为参数,java代码收集这些参数后,组装为命令,调用脚本来向集群提交jar包。

第二种方案:
根据Spark官网所述,Spark SQL实现了Thrift JDBC/ODBC server

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值