1. 程式人生 > >sparkSQL1.1入門之七:ThriftServer和CLI

sparkSQL1.1入門之七:ThriftServer和CLI

      spark1.1相較於spark1.0,最大的差別就在於spark1.1增加了萬人期待的CLI和ThriftServer。使得hive使用者還有用慣了命令列的RDBMS資料庫管理員很容易地上手sparkSQL,在真正意義上進入了SQL時代。下面先簡單介紹其使用,限於時間關係,以後再附上原始碼分析。 1:令人驚訝的CLI       剛部署好spark1.1就迫不及待地先測試CLI(bin/spark-sql),對於習慣了sql命令列的本人,失去了shark後,對於sparkSQL1.0一度很是抵觸(其實對於開發除錯人員來說,spark-shell才是利器,可以很方便地使用各個spark生態中的元件)。急切中,沒有關閉hive metastore服務,然後一個bin/spark-sql就進入了命令列,然後通過hive metastore就可以直接對hive進行查詢了:
spark-sql> use saledata;
//所有訂單中每年的銷售單數、銷售總額
spark-sql> select c.theyear,count(distinct a.ordernumber),sum(b.amount) from tblStock a join tblStockDetail b on a.ordernumber=b.ordernumber join tbldate c on a.dateid=c.dateid group by c.theyear order by c.theyear;
執行結果:
順便地測試了一下hive0.13的語法(測試系統中使用的是hive0.13,spark1.1編譯的時候是hive0.12,毫無意外地,在CLI裡是不能使用hive0.13的語法,必須使用和spark匹配的hive版本的hive語法)。 1.1 CLI配置
      在使用CLI前,要先啟動hive metastore;而CLI的配置非常簡單,在conf/hive-site.xml中之需要指定hive metastore的uris就可以使用了。現在要在客戶端wyy上使用spark-sql,配置conf/hive-site.xml如下:
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop3:9083</value>
<description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description>
</property>
</configuration>
1.2 CLI命令引數 通過bin/spark-sql --help可以檢視CLI命令引數:
[[email protected] spark110]$ bin/spark-sql --help
Usage: ./bin/spark-sql [options] [cli option]
CLI options:
 -d,--define <key=value>          Variable subsitution to apply to hive
                                  commands. e.g. -d A=B or --define A=B
    --database <databasename>     Specify the database to use
 -e <quoted-query-string>         SQL from command line
 -f <filename>                    SQL from files
 -h <hostname>                    connecting to Hive Server on remote host
    --hiveconf <property=value>   Use value for given property
    --hivevar <key=value>         Variable subsitution to apply to hive
                                  commands. e.g. --hivevar A=B
 -i <filename>                    Initialization SQL file
 -p <port>                        connecting to Hive Server on port number
 -S,--silent                      Silent mode in interactive shell
 -v,--verbose                     Verbose mode (echo executed SQL to the
                                  console)
其中[options] 是CLI啟動一個SparkSQL應用程式的引數,如果不設定--master的話,將在啟動spark-sql的機器以local方式執行,只能通過http://機器名:4040進行監控;這部分引數,可以參照Spark1.0.0 應用程式部署工具spark-submit 的引數。 [cli option]是CLI的引數,通過這些引數,CLI可以直接執行SQL檔案、進入命令列執行SQL命令等等,類似以前的shark的用法。需要注意的是CLI不是使用JDBC連線,所以不能連線到ThriftServer;但可以配置conf/hive-site.xml連線到hive的metastore,然後對hive資料進行查詢。 1.3 CLI使用 啟動spark-sql:
bin/spark-sql --master spark://hadoop1:7077 --executor-memory 3g
在叢集監控頁面可以看到啟動了SparkSQL應用程式:
這時就可以使用HQL語句對hive資料進行查詢,另外,可以使用COMMAND,如使用set進行設定引數:預設情況下,sparkSQL shuffle的時候是200個partition,可以使用如下命令修改這個引數:
SET spark.sql.shuffle.partitions=20;
運行同一個查詢語句,引數改變後,Task(partition)的數量就由200變成了20。
基本上,在CLI可以使用絕大多數的hive特性。  2:ThriftServer       ThriftServer是一個JDBC/ODBC介面,使用者可以通過JDBC/ODBC連線ThriftServer來訪問SparkSQL的資料。ThriftServer在啟動的時候,會啟動了一個sparkSQL的應用程式,而通過JDBC/ODBC連線進來的客戶端共同分享這個sparkSQL應用程式的資源,也就是說不同的使用者之間可以共享資料;ThriftServer啟動時還開啟一個偵聽器,等待JDBC客戶端的連線和提交查詢。所以,在配置ThriftServer的時候,至少要配置ThriftServer的主機名和埠,如果要使用hive資料的話,還要提供hive metastore的uris。 2.1 ThriftServer配置       通常,ThriftServer可以在conf/hive-site.xml中定義以下幾項配置,也可以使用環境變數的方式進行配置(環境變數的優先順序高於hive-site.xml)。       下面是在實驗叢集中hadoop2上啟動ThriftServer的hive-site.xml配置:
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop3:9083</value>
<description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description>
</property>

