天天看點

Spark綜合學習筆記(二十九)SparkSQL分布式SQL引擎

學習緻謝

​​https://www.bilibili.com/video/BV1Xz4y1m7cv?p=66​​

說明

Hive的SQL互動方式

方式1∶互動式指令行(CLI)

​​

​· bin/hive​

​​,編寫SQL語句及DDL語句

方式2: 啟動服務HiveServer2 (Hive ThriftServer2)

·将Hive當做一個服務啟動(類似MySQL資料庫,啟動一個服務),端口為10000

·互動式指令行,​​

​bin/beeline​

​​,CDH 版本HIVE建議使用此種方式,CLI方式過時

· 2JDBC/ODBC方式,類似MySQL中JDBC/ODBC方式

同樣的SparkSQL也支援這樣的通路方式

1.SparkSQL的指令行

2.在某一台機器啟動SparkSQL的ThriftServer,然後可以在其他機器使用beeline通路

使用beeline用戶端連接配接

0.hive的中繼資料庫服務metastore保持啟動狀态 --node2

nohup./export/server/hive/bin/hive --service metastore &      

1.啟動SparkSQL的ThriftServer----類似于HiveServer------node2啟動

/export/server/ spark /sbin/start-thriftserver.sh \
--hiveconf hive.server2.thrift.port=10000 \
--hiveconf hive.server2.thrift. bind.host=node2 \
--master loca1 [2]      

​​http://node2:4040/jobs/​

Spark綜合學習筆記(二十九)SparkSQL分布式SQL引擎

2.在其他機器使用beeline連接配接sparkSql的thirftService

/export/server/spark/bin/beeline
!connect jdbc:hive2://node2:10000
root
123456      
Spark綜合學習筆記(二十九)SparkSQL分布式SQL引擎

3.執行sql

show databases;
show tables;
select * from person;      
Spark綜合學習筆記(二十九)SparkSQL分布式SQL引擎

使用代碼通路

0.導入依賴

<dependency>
<groupId>org.apache.spark</groupId>
<artifactid>spark-hive-thriftserver_2.12</artifactId>
<version>$ispark.version}</version>
</dependency>      
package sql

import java.sql.{DriverManager, PreparedStatement, ResultSet}


/**
  * Author itcast
  * Desc 示範jdbc通路SparkSQL的ThrifrServer
  * */
  object Demo10_ThirftServer{
  def main(args: Array[String]): Unit = {
    //0.加載驅動
    Class.forName("org.apache.hive.jdbc.HiveDriver")

    //1.擷取連接配接
    val conn = DriverManager.getConnection(
      "jdbc:hive://node2:10000/default", //看上去像是在使用Hive的server2,本質上使用Spark的ThrifServer
      "root",
      "123456"
    )
    //2.編寫sql
    val sql =
      """select id,name,age from person"""
    //3.擷取預編譯語句對象
    val ps: PreparedStatement = conn.prepareStatement(sql)
    //4.執行sql
    val rs: ResultSet = ps.executeQuery()
    //5.擷取結果
    while (rs.next()){
    val id: Int = rs.getInt("id")
    val name: String = rs.getString("name")
    val age: Int = rs.getInt("age")
    println(s"id=${id},name=${name},age=${age}")
  }
    //6.關閉資源
    if (conn!=null)conn.close()
    if (ps!=null)ps.close()
    if (rs!=null)rs.close()
  }
}