声明:本文基于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. Hibernate:不容易理解的 lock 和 merge

    背景 lock 和 merge 在字面上很容易理解它们的语义,不过它们的实际行为所代表的语义范围要大一点,本文就简单的记录下来,还请朋友们多批评和指正. Lock 官方的注释 /** * Obtain ...

  2. 数学图形(2.8)Viviani曲线

    维维亚尼(Viviani , Vincenzo)意大利数学家.1622年4月5日生于托斯卡纳大区佛罗伦萨:1703年9月22日卒于佛罗伦萨. 这是一个圆柱与一个球相交而生成的曲线. #http://w ...

  3. 深度Linux Deepin系统安装教程使用体验

    很早以前,试用过一次深度的OS,那时深度刚出自己的Linux修改版系统,过了有两年了,准备看看Deepin OS有什么变化,和雨林木风的Start OS比,有什么不同 1.安装的引导菜单和Start ...

  4. csm pssm +pcf pcss sdsm

    这几个shadow算法 pcf是sample时候用的 按照一个mode采样几个位置 根据采样结果 决定0-1  可以是0.234 这样就不是 0或者1 就是soft了 主要讲下pcss 是啥 因为我之 ...

  5. office excel2013如何启用solver选项

    Excel要启用solver很多地方说是要单独安装插件,我认为不同版本可能操作不同.此时office2013已经足够强大,可以通过下面的方法来启用solver 1:在office2013 Excel中 ...

  6. C-IDE使用指南

    HI  您好: 亲爱的学员,本文章是基于C-IDE的入口使用指南,您能够查看demo项目来了解C-IDE详细操作哦~ 如有疑问您可提交反馈来咨询,或扫描下方二维码增加官方微信群.我们会认真对待且具体回 ...

  7. 【数据压缩】LZW算法原理与源代码解析

    转载请注明出处:http://blog.csdn.net/luoshixian099/article/details/50331883 <勿在浮沙筑高台> LZW压缩算法原理很easy,因 ...

  8. SpringMVC配置全局日期转换器,处理日期转换异常

    Spring 3.1.1使用Mvc配置全局日期转换器,处理日期转换异常链接地址: https://www.2cto.com/kf/201308/236837.html spring3.0配置日期转换可 ...

  9. Linux 内核源码情景分析 chap 2 存储管理 (四)

    物理页面的使用和周转 1. 几个术语 1.1 虚存页面 指虚拟地址空间中一个固定大小, 边界与页面大小 4KB 对齐的区间及其内容 1.2 物理页面 与虚存页面相对的, 须要映射到某种物理存储介质上面 ...

  10. 【NEWS】 ADempiere发布ADempiere 3.8.0路线图【2013年7月28日】

    发布源:http://osssme.org/cms/?q=node/17 本以为ADempiere”已死“,但是看到ADempiere的WIKI上大概在从5月28日开始添加WIKI以来,经过多次更新后 ...