主要参考:

本文基本按照Spark官方文档顺序,结合PPT中的详细描述,以及个人理解组成,并且本文基于Java语言接口进行分析.如有错误之处,恳请大家指出.本人也是Spark新手上路,理解可能有偏差,望广大同仁理解.

Spark应用程序基本概念

基本元素 解释
Application 基于Spark的用户程序,包含了一个driver program和集群中多个executor
Driver Program 运行Application的main()函数,并且创建SparkContext,通常用SparkContext代表Driver Program
Executor 某Application运行在worker node上的一个进程,该进程负责运行Task,并且负责将数据存在内存或磁盘上.每个Application都有各自独立的executor(s)
Cluster Manager 在集群上获取资源的外部服务(如:Standalone,Mesos,Yarn等)
Worker Node 集群上任何可以运行Application代码的节点
Task 被送到某个executor上的工作单元
Job 包含多个task组成的并行计算,往往由Spark Action催生
Stage 每个Job会拆分成很多组task,每组任务成为stage,也可称为TaskSet
RDD Spark的基本计算单元

基本组成如下图


概述

总的来说,Spark applicaiton(应用程序)由一个driver program和若干在集群节点上运行的executors组成.RDD是Spark编程的核心,程序主要过程是读取数据生成RDD,各种RDD之间的转换,将RDD转换成所需或保存或显示等等.关于RDD可以参考论文Resilient Distributed Datasets: A Fault-tolerant Abstraction for In-Memory Cluster Computing

Spark中还有一个重要的概念就是shared variables,可以在并行的操作中使用到.当Spark在一系列不同的node上并行运行tasks时,会将在每个task中会被使用到的一系列变量复制成共享变量.共享变量一般在不同的tasks之间,以及tasks与driver program之间使用.共享变量主要有两种,一种是broadcast variables,另一种是accumulators.下文中将有进一步的介绍

一,初始化Spark

初始化Spark即构建一个JavaSparkContext对象,差不多也就是上面提到的driver program.

SparkConf conf = new SparkConf().setAppName(appName).setMaster(master);
JavaSparkContext sc = new JavaSparkContext(conf);

使用appName参数设置application的名字,master参数一般是Spark,Mesos或者YARN的节点URL,或者用”local”代表本地模式运行.

二,Resilient Distributed Datasets(RDDs, 弹性分布式数据集)

有两种方式来生成一个RDD

1,使用本地集合类(Collection)并行化生成

在driver program中,使用JavaSparkContext对象的parallelize方法将Colleciton变成RDD

List<Integer> data = Arrays.asList(1, 2, 3, 4, 5);
JavaRDD<Integer> distData = sc.parallelize(data);

关于parallelize函数,还有一种调用方式

sc.parallelize(data, 10)

可以指定 将数据集划分的分片的数量,Spark对每个分片都会运行一个task进行处理.通常来说,Spark会根据用户集群的性能自动选择分片数.

2,使用外部存储系统(HDFS,HBASE或者其他Hadoop InputFormat)生成

