1. 主要参考资料
http://spark.incubator.apache.org/docs/latest/scala-programming-guide.html
http://www.eecs.berkeley.edu/Pubs/TechRpts/2011/EECS-2011-82.pdf

2. 简介
每个Spark应用,都有一个驱动程序,它运行main函数,在集群上执行各种并行运算。Spark的最重要的抽象是RDD--Resilient Distributed Data(弹性分布式数据)。RDD存储数据,这些数据分布在Spark集群的各种节点上,这些数据可以进行并行计算。可以从一个HDFS文件或者类似的文件系统创建RDD,也可以从Scala的Collection创建RDD,也可以从另外一个RDD处理之后创建。RDD可以持久化到内存里。RDD可以自动从节点失效中恢复。

Spark第二个抽象是Shared Variables--共享变量,用于并行计算。Spark有两种共享变量:Broadcast varibles--广播变量,它在所有节点的内存里缓存一个值;Accumulators--累积量,它们只能被“加”起来,比如计数器或者是“求和”。

3. Spark程序的第一步是初始化SparkContext,它通知Spark如何获取一个集群:
    val sc = new SparkContext(master, appName, [sparkHome], [jars])

参数master指明集群的地址,是字符串,master可以是"local"--在本地单机运行,也可以是Spark或者Mesos集群的URL。
参数appName是Spark应用的名称,会在集群的web界面里显示出来。
参数sparkHome是spark的安装目录,注意,集群内所有节点的Spark必须安装在同样的目录下。
参数jars是打包后的Spark应用,是本地目录,这些Jar包会被复制发送到集群内的所有节点执行。

如果是运行Spark Shell,那么它会自从创建一个SparkContext,变量名sc,不要在Spark Shell创建新的SparkContext,不会生效的。在运行Spark Shell之前,可以指定环境变量,让Spark知道使用哪个集群,也可以用ADD_JARS环境变量把JARS添加到classpath。比如,如果想在spakr-shell在本地4核的cpu运行,需要如下方式启动:

$MASTER=local[4] ./spark-shell

这里的4,是启动4个工作线程。

如果要添加JARS,可以如下:
$MASTER=local[4] ADD_JARS=code.jar ./spark-shell

4. Master URLs

Master的URL有4中:
local,本地,单线程
local[K],本地,K个线程
spark://HOST:PORT,在spark集群上运行。
mesos://HOST:PORT,在Mesos集群上运行。

5. RDD-弹性分布式数据
Spark以RDD为核心概念开发的,它的运行也是以RDD为中心。有两种RDD:第一种是并行Collections,它是Scala collection,可以进行并行计算;第二种是Hadoop数据集,它是并行计算HDFS文件的每条记录,凡是Hadoop支持的文件系统,都可以进行操作。这两种RDD都以同样的方式处理。

6. RDD之 并行Collections
并行Collections由SparkContext的parallelize方法,在一个已经存在的Scala collection上创建。这个collection上的成员会被copy成分布式数据库,也就是copy到所有节点,于是就可以进行并行计算了。举例如下:

#scala的collection
scala> val data = Array(1, 2, 3, 4, 5)
data: Array[Int] = Array(1, 2, 3, 4, 5)

#并行collection
scala> val distData = sc.parallelize(data)
distData: spark.RDD[Int] = spark.ParallelCollection@10d13e3e

第一条语句创建一个Scala collection,第二条语句将它转化成并行collection。并行collection有一个重要参数,就是slices数,spark在进行计算的时候,每个slice对应一个task。通常,一个CPU对应2~4个slice。一般情况下,Sparkt会根据集群的状况,自动计算slice,也可以手动指定,比如说,paralize(data,10)就是指定了10个slice。

7. RDD之 Hadoop数据集

Spark支持在任何Hadoop能处理的文件系统上创建分布式数据集,包括本地文件系统,Amazon S3,Hypertable,HBase等等。Spark支持文本文件,序列文件,以及任何Hadoop的InputFormat。

比如,从文本文件创建数据集的方式如下:

scala> val distFile = sc.textFile("data.txt")
distFile: spark.RDD[String] = spark.HadoopRDD@1d4cee08

如果给distFile设置slice数量,形如sc.textFile("data.txt",5)。默认情况下,sparkt为data.txt的每个block块设置一个slice,注意,手工设置的slice数,只能比文件的block块数量大,不能比它小。

对于SequenceFile-序列文件,SparkContext的sequenceFile[k, v]函数将它转化成RDD。

对其他的Hadoop InputFormat,SparkContext.hadoopRDD方法处理。

8. RDD运算
RDD支持两种运算:变换transformation-从已有的RDD创建一个新的RDD,如map;或者从action中创建RDD,如reduce。

Spark的transformation都是lazy的,Spark会记下这些transformation,不立刻计算结果,直到action需要返回结果的时候再进行计算。

默认情况下,每个RDD的transformation都会重新计算,但如果将RDD用persisi持久化到内存里,或者缓存到内存里,它就不重新计算了,由此加快查询速度。

9. RDD持久化
如果一个RDD被持久化了,那么,每个节点都会存数这个RDD的所有slice,于是可以在内存进行计算,可以重用,这样可以让后来的action计算的更快,通常会把速度提高至少十倍。对迭代式计算来说,持久化非常关键。RDD的persisi方法和cache方法都可以进行持久化。RDD是容错的--如果它的任何部分丢失了,都会重新计算创建。

RDD有不同的存储方式,可以存在硬盘,或者内存,或者复制到所有节点。而chach函数只有一个默认的存储方式就是内存。

10. 共享变量-广播变量
广播变量--在集群的每个节点机器上都缓存一个只读的变量,比如说,每个节点都保存一份输入数据的只读缓存。

