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。

原文和作者一起讨论:http://www.cnblogs.com/intsmaze/p/6618841.html

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

  Spark 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.如果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/intsmaze/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/intsmaze/mysql-connector-java-5.1.35-bin.jar
 
4.执行sql语句
 
  使用sqlContext.sql调用HQL
  val rdd=sqlContext.sql("select * from default.person limit 2")//现在就可以直接使用sql语句了,只是要指定查询哪个库的哪张表。
  rdd.write.json("hdfs://192.168.19.131: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://intsmaze:7077 \
--executor-memory 512m \
--total-executor-cores 3 \
--driver-class-path /home/intsmaze/mysql-connector-java-5.1.35-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 /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。

启动thrift

  在spark根目录下执行:./sbin/start-thriftserver.sh 开启thrift服务器。

./start-thriftserver.sh --jars /home/hadoop/mysql-connector-java-5.1.35-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连接

接下来打开eclipse用jdbc连接hiveserver2,连接hive的步骤同样如此。
在pom.xml添加以下依赖:
 <dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>1.2.1</version>
</dependency> <dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.4.1</version>
</dependency> <dependency>
<groupId>jdk.tools</groupId>
<artifactId>jdk.tools</artifactId>
<version>1.6</version>
<scope>system</scope>
<systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>
 
驱动:org.apache.hive.jdbc.HiveDriver
url:jdbc:hive2://192.168.19.131: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

最后,这篇文章很久了,一直编辑没有发布,我现在已经一年不搞spark了,专注java核心技术的研究。

 

3.sparkSQL整合Hive的更多相关文章

  1. SparkSql 整合 Hive

    SparkSql整合Hive 需要Hive的元数据,hive的元数据存储在Mysql里,sparkSql替换了yarn,不需要启动yarn,需要启动hdfs 首先你得有hive,然后你得有spark, ...

  2. Spark之 SparkSql整合hive

    整合: 1,需要将hive-site.xml文件拷贝到Spark的conf目录下,这样就可以通过这个配置文件找到Hive的元数据以及数据存放位置. 2,如果Hive的元数据存放在Mysql中,我们还需 ...

  3. 【Spark】帮你搞明白怎么通过SparkSQL整合Hive

    文章目录 一.创建maven工程,导包 二.开发代码 一.创建maven工程,导包 <properties> <scala.version>2.11.8</scala.v ...

  4. Hive环境搭建和SparkSql整合

    一.搭建准备环境 在搭建Hive和SparkSql进行整合之前,首先需要搭建完成HDFS和Spark相关环境 这里使用Hive和Spark进行整合的目的主要是: 1.使用Hive对SparkSql中产 ...

  5. 关于sparksql操作hive,读取本地csv文件并以parquet的形式装入hive中

    说明:spark版本:2.2.0 hive版本:1.2.1 需求: 有本地csv格式的一个文件,格式为${当天日期}visit.txt,例如20180707visit.txt,现在需要将其通过spar ...

  6. Spark整合Hive

    spark-sql 写代码方式 1.idea里面将代码编写好打包上传到集群中运行,上线使用 spark-submit提交 2.spark shell (repl) 里面使用sqlContext 测试使 ...

  7. 大数据学习day25------spark08-----1. 读取数据库的形式创建DataFrame 2. Parquet格式的数据源 3. Orc格式的数据源 4.spark_sql整合hive 5.在IDEA中编写spark程序(用来操作hive) 6. SQL风格和DSL风格以及RDD的形式计算连续登陆三天的用户

    1. 读取数据库的形式创建DataFrame DataFrameFromJDBC object DataFrameFromJDBC { def main(args: Array[String]): U ...

  8. SparkSQL读取Hive中的数据

    由于我Spark采用的是Cloudera公司的CDH,并且安装的时候是在线自动安装和部署的集群.最近在学习SparkSQL,看到SparkSQL on HIVE.下面主要是介绍一下如何通过SparkS ...

  9. SparkSQL与Hive on Spark的比较

    简要介绍了SparkSQL与Hive on Spark的区别与联系 一.关于Spark 简介 在Hadoop的整个生态系统中,Spark和MapReduce在同一个层级,即主要解决分布式计算框架的问题 ...

随机推荐

  1. java调用天气预报接口案例

    免费天气接口:http://mobile.weather.com.cn/data/sk/城市ID.html 例如: http://mobile.weather.com.cn/data/sk/10124 ...

  2. sqlserver waitfor time 延迟函数的用法

    SQL有定时执行的语句 WaitFor,可以写到一个存储过程中再执行一次 语法:WaitFor{Delay 'time'|Time 'time} Delay后面的时间为延迟多少时间执行 Time后面的 ...

  3. Windows Server 2016-Powershell管理站点复制

    对于Active Directory的Windows PowerShell包括管理复制.网站.域和森林,域控制器以及分区的能力.例如Active Directory的站点和服务管理单元和repadmi ...

  4. Python中函数partial的应用

    函数在执行时,要带上所有必要的参数进行调用.但是,有时参数可以在函数被调用之前提前获知.这种情况下, 一个函数有一个或多个参数预先就能用上,以便函数能用更少的参数进行调用.通过设定参数的默认值,可以降 ...

  5. Linux 小知识翻译 - 「SCP和SFTP」

    这次想说说「SCP和SFTP」. 不管SCP还是SFTP,都是SSH的功能之一.都是使用SSH协议来传输文件的. 不用说文件内容,就是登录时的用户信息都是经过SSH加密后才传输的,所以说SCP和SFT ...

  6. Java多线程(三)如何创建线程

    点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...

  7. 安利一波:Adobe 2019全家桶 破解版

    之前发过一篇Photoshop破解的文章,今天把笔记本换了个系统,发现之前那个amtlib.dll替换破解的方式不适用于最新版的Adobe 2019 CC系列了,刚好看到群里有大佬分享了一个全家桶,给 ...

  8. 转://Oracle A用户给B用户授权查询指定表或视图权限方案

    用DNINMSV31账户登录数据库进行如下操作: CREATE USER NORTHBOUND IDENTIFIED BY NORTHBOUND DEFAULT TABLESPACE "TB ...

  9. Linux中的cat、more、less、head、tail命令

    cat [OPTION]... [FILE]... -E:显示行结束符$ -n:对显示出的每一行进行编号 cat后面可以加多个文件,也就是说可以把多个文件连接起来,然后dump到标准输出. 另外cat ...

  10. Mqtt用户认证

    http://emqtt.com/docs/v2/guide.html 1默认是匿名认证,不用输入用户名和密码,直接可连接 2如何开启用户名和密码认证模式 2-1关闭匿名认证 在你的MQTT安装目录下 ...