使用SparkContext的textFile方法,Spark能够接收文件的URI参数(可以为本地文件,也可以为hdfs://,s3n://或其他URI)

JavaRDD<String> distFile = sc.textFile("data.txt");

当如上,使用本地文件时,需要确保”data.txt”文件在其他worker node上同样路径下存在.可以将该文件复制到其他节点上,也可以使用网络的方式对文件进行分享.

使用textFile()方法可以将本地或HDFS文件转换成RDD,

支持整个文件目录读取,如

textFile("/my/directory")

支持压缩文件读取,如

textFile("/my/directory/*.gz")

支持通配符文件读取,如

textFile("/my/directory/*.txt")

除了text文件之外,Spark还可以读取其他形式的数据

wholeTextFiles()方法可以读取一个目录下包含的若干小text文件,每个文件对应返回一个(文件名, 内容)对.

sequenceFilesK, V方法可以将SequenceFiles转换成RDD.K和V分别代表文件中key和values的类型.K和V必须是Hadoop中Writable接口的子类,如IntWritable和Text等

hadoopRDD()方法可以将其他Hadoop的InputFormats转化成RDD.

三,RDD操作



从上图可以看出,对RDD的操作主要有两种,transformations,和actions()

1,transformation

在一个已有的RDD基础上生成另外一个新的RDD.所有transformation都是延迟执行的,一个transformation操作并不是立即执行,只是记住需要对基础数据的transformation操作的过程,直到某个action需要对某个RDD进行计算.若某个RDD会被多次使用,可以调用persist(或者cache)方法保存到内存,或外部存储设备上.当下次调用时,速度会更加快

JavaRDD<String> lines = sc.textFile("data.txt");
JavaRDD<Integer> lineLengths = lines.map(s -> s.length());
int totalLength = lineLengths.reduce((a, b) -> a + b);

第一行代码读取一个外部文件形成RDD,该操作只是有一个引用指向该文件,并不会立即执行.第二行通过map计算一行文本的长度,只是记住该map过程,并不是立即执行.直到第三行的reduce操作,Spark会将计算过程分配到各个节点去执行,每个节点运行各自的map过程和本地的reduce过程,只将最终结果返回给drive program.

如果要对lineLenths多次使用,可以添加

lineLengths.persist();

在reduce操作之前,这个操作会在第一次计算时将lineLengths变量保存到内存中

Spark的transformation相关操作有

transformation 描述
map(func) 将源数据的每个元素传入函数func中进行计算,返回一个新的RDD
filter(func) 使用func方法从源数据中选择一部分数据形成新的RDD
flatMap(func) 与map类似,但是对每一个输入元素可能会生成0个或多个输出,所以func函数应该返回一个Seq而不是单个元素
sample(withReplacement, fraction, seed) 对数据的一部分fraction,使用一个随机数生成器seed,生成一个新的RDD
union(otherDataset) 将源数据和新的数据合并到一个新的RDD
distinct([numTasks]) 返回源数据中distinct的数据
groupByKey([numTasks]) 输入一系列的(K,V)对,返回(K,Seq[V])对
reduceByKey(func,[numTasks]) 输入一系列的(K,V1)对,返回(K,V2)对,V2是由V1经过func方法计算得到的
sortByKey([ascending],[numTasks]) 输入一系列的(K,V)对,根据K的值进行升序或降序排练.ascending是一个boolean值
join(otherDateset, [numTasks]) 当输入(K,V)和(K,W)时,输出(K,Seq[V],Sqe[W])tuples
catesian(otherDataset) 当输入为T和U时,返回(T,U)对

2,actions

通过对一个RDD进行计算,返回一个值给driver program

对RDD数据集上运行计算后,将结果传给driver program或写入存储系统,可以触发Job

Actions相关操作

action 描述
reduce(func) 使用func函数计算输入数据,func对两个输入数据进行计算,生成一个计算结果.reduce过程可以和其他节点并行计算
collect() 将输入数据中所有元素返回成一个数组到driver program中,通常在filter操作,或者其他返回一个足够小的子数据集的操作过程后
count() 返回输入数据中元素的个数
first() 返回输入数据中的第一个元素,和take(1)功能相同
take(n) 返回前n个输入数据形成的数组,目前不支持并行计算,只能在driver program中来计算所有的元素
takeSample(withReplacement, fraction, seed) 使用一个随机数生成器seed,使用或者不是要replacement,生成输入数据的一个随机样本
saveAsTextFile(path) 根据给定的path,将数据保存至本地,或者分布式文件系统中
saveAsSequenceFile(path) 根据给定的path,将Hadoop Sequence数据保存到本地或分布式文件系统中.
countByKey() 只对(K,V)形式的RDD有效,返回一个包含所有key的(K,Int)对的Map
foreach(func) 对每个元素执行func函数

传递函数到Spark

Spark的很多功能都需要用户自己写具体实现的函数,如上面transformation和actions中某些参数func.

Spark中的函数,继承自 org.apache.spark.api.java.function

有两种方式来创建该函数:

1,用户自定义类继承Function接口

2,在Java8中,使用lambda expressions来定义一个实现

Spark中的作用域和生命周期

shared variables(共享变量)

1,Broadcast Variables(广播变量)

  • 广播变量缓存到各个节点的内存中,而不是每个 Task
  • 广播变量被创建后,能在集群中运行的任何函数调用
  • 广播变量是只读的,不能在被广播后修改
  • 对于大数据集的广播, Spark 尝试使用高效的广播算法来降低通信成本

    使用方法:

2,Accumulators(累加器)

  • 累加器只支持加法操作
  • 累加器可以高效地并行,用于实现计数器和变量求和
  • Spark 原生支持数值类型和标准可变集合的计数器,但用户可以添加新的类型
  • 只有Driver Program才能获取累加器的值

    使用方法:

未完待续~~~

Spark编程模型的更多相关文章

  1. Spark入门实战系列--3.Spark编程模型(上)--编程模型及SparkShell实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Spark编程模型 1.1 术语定义 l应用程序(Application): 基于Spar ...

  2. Spark入门实战系列--3.Spark编程模型(下)--IDEA搭建及实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 . 安装IntelliJ IDEA IDEA 全称 IntelliJ IDEA,是java语 ...

  3. Spark中文指南(入门篇)-Spark编程模型(一)

    前言 本章将对Spark做一个简单的介绍,更多教程请参考:Spark教程 本章知识点概括 Apache Spark简介 Spark的四种运行模式 Spark基于Standlone的运行流程 Spark ...

  4. Spark:Spark 编程模型及快速入门

    http://blog.csdn.net/pipisorry/article/details/52366356 Spark编程模型 SparkContext类和SparkConf类 代码中初始化 我们 ...

  5. Spark编程模型(RDD编程模型)

    Spark编程模型(RDD编程模型) 下图给出了rdd 编程模型,并将下例中用 到的四个算子映射到四种算子类型.spark 程序工作在两个空间中:spark rdd空间和 scala原生数据空间.在原 ...

  6. Spark编程模型(下)

    创建Pair RDD 什么是Pair RDD 包含键值对类型的RDD类型被称作Pair RDD: Pair RDD通常用来进行聚合计算: Pair RDD通常由普通RDD做ETL转化而来. Pytho ...

  7. Spark编程模型几大要素

    不多说,直接上干货! Spark编程模型几大要素 Driver Program 输入-Transformation-Action 缓存 共享变量

  8. Spark编程模型(博主推荐)

    福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑         Java全栈大联盟   ...

  9. 转载:Spark中文指南(入门篇)-Spark编程模型(一)

    原文:https://www.cnblogs.com/miqi1992/p/5621268.html 前言 本章将对Spark做一个简单的介绍,更多教程请参考:Spark教程 本章知识点概括 Apac ...

随机推荐

  1. 基于PHP的对接免费电子面单接口平台的案例-快宝开放平台

    一.电子面单对接平台 电子面单对接平台分为两类: 1 .各大快递公司自有的电子面单接口开放平台:对接起来麻烦,需要每个快递公司分别调试接口,费时费力. 2 .第三方快递开放平台:如快宝开放平台(htt ...

  2. 628. Maximum Product of Three Numbers

    Given an integer array, find three numbers whose product is maximum and output the maximum product. ...

  3. 009.Working with SQL Server LocalDB --【在sql server localdb 上操作数据】

    Working with SQL Server LocalDB 在sql server localdb 上操作数据 2017-3-7 2 分钟阅读时长 本文内容 1.SQL Server Expres ...

  4. 百度音乐flac 下载

    破解百度音乐白金会员 为了给Play Music上传标签齐全的正版的mp3,本屌翻遍网络苦思冥想.现在终于被我找到了破解之法——破解百度白金会员!破解之后可以直接从百度下载正版授权的320k文件,更可 ...

  5. 使用FFMPEG在windows平台下推rtmp流

    使用FFMPEG在windows平台下推rtmp流 工作中习惯在Linux下面使用FFmpeg模拟推rtmp流,无奈家中的电脑都是windows系统,需要利用家中的带宽来测试流媒体服务器的性能.所以研 ...

  6. 通讯协议序列化解读(二) protostuff详解教程

    上一篇文章 通讯协议序列化解读(一):http://www.cnblogs.com/tohxyblog/p/8974641.html  前言:上一面文章我们介绍了java序列化,以及谷歌protobu ...

  7. PHP $_POST 变量

    $_POST 变量 预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值. 从带有 POST 方法的表单发送的信息,对任何人都是不可见的(不会显示在浏 ...

  8. Docker常见仓库Node.js

    Node.js 基本信息 Node.js是基于 JavaScript 的可扩展服务端和网络软件开发平台. 该仓库提供了 Node.js 0.8 ~ 0.11 各个版本的镜像. 使用方法 在项目中创建一 ...

  9. JavaScript的事件、DOM模型、事件流模型以及内置对象详解(三)

    JS中的事件 JS中的事件分类 1.鼠标事件: click/dbclick/mouseover/mouseout 2.HTML事件: onload/onunload/onsubmit/onresize ...

  10. Hibernate之SchemaExport的使用

    @Test public void testCreateDB(){ Configuration cfg = new Configuration().configure(); SchemaExport ...