Spark Application能够在集群中并行执行,其关键是抽象出RDD的概念(详见RDD
细解
),也使得Spark Application的开发变得简单明了。下图浓缩了Spark的编程模型。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYm9va19tbWlja3k=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

1:Spark应用程序的结构
      Spark应用程序可分两部分:driver部分和executor部分初始化SparkContext和主体程序
A:driver部分
      driver部分主要是对SparkContext进行配置、初始化以及关闭。初始化SparkContext是为了构建Spark应用程序的执行环境,在初始化SparkContext,要先导入一些Spark的类和隐式转换;在executor部分执行完成后,须要将SparkContext关闭。driver部分的基本代码框架例如以下:
package week2

import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.SparkContext._ object WordCount1 {
def main(args: Array[String]) {
if (args.length == 0) {
System.err.println("Usage: bin/spark-submit [options] --class week2.WordCount1 WordCount.jar <file1> ")
System.exit(1)
} val conf = new SparkConf().setAppName("WordCount1")
val sc = new SparkContext(conf) 。。。 //executor部分 sc.stop()
}
}

要注意的是,Spark1.0.0因为採用了spark-submit统一的应用程序提交工具,代码上有所改变:

  • 不须要在代码里将应用程序本身通过addJars上传给资源管理器
  • 添加了history server,须要在代码末尾关闭SparkContext,才干将完整的执行信息公布到history server。

B:executor部分
      Spark应用程序的executor部分是对数据的处理,数据分三种:
  • 原生数据,包括输入的数据和输出的数据

    • 对于输入原生数据,Spark眼下提供了两种:

      • scala集合数据集,如Array(1,2,3,4,5),Spark使用parallelize方法转换成RDD。

      • hadoop数据集,Spark支持存储在hadoop上的文件和hadoop支持的其它文件系统,如本地文件、HBase、SequenceFile和Hadoop的输入格式。比如Spark使用txtFile方法能够将本地文件或HDFS文件转换成RDD。

    • 对于输出数据,Spark除了支持以上两种数据。还支持scala标量
      • 生成Scala标量数据,如count(返回RDD中元素的个数)、reduce、fold/aggregate;返回几个标量,如take(返回前几个元素)。
      • 生成Scala集合数据集,如collect(把RDD中的全部元素倒入 Scala集合类型)、lookup(查找相应key的全部值)。

      • 生成hadoop数据集,如saveAsTextFile、saveAsSequenceFile
  • RDD。Spark进行并行运算的基本单位。其细节參见RDD 细解

    RDD提供了四种算子:

    • 输入算子。将原生数据转换成RDD,如parallelize、txtFile等
    • 转换算子,最基本的算子,是Spark生成DAG图的对象。转换算子并不马上运行,在触发行动算子后再提交给driver处理。生成DAG图 -->  Stage --> Task  --> Worker运行。按转化算子在DAG图中作用。能够分成两种:
      • 窄依赖算子

        • 输入输出一对一的算子,且结果RDD的分区结构不变。主要是map、flatMap。
        • 输入输出一对一,但结果RDD的分区结构发生了变化。如union、coalesce;
        • 从输入中选择部分元素的算子,如filter、distinct、subtract、sample。
      • 宽依赖算子,宽依赖会涉及shuffle类,在DAG图解析时以此为边界产生Stage。如图所看到的。
        • 对单个RDD基于key进行重组和reduce,如groupByKey、reduceByKey。
        • 对两个RDD基于key进行join和重组。如join、cogroup。

    • 缓存算子。对于要多次使用的RDD,能够缓冲加快执行速度,对关键数据能够採用多备份缓存。
    • 行动算子,将运算结果RDD转换成原生数据,如count、reduce、collect、saveAsTextFile等。

  • 共享变量。在Spark执行时,一个函数传递给RDD内的patition操作时。该函数所用到的变量在每一个运算节点上都复制并维护了一份,而且各个节点之间不会相互影响。

    可是在Spark Application中。可能须要共享一些变量,提供Task或驱动程序使用。Spark提供了两种共享变量:

    • 广播变量,能够缓存到各个节点的共享变量,通常为仅仅读,用法:
scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))
scala> broadcastVar.value
  • 累计器。仅仅支持加法操作的变量,能够实现计数器和变量求和。用户能够调用SparkContext.accumulator(v)创建一个初始值为v的累加器。而执行在集群上的Task能够使用“+=”操作。但这些任务却不能读取;仅仅有驱动程序才干获取累加器的值。

    用法:

cala> val accum = sc.accumulator(0)
scala> sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum += x)

2:例程示范

      以下拿一个简单的样例WorCount来演示样例:

3:Spark应用程序的多语言编程
      Spark提供了Scala、Python、Java开发API。

用户能够依据自己的喜好选择对应的编程语言和工具。

建议使用Scala和IntelliJ IDEA开发。

