1. Spark on hive 与 Hive on Spark 的区别
- Spark on hive
Spark通过Spark-SQL使用hive 语句操作hive,底层运行的还是 spark rdd
就是通过sparksql,加载hive的配置文件,获取到hive的元数据信息
spark sql获取到hive的元数据信息之后就可以拿到hive的所有表的数据
接下来就可以通过spark sql来操作hive表中的数据
- Hive on Spark
把hive查询从mapreduce 的 MapReduce计算引擎,操作替换为spark 执行引擎, 相对于spark on hive,这个要实现起来则麻烦很多, 必须重新编译你的spark和导入jar包,不过目前大部分使用的是spark on hive。
2. SparkSQL与hive进行整合
- 拷贝hive-site.xml配置文件
将node3服务器安装的hive家目录下的conf文件夹下面的hive-site.xml拷贝到spark安装的各个机器节点,node3执行以下命令进行拷贝
cd /opt/install/hive-1.1.0-cdh5.14.2/conf
scp hive-site.xml node01:/opt/install/spark-2.3.3-bin-hadoop2.7/conf/
scp hive-site.xml node02:/opt/install/spark-2.3.3-bin-hadoop2.7/conf/
scp hive-site.xml node3:/opt/install/spark-2.3.3-bin-hadoop2.7/conf/
- 拷贝mysql连接驱动包
将hive当中mysql的连接驱动包拷贝到spark安装家目录下的lib目录下,node3执行下命令拷贝mysql的lib驱动包
cd /opt/install/hive-1.1.0-cdh5.14.2/lib/
scp mysql-connector-java-5.1.38.jar node01:/opt/install/spark-2.3.3-bin-hadoop2.7/jars/
scp mysql-connector-java-5.1.38.jar node02:/opt/install/spark-2.3.3-bin-hadoop2.7/jars/
scp mysql-connector-java-5.1.38.jar node3:/opt/install/spark-2.3.3-bin-hadoop2.7/jars/
- 进入spark-sql直接操作hive数据库当中的数据
在spark2.0版本后由于出现了sparkSession,在初始化sqlContext的时候,会设置默认的==spark.sql.warehouse.dir=spark-warehouse==,
此时将hive与sparksql整合完成之后,在通过spark-sql脚本启动的时候,还是会在哪里启动spark-sql脚本,就会在当前目录下创建一个spark.sql.warehouse.dir为spark-warehouse的目录,存放由spark-sql创建数据库和创建表的数据信息,与之前hive的数据息不是放在同一个路径下(可以互相访问)。但是此时spark-sql中表的数据在本地,不利于操作,也不安全。
所有在启动的时候需要加上这样一个参数:
–conf spark.sql.warehouse.dir=hdfs://node01:8020/user/hive/warehouse
保证spark-sql启动时不在产生新的存放数据的目录,sparksql与hive最终使用的是hive同一存放数据的目录。
node01直接执行以下命令,进入spark-sql交互界面,然后操作hive当中的数据,
cd /opt/install/spark-2.3.3-bin-hadoop2.7/
bin/spark-sql --master local[2] \
--executor-memory 512m --total-executor-cores 3 \
--conf spark.sql.warehouse.dir=hdfs://node01:8020/user/hive/warehouse \
--jars /opt/install/hadoop-2.6.0-cdh5.14.2/share/hadoop/common/hadoop-lzo-0.4.20.jar
使用sparkSQL有hive进行整合之后,就可以通过sparkSQL语句来操作hive表数据了
- 应用场景
#!/bin/sh
#定义sparksql提交脚本的头信息
SUBMITINFO="spark-sql --master spark://node01:7077 --executor-memory 1g --total-executor-cores 4 --conf spark.sql.warehouse.dir=hdfs://node01:8020/user/hive/warehouse"
#定义一个sql语句
SQL="select * from default.hive_source;"
#执行sql语句 类似于 hive -e sql语句
echo "$SUBMITINFO"
echo "$SQL"
$SUBMITINFO -e "$SQL"
3. 启用spark thrift server与hive交互
除了可以通过spark-shell来与hive进行整合之外,我们也可以通过spark的thrift服务来远程与hive进行交互
- 修改hive-site.xml的配置
node3执行以下命令修改hive-site.xml的配置属性,添加以下几个配置
cd /opt/install/hive-1.1.0-cdh5.14.2/conf
vim hive-site.xml
<property>
<name>hive.metastore.uris</name>
<value>thrift://node3:9083</value>
<description>Thrift URI for the remote metastore</description>
</property>
<property>
<name>hive.server2.thrift.min.worker.threads</name>
<value>5</value>
</property>
<property>
<name>hive.server2.thrift.max.worker.threads</name>
<value>500</value>
</property>
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>node3</value>
</property>
- 修改完的配置文件分发到其他机器
node3执行以下命令分发hive配置文件
cd /opt/install/hive-1.1.0-cdh5.14.2/conf
scp hive-site.xml node01:/opt/install/spark-2.3.3-bin-hadoop2.7/conf/
scp hive-site.xml node02:/opt/install/spark-2.3.3-bin-hadoop2.7/conf/
scp hive-site.xml node3:/opt/install/spark-2.3.3-bin-hadoop2.7/conf/
- node3启动metastore服务
node3执行以下命令启动metastore服务
cd /opt/install/hive-1.1.0-cdh5.14.2/
bin/hive --service metastore
- node3执行以下命令启动spark的thrift server
==注意:hive安装在哪一台,就在哪一台服务器启动spark的thrift server==
我的hive安装在node3服务器,所以我在node3服务器上面启动spark的thrift server服务
node3执行以下命令启动thrift server服务
cd /opt/install/spark-2.3.3-bin-hadoop2.7
sbin/start-thriftserver.sh --master local[2] --executor-memory 5g --total-executor-cores 5 --jars /opt/install/hadoop-2.6.0-cdh5.14.2/share/hadoop/common/hadoop-lzo-0.4.20.jar
- 直接使用beeline来连接
直接在node3服务器上面使用beeline来进行连接spark-sql
cd /opt/install/spark-2.3.3-bin-hadoop2.7
bin/beeline
beeline> !connect jdbc:hive2://node3:10000
Connecting to jdbc:hive2://node3:10000
Enter username for jdbc:hive2://node3:10000: hadoop
Enter password for jdbc:hive2://node3:10000: ******