Spark

运行模式:

local:适用于本地测试

yarn: 分为yarn-client、yarn-cluster两个模式。yarn-client的Driver驱动程序会在客户端进行运行,而yarn-cluster的驱动程序是在集群的(nodemanager)applicationMaster上面。

standalone:独立模式,spark客户端将任务提交到 Master/slaves结构的集群上的master处理,使用spark自身的调度系统。

spark任务提交的方式:J2ee还是shell?

shell

#!/bin/bash

# 设置Spark主节点URL和应用程序名称
SPARK_MASTER="spark://localhost:7077"
APP_NAME="MySparkApp"

# 设置其他Spark配置属性
SPARK_CONF="--executor-memory 2g --num-executors 4"

# 提交Spark应用程序
spark-submit \
    --master $SPARK_MASTER \
    --name $APP_NAME \
    $SPARK_CONF \
    path/to/your/app.jar

1)在提交任务时的几个重要参数

executor-cores —— 每个 executor 使用的内核数,默认为 1,官方建议 2-5 个,我们企业是 4 个 num-executors —— 启动 executors 的数量,默认为 2

executor-memory —— executor 内存大小,默认 1G

driver-cores —— driver 使用内核数,默认为 1

 driver-memory —— driver 内存大小,默认 512M

2)一个提交任务的样式

spark-submit 
\ --master local[5] 
\ --driver-cores 2 
\ --driver-memory 8g 
\ --executor-cores 4     
\ --num-executors 10 
\ --executor-memory 8g 
\ --class PackageName.ClassName XXXX.jar 
\ --name "Spark Job Name" 
\ InputPath 
\ OutputPath

spark架构与作业提交流程简述

yarn-cluster模式

1.spark-submit 中main被执行

2.反射 Client类的main方法执行

3.向RM注册任务并加入队列

4.NM认领后创建AM,AM中的driver申请所需资源

5.同时会申请相应的executors并创建executor对象,这个executors会向driver注册

6.driver 执行代码 初始化SC 任务划分

7.分配对应任务给指定的executors执行

spark的血统(lineage)概念及其作用

lineage是记录分区之间依赖关系的机制,分为宽依赖和窄依赖;窄依赖是一个分区依赖一个分区,没有shuffle操作,流程图呈现是一条直线;宽依赖是一个分区依赖多个分区,可能涉及shuffle操作,产生更多的IO。

  1. 窄依赖(Narrow Dependency):

    • 窄依赖表示父RDD的每个分区只被子RDD的一个或多个分区直接依赖。
    • 窄依赖可以通过简单的转换操作(如map、filter)进行计算,不需要进行数据的洗牌操作(Shuffle)。
    • 窄依赖保证了计算的高效性,因为父RDD的每个分区只需要被子RDD的一个或多个分区计算即可。
    • 窄依赖在血统中以依赖关系图的一条直线表示。
  2. 宽依赖(Wide Dependency):

    • 宽依赖表示父RDD的一个或多个分区被子RDD的多个分区依赖,需要进行数据的洗牌操作(Shuffle)。
    • 宽依赖通常发生在一些需要进行分组、聚合或排序等操作的转换上,这些操作需要将父RDD的数据重新分配和重组。
    • 宽依赖会引起数据的网络传输和磁盘读写,可能导致性能的下降。
    • 宽依赖在血统中以依赖关系图的分叉表示。

lineage的作用主要是以下2点:

1.容错和数据恢复

lineage可以让spark在出错后根据依赖关系定位上次出错的地方重新执行,把丢失的数据找回来。

2.优化执行

可以根据lineage依赖关系优化执行计划,由于spark是惰性计算,故只需识别用到的部分,过滤掉多余的宽依赖来提高效率。

spark根据什么划分stage?根据什么划分tasks?

根据宽依赖划分,将job划分成若干个stage,每一个宽依赖都会对应一个stage;一个stage是taskSet,而task是根据RDD中的分区数将stage划分成数个tasks。

spark常用的transformation算子(惰性算法,不会马上执行),列举并说明其作用(功能)。

map(func)转化算子,每个输入元素,使用接受到的func函数的聚合逻辑按key分组合并value(做了转化),返回一个新的RDD。(元素数=map调用数)

分区:数据集被划分成若干个较小的数据块,即分区,每个分区可以在集群不同的节点上并行处理,并行度=分区数。

元素:即数据项,数据集被划分成若干个较小的数据块,数据块包含一定数量的元素,元素是数据集中一个个独立的数据项,是处理的基本单元,spark对每个元素进行计算转换,并存储在分区中。

mapPartitions(func)类似于map,但mapP是针对每个分区调用一次,即分区数=调用mapP数。

reduceByKey (func,numtasks)numtasks指定reduce任务数(并行数),func为聚合函数逻辑,按key聚合value,输入k-v类型rdd,返回一个新的k-v类型rdd。

def aggregateByKey[U](zeroValue: U)(seqOp: (U, V) => U, combOp: (U, U) => U): RDD[(K, U)]

自定义函数,zeroV是初始值,seq是分区内聚合逻辑,comb是分区间聚合逻辑(将前两个value进行合并comb得到的结果与下一个value再一起传给comb,以此类推),返回一个k-v类型的rdd(key与计算结果作为一个新rdd)。

spark常用的action算子(马上执行),列举并说明其作用(功能)。

你可能感兴趣的:(spark,大数据,hadoop)