Spark修炼之道(进阶篇)——Spark入门到精通:第四节 Spark编程模型(一)

  • 时间:
  • 浏览:1

下面的代码演示的是从内存中创建RDD

mapPartitionsWithIndex函数是mapPartitions函数的一一个多多多变种,它的函数参数如下:

(4)mapPartitions(func)

本mapPartitions例子来源于:https://www.zybuluo.com/jewes/note/33032

mapPartitions是map的一一个多多多变种。map的输入函数是应用于RDD中每个元素,而mapPartitions的输入函数是应用于每个分区,也若果把每个分区中的内容作为整体来避免的。它的函数定义为:

(5)mapPartitionsWithIndex

RDD在Spark中是一一个多多多只读的(val类型)、经过分区的记录集合。RDD在Spark中这么三种创建方法:(1)从存储系统中创建;(2)从其它RDD中创建。从存储中创建有多种方法,还时本来本地文件系统,也还时本来分布式文件系统,还还时本来内存中的数据。

下面的代码演示的是从HDFS中创建RDD

RDD用于支持在并行计算时不要 高效地利用上方结果,支持更简单的编程模型,一齐也具有像MapReduce等并行计算框架的高容错性、不要 高效地进行调度及可扩展性。RDD的容错通过记录RDD转换操作的lineage关系来进行,lineage记录了RDD的家族关系,当出現错误的很久,直接通过lineage进行恢复。RDD最合数据挖掘, 机器学习及图计算,若果哪些地方地方应用涉及到其他同学的迭代计算,基于内存不要 极大地提升其在分布式环境下的执行传输速率;RDD不适用于诸如分布式爬虫等时要频繁更新共享请况的任务。

一一个多多多全部的Spark进程运行运行,如前一节当中SparkWordCount进程运行,在提交集群运行时,它涉及到如下图所示的组件:

作者:周志湖

网名:摇摆少年梦

微信号:zhouzhihubeyond

下面给出的是在spark-shell中要怎样查看RDD的Lineage

各Spark进程运行运行以相互独立的进程运行运行集合运行于集群之上,由SparkContext对象进行协调,SparkContext对象还时要视为Spark进程运行运行的入口,被称为driver program,SparkContext还时要与不同种类的集群资源管理器(Cluster Manager),相似Hadoop Yarn、Mesos等 进行通信,从而分配到进程运行运行所需的资源,获取到集群运行所需的资源后,SparkContext将得到集群中其它工作节点(Worker Node) 上对应的Executors (不同的Spark进程运行运行有不同的Executor,它们之间也是独立的进程运行运行,Executor为进程运行运行提供分布式计算及数据存储功能),很久SparkContext将进程运行运行代码架构设计 到各Executors,最后将任务(Task)分配给executors执行。

弹性分布式数据集(RDD,Resilient Distributed Datasets),由Berkeley实验室于2011年提出,原始论文名字:Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing 原始论文非常值得一读,是研究RDD的一手资料,本节内容大要素将基于该论文。

f即为输入函数,它避免每个分区上方的内容。每个分区中的内容将以Iterator[T]传递给输入函数f,f的输出结果是Iterator[U]。最终的RDD由所有分区经过输入函数避免后的结果合并起来的。

目前最为常用的Spark运行模式有:

- local:本地进程运行方法运行,主要用于开发调试Spark进程运行运行

- Standalone:利用Spark自带的资源管理与调度器运行Spark集群,采用Master/Slave形态,为避免单点故障,还时要采用ZooKeeper实现高可靠(High Availability,HA)

- Apache Mesos :运行在著名的Mesos资源管理框架基础之上,该集群运行模式将资源管理交给Mesos,Spark只负责进行任务调度和计算

- Hadoop YARN : 集群运行在Yarn资源管理器上,资源管理交给Yarn,Spark只负责进行任务调度和计算

Spark运行模式中Hadoop YARN的集群运行方法最为常用,本课程中的第一节便是采用Hadoop YARN的方法进行Spark集群搭建。这么Spark便与Hadoop生态圈完美搭配,组成强大的集群,可谓无所这么。

Spark 1.5.0支持的transformation包括:

下面的代码演示的是从其它RDD创建新的RDD

上述例子中的函数myfunc是把分区中一一个多多多元素和它的下一一个多多多元素组成一一个多多多Tuple。可能性分区中最后一一个多多多元素这么下一一个多多多元素了,本来(3,4)和(6,7)没哟结果中。

mapPartitions还这俩变种,比如mapPartitionsWithContext,它能把避免过程中的这俩请况信息传递给用户指定的输入函数。还有mapPartitionsWithIndex,它能把分区的index传递给用户指定的输入函数。

//使用示例

这段代码它可能性给其他同学解释了RDD编程模型的核心思想:“filter函数将distData RDD转加带新的RDD”,“触发action操作”。也若果说RDD的操作包括Transformations(转换)、Actions三种。

(6)sample

方法参数:

在前面的例子中,其他同学可能性接触过到要怎样利用RDD进行编程,前面其他同学提到的

(2)filter

方法参数:

使用示例

(3)flatMap

方法参数:

使用示例:

(1)map

map函数方法参数:

本节要素内容源自官方文档:http://spark.apache.org/docs/latest/cluster-overview.html

transformations操作会将一一个多多多RDD转加带一一个多多多新的RDD,时要很糙注意的是所有的transformation全是lazy的,可能性对scala中的lazy了解的人都知道,transformation很久它不要立马执行,而若果会记住对相应数据集的transformation,而到真正被使用的很久才会执行,相似distData.filter(e=>e>2) transformation后,它不要立即执行,若果等到distDataFiltered.collect方法执行时才被执行,如下图所示



从上图还时要看完,在distDataFiltered.collect方法执行很久,才会触发最终的transformation执行。

使用示例:

def mapPartitions[U: ClassTag](f: Iterator[T] => Iterator[U], preservesPartitioning: Boolean = false): RDD[U]

def mapPartitionsWithIndex[U: ClassTag](

f: (Int, Iterator[T]) => Iterator[U],

preservesPartitioning: Boolean = false): RDD[U]

加带公众微信号,还时要了解更多最新Spark、Scala相关技术资讯

从transformation的介绍中其他同学知道,action是避免进程运行最终执行的诱因,action操作会返回进程运行执行结果如collect操作或将运行结果保存,相似SparkWordCount中的saveAsTextFile方法。