主要参考:

本文基本按照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. Linux pip安装使用

    pip安装使用详解 pip类似RedHat里面的yum,安装Python包非常方便.本节详细介绍pip的安装.以及使用方法. 1.pip下载安装 1.1 pip下载   1 # wget " ...

  2. Docker安装tomcat和部署项目

    随着微服务的流行,Docker越来越流行,正如它的理念"Build, Ship, and Run Any App, Anywhere"一样,Docker提供的容器隔离技术使得开发人 ...

  3. 41. First Missing Positive(困难, 用到 counting sort 方法)

    Given an unsorted integer array, find the first missing positive integer. For example, Given [1,2,0] ...

  4. grab window

    #include <Windows.h> #include <iostream> using namespace std; #if 0 int CaptureAnImage(/ ...

  5. Python logging 模块和使用经验

    记录下常用的一些东西,每次用总是查文档有点小麻烦. py2.7 日志应该是生产应用的重要生命线,谁都不应该掉以轻心 有益原则 级别分离 日志系统通常有下面几种级别,看情况是使用 FATAL - 导致程 ...

  6. java创建线程

    创建一个线程 Java提供了两种创建线程方法: 通过实现Runable接口: http://blog.csdn.net/duruiqi_fx/article/details/52187275 通过继承 ...

  7. Android自定义View(一、初体验自定义TextView)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51454685 本文出自:[openXu的博客] 目录: 继承View重写onDraw方法 自 ...

  8. 第三方开源动画库EasyAnimation中一个小bug的修复

    看过iOS动画之旅的都知道,其中在最后提到一个作者写的开源动画库EasyAnimation(以下简称EA). EA对CoreAnimation中的view和layer动画做了更高层次的包装和抽象,使得 ...

  9. 视频编码器评测系统:VideoCodecRank

    视频编码器领域一直有个比较复杂的问题:mpeg2.divx.xvid.mpeg4.vp8.vp9.x264.openh264.x265等等这一系列编码器到底哪个好?而对于同一种视频编码器,又包括了各种 ...

  10. Java基本语法-----java常量

    1常量的概述 常量是指在程序运行过程中其值不能改变的量. 2常量类型 Java中常量的分类: 整数常量 : 所有整数 小数常量 : 所有小数 布尔常量 : 只有true和false 字符常量 :使用' ...