文章目录 Spark On Hive的原理及配置 Spark分布式SQL执行原理及配置 配置步骤 在代码中集成Spark JDBC ThriftServer 总结
Spark On Hive的原理及配置
Spark本身是一个执行引擎,而没有管理metadate的能力,当我们在执行SQL的时候只能将SQL转化为RDD提交。而对于一些数据中的元数据Spark并不知道,而Spark能写SQL主要是通过DataFrame进行注册的。 这时候我们就可以借助Hive中的MetaStore进行元数据管理。也就是说把Hive中的metastore服务器直接拿过来给Spark使用。
配置步骤
在spark安装的conf目录下创建hive-site.xml
< configuration> < property> < name> hive.metastore.warehouse.dir</ name> < value> /user/hive/warehouse</ value> </ property> < property> < name> hive.metastore.uris</ name> < value> thrift://node1:9083</ value> </ property>
</ configuration>
将mysql驱动Jar包放在spark安装的jars目录中 确保Hive配置了metastore的服务
< property> < name> hive.metastore.uris</ name> < value> thrift://node1:9083</ value>
</ property>
启动metastore服务
nohup bin/hive --service metastore 2 >&1 >> /export/server/apache-hive-3.1.2/log/metastore.log &
测试:在spark安装的bin目录下,启动spark-sql直接编写sql。
在代码中集成Spark On Hive
if __name__ == '__main__' : ss = SparkSession. builder \. appName( "test" ) \. master( "local[*]" ) \. config( "spark.sql.shuffle.partitions" , 2 ) \. config( "spark.sql.warehouse.dir" , "hdfs://node1:8020/user/hive/warehouse/" ) \. config( "hive.metastore.uris" , "thrift://node1:9083" ) \. enableHiveSupport( ) \. getOrCreate( ) sc = ss. sparkContextss. sql( '''select * from student''' ) . show( )
Spark分布式SQL执行原理及配置
Spark中ThriftServer,监听10000端口的服务,能够使开发者直接使用数据库工具或者代码连接,并且直接通过编写SQL来操作Spark。前提确保metastore服务+spark on hive配置
配置步骤
配置spark on hive步骤相同 启动ThriftServer服务
./start-thriftserver.sh --hiveconf hive.server2.thrift.port = 10000 --hiveconf hive.server2.thrift.bind.host = node1 --master local[ 2 ]
测试:通过DBeaver等工具连接Spark
在代码中集成Spark JDBC ThriftServer
安装pyhive所需要的linux依赖包
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel gcc make gcc-c++ python-devel cyrus-sasl-devel cyrus-sasl-plain cyrus-sasl-gssapi -y
pip install pyhive pymysql sasl thrift thrift_sasl
代码测试
from pyhive import hiveif __name__ == '__main__' : conn = hive. connect( host= "node1" , port= 10000 , username= "root" ) cursor = conn. cursor( ) cursor. execute( "SELECT * FROM student" ) res = cursor. fetchall( ) print ( res)
总结
分布式SQL执行引擎就是使用Spark提供的ThriftServer服务,以“后台进程”的模式持续运行,对外提供端口。 SQL提交后,底层运行的就是Spark任务。相当于构建了一个以MetaStore服务为元数据,Spark为执行引擎的数据库服务,像操作数据库那样方便的操作SparkSQL进行分布式的SQL计算。