spark-sql 写代码的三种方式
一、在idea里面将代码编写好打包上传到集群中运行----上线使用
spark-submit提交(项目常用)
1、编写代码
编写代码三步骤:
(1)创建环境
(2)读取文件、编写逻辑
(3)保存数据
package com.shujia.sql
import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession}
object Demo8Submit {
def main(args: Array[String]): Unit = {
val spark: SparkSession = SparkSession
.builder()
// .master("local") //提交到集群运行,不需要写
.appName("submit")
.getOrCreate()
import spark.implicits._
import org.apache.spark.sql.functions._
//读取hdfs中的文件
val student: DataFrame = spark
.read
.format("csv")
.option("sep", ",")
.schema("id STRING,name STRING,age INT,gender STRING,clazz STRING")
.load("/user/hive/warehouse/test1.db/students")
//统计性别人数
val genderNum: DataFrame = student
.groupBy($"gender")
.agg(count($"gender") as "c")
//保存数据
genderNum
.write
.format("csv")
.option("sep", "\t")
.mode(SaveMode.Overwrite)
.save("/user/hive/warehouse/test1.db/gender_num")
/**
* spark-submit --master yarn-client --class com.shujia.sql.Demo8Submit --executor-memory 1G --executor-cores 1 --num-exe
* cutors 1 --conf spark.sql.shuffle.partitions=1 spark-1.0.jar
*
*/
}
}
2、打包上传到Hdoop集群中
在IDEA中使用
package
将代码打包将打好的包上传到集群(我们目前使用的集群就是虚拟机)
3、spark-submit提交到Yarn上运行
使用yarn-client模式,可以查看日志,方便我们查看是否有错误
[root@master jars]#
spark-submit --master yarn-client --class com.shujia.sql.Demo8Submit --executor-memory 1G --executor-cores 1 --num-executors 1 Spark-1.0.jar
通过命令可以查看运行结果
[root@master jars]# hdfs dfs -cat /user/hive/warehouse/test1.db/gender_num/*
男 507
女 493
在HDFS中可以查看到运行后的文件
默认分区数是200个,运行时就有200个task,运行的比较慢,修改分区数
方法1:修改代码
1、在创建SparkSession时指定分区数
val spark: SparkSession = SparkSession
.builder()
// .master("local")//提交到集群运行,不需要写
.appName("submit")
.config("spark.sql.shuffle.partitions",1)//指定分区数
.getOrCreate()
2、再重新打包上传
方法2:通过shell命令直接修改
在jar包前面增加
--conf spark.sql.shuffle.partitions=1
[root@master jars]#
spark-submit --master yarn-client --class com.shujia.sql.Demo8Submit --executor-memory 1G --executor-cores 1 --num-executors 1
--conf spark.sql.shuffle.partitions=1 Spark-1.0.jar
二、Spark shell 命令栏里面写代码----测试使用(项目上几乎不使用)
这种方式统称为
repl
(交互式命令行)
需要进入spark shell命令栏
两种进入命令栏的方式:
(1)
spark-shell --master local
---本地模式:适合数据量较小的测试(2)
spark-shell --master yarn-client
----Yarn模式:适合数据量较大的测试
不能使用yarn-cluster Driver必须在本地启动
[root@master jars]# spark-shell --master local
scala> "可以直接编写和IDEA里一样的代码"
[root@master jars]# spark-shell --master client
scala> "可以直接编写和IDEA里一样的代码"
三、spark-sql命令栏写代码
类似与 hive 的 shell
可以在里面直接写 SQL
默认使用derby管理元数据
# 进入 spark-sql
# 不指定默认是local模式,但是不能使用yarn-cluster模式
spark-sql --master yarn-client
# 退出
# 注意这里一定要通过quit;退出,不然yarn上的任务不会停止
quit;
#如果使用了Ctrl+z/x/c退出,yarn上的任务不会停止,那么就要手动停止
yarn application -kill ID号
在进入 spark-sql 的过程中会输出很多日志,那么如何取消这些日志呢?
log4j -- 打日志的框架,一般常用的组件都是通过它打日志的
不建议修改输出日志的级别
# 进入spark配置文件目录
cd /usr/local/soft/spark-2.4.5/conf/
# 重命名
mv log4j.properties.template log4j.properties
# 修改log4j.properties
vim log4j.properties
# 修改输出日志的级别
# 默认是INFO级别
log4j.rootCategory=INFO,console
# 将之修改为 ERROR 级别 -- 只打印报错
log4j.rootCategory=ERROR,console
spark 整合 Hive
因为spark默认使用derby管理元数据,一旦换个位置进入spark-sql,之前做的操作就都没了
所以我们需要将 Hive 和 spark 进行整合,让 spark 可以使用 Hive 的元数据
即让spark可以使用Hive中的表
1、在hive的hive-site.xml修改一行配置
cd /usr/local/soft/hive-1.2.1/conf
vim hive-site.xml
#查找hive.metastore.uris关键字
#添加 <value>thrift://master:9083</value>
<property>
<name>hive.metastore.uris</name>
<value>thrift://master:9083</value>
</property>
2、启动hive元数据服务
nohup hive --service metastore >> metastore.log 2>&1 &
#注意: 当修改完配置文件之后,你不开启hive元数据服务,那么hive就会报一个 拒绝连接 的错误
#验证 hive 能不能用 -- 看看能不能进入hive的shell
hive
3、将 hive-site.xml 复制到 spark conf 目录下
cp /usr/local/soft/hive-1.2.1/conf/hive-site.xml /usr/local/soft/spark-2.4.5/conf/
4、将mysql的驱动包复制到saprk jars目录下
cp /usr/local/soft/hive-1.2.1/lib/mysql-connector-java-5.1.49.jar /usr/local/soft/spark-2.4.5/jars/
做完这4步就整合好了
在 spark-sql 里面就可以使用hive的表了
#进入spark-sql命令栏
spark-sql --master yarn-client --conf spark.sql.shuffle.partitions=2
#不能使用cluster模式
也可以单独在 spark-sql 中设置运行参数
set spark.sql.shuffle.partitions=2;