3.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。
html

原文和做者一块儿讨论:http://www.cnblogs.com/intsmaze/p/6618841.htmljava

  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模式mysql

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。
linux

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

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

启动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方式运行,默认的监听端口为10000apache

 

用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语句,就是同时为两个用户输入的查询语句同时跑,必须等一个跑完了再跑第二个。
json

 

spark sql可视化

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

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

最后,这篇文章好久了,一直编辑没有发布,我如今已经一年不搞spark了,专一java核心技术的研究。
服务器

相关文章
相关标签/搜索