广播变量的使用方式:
scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))
broadcastVar: spark.Broadcast[Array[Int] = spark.Broadcast(b5c40191-a864-4c7d-b9bf-d87e1a4e787c)

scala> broadcastVar.value
res0: Array[Int] = Array(1, 2, 3)

注意:创建了广播变量之后,就不能使用v了,要使用broadcaseCar;v值不能修改。

11. 共享变量-累计量:
只要是用作计数器counter或者求和sum,只能做add运算,例子如下:
scala> val accum = sc.accumulator(0)
accum: spark.Accumulator[Int] = 0

scala> sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum += x)
...
10/09/29 18:41:08 INFO SparkContext: Tasks finished in 0.317106 s

scala> accum.value
res2: Int = 10

spark开发的更多相关文章

  1. Windows下单机安装Spark开发环境

    机器:windows 10 64位. 因Spark支持java.python等语言,所以尝试安装了两种语言环境下的spark开发环境. 1.Java下Spark开发环境搭建 1.1.jdk安装 安装o ...

  2. 使用Intellij IDEA构建spark开发环境

    近期开始研究学习spark,开发环境有多种,由于习惯使用STS的maven项目,但是按照许多资料的方法尝试以后并没有成功,也可能是我环境问题:也可以是用scala中自带的eclipse,但是不太习惯, ...

  3. Spark开发指南

    原文链接http://www.sxt.cn/info-2730-u-756.html 目录 Spark开发指南 简介 接入Spark Java 初始化Spark Java 弹性分布式数据集 并行集合 ...

  4. windows下spark开发环境配置

    http://www.cnblogs.com/davidwang456/p/5032766.html windows下spark开发环境配置 --本篇随笔由同事葛同学提供. windows下spark ...

  5. Spark编译及spark开发环境搭建

    最近需要将生产环境的spark1.3版本升级到spark1.6(尽管spark2.0已经发布一段时间了,稳定可靠起见,还是选择了spark1.6),同时需要基于spark开发一些中间件,因此需要搭建一 ...

  6. Windows环境下在IDEA编辑器中spark开发安装步骤

    以下是windows环境下安装spark的过程: 1.安装JDK(version:1.8.0.152) 2.安装scala(version:2.11/2.12) 3.安装spark(version:s ...

  7. Intellij IDEA使用Maven搭建spark开发环境(scala)

    如何一步一步地在Intellij IDEA使用Maven搭建spark开发环境,并基于scala编写简单的spark中wordcount实例. 1.准备工作 首先需要在你电脑上安装jdk和scala以 ...

  8. Spark开发环境

    1. Win7下利用Intellij IDEA构建Spark开发环境 前提:Intellij IDEA Community 免费版下载(最新版14.0.1),Scala插件下载(最新版scala-in ...

  9. 分别用Eclipse和IDEA搭建Scala+Spark开发环境

    开发机器上安装jdk1.7.0_60和scala2.10.4,配置好相关环境变量.网上资料很多,安装过程忽略.此外,Eclipse使用Luna4.4.1,IDEA使用14.0.2版本. 1. Ecli ...

  10. Spark 开发环境搭建

    原文见   http://xiguada.org/spark-develop/ 本文基于Spark 0.9.0,由于它基于Scala 2.10,因此必须安装Scala 2.10,否则将无法运行Spar ...

随机推荐

  1. centos7下编译安装nginx1.10

    1.下载pcre 下载地址:ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 解压到/usr/local/pcre8.3.9 2.下载ope ...

  2. supervisor笔记

    supervisord 作为主进程,管理旗下的各个子进程,子进程会产生若干线程.当某个管理的服务异常奔溃之后,supervisor 会自动重启该服务.配合使用 superlance 插件以实现 Htt ...

  3. 《JavaScript高级程序设计》读书笔记 ---RegExp 类型

    ECMAScript 通过RegExp 类型来支持正则表达式.使用下面类似Perl 的语法,就可以创建一个正则表达式.var expression = / pattern / flags ; 其中的模 ...

  4. 8VC Venture Cup 2017 - Elimination Round

    传送门:http://codeforces.com/contest/755 A题题意是给你一个数字n,让你找到一个数字m,使得n*m+1为合数,范围比较小,直接线性筛出1e6的质数,然后暴力枚举一下就 ...

  5. intellij idea 12 搭建maven web项目 freemarker + spring mvc(续)

    上次有2个东西没整明白,一个就是controller的注解使用RequestMappingHandlerAdapter报错 No adapter for handler [controller.Use ...

  6. LOOPS

    LOOPS 题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3853 递推 设dp[i][j]为(i,j)到终点期望的使用魔力值,mp[i][ ...

  7. UVa 11426

    首先我们了解一下欧拉函数phi[x],phi[x]表示的是不超过x且和x互素的整数个数 phi[x]=n*(1-1/p1)*(1-1/p2)....(1-1/pn); 计算欧拉函数的代码为 int e ...

  8. VS2013使用EF与mysql数据库.

    一个VS2013的mvc+EF+mysql的项目,需要连接Mysql数据库 一,下载一个mysql-for-visualstudio-1.2.3.msi,在自己的电脑上安装,这个是解决在创建实体模型( ...

  9. 编写高质量iOS代码的52个有效方法1-1

    一.使用向前声明(@class)的好处 1.有效减少编译器编译的时间: 2.有效避免循环引用: 二.字面量语法的好处 1.字面常量 精简.可用于所有数据类型,如: NSNumber *intNumbe ...

  10. JavaEE 配置文件 应用首选项存储

    JavaEE 配置文件 应用首选项存储 @author ixenos 什么是首选项? 首选项Preferences 指配置信息 首选项存储就是指对配置信息的存储   有什么方式存储? 有两种,一种存于 ...