标题

  • 1.整合hive
  • 2.sparkSQL使用



sparkSQL官方文档:
http://spark.apache.org/docs/2.2.0/sql-programming-guide.html

Spark SQL的其中一个分支就是Spark on Hive,也就是使用Hive中HQL的解析、逻辑执行计划翻译、执行计划优化等逻辑,可以近似认为仅将物理执行计划从MR作业替换成了Spark作业

SparkSql整合hive就是获取hive表中的元数据信息,然后通过SparkSql来操作数据。

1.整合hive

1、将hive-site.xml拷贝到spark安装家路径的conf目录下
node03执行以下命令来拷贝hive-site.xml到所有的spark安装服务器上面去

cd /export/servers/hive-1.1.0-cdh5.14.0/confcp hive-site.xml /export/servers/spark-2.2.0-bin-2.6.0-cdh5.14.0/conf/scp hive-site.xml node02:/export/servers/spark-2.2.0-bin-2.6.0-cdh5.14.0/conf/scp hive-site.xml node01:/export/servers/spark-2.2.0-bin-2.6.0-cdh5.14.0/conf/

2、将mysql的连接驱动包拷贝到spark的jars目录下
node03执行以下命令将连接驱动包拷贝到spark的jars目录下,三台机器都要进行拷贝

cd /export/servers/hive-1.1.0-cdh5.14.0/libcp mysql-connector-java-5.1.38.jar /export/servers/spark-2.2.0-bin-2.6.0-cdh5.14.0/jars/scp mysql-connector-java-5.1.38.jar node02:/export/servers/spark-2.2.0-bin-2.6.0-cdh5.14.0/jars/scp mysql-connector-java-5.1.38.jar node01:/export/servers/spark-2.2.0-bin-2.6.0-cdh5.14.0/jars/

3、测试
先启动hadoop集群,在启动spark集群,确保启动成功之后node01执行命令:

cd /export/servers/spark-2.2.0-bin-2.6.0-cdh5.14.0bin/spark-sql --master spark://node01:7077 --executor-memory 1G --total-executor-cores 2

执行成功后的界面:进入到spark-sql 客户端命令行界面

pyspark 写入hive分区表 sparksql写入hive_hive

查看当前有哪些数据库, 并创建数据库

pyspark 写入hive分区表 sparksql写入hive_spark_02

注意:!!
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中表的数据在本地,不利于操作,也不安全

解决: 所有在启动的时候需要加上这样一个参数:
保证spark-sql启动时不在产生新的存放数据的目录,sparksql与hive最终使用的是hive同一存放数据的目录
--conf spark.sql.warehouse.dir=hdfs://node01:8020/user/hive/warehouse

2.sparkSQL使用

1、准备表数据
node01服务器准备表数据
cd /export/servershdfs dfs -mkdir -p /sparkhivedatasvim sparkhive.txt

1 zhangsan 18
2 lisi 28
3 wangwu 20
4 zhaoliu 38
5 chenqi 45

上传到hdfs
hdfs dfs -put sparkhive.txt /sparkhivedatas

2、开发sparkSQL脚本,并加载表数据
cd /export/serversvim sparkhive.sql

create database if not exists sparkhivedb;
create table if not exists sparkhivedb.user(id int,name string,age int) row format delimited fields terminated by ' ';
load data inpath 'hdfs://node01:8020/sparkhivedatas' overwrite into table sparkhivedb.user;
drop table if exists sparkhivedb.userresult;
create table sparkhivedb.userresult as select * from sparkhivedb.user where age > 30;

3、开发shell脚本,使用shell脚本执行sparkSQL脚本
cd /export/serversvim sparksql.sh

#!/bin/bash

SPARK_SQL="/export/servers/spark-2.2.0-bin-2.6.0-cdh5.14.0/bin/spark-sql --master spark://node01:7077  --executor-memory 1G -
-total-executor-cores 2  --conf spark.sql.warehouse.dir=hdfs://node01:8020/user/hive/warehouse"

$SPARK_SQL -f /export/servers/sparkhive.sql
#!/bin/bash
#或者我们也可以直接将sql语句写到shell脚本里面通过 -e 来进行执行,例如
SPARK_SQL="/export/servers/spark-2.2.0-bin-2.6.0-cdh5.14.0/bin/spark-sql --master spark://node01:7077  --executor-memory 1G -
-total-executor-cores 2  --conf spark.sql.warehouse.dir=hdfs://node01:8020/user/hive/warehouse"

SPARK_HQL="create database if not exists sparkhqldb; create table if not exists sparkhqldb.myuser(id int,name string,age int)
 row format delimited fields terminated by ' ' ;"

$SPARK_SQL -e "$SPARK_HQL"

4、结果

pyspark 写入hive分区表 sparksql写入hive_sql_03