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核心技術的研究。
服務器

相關文章
相關標籤/搜索