Spark 2.2.1 集成Hive数据仓库的案例与解读
一般情况下,各个公司都会建立自己的数据仓库,尤其是当前大数据生态圈中使用最普遍的Hive数据仓库,需要集成这部分数据,向外提供这部分数据的查询接口。Spark SQL提供了分布式SQL引擎,支持直接运行SQL查询的接口,不用写任何代码。
运行的集群环境说明:在新建的集群上运行,部署Spark 2.2.1版本和Hadoop 2.6.0版本,Hive 版本为apache-hive-1.2.1,对应Mysql数据库的驱动Jar包为:mysql-connector-java-5.1.35.tar.gz。
(一) ThriftJDBC/ODBC的案例。
Spark SQL提供Thrift JDBC/ODBC支持, 实现的Thrift JDBC/ODBC服务器与Hive HiveServer2相一致。可以用在Spark 或者Hive附带的Beeline脚本测试JDBC服务器。
下面给出两种方式启动JDBC/ODBC服务的案例。参考Hive的默认配置文件中的属性:
hive.server2.transport.mode
binary
Expects oneof [binary, http].
Transportmode of HiveServer2.
传输模式支持两种(Binary和Http),默认的方式为Binary。
一:默认传输模式(Binary)启动JDBC/ODBC服务的案例。
这种情况下,在hive-site.xml 中没有对hive.server2.transport.mode等进行修改。
1) 在Spark目录中,运行start-thriftserver.sh命令启动JDBC/ODBC服务器。
root@master:~# cd/usr/local/spark-2.2.1-bin-hadoop2.6
root@master:/usr/local/spark-2.2.1-bin-hadoop2.6#cd sbin
root@master:/usr/local/spark-2.2.1-bin-hadoop2.6/sbin#start-thriftserver.sh
startingorg.apache.spark.sql.hive.thriftserver.HiveThriftServer2, logging to/usr/local/spark-2.2.1-bin-hadoop2.6/logs/spark-root-org.apache.spark.sql.hive.thriftserver.HiveThriftServer2-1-master.out
这个脚本接受任何的bin/spark-submit命令行参数,加上一个--hiveconf参数用来指明Hive属性。可以运行./sbin/start-thriftserver.sh--help来获得所有可用选项的完整列表。默认情况下,服务器监听localhost:10000。
可以用环境变量覆盖这些变量。
root@master:/usr/local/spark-2.2.1-bin-hadoop2.6/sbin# export
HIVE_SERVER2_THRIFT_PORT=10001
root@master:/usr/local/spark-2.2.1-bin-hadoop2.6/sbin# exportHIVE_SERVER2_THRIFT_BIND_HOST=master
root@master:/usr/local/spark-2.2.1-bin-hadoop2.6/sbin#start-thriftserver.sh --masterspark://master:7077 --driver-class-path/usr/local/apache-hive-1.2.1/lib/mysql-connector-java-5.1.13-bin.jar
startingorg.apache.spark.sql.hive.thriftserver.HiveThriftServer2, logging to/usr/local/spark-2.2.1-bin-hadoop2.6/logs/spark-root-org.apache.spark.sql.hive.thriftserver.HiveThriftServer2-1-master.out
使用Spark的应用程序start-thriftserver.sh启动Thriftserver的时候,同样需加上--driver-class-path/usr/local/apache-hive-1.2.1/lib/mysql-connector-java-5.1.13-bin.jar的配置参数,不然会报找不到“com.mysql.jdbc.Driver”的错误。查看Thriftserver启动的日志/usr/local/spark-2.2.1-bin-hadoop2.6/logs/spark-root-org.apache.spark.sql.hive.thriftserver.HiveThriftServer2-1-master.out。SparkSubmit提交应用程序的入口类是HiveThriftServer2。
root@master:/usr/local/spark-2.2.1-bin-hadoop2.6/sbin# cat /usr/local/spark-2.2.1-bin-
hadoop2.6/logs/spark-root-org.apache.spark.sql.hive.thriftserver.HiveThriftServer2-1-master.out
Spark Command: /usr/local/jdk1.8.0_60/bin/java -cp/usr/local/apache-hive-1.2.1/lib/mysql-connector-java-5.1.13-bin.jar:/usr/local/spark-2.2.1-bin-hadoop2.6/conf/:/usr/
local/spark-2.2.1-bin-hadoop2.6/jars/*:/usr/local/hadoop-2.6.0/etc/hadoop/-Dalluxio.zookeeper.address=192.168.189.1:2181,192.168.189.2:2181,192.168.189.3:2181-Dalluxio.usezookeeper=true -Xmx1g org.apache.spark.deploy.SparkSubmit --masterspark://master:7077 --conf spark.driver.extraClassPath=/usr/local/apache-hive-1.2.1/lib/mysql-connector-java-5.1.13-bin.jar--class org.apache.spark.sql.hive.thriftserver.HiveThriftServer2 --name ThriftJDBC/ODBC Server spark-internal
…….
2) 执行Spark 2.2.1自带的Beeline工具,通过!connectjdbc:hive2://master:10001命令连接到HiveThriftServer2服务。
root@master:/usr/local/spark-2.2.1-bin-hadoop2.6/bin#./beeline
Beeline version1.2.1.spark2 by Apache Hive
beeline>!connect jdbc:hive2://master:10001
Connecting tojdbc:hive2://master:10001
Enter username forjdbc:hive2://master:10001: root
Enter password forjdbc:hive2://master:10001: ****
18/02/20 19:01:40INFO jdbc.Utils: Supplied authorities: master:10001
18/02/20 19:01:40INFO jdbc.Utils: Resolved authority: master:10001
18/02/20 19:01:40INFO jdbc.HiveConnection: Will try to open client transport with JDBC Uri:jdbc:hive2://master:10001
Connected to: SparkSQL (version 2.2.1)
Driver: Hive JDBC(version 1.2.1.spark2)
Transactionisolation: TRANSACTION_REPEATABLE_READ
0:jdbc:hive2://master:10001>
3) 在BeelineShell交互式工具中查询Hive中的数据库及表。
0:jdbc:hive2://master:10001> show databases;
+---------------+--+
| databaseName |
+---------------+--+
| default |
| hive |
| hivestudy |
+---------------+--+
3 rows selected(1.155 seconds)
0: jdbc:hive2://master:10001>use hive;
+---------+--+
| Result |
+---------+--+
+---------+--+
No rows selected(0.093 seconds)
0:jdbc:hive2://master:10001> show tables;
+-----------+-------------+--------------+--+
| database | tableName | isTemporary |
+-----------+-------------+--------------+--+
| hive | pokes | false |
| hive | pokes_test | false |
+-----------+-------------+--------------+--+
2 rows selected(0.055 seconds)
设置--master参数后,应用提交到Spark Standaone集群,查看界面可以看到应用信息,应用的名称为Thrift JDBC/ODBCServer,具体内容如3-8 所示。
图 3 - 8 Spark 监控界面上的applications信息
单击Thrift JDBC/ODBC Server ,进入应用页面,单击JDBC/ODBC Server栏目,查看Spark SQL的统计信息。如图3-9所示。
图 3 - 9 ThriftJDBC/ODBC Server 应用的Spark SQL的统计信息
接下来将使用Spark 2.2.1的默认参数启动Thriftserver服务,具体参数和spark-submit一样,可以根据需要调整。先停掉之前端口配置为10001的Thriftserver服务。
4) 停掉Thriftserver服务。
root@master:/usr/local/spark-2.2.1-bin-hadoop2.6/sbin#stop-thriftserver.sh
stoppingorg.apache.spark.sql.hive.thriftserver.HiveThriftServer2
清空之前环境变量的配置。
root@master:/usr/local/spark-2.2.1-bin-hadoop2.6/sbin#unset HIVE_SERVER2_THRIFT_PORT
root@master:/usr/local/spark-2.2.1-bin-hadoop2.6/sbin# unsetHIVE_SERVER2_THRIFT_BIND_HOST
如果需要配置参数,可以通过系统变量覆盖,命令如下:
./sbin/start-thriftserver.sh\
--hiveconfhive.server2.thrift.port= \
--hiveconfhive.server2.thrift.bind.host= \
--master
...
5) 使用系统的默认配置,重新启动ThriftJDBC/ODBC服务,使用Beeline来测试Thrift JDBC/ODBC服务器。
在Spark部署主目录下输入:
root@master:/usr/local/spark-2.2.1-bin-hadoop2.6/sbin#start-thriftserver.sh --master
spark://master:7077 --driver-class-path/usr/local/apache-hive-1.2.1/lib/mysql-connector-java-5.1.13-bin.jar
starting org.apache.spark.sql.hive.thriftserver.HiveThriftServer2,logging to/usr/local/spark-2.2.1-bin-hadoop2.6/logs/spark-root-org.apache.spark.sql.hive.thriftserver.HiveThriftServer2-1-master.out
6) 启动Beeline工具,以默认的端口连接到Thrift JDBC/ODBC服务器。
root@master:/usr/local/spark-2.2.1-bin-hadoop2.6/bin#./beeline
Beeline version1.2.1.spark2 by Apache Hive
beeline> !connect jdbc:hive2://localhost:10000
Connecting tojdbc:hive2://localhost:10000
Enter username forjdbc:hive2://localhost:10000: root
Enter password forjdbc:hive2://localhost:10000:
18/02/20 19:42:40INFO jdbc.Utils: Supplied authorities: localhost:10000
18/02/20 19:42:40INFO jdbc.Utils: Resolved authority: localhost:10000
18/02/20 19:42:40INFO jdbc.HiveConnection: Will try to open client transport with JDBC Uri:jdbc:hive2://localhost:10000
Connected to: SparkSQL (version 2.2.1)
Driver: Hive JDBC(version 1.2.1.spark2)
Transactionisolation: TRANSACTION_REPEATABLE_READ
0:jdbc:hive2://localhost:10000>
这里的Localhost和10000是默认的主机和端口号,可以用Thrift JDBC/ODBC服务启动时的实际主机和端口号进行替换。
Beeline将会询问用户名和密码。在非安全的模式,输入机器用户名和空密码就可以。对于安全模式,可以按照Beeline文档的说明来执行。注意:当报URL连接无效时,如果确认URL正确,可以查看进程或日志,先确认ThriftJDBC/ODBC服务是否已经正常启动。
7) Beeline交互界面上执行基本的SQL语句:查询数据库及表。
0: jdbc:hive2://localhost:10000> use hive
0: jdbc:hive2://localhost:10000> show tables;
+-----------+-----------------+--------------+--+
| database | tableName | isTemporary |
+-----------+-----------------+--------------+--+
| default |partition_test | false |
| default |pokes | false |
+-----------+-----------------+--------------+--+
2 rows selected (1.048 seconds)
show tables可以看到之前用Spark SQL在Hive中建立的所有表信息。
8) 发送Quit命令,退出Beeline工具。
0: jdbc:hive2://localhost:10000> !quit
Closing: 0: jdbc:hive2://localhost:10000
二:Http传输模式启动JDBC/ODBC服务的案例。
Thrift JDBC服务支持通过HTTP传输模式来发送Thrift RPC消息。将HTTP模式的配置设置成系统属性,或修改Conf下的hive-site.xml文件中的属性配置来实现。
1) 修改Hive框架的hive-site.xml配置。
root@master:/usr/local/apache-hive-1.2.1/conf# vihive-site.xml
……
hive.server2.transport.mode
http
Expects oneof [binary, http].
Transportmode of HiveServer2.
hive.server2.thrift.http.port
10001
Port number of HiveServer2 Thrift interface whenhive.server2.transport.mode is 'http'.
hive.server2.http.endpoint
cliservice
Path component of URL endpoint when in HTTPmode.
2) 将Hive修改以后的Conf下的hive-site.xml文件拷贝到$SPARK_HOME/conf目录下。
root@master:/usr/local/apache-hive-1.2.1/conf# cp/usr/local/apache-hive-1.2.1/conf/hive-site.xml
/usr/local/spark-2.2.1-bin-hadoop2.6/conf/
root@master:/usr/local/apache-hive-1.2.1/conf# ls -ltr /usr/local/spark-2.2.1-bin-hadoop2.6/conf/hive-site.xml
-rw-r--r-- 1 root root 1710 Feb 20 20:40/usr/local/spark-2.2.1-bin-hadoop2.6/conf/hive-site.xml
3) 启动Thrift Server服务。
root@master:/usr/local/spark-2.2.1-bin-hadoop2.6/sbin# start-thriftserver.sh --master
spark://master:7077 --driver-class-path/usr/local/apache-hive-1.2.1/lib/mysql-connector-java-5.1.13-bin.jar
startingorg.apache.spark.sql.hive.thriftserver.HiveThriftServer2, logging to/usr/local/spark-2.2.1-bin-hadoop2.6/logs/spark-root-org.apache.spark.sql.hive.thriftserver.HiveThriftServer2-1-master.out
4) 启动Beeline工具,使用!connectjdbc:hive2://master:10001/default?
hive.server2.transport.mode=http;hive.server2.thrift.http.path=cliservice方式连接ThriftServer服务。
root@master:/usr/local/spark-2.2.1-bin-hadoop2.6/sbin#../bin/beeline
Beeline version 1.2.1.spark2 by Apache Hive
beeline> !connectjdbc:hive2://master:10001/default?hive.server2.transport.mode=http;hive.server2.thrift.http.path=cliservice
Connecting tojdbc:hive2://master:10001/default?hive.server2.transport.mode=http;hive.server2.thrift.http.path=cliservice
Enter username forjdbc:hive2://master:10001/default?hive.server2.transport.mode=http;hive.server2.thrift.http.path=cliservice:root
Enter password forjdbc:hive2://master:10001/default?hive.server2.transport.mode=http;hive.server2.thrift.http.path=cliservice:****
18/02/20 21:09:19 INFO jdbc.Utils: Supplied authorities:master:10001
18/02/20 21:09:19 WARN jdbc.Utils: ***** JDBC param deprecation*****
18/02/20 21:09:19 WARN jdbc.Utils: The use ofhive.server2.transport.mode is deprecated.
18/02/20 21:09:19 WARN jdbc.Utils: Please use transportMode like so:jdbc:hive2://:/dbName;transportMode=
18/02/20 21:09:19 WARN jdbc.Utils: ***** JDBC param deprecation*****
18/02/20 21:09:19 WARN jdbc.Utils: The use of hive.server2.thrift.http.pathis deprecated.
18/02/20 21:09:19 WARN jdbc.Utils: Please use httpPath like so:jdbc:hive2://:/dbName;httpPath=
18/02/20 21:09:19 INFO jdbc.Utils: Resolved authority: master:10001
Connected to: Spark SQL (version 2.2.1)
Driver: Hive JDBC (version 1.2.1.spark2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://master:10001/default>
5) 在Beeline Shell中查询数据库及表。
0:jdbc:hive2://master:10001/default> use hive;
+---------+--+
| Result |
+---------+--+
+---------+--+
No rows selected(0.07 seconds)
0:jdbc:hive2://master:10001/default> show tables;
+-----------+-------------+--------------+--+
| database | tableName | isTemporary |
+-----------+-------------+--------------+--+
| hive | pokes | false |
| hive | pokes_test | false |
+-----------+-------------+--------------+--+
2 rows selected(0.094 seconds)
0:jdbc:hive2://master:10001/default>
接下来,我们停掉Spark 2.2.1的Thriftserver服务,然后启动Hive框架中的Hiveserver2服务,使用Spark的Beeline工具直接连接Hive的Hiveserver2服务。测试HIVE框架的Hiveserver2服务。
停掉Spark 2.2.1的Thriftserver服务。
root@master:/usr/local/spark-2.2.1-bin-hadoop2.6/sbin#stop-thriftserver.sh
stopping org.apache.spark.sql.hive.thriftserver.HiveThriftServer2
这时在Beeline工具中查询会报错。
0:jdbc:hive2://master:10001/default> show tables;
Error:org.apache.thrift.transport.TTransportException:org.apache.http.conn.HttpHostConnectException: Connect to master:10001[master/192.168.189.1] failed: Connection refused (state=08S01,code=0)
接下来的步骤将启动Hive框架中的Hiveserver2服务。
6) 新建编辑start-hiveserver2.sh启动脚本,提供给Hive测试使用。脚本启动hiveserver2服务,并记录日hi及hive-server2.pid。
root@master:/usr/local/apache-hive-1.2.1/bin# vistart-hiveserver2.sh
#!/bin/sh
nohup /usr/local/apache-hive-1.2.1/bin/hiveserver2>> hiveserver2.log 2>&1 &
echo $! > hive-server2.pid
修改start-hiveserver2.sh的执行权限。
root@master:/usr/local/apache-hive-1.2.1/bin#chmod u+x start-hiveserver2.sh
7) 通过start-hiveserver2.sh脚本启动Hive框架的的Hive2server服务。脚本执行以后会生成日志文件hiveserver2.log和PID查询文件Hive-server2.pid。
JPS查询显示增加了一个RunJar的进程。同Hive-server2.pid记录的进程号是一致的。
root@master:/usr/local/apache-hive-1.2.1/bin#./start-hiveserver2.sh
root@master:/usr/local/apache-hive-1.2.1/bin# ls
beeline ext hive hive-config.sh hiveserver2 hiveserver2.log hive-server2.pid metatool schematool start-hiveserver2.sh
查询Hive-server2.pid获得Hive2server的PID是10591。
root@master:/usr/local/apache-hive-1.2.1/bin# cathive-server2.pid
10591
查询JPS进程。
root@master:/usr/local/apache-hive-1.2.1/bin#jps
10704 BeeLine
9969 Master
8801ResourceManager
8451 NameNode
8633SecondaryNameNode
10762 Jps
10591 RunJar
8) 启动Http模式下的Beeline,直接连接Hive框架的Hive2server服务。
root@master:/usr/local/spark-2.2.1-bin-hadoop2.6/sbin#../bin/beeline
Beeline version1.2.1.spark2 by Apache Hive
beeline>!connect jdbc:hive2://master:10001/default?hive.server2.transport.mode=http;hive.server2.thrift.http.path=cliservice
Connecting tojdbc:hive2://master:10001/default?hive.server2.transport.mode=http;hive.server2.thrift.http.path=cliservice
Enter username forjdbc:hive2://master:10001/default?hive.server2.transport.mode=http;hive.server2.thrift.http.path=cliservice:root
Enter password forjdbc:hive2://master:10001/default?hive.server2.transport.mode=http;hive.server2.thrift.http.path=cliservice:****
18/02/20 21:26:34INFO jdbc.Utils: Supplied authorities: master:10001
18/02/20 21:26:34WARN jdbc.Utils: ***** JDBC param deprecation *****
18/02/20 21:26:34WARN jdbc.Utils: The use of hive.server2.transport.mode is deprecated.
18/02/20 21:26:34WARN jdbc.Utils: Please use transportMode like so:jdbc:hive2://:/dbName;transportMode=
18/02/20 21:26:34WARN jdbc.Utils: ***** JDBC param deprecation *****
18/02/20 21:26:34WARN jdbc.Utils: The use of hive.server2.thrift.http.path is deprecated.
18/02/20 21:26:34WARN jdbc.Utils: Please use httpPath like so:jdbc:hive2://:/dbName;httpPath=
18/02/20 21:26:34INFO jdbc.Utils: Resolved authority: master:10001
Connected to:Apache Hive (version 1.2.1)
Driver: Hive JDBC(version 1.2.1.spark2)
Transactionisolation: TRANSACTION_REPEATABLE_READ
0:jdbc:hive2://master:10001/default>
这里的10001为刚才设置属性hive.server2.thrift.http.port,default为默认的数据库,连接成功。
9) 在BeelineShell中查询Hive的数据库,查询出当前Hive中已经有三个数据库default、hive、hivestudy。
0:jdbc:hive2://master:10001/default> show databases;
+----------------+--+
|database_name |
+----------------+--+
| default |
| hive |
| hivestudy |
+----------------+--+
3 rows selected(2.024 seconds)
10) Hive2server服务的停止。
由于Hive metastore进程名一样,Hive脚本中没有直接提供停止服务的操作,之前在脚本中将PID信息写入文件中。通过查看该文件,获取PID值,然后Kill掉进程。
root@master:/usr/local/apache-hive-1.2.1/bin#kill -9 10591
root@master:/usr/local/apache-hive-1.2.1/bin#jps
10704 BeeLine
9969 Master
8801ResourceManager
10803 Jps
8451 NameNode
8633SecondaryNameNode
Kill掉Hive2server服务进程,此时在Beeline中查询Hive的数据库会提示报错。
0:jdbc:hive2://master:10001/default> show databases;
Error:org.apache.thrift.transport.TTransportException:org.apache.http.conn.HttpHostConnectException: Connect to master:10001[master/192.168.189.1] failed: Connection refused (state=08S01,code=0)
(二) Spark SQLCLI的案例。
Spark SQL CLI是一个便利的工具,可以在本地运行Hive元存储服务、执行命令行输入的查询。注意,Spark SQLCLI不能与ThriftJDBC服务器通信。如果Hive使用内置的默认Derby数据库,同时只能允许一个会话连接,因此启动Thrift JDBC服务后再次启动Spark-Sql将会报异常。
1) 连接Hive时,在driver-class-path中添加Mysql数据库驱动Jar包路径,在
Spark目录运行下面的命令启动Spark SQL CLI。
root@master:/usr/local/spark-2.2.1-bin-hadoop2.6/bin#spark-sql --driver-class-path
/usr/local/apache-hive-1.2.1/lib/mysql-connector-java-5.1.13-bin.jar
18/02/20 21:44:25WARN conf.HiveConf: HiveConf of name hive.server2.http.endpoint does not exist
18/02/20 21:44:25WARN util.NativeCodeLoader: Unable to load native-hadoop library for yourplatform... using builtin-java classes where applicable
18/02/20 21:44:25INFO metastore.HiveMetaStore: 0: Opening raw store with implemenationclass:org.apache.hadoop.hive.metastore.ObjectStore
......
18/02/20 21:44:45INFO client.HiveClientImpl: Warehouse location for Hive client (version 1.2.1)is /user/hive/warehouse
18/02/20 21:44:45INFO state.StateStoreCoordinatorRef: Registered StateStoreCoordinator endpoint
spark-sql>
2) 查询数据库及表信息。
spark-sql> showdatabases;
……
default
hive
hivestudy
Time taken: 2.458seconds, Fetched 3 row(s)
18/02/20 21:46:49INFO CliDriver: Time taken: 2.458 seconds, Fetched 3 row(s)
spark-sql> usehive;
…….
18/02/20 21:46:54INFO CliDriver: Time taken: 0.039 seconds
spark-sql> showtables;
…….
hive pokes false
hive pokes_test false
Time taken: 0.129seconds, Fetched 2 row(s)
18/02/20 21:46:57INFO CliDriver: Time taken: 0.129 seconds, Fetched 2 row(s)
spark-sql>
通过Spark SQL CLI查询Hive的数据库及数据库表查询成功。
2018年新春报喜!热烈祝贺王家林大咖大数据经典传奇著作《SPARK大数据商业实战三部曲》畅销书籍 清华大学出版社发行上市!
本书基于Spark 2.2.0最新版本(2017年7月11日发布),以Spark商业案例实战和Spark在生产环境下几乎所有类型的性能调优为核心,以Spark内核解密为基石,分为上篇、中篇、下篇,对企业生产环境下的Spark商业案例与性能调优抽丝剥茧地进行剖析。上篇基于Spark源码,从一个动手实战案例入手,循序渐进地全面解析了Spark 2.2新特性及Spark内核源码;中篇选取Spark开发中最具有代表的经典学习案例,深入浅出地介绍,在案例中综合应用Spark的大数据技术;下篇性能调优内容基本完全覆盖了Spark在生产环境下的所有调优技术。
本书适合所有Spark学习者和从业人员使用。对于有分布式计算框架应用经验的人员,本书也可以作为Spark高手修炼的参考书籍。同时,本书也特别适合作为高等院校的大数据教材使用。
当当网、京东、淘宝、亚马逊等网店已可购买!欢迎大家购买学习!