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