声明:本文基于spark的programming guide,并融合自己的相关理解整理而成

     Spark应用程序总是包括着一个driver program(驱动程序),它运行着用户的main方法,而且运行大量的并行操作(parallel operations)在集群上.

概述


    Spark最基本的抽象就是RDD(resilient distributed dataset) 弹性分布式数据集,RDD  就是切割元素的集合,他被分发在集群的各个节点上,而且可以进行并行操作.
    RDD的创建有三种方式:
  • HDFS,HBase 或者其它不论什么可以提供Hadoop输入格式的数据源;
  • 驱动程序中已存在的Scala集合;
  • 其它的RDD的转换
RDD可以持久化到内存中以反复使用加速计算速度, RDD可以自己主动从失败的节点中恢复(血统设计).

    Spark中的还有一个抽象就是可以被用于并行计算的共享变量. 默认的情况下, Spark并行执行一个函数是作为一组tasks在不同的节点上同一时候计算的, 这样的情况下,他是通过分发每个变量的复制到每个task中的. 有时候,我们须要某些变量在tasks之间进行共享. 这里Spark支持两种共享变量:
  1. broadcast variables, 被用于持久化变量在每一个node的内存中;
  2. accumulators,  这个变量仅仅可以被累加,

    

RDD操作


     操作主要包含两种,各自是transformations 和 action
     transformation : 将一个已经存在的RDD中转换成一个新的RDD,全部的转换操作都是lazy运行的,即仅仅是记下了运行的动作,仅仅有当driver程序须要结果的时候才会进行计算. 


action:一般用于对RDD中的元素进行实际的计算,然后返回对应的值,比如reduce操作,collect操作,count操作等等.这中action之后返回的就不在是RDD了

RDD基本操作的几个样例以及自己的理解:

 val conf = new SparkConf().setAppName("BasicRDDApp").setMaster("local[4]")
//spark://host:port
val sc = new SparkContext(conf) /**
* parallelized collections
* 将scala的集合数据,并行化成为能够并行计算的分布式数据集
*/
val data = 1 to 1000 toArray
val distData = sc.parallelize(data,10)
//后面的数字是表示将集合切分成多少个块 ,一般是一个CPU 2-4块,通常spark能够自己主动帮你切分 val sum = distData.reduce((a, b) => a+b )
//在reduce的时候才開始真正的运行,driver将任务分布到各个机器上,然后每一个机器单独运行,将计算的结果返回到driver程序
println("sum " + sum) /**
* 读取外部的数据源
* 1.Hadoop支持的数据源 ,比如HDFS,Cassandra,HBase ,Amazon S3
* ##假设文件地址是本地地址的话,那么他应该在集群的每一个节点上都能够被訪问(即:每一个节点上都应该有相同的文件)
* ##textFile的第二个參数控制文件被分割的大小默觉得64MB ,能够设置更大的可是不能设置更小的
*/ val distFile = sc.textFile("file:///usr/local/spark/README.md") //接下来就能够进行相关的操作了
distFile.persist()//持久化 val len = distFile.map(s => 1).reduce((a, b) => a+b)
println(len) val words = distFile.flatMap(l => l.split(" ")).map(w => (w,1)).reduceByKey((a,b) => a+b)
//w => (v1+v2+v3+...)
//map => 1->1 , flatMap => 1 -> 0..n print(words.count())
words foreach println val twords = distFile.flatMap(l => l.split(" ")).map(w => (w,1)).groupByKey()
//分组 w => (v1, v2, v3 ...) twords foreach println
//.map(w => (w,1)).foreach(w => w._1);



RDD的持久化


  1. 使用方法: 使用persist()或者cache()方法,当中cache()方法默认持久化到内存,persist能够自己选择持久化的层次,在shuffle操作中,spark会自己主动保存中间计算结果,比如reduceBykey
  2. 作用:  RDD的持久化会将会使得每一个节点保存对应的计算部分,以便再次使用该数据集时能够直接使用,加快计算速度
  3. 怎样选择持久化层次: 假设RDDs 在MEMORY_ONLY下表现良好的话,就选这个层次,这样CPU效率最高

    其次MEMORY_ONLY_SER ,其它情况http://spark.apache.org/docs/latest/programming-guide.html

共享变量


1. broadcast 变量, 仅仅读的共享变量 每一个节点上都有一个拷贝, 使用方法
     val broadcastVar = sc.broadcast("string test")
     broadcastVar.value
2.accumulator 变量,做累加器用,类似与counter或者是sum
    val broadcastVar = sc.broadcast("string test")//broadcast variable is readonly

    val v = broadcastVar.value
println(v) val accum = sc.accumulator(0, "My Accumulator")//value and name sc.parallelize(1 to 1000000).foreach(x => accum+= 1) println(accum.name + ":" + accum.value)


