手机专用

Action

触发代码的运行,我们一段spark代码里面至少需要有一个action操作。
常用的Action:

动作含义示例
reduce(func)通过func函数聚集RDD中的所有元素,可以实现,RDD中元素的累加,计数和其他类型的聚集操作var rdd = sc.parallelize(1 to 10)
rdd.reduce((x, y) => x+y)
reduceByKey(func)按key进行reduce,让key合并wordcount示例:
var rdd = sc.parallelize(List(“hello world”, “hello spark”, “hello hdfs”))
rdd.flatMap(x => x.split(" ")).map(x => (x,1)).reduceByKey((x,y) => x+y).collect()
collect()在驱动程序中,以数组的形式返回数据集的所有元素 
count()返回RDD的元素个数 
first()返回RDD的第一个元素(类似于take(1)) 
take(n)返回一个由数据集的前n个元素组成的数组 
saveAsTextFile(path)将数据集的元素以textfile的形式保存到HDFS文件系统或者其他支持的文件系统,对于每个元素,Spark将会调用toString方法,将它装换为文件中的文本rdd.saveAsTextFile("/user/jd_ad/ads_platform/outergd/0124/demo2.csv")
foreach(func)在数据集的每一个元素上,运行函数func进行更新。 
takeSample抽样返回一个dateset中的num个元素var rdd = sc.parallelize(1 to 10)
rdd.takeSample(false,10)

四、Block与RDD生成过程


输入可能以多个文件的形式存储在HDFS上,每个File都包含了很多块,称为Block。
当Spark读取这些文件作为输入时,会根据具体数据格式对应的InputFormat进行解析,一般是将若干个Block合并成一个输入分片,称为InputSplit,注意InputSplit不能跨越文件。
随后将为这些输入分片生成具体的Task。InputSplit与Task是一一对应的关系。
随后这些具体的Task每个都会被分配到集群上的某个节点的某个Executor去执行。

  • 每个节点可以起一个或多个Executor。
  • 每个Executor由若干core组成,每个Executor的每个core一次只能执行一个Task。
  • 每个Task执行的结果就是生成了目标RDD的一个partiton。

注意: 这里的core是虚拟的core而不是机器的物理CPU核,可以理解为就是Executor的一个工作线程。
而 Task被执行的并发度 = Executor数目 * 每个Executor核数。
至于partition的数目:

  • 对于数据读入阶段,例如sc.textFile,输入文件被划分为多少InputSplit就会需要多少初始Task。
  • 在Map阶段partition数目保持不变。
  • 在Reduce阶段,RDD的聚合会触发shuffle操作,聚合后的RDD的partition数目跟具体操作有关,例如repartition操作会聚合成指定分区数,还有一些算子是可配置的。

五、依赖关系与Stage划分

RDD之间有一系列的依赖关系,依赖关系又分为窄依赖和宽依赖。简单的区分发,可以看一下父RDD中的数据是否进入不同的子RDD,如果只进入到一个子RDD则是窄依赖,否则就是宽依赖。如下图

窄依赖( narrow dependencies )

  • 子RDD 的每个分区依赖于常数个父分区(即与数据规模无关)
  • 输入输出一对一的算子,且结果RDD 的分区结构不变,主要是map 、flatMap
  • 输入输出一对一,但结果RDD 的分区结构发生了变化,如union 、coalesce
  • 从输入中选择部分元素的算子,如filter 、distinct 、subtract 、sample

宽依赖( wide dependencies )

  • 子RDD 的每个分区依赖于所有父RDD 分区
  • 对单个RDD 基于key 进行重组和reduce ,如groupByKey 、reduceByKey ;
  • 对两个RDD 基于key 进行join 和重组,如join

Spark任务会根据RDD之间的依赖关系,形成一个DAG有向无环图,DAG会提交给DAGScheduler,DAGScheduler会把DAG划分相互依赖的多个stage,划分stage的依据就是RDD之间的宽窄依赖。遇到宽依赖就划分stage,每个stage包含一个或多个task任务。然后将这些task以taskSet的形式提交给TaskScheduler运行。 stage是由一组并行的task组成。切割规则:从后往前,遇到宽依赖就切割stage,遇到窄依赖就将这个RDD加入该stage中。 如下图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值