在使用CLI前,要先启动hive metastore;而CLI的配置非常简单,在conf/hive-site.xml中之需要指定hive metastore的uris就可以使用了。现在要在客户端wyy上使用spark-sql,配置conf/hive-site.xml如下:
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配置:
hive.metastore.uris
thrift://hadoop3:9083
Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.
hive.server2.thrift.min.worker.threads
5
Minimum number of Thrift worker threads
hive.server2.thrift.max.worker.threads
500
Maximum number of Thrift worker threads
hive.server2.thrift.port
10000
Port number of HiveServer2 Thrift interface. Can be overridden by setting $HIVE_SERVER2_THRIFT_PORT
hive.server2.thrift.bind.host
hadoop2
Bind host on which to run the HiveServer2 Thrift interface.Can be overridden by setting$HIVE_SERVER2_THRIFT_BIND_HOST
2.2 ThriftServer命令参数
使用sbin/start-thriftserver.sh --help可以查看ThriftServer的命令参数:
[hadoop@hadoop3 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的用户,密码为空:
- 切换数据库saledata;
- cache table tblstock;
- 对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可以更接近使用者,而非开发者。