spark 学习(二) RDD及共享变量的更多相关文章

  1. Spark学习之RDD编程(2)

    Spark学习之RDD编程(2) 1. Spark中的RDD是一个不可变的分布式对象集合. 2. 在Spark中数据的操作不外乎创建RDD.转化已有的RDD以及调用RDD操作进行求值. 3. 创建RD ...

  2. Spark学习之RDD编程总结

    Spark 对数据的核心抽象——弹性分布式数据集(Resilient Distributed Dataset,简称 RDD).RDD 其实就是分布式的元素集合.在 Spark 中,对数据的所有操作不外 ...

  3. Spark学习之RDD

    RDD概述 什么是RDD RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素可并行计算的集合 ...

  4. Spark学习笔记——RDD编程

    1.RDD——弹性分布式数据集(Resilient Distributed Dataset) RDD是一个分布式的元素集合,在Spark中,对数据的操作就是创建RDD.转换已有的RDD和调用RDD操作 ...

  5. Spark Standalone Mode 多机启动 -- 分布式计算系统spark学习(二)(更新一键启动slavers)

    捣鼓了一下,先来个手动挡吧.自动挡要设置ssh无密码登陆啥的,后面开搞. 一.手动多台机链接master 手动链接master其实上篇已经用过. 这里有两台机器: 10.60.215.41 启动mas ...

  6. spark学习(10)-RDD的介绍和常用算子

    RDD(弹性分布式数据集,里面并不存储真正要计算的数据,你对RDD的操作,他会在Driver端转换成Task,下发到Executor计算分散在多台集群上的数据) RDD是一个代理,你对代理进行操作,他 ...

  7. Spark学习之RDD的理解

    转自:http://www.infoq.com/cn/articles/spark-core-rdd/ 感谢张逸老师的无私分享 RDD,全称为Resilient Distributed Dataset ...

  8. spark学习(RDD案例实战)

    练习0(并行化创建RDD) 先启动spark-shell 通过并行化生成rdd scala> val rdd1 = sc.parallelize(List(63,45,89,23,144,777 ...

  9. Spark 学习(二)

    继续学习spark 认真查看了一下${SPARK_HOME}/bin/pyspark 的脚本,原来开启spark 的python 交互挺简单的. 主要操作 export PYTHONPATH=${SP ...

随机推荐

  1. 使用tortoisegit访问git@oschina

    转自:http://www.3lian.com/edu/2014/01-03/121350.html 首先,如果你想使用git@oschina ,你的电脑上必须先有git工具:你可以从这里获取谷歌提供 ...

  2. Install Tomcat 7 on CentOS, RHEL, or Fedora

    linux下的 Tomcat 安装: http://www.davidghedini.com/pg/entry/install_tomcat_7_on_centos

  3. Error: Cannot find module 'internal/fs'

    $ sudo n 6.9.1 $ sudo npm -g install npm@next $ sudo n stable curl -0 -L https://npmjs.org/install.s ...

  4. sed替换换行符“\n”

    linux sed命令,如何替换换行符“\n” 在一次sed使用中,执行命令: sed "s/\n//g" file 1 发现,没起到任何效果. 后来,经查sed官方用户手册,才得 ...

  5. iOS: FFmpeg的使用二

    1.下载并编译FFMPEG. https://github.com/kewlbear/FFmpeg-iOS-build-script 下载后有一个build-ffmpeg.sh文件.终端执行即可自动下 ...

  6. Informatica 常用组件Source Qualifier之六 外部联接

    可以使用源限定符和应用程序源限定符转换在相同的数据库中执行两个源的外部联接.当 PowerCenter 执行外部联接时,它将返回其中一个源表的所有行和另一个源表中匹配联接条件的行. 如果您需要联接两个 ...

  7. go语言基础之全局变量

    1.全局变量 示例: package main import "fmt" func test() { fmt.Println("test a =", a) } ...

  8. 国内站点经常使用的一些 CDN 静态资源公共库加速服务

    web开发人员们的福利来了..旨在为大家提供更快很多其它更好的静态资源库的CDN载入库方案! CDN公共库是指将经常使用的JS库存放在CDN节点,以方便广大开发人员直接调用. 与将JS库存放在serv ...

  9. API的文件遍历,未使用CFileFind,因为里面牵扯MFC,编个DLL好麻烦。

    // FindFileDebug.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "FindFileDebug. ...

  10. mysql5.5.15配置主从数据库

    1.编辑主库的my.cnf 在[mysqld]下添加如下配置 server-i=1 #一般默认为1,不需要修改(一般都以ip的后两位为server-id,保证全局的一致) read-only=0#主库 ...