理解Spark SQL(一)—— CLI和ThriftServer
spark sql主要提供了两个工具来访问hive中的数据,即cli和thriftserver。前提是需要spark支持hive,即编译spark时需要带上hive和hive-thriftserver选项,同时需要确保在$spark_home/conf目录下有hive-site.xml配置文件(可以从hive中拷贝过来)。在该配置文件中主要是配置hive metastore的uri(spark的cli和thriftserver都需要)以及thriftserver相关配置项(如hive.server2.thrift.bind.host、hive.server2.thrift.port等)。注意如果该台机器上同时运行有hive thriftserver和spark thriftserver,则hive中的hive.server2.thrift.port配置的端口与spark中的hive.server2.thrift.port配置的端口要不一样,避免同时启动时发生端口冲突。
启动cli和thriftserver之前都需要先启动hive metastore。执行如下命令启动:
[root@brucecentos ~]# nohup hive --service metastore &
成功启动后,会出现一个runjar的进程,同时会监听端口9083(hive metastore的默认端口)。
先来看cli,通过spark-sql脚本来使用cli。执行如下命令:
[root@brucecentos4 spark]# $spark_home/bin/spark-sql --master yarn
上述命令执行后会启动一个yarn client模式的spark程序,如下图所示:
同时它会连接到hive metastore,可以在随后出现的spark-sql>提示符下运行hive sql语句,比如:
其中每输入并执行一个sql语句相当于执行了一个spark的job,如图所示:
也就是说执行spark-sql脚本会启动一个yarn clien模式的spark application,而后出现spark-sql>提示符,在提示符下的每个sql语句都会在spark中执行一个job,但是对应的都是同一个application。这个application会一直运行,可以持续输入sql语句执行job,直到输入“quit;”,然后就会退出spark-sql,即spark application执行完毕。
另外一种更好地使用spark sql的方法是通过thriftserver,首先需要启动spark的thriftserver,然后通过spark下的beeline或者自行编写程序通过jdbc方式使用spark sql。
通过如下命令启动spark thriftserver:
[root@brucecentos4 spark]# $spark_home/sbin/start-thriftserver.sh --master yarn
执行上面的命令后,会生成一个sparksubmit进程,实际上是启动一个yarn client模式的spark application,如下图所示:
而且它提供一个jdbc/odbc接口,用户可以通过jdbc/odbc接口连接thriftserver来访问spark sql的数据。具体可以通过spark提供的beeline或者在程序中使用jdbc连接thriftserver。例如在启动spark thriftserver后,可以通过如下命令使用beeline来访问spark sql的数据。
[root@brucecentos3 spark]# $spark_home/bin/beeline -n root -u jdbc:hive2://brucecentos4.hadoop:10003
上述beeline连接到了brucecentos4上的10003端口,也就是spark thriftserver。所有连接到thriftserver的客户端beeline或者jdbc程序共享同一个spark application,通过beeline或者jdbc程序执行sql相当于向这个application提交并执行一个job。在提示符下输入“!exit”命令可以退出beeline。
最后,如果要停止thriftserver(即停止spark application),需要执行如下命令:
[root@brucecentos4 spark]# $spark_home/sbin/stop-thriftserver.sh
综上所述,在spark sql的cli和thriftserver中,比较推荐使用后者,因为后者更加轻量,只需要启动一个thriftserver(对应一个spark application)就可以给多个beeline客户端或者jdbc程序客户端使用sql,而前者启动一个cli就启动了一个spark application,它只能给一个用户使用。