声明:本文基于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. [Android Pro] Android 必知必会-使用 supportV4 的 RoundedBitmapDrawable 实现圆角

    RoundedBitmapDrawable 是 supportV4 下的一个类,有了它,显示圆角和圆形图片的情况下就不需要额外的第三方类库了,还能和各种图片加载库配合使用. 背景 今天无意间看到一段实 ...

  2. OpenCV学习(2) OpenCV的配置

          下面我们在VS2010中编写一个简单的OpenCV程序,来看看如何在程序中使用OpenCV. 创建一个新的Win32 控制台程序,附加选项为空工程(empty project),并添加一个 ...

  3. java中读取配置文件中的数据

    1.先在项目中创建一个包(如:config),再创建一个配置文件(如:a.properties),添加配置信息如下:比如:name=kakaage=28 2.代码:import java.io.IOE ...

  4. android学习的网站收集

    1. http://mob.com/#/index 提供分享等统一解决方案 2. http://bbs.apkbus.com/explore/ 这个类似的quroa问答模块,覆盖不错.就是人气,稍差. ...

  5. 推送未找到应用程序的“aps-environment”的权利字符串错误

    一:使用百度推送,或是苹果自带的推送出,才配置好anps-cer文件之后,出现错误 推送未找到应用程序的“aps-environment”的权利字符串错误 二:错误原因: 此原因是配置好推送证书之后, ...

  6. ThinkPHP框架返回插入记录的id号

    ThinkPHP返回插入记录的id号 $Form->create()) $result = $Form->add(); 在执行上述语句后,若存在auto_increment字段,则可以使用 ...

  7. Geolocation 地理定位

    地理位置(Geolocation)是 HTML5 的重要特性之一,提供了确定用户位置的功能,借助这个特性能够开发基于位置信息的应用.今天这篇文章向大家介绍一下 HTML5 地理位置定位的基本原理及各个 ...

  8. Vue 源码 基础知识点

    1.数据类型判断 const _toString = Object.prototype.toString function toRawType(value) { return _toString.ca ...

  9. sql server Service Broker 相关查询

    sql server Service Broker 相关查询 -- 查看传输队列中的消息 --如果尝试从队列中移除时,列将表明哪里出现了问题 select * from sys.transmissio ...

  10. Android开发牛刀小试之“AA算钱软件”开发(一)

    事实上想去做android开发已经有非常长一段时间了,可是因为还在上课,加上老板那边的项目接连不断.也一直都没有机会抽出身来做.可是,楼主当然也不会闲着,首先我了解到android开发须要java学习 ...