spark-sql
Spark Sql
spark-sql 写代码方式
1、idea里面将代码编写好打包上传到集群中运行,上线使用
--conf spark.sql.shuffle.partitions=1 -- 设置spark sqlshuffle之后分区数据马,和代码里面设置是一样的,代码中优先级高
spark-submit提交
spark-submit --master yarn-client --class com.shujia.sql.Demo8SubmitYarn --conf spark.sql.shuffle.partitions=1 spark-1.0.jar
//新版本spark提交yarn的命令
spark-submit --master yarn --deploy-mode client --class com.shujia.sql.Demo8SubmitYarn --conf spark.sql.shuffle.partitions=1 spark-1.0.jar
2、spark shell (repl) 里面使用sqlContext 测试使用,简单任务使用
spark-shell --master yarn-client
不能使用yarn-cluster Driver必须再本地启动
3、spark-sql spark-sql --master yarn --deploy-mode client 不能使用yarn-cluster 和hive的命令行一样,直接写sql
在spark-sql时完全兼容hive sql的
spark-sql底层使用的时spark进行计算的
hive 底层使用的是MR进行计算的
spark sql整合hive
在spark sql中使用hive的元数据
spark sql是使用spark进行计算的,hive使用MR进行计算的
1、在hive的hive-site.xml修改一行配置,增加了这一行配置之后,以后在使用hive之前都需要先启动元数据服务
cd /usr/local/soft/hive-1.2.1/conf/
<property>
<name>hive.metastore.uris</name>
<value>thrift://master:9083</value>
</property>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.12</artifactId>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.10.0</version>
2、启动hive元数据服务, 将hvie的元数据暴露给第三方使用
nohup hive --service metastore >> metastore.log 2>&1 &
3、将hive-site.xml 复制到spark conf目录下
cp hive-site.xml /usr/local/soft/spark-2.4.5/conf/
4、 将mysql 驱动包复制到spark jars目录下
cd /usr/local/soft/hive-1.2.1/lib
cp mysql-connector-java-5.1.49.jar /usr/local/soft/spark-2.4.5/jars/
5、整合好之后在spark-sql 里面就可以使用hive的表了
# 模式是local模式
spark-sql -conf spark.sql.shuffle.partitions=2
# 使用yarn-client模式
spark-sql --master yarn --deploy-mode client --conf spark.sql.shuffle.partitions=1
#在spark-sql中设置运行参数
set spark.sql.shuffle.partitions=2;
spark-sql -e
-- 执行一条sql语句,执行完,自动退出
spark-sql -e "select * from student"
spark-sql -f
vim a.sql
select * from student
-- 执行一个sql文件
spark-sql -f a.sql
当spark-sql 和hive整合好之后再代码中也可以直接使用hive的表
val spark: SparkSession = SparkSession
.builder()
.appName("onhive")
.enableHiveSupport() //开启hive的元数据支持,在代码中读取hive的元数据
.getOrCreate()
//读取hie的表
val studentDF = spark.talbe("studnet")
//写好的代码不能再本地运行, 需要打包上传到集群运行
spark sql和hvie的建表语句一样
create external table students
(
id string,
name string,
age int,
gender string,
clazz string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
location '/bigdata29/spark_in/data/student';
create table score
(
student_id string,
cource_id string,
sco int
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS textfile
location '/data/score/';
禁用集群spark日志
cd /usr/local/soft/spark-2.4.5/conf
mv log4j.properties.template log4j.properties
vim log4j.properties
修改配置
log4j.rootCategory=ERROR, console
spark sql和hive区别
1、spark sql缓存
-- 进入spark sql命令行
spark-sql
-- 可以通过一个网址访问spark任务
http://master:4040
-- 设置并行度
set spark.sql.shuffle.partitions=1;
-- 再spark-sql中对同一个表进行多次查询的时候可以将表缓存起来
cache table student;
-- 删除缓存
uncache table student;
-- 再代码中也可以缓存DF
studentDF.persist(StorageLevel.MEMORY_ONLY)
2、spark sql mapjoin --- 广播变量
Reduce Join
select * from
student as a
join
score as b
on
a.id=b.student_id
MapJoin
当一个大表关联小表的时候可以将小表加载到内存中进行关联---- 广播变量
在map端进行表关联,不会产生shuffle
select /*+broadcast(a) */ * from
student as a
join
score as b
on
a.id=b.student_id
/*+broadcast(a) */ HINT:给sql加提示的语法