关于多语言开发能够參考:Spark1.0.0 多语言编程
关于Spark应用程序的部署能够參考:Spark1.0.0 应用程序部署工具spark-submit
关于Spark应用程序的执行架构能够參考:Spark1.0.0 执行架构基本概念

Spark1.0.0 编程模型的更多相关文章

  1. at91sam9x5 linux 4.1.0下dts驱动编程模型

    测试环境:  CPU: AT91SAM9X35      Linux: Atmel提供的linux-at91-linux4sam_5.3 (Linux-4.1.0) 转载请注明: 凌云物网智科嵌入式实 ...

  2. Spark1.0.0新特性

            Spark1.0.0 release于2014-05-30日正式公布,标志Spark正式进入1.X的时代.Spark1.0.0带来了各种新的特性,并提供了更好的API支持:Spark1 ...

  3. Spark1.0.0 学习路径

          2014-05-30 Spark1.0.0 Relaease 经过11次RC后最终公布.尽管还有不少bug,还是非常令人振奋. 作为一个骨灰级的老IT,经过非常成一段时间的消沉,再次被点燃 ...

  4. Apache Spark1.1.0部署与开发环境搭建

    Spark是Apache公司推出的一种基于Hadoop Distributed File System(HDFS)的并行计算架构.与MapReduce不同,Spark并不局限于编写map和reduce ...

  5. Spark1.0.0 生态圈一览

          Spark生态圈,也就是BDAS(伯克利数据分析栈),是伯克利APMLab实验室精心打造的,力图在算法(Algorithms).机器(Machines).人(People)之间通过大规模集 ...

  6. Spark1.0.0 学习路线指导

    转自:http://www.aboutyun.com/thread-8421-1-1.html 问题导读1.什么是spark?2.spark编程模型是什么?3.spark运维需要具有什么知识?4.sp ...

  7. C#与C++的发展历程第三 - C#5.0异步编程巅峰

    系列文章目录 1. C#与C++的发展历程第一 - 由C#3.0起 2. C#与C++的发展历程第二 - C#4.0再接再厉 3. C#与C++的发展历程第三 - C#5.0异步编程的巅峰 C#5.0 ...

  8. C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(上)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(上)),不对的地方欢迎指出与交流. 章节出自<Professional C# 6 ...

  9. C# 6 与 .NET Core 1.0 高级编程 - 40 ASP.NET Core(上)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 40 章  ASP.NET Core(上)),不对的地方欢迎指出与交流. 章节出自<Professiona ...

随机推荐

  1. 使用CloudSight API进行图像识别的Python脚本

    # -*- coding: utf-8 -*- # @Time : 2018/03/20 17:02 # @Author : cxa # @File : sss.py # @Software: PyC ...

  2. Entity Framework 6.1.2 offset row fetch next 错误解决办法

    本地测试环境用的SqlServer2012,生产环境2008R2.然后在查询分页数据时生产环境悲剧的报错了. 原因是EF6.1.2以上版本在编译SQL时使用了新的语法对低版本的SqlServer不兼容 ...

  3. 【bzoj3439】KPM的MC密码

    这题乍一看后缀相等很烦的样子…… 其实如果把字符串倒过来,那么相等的后缀就可以转化成前缀,前缀相等扔进trie就可以了. 剩下无非是Trie的树链kth,主席树随便维护就好. 注意一个串彻底结束才能打 ...

  4. fullpage.js jq全屏滚动插件

    fullPage.js和fullPage都能实现全屏滚动,二者区别是:fullPage.js需依赖于JQuery库,而fullPage不需要依赖任何一个js库,可以单独使用. (代码演示效果并且可以下 ...

  5. Selenium2+python自动化59-数据驱动(ddt)【转载】

    前言 在设计用例的时候,有些用例只是参数数据的输入不一样,比如登录这个功能,操作过程但是一样的.如果用例重复去写操作过程会增加代码量,对应这种多组数据的测试用例,可以用数据驱动设计模式,一组数据对应一 ...

  6. SQLAlchemy技术文档(中文版)-上

    转自:http://www.cnblogs.com/iwangzc/p/4112078.html 1.版本检查 import sqlalchemy sqlalchemy.__version__ 2.连 ...

  7. poj 2398(叉积判断点在线段的哪一侧)

    Toy Storage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5016   Accepted: 2978 Descr ...

  8. Nodejs微信与Bot framework通过Direct Line连接

    背景 最近开发了一个Bot Framework的小工具,能够通过Luis分析出用户输入的文本,对文本中的StyleNo/FabricNo/TrimNo提取出来,并传入另一个小系统进行查询出结果,包括文 ...

  9. Python3 字典(map)

    ayout: post title: Python3 字典(map) author: "luowentaoaa" catalog: true tags: mathjax: true ...

  10. UVALive - 3211 (2-SAT + 二分)

    layout: post title: 训练指南 UVALive - 3211 (2-SAT + 二分) author: "luowentaoaa" catalog: true m ...