所有文章

Spark - Thrift Server模式

Spark Thrift Server 其实是 Spark SQL 的一种运行方式,笔者前段时间用它来做测试了 Spark 的性能,以及 Spark SQL 对 SQL 语句的支持情况,用起来还是十分方便的,后来在网上一搜,除了官网很少有写 Spark Thrift Server 的文章,那么本文将让你了解并且会使用它。

Spark Thrift Server 运行原理

即然它被称为 Server,那它就是提供某种服务的,它提供的服务就是解析 SQL 语句,然后将解析完的 SQL 转换为 Spark 任务,并提交给 Spark 集群去执行(这里要取决于 Spark 的运行方式,如:Spark on Yarn、Spark Standalone 等),最后捕获运行结果。

配置一个可用的 Spark Thrift Server

前提准备

  1. 我们为以三台机器的作为示例,分别为:host1、host2、host3
  2. 在三个节点上部署好 Hadoop2.7 集群,并启动 Hdfs、Yarn
  3. 在 host1 上部署好 Hive1.2.1,并且可以运行
  4. 在 host1 上安装 Spark2.0,先不用配置

修改 spark-env.sh

要使用 Spark Thrift Server,需要用到三个配置文件,我们一个一个来配置 首先是 Spark 安装目录下的 conf/spark-env.sh

[user@host1 spark]$ vi conf/spark-env.sh 
#!/usr/bin/env bash
 
# 这里是Spark的配置文件所在的目录,在本例中为:$spark_home/conf
export SPARK_CONF_DIR=/usr/lib/spark/conf
 
# 为Spark Thrift Server分配的内存大小
export SPARK_DAEMON_MEMORY=1024m
 
# Hadoop的安装目录
export HADOOP_HOME=/usr/lib/hadoop
 
# Hadoop的配置文件目录
export HADOOP_CONF_DIR=/usr/lib/hadoop/etc/hadoop
 
# 这里的java安装路经要换成自己的
export JAVA_HOME=/usr/lib/java

修改spark-defaults.conf

然后是Spark安装目录下的 conf/spark-defaults.conf

[user@host1 spark]$ vi conf/spark-defaults.conf
# 指定Spark的运行模式
spark.master yarn-client
 
# 这里我们让Spark自己去动态调整资源
spark.dynamicAllocation.enabled true
spark.dynamicAllocation.initialExecutors 2
spark.dynamicAllocation.maxExecutors 10
spark.dynamicAllocation.minExecutors 2
 
# 这几个可有可无了,,
spark.history.fs.logDirectory hdfs:///spark-history/
spark.shuffle.service.enabled true
spark.yarn.queue spark-thrift

复制hive-site.xml

最后将 Hive 的配置文件复制到 spark_home/conf

[user@host1 spark]$ ll conf/
-rw-r--r-- 1 spark spark   899 2月  28 22:23 hive-site.xml    # Hive的配置文件
-rw-r--r-- 1 root  root    865 1月  11 05:14 slaves.template  # 这个没有用到
-rw-r--r-- 1 spark spark   719 3月  19 05:54 spark-defaults.conf
-rw-r--r-- 1 spark spark  1710 2月  28 22:23 spark-env.sh

启动服务

sbin/start-thriftserver.sh --hiveconf hive.server2.thrift.port=10011

查看启动是否成功

[user@host1 spark]$ ss -apln | grep 10011
LISTEN     0      50                       :::10011                   :::*      users:(("java",8600,389))

使用 Spark Thrift Server

在 Hive 里创建一个数据库

[user@host1 spark]$ hive 
WARN conf.HiveConf: HiveConf of name hive.optimize.mapjoin.mapreduce does not exist
17/03/19 07:20:11 WARN conf.HiveConf: HiveConf of name hive.heapsize does not exist
17/03/19 07:20:11 WARN conf.HiveConf: HiveConf of name hive.sentry.conf.url does not exist
17/03/19 07:20:11 WARN conf.HiveConf: HiveConf of name hive.auto.convert.sortmerge.join.noconditionaltask does not exist
 
Logging initialized using configuration in file:/etc/hive/conf.dist/hive-log4j.properties
WARNING: Hive CLI is deprecated and migration to Beeline is recommended.
hive> create thrift;   # 创建数据库
OK
hive> quit;   然后退出
[user@host1 spark]$ 

进入 Spark Thrift 客户端

[root@spark ~]# bin/beeline 
Beeline version 1.2.1.spark2 by Apache Hive
beeline> !connect jdbc:hive2://localhost:10011
Connecting to jdbc:hive2://localhost:10011
Enter username for jdbc:hive2://localhost:10011:    # 直接回车
Enter password for jdbc:hive2://localhost:10011:    # 直接回车
Connected to: Spark SQL (version 2.0.0)
Driver: Hive JDBC (version 1.2.1.spark2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://localhost:10011> show databases;   # 查看所有数据库
+---------------+--+
| databaseName  |
+---------------+--+
| default       |
| thrift        |
+---------------+--+
3 rows selected (0.082 seconds)
0: jdbc:hive2://localhost:10011> 

到这里Spark Thrift配置完毕,进入客户端后就可以执行SQL语句了,不过更多的时候我们是用脚本的方式来执行SQL任务,这当然也可以了, 先把我们需要执行的SQL语句写到一个文件里,如:my_task.sql,然后执行以下命令:

bin/beeline -u "jdbc:hive2://host1:10011/default;httpPath=cliservice" -f my_task.sql

编写日期:2017-03-19