Spark 2.2.1 集成Hive数据仓库的案例与解读

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 所示。

Spark 2.2.1 集成Hive数据仓库的案例与解读_第1张图片

图 3 - 8 Spark 监控界面上的applications信息

单击Thrift JDBC/ODBC Server ,进入应用页面,单击JDBC/ODBC Server栏目,查看Spark SQL的统计信息。如图3-9所示。

Spark 2.2.1 集成Hive数据仓库的案例与解读_第2张图片

图 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 SQLHive中建立的所有表信息。

        

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.1Thriftserver服务,然后启动Hive框架中的Hiveserver2服务,使用SparkBeeline工具直接连接HiveHiveserver2服务。测试HIVE框架的Hiveserver2服务。

                   停掉Spark 2.2.1Thriftserver服务。

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服务,并记录日hihive-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.logPID查询文件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高手修炼的参考书籍。同时,本书也特别适合作为高等院校的大数据教材使用。

当当网、京东、淘宝、亚马逊等网店已可购买!欢迎大家购买学习!

当当网址: http://product.dangdang.com/25230552.html

你可能感兴趣的:(AI,&,Big,Data案例实战课程)