spark 写代码的三种方式、spark 整合 Hive

spark 写代码的方式

1、在IDEA中将代码编写好然后打包上传到集群中运行(使用最多)

将代码提交到集群运行,不需要指定master(运行模式)

注意以后只要涉及到路径,就不能出现中文或空格,不然可能会报莫名其妙的错误

代码示例

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()
      //提交到集群运行,不需要写,因为代码中的优先级是最高的,哪怕是提交到集群,运行模式还是local
      // .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("/data/students.txt")

    //统计性别人数
    val genderNum: DataFrame = student
      .groupBy($"gender")
      .agg(count($"gender") as "c")

    //保存数据
    genderNum
      .write
      //format、option、mode 这三个参数的位置是没有强制要求的
      .format("csv")
      .option("sep", "\t")
      .mode(SaveMode.Overwrite)
      .save("/data/gender_num")

    /**
      * 先打jar包并上传至集群
      *
      * 设置spark sql shuffle之后的分区数的另一种方式 -- 在提交命令中指定
      * --conf spark.sql.shuffle.partitions=1 -- 指定 spark SQL 的默认并行度
      * 不设置的话默认是200
      *
      * 这里先使用client模式做个演示,上线前测试
      * 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-submit 提交

Spark Standalone -- 独立集群模式、Spark 提交任务的两种模式、spark在yarn上运行的环境搭建、自己写的spark代码如何提交到yarn上并运行

先使用client模式,上线前测试

再使用cluster模式,上线使用

2、spark shell(REPL -- 交互式的命令行)

方便测试 和 看运行结果

我们之前在IDEA中写的代码在这边也能写

唯一的缺点就是写代码没有提示,只能硬写

# 进入 spark shell 的命令行
spark-shell

# 在后面也可以指定 资源和运行方式 (不指定默认运行方式为local) 例如:
spark-shell --master local
spark-shell --master yarn-client

# 不能使用 yarn-cluster  因为Driver必须在本地启动(因为要在本地看到结果)

# 退出
quit

3、spark-sql(spark的SQL命令行)

类似与 hive 的 shell

可以在里面直接写 SQL

默认使用derby管理元数据

# 进入 spark-sql 
# 不指定默认是local模式,但是不能使用yarn-cluster模式
spark-sql --master yarn-client

# 退出
# 注意这里一定要通过quit;退出,不然yarn上的任务不会停止
quit;

在进入 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

#添加 <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 --master yarn-client  --conf  spark.sql.shuffle.partitions=2
不能使用cluster模式

在 spark-sql 中设置运行参数
set spark.sql.shuffle.partitions=2;
posted @ 2022-03-12 21:42  赤兔胭脂小吕布  阅读(395)  评论(0编辑  收藏  举报