<property>
<name>hive.server2.thrift.min.worker.threads</name>
<value>5</value>
<description>Minimum number of Thrift worker threads</description>
</property>

<property>
<name>hive.server2.thrift.max.worker.threads</name>
<value>500</value>
<description>Maximum number of Thrift worker threads</description>
</property>

<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
<description>Port number of HiveServer2 Thrift interface. Can be overridden by setting $HIVE_SERVER2_THRIFT_PORT</description>
</property>

<property>
<name>hive.server2.thrift.bind.host</name>
<value>hadoop2</value>
<description>Bind host on which to run the HiveServer2 Thrift interface.Can be overridden by setting$HIVE_SERVER2_THRIFT_BIND_HOST</description>
</property>
</configuration>
2.2 ThriftServer命令引數 使用sbin/start-thriftserver.sh --help可以檢視ThriftServer的命令引數:
[[email protected] spark110]$ sbin/start-thriftserver.sh --help
Usage: ./sbin/start-thriftserver [options] [thrift server options]
Thrift server options:
      Use value for given property
其中[options] 是ThriftServer啟動一個SparkSQL應用程式的引數,如果不設定--master的話,將在啟動ThriftServer的機器以local方式執行,只能通過http://機器名:4040進行監控;這部分引數,可以參照Spark1.0.0 應用程式部署工具spark-submit 的引數。在叢集中提供ThriftServer的話,一定要配置master、executor-memory等引數。 [thrift server options]是ThriftServer的引數,可以使用-dproperty=value的格式來定義;在實際應用上,因為引數比較多,通常使用conf/hive-site.xml配置。 2.3 ThriftServer使用 2.3.1 啟動ThriftServer 啟動ThriftServer,使之執行在spark叢集中:
sbin/start-thriftserver.sh --master spark://hadoop1:7077 --executor-memory 3g
在叢集監控頁面可以看到啟動了SparkSQL應用程式:
注意不要將hive.server2.thrift.bind.host配置能localhost,不然遠端客戶端不能連線。 2.3.2 遠端客戶端連線 切換到客戶端wyy,啟動bin/beeline,用!connect jdbc:hive2://hadoop2:10000連線ThriftServer,因為沒有采用許可權管理,所以使用者名稱用執行bin/beeline的使用者,密碼為空:
然後,對tblstock進行下面操作:
  1. 切換資料庫saledata;
  2. cache table tblstock;
  3. 對tblstock計數;

因為首次操作,所以統計花了11.725秒,檢視webUI,tblStock已經快取:
然後啟動另外一個遠端連線,切換到hadoop1,啟動bin/beeline,用!connect jdbc:hive2://hadoop2:10000連線ThriftServer,然後直接執行對tblstock計數(注意沒有進行資料庫的切換):
用時0.664秒,再檢視webUI中的stage:
Locality Level是PROCESS,顯然是使用了快取表。 從上可以看出,ThriftServer可以連線多個JDBC/ODBC客戶端,並相互之間可以共享資料。順便提一句,ThriftServer啟動後處於監聽狀態,使用者可以使用ctrl+c退出ThriftServer;而beeline的退出使用!q命令。 2.3.3 程式碼示例       有了ThriftServer,開發人員可以非常方便的使用JDBC/ODBC來訪問sparkSQL。下面是一個scala程式碼,查詢表tblStockDetail ,返回amount>3000的單據號和交易金額:
package doc

import java.sql.DriverManager

object SQLJDBC {
  def main(args: Array[String]) {
    Class.forName("org.apache.hive.jdbc.HiveDriver")
    val conn = DriverManager.getConnection("jdbc:hive2://hadoop2:10000", "hadoop", "")
    try {
      val statement = conn.createStatement
      val rs = statement.executeQuery("select ordernumber,amount from tblStockDetail where amount>3000")
      while (rs.next) {
        val ordernumber = rs.getString("ordernumber")
        val amount = rs.getString("amount")
        println("ordernumber = %s, amount = %s".format(ordernumber, amount))
      }
    } catch {
      case e: Exception => e.printStackTrace
    }
    conn.close
  }
}
執行結果: 3:小結       總的來說,ThriftServer和CLI的引入,使得sparkSQL可以更方便的使用hive資料,使得sparkSQL可以更接近使用者,而非開發者。