1. Spark on hive 与 Hive on Spark 的区别
Spark通过Spark-SQL使用hive 语句操作hive,底层运行的还是 spark rdd
就是通过sparksql,加载hive的配置文件,获取到hive的元数据信息
spark sql获取到hive的元数据信息之后就可以拿到hive的所有表的数据
接下来就可以通过spark sql来操作hive表中的数据
把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执行以下命令进行拷贝
1 2 3 4 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驱动包
1 2 3 4 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当中的数据,
1 2 3 4 5 6 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表数据了
1 2 3 4 5 6 7 8 9 # !/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的配置属性,添加以下几个配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 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配置文件
1 2 3 4 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服务
1 2 3 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服务
1 2 3 4 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
1 2 3 4 5 6 7 8 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: ******