spark-sql 写代码的三种方式


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中可以查看到运行后的文件

image

默认分区数是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;


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM