RDD(Resilient Distributed Datasets)弹性分布式数据集。RDD可以看成是一个简单的"数组",对其进行操作也只需要调用有限的"数组"中的方法即可,但它与一般数组的区别在于:RDD是分布式存储,可以跟好的利用现有的云数据平台,并在内存中进行。此处的弹性指的是数据的存储方式,及数据在节点中进行存储的时候,既可以使用内存也可以使用磁盘。此外,RDD还具有很强的容错性,在spark运行计算的过程中,不会因为某个节点错误而使得整个任务失败;不通节点中并发运行的数据,如果在某个节点发生错误时,RDD会自动将其在不同的节点中重试。

  RDD一大特性是延迟计算,即一个完整的RDD运行任务被分成2部分:Transformation和Action。

  Transformation用于对RDD的创建。在spark中,RDD只能使用Transformation来创建,同时Transformation还提供了大量的操作方法。RDD还可以利用Transformation来生成新的RDD,这样可以在有限的内存空间中生成竟可能多的数据对象。无论发生了多少次Transformation,此时,在RDD中真正数据计算运行的操作Action都没真正的开始运行。

  Action是数据的执行部分,其也提供了大量的方法去执行数据的计算操作部分。

  RDD可以将其看成一个分布在不同节点中的分布式数据集,并将数据以数据块(Block)的形式存储在各个节点的计算机中。每个BlockMaster管理着若干个BlockSlave,而每个BlockSlave又管理着若干个BlockNode。当BlockSlave获得了每个Node节点的地址,又会反向向BlockMaster注册每个Node的基本信息,这样就形成了分层管理。

  RDD依赖

   窄依赖 (narrowdependencies) 和宽依赖 (widedependencies) 。窄依赖是指 父 RDD 的每个分区都只被子 RDD 的一个分区所使用,例如map、filter。相应的,那么宽依赖就是指父 RDD 的分区被多个子 RDD 的分区所依赖,例如groupByKey、reduceByKey等操作。如果父RDD的一个Partition被一个子RDD的Partition所使用就是窄依赖,否则的话就是宽依赖。
  这种划分有两个用处。首先,窄依赖支持在一个结点上管道化执行。例如基于一对一的关系,可以在 filter 之后执行 map 。其次,窄依赖支持更高效的故障还原。因为对于窄依赖,只有丢失的父 RDD 的分区需要重新计算。而对于宽依赖,一个结点的故障可能导致来自所有父 RDD 的分区丢失,因此就需要完全重新执行。因此对于宽依赖,Spark 会在持有各个父分区的结点上,将中间数据持久化来简化故障还原,就像 MapReduce 会持久化 map 的输出一样。对于join操作有两种情况,如果join操作的使用每个partition仅仅和已知的Partition进行join,此时的join操作就是窄依赖;其他情况的join操作就是宽依赖;因为是确定的Partition数量的依赖关系,所以就是窄依赖,得出一个推论,窄依赖不仅包含一对一的窄依赖,还包含一对固定个数的窄依赖(也就是说对父RDD的依赖的Partition的数量不会随着RDD数据规模的改变而改变)
                
 
  下面就是RDD API
  1、parallelize
  def parallelize[T](seq : scala.Seq[T], numSlices : scala.Int = { /* compiled code */ }) //第一个参数是数据,同时还有一个带有默认数值的参数,改参数为1,该参数表示的是将数据分布在多少个数据节点中存放。
  2、aggregate
  def aggregate[U](zeroValue : U)(seqOp : scala.Function2[U, T, U], combOp : scala.Function2[U, U, U]) //seqOp 是给定的计算方法,combOp 是合并方法,将第一个计算方法得出的结果与源码中的zeroValue进行合并。实例:
import org.apache.spark.{SparkConf, SparkContext}

object test {
def main(args: Array[String]): Unit = {
val conf=new SparkConf().setMaster("local").setAppName("test")
val sc=new SparkContext(conf)
val arr=sc.parallelize(Array(,,,,,,,))//parallelize将内存数据读入Spark系统中,作为整体数据集
val result=arr.aggregate()(math.max(_,_),_+_)//_+_ 对传递的第一个方法的结果集进行进一步处理
println(result)
}
}

结果为8

import org.apache.spark.{SparkConf, SparkContext}

object test {
def main(args: Array[String]): Unit = {
val conf=new SparkConf().setMaster("local").setAppName("test")
val sc=new SparkContext(conf)
val arr=sc.parallelize(Array("abd","hello world","hello sb"))//parallelize将内存数据读入Spark系统中,作为整体数据集
val result=arr.aggregate("")((value,word)=>value+word,_+_)//_+_ 对传递的第一个方法的结果集进行进一步处理
println(result)
}
}

结果为abdhello worldhello sb

  3、cache是将数据内容计算并保存在计算节点的内存中

  4、cartesion是用于对不同的数组进行笛卡尔操作,要求是数组的长度必须相同

import org.apache.spark.{SparkConf, SparkContext}

object test {
def main(args: Array[String]): Unit = {
val conf=new SparkConf().setMaster("local").setAppName("test")
val sc=new SparkContext(conf)
val arr1=sc.parallelize(Array(,,,))//parallelize将内存数据读入Spark系统中,作为整体数据集
val arr2=sc.parallelize(Array(,,,))
val res=arr1.cartesian(arr2)
res.foreach(print)
}
}

结果:(1,4)(1,3)(1,2)(1,1)(2,4)(2,3)(2,2)(2,1)(3,4)(3,3)(3,2)(3,1)(4,4)(4,3)(4,2)(4,1)

  5、Coalesce是将已经存储的数据重新分片后再进行存储(repartition与Coalesce类似)

import org.apache.spark.{SparkConf, SparkContext}

object test {
def main(args: Array[String]): Unit = {
val conf=new SparkConf().setMaster("local").setAppName("test")
val sc=new SparkContext(conf)
val arr1=sc.parallelize(Array(,,,,,))//parallelize将内存数据读入Spark系统中,作为整体数据集
val arr2=arr1.coalesce(,true)
val res1=arr1.aggregate()(math.max(_,_),_+_)
println(res1)
val res2=arr2.aggregate()(math.max(_,_),_+_)
println(res2)
}
}

结果为6    11

  6、countByValue是计算数据集中某个数据出现的个数,并将其以map的形式返回

  7、countByKey是计算数据集中元数据键值对key出现的个数

import org.apache.spark.{SparkConf, SparkContext}

object test {
def main(args: Array[String]): Unit = {
val conf=new SparkConf().setMaster("local").setAppName("test")
val sc=new SparkContext(conf)
val arr1=sc.parallelize(Array((,"a"),(,'b'),(,'c'),(,'d'),(,'a')))//parallelize将内存数据读入Spark系统中,作为整体数据集
val res1=arr1.countByValue()
res1.foreach(println)
val res2=arr1.countByKey()
res2.foreach(println)
}
}
//结果:((1,c),1)
((,a),)
((,a),)
((,d),)
((,b),)
(,)
(,)

  8、filter是对数据集进行过滤

  9、flatMap是对RDD中的数据进行整体操作的一个特殊方法,其在定义时就是针对数据集进行操作

  10、map可以对RDD中的数据集进行逐个操作,其与flatmap不同得是,flatmap是将数据集中的数据作为一个整体去处理,之后再对其中的数据做计算,而map则直接对数据集中的数据做单独的处理

  11、groupBy是将传入的数据进行分组

  12、keyBy是为数据集中的每个个体数据添加一个key,从而形成键值对

  13、reduce同时对2个数据进行处理,主要是对传入的数据进行合并处理

  14、sortBy是对已有的RDD进行重新排序

import org.apache.spark.{SparkConf, SparkContext}

object test {
def main(args: Array[String]): Unit = {
val conf=new SparkConf().setMaster("local").setAppName("test")
val sc=new SparkContext(conf)
val arr1=sc.parallelize(Array((,"a"),(,"c"),(,"b"),(,"x"),(,"f")))//parallelize将内存数据读入Spark系统中,作为整体数据集
val res1=arr1.sortBy(word=>word._1,true)
val res2=arr1.sortBy(word=>word._2,true)
res1.foreach(println)
res2.foreach(println)
}
}

  15、zip可以将若干个RDD压缩成一个新的RDD

走近RDD的更多相关文章

  1. Spark RDD 核心总结

    摘要: 1.RDD的五大属性 1.1 partitions(分区) 1.2 partitioner(分区方法) 1.3 dependencies(依赖关系) 1.4 compute(获取分区迭代列表) ...

  2. Spark笔记:复杂RDD的API的理解(下)

    本篇接着谈谈那些稍微复杂的API. 1)   flatMapValues:针对Pair RDD中的每个值应用一个返回迭代器的函数,然后对返回的每个元素都生成一个对应原键的键值对记录 这个方法我最开始接 ...

  3. Spark笔记:复杂RDD的API的理解(上)

    本篇接着讲解RDD的API,讲解那些不是很容易理解的API,同时本篇文章还将展示如何将外部的函数引入到RDD的API里使用,最后通过对RDD的API深入学习,我们还讲讲一些和RDD开发相关的scala ...

  4. Spark笔记:RDD基本操作(下)

    上一篇里我提到可以把RDD当作一个数组,这样我们在学习spark的API时候很多问题就能很好理解了.上篇文章里的API也都是基于RDD是数组的数据模型而进行操作的. Spark是一个计算框架,是对ma ...

  5. Spark笔记:RDD基本操作(上)

    本文主要是讲解spark里RDD的基础操作.RDD是spark特有的数据模型,谈到RDD就会提到什么弹性分布式数据集,什么有向无环图,本文暂时不去展开这些高深概念,在阅读本文时候,大家可以就把RDD当 ...

  6. Spark核心——RDD

    Spark中最核心的概念为RDD(Resilient Distributed DataSets)中文为:弹性分布式数据集,RDD为对分布式内存对象的 抽象它表示一个被分区不可变且能并行操作的数据集:R ...

  7. 【原】Learning Spark (Python版) 学习笔记(一)----RDD 基本概念与命令

    <Learning Spark>这本书算是Spark入门的必读书了,中文版是<Spark快速大数据分析>,不过豆瓣书评很有意思的是,英文原版评分7.4,评论都说入门而已深入不足 ...

  8. Spark Rdd coalesce()方法和repartition()方法

    在Spark的Rdd中,Rdd是分区的. 有时候需要重新设置Rdd的分区数量,比如Rdd的分区中,Rdd分区比较多,但是每个Rdd的数据量比较小,需要设置一个比较合理的分区.或者需要把Rdd的分区数量 ...

  9. RDD/Dataset/DataFrame互转

    1.RDD -> Dataset val ds = rdd.toDS() 2.RDD -> DataFrame val df = spark.read.json(rdd) 3.Datase ...

随机推荐

  1. Python使用openpyxl读写excel文件

    Python使用openpyxl读写excel文件 这是一个第三方库,可以处理xlsx格式的Excel文件.pip install openpyxl安装.如果使用Aanconda,应该自带了. 读取E ...

  2. [补档][Hnoi2013]游走

    [Hnoi2013]游走 题目 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一 ...

  3. 14. leetcode 383. Ransom Note

    Given an arbitrary ransom note string and another string containing letters from all the magazines, ...

  4. 虚拟机下克隆3个centos系统并配置IP访问网络(转载)

    此文是保证linux系统能够上网 先查看本机的IP 打开虚拟机,更改虚拟机为桥接方式 在第一个虚拟机上打开终端,在命令行输入setup,选择NETWORK CONFIGRATION 回车后, 配置IP ...

  5. grunt 的安装和简单使用

    安装Grunt命令行 npm install -g grunt-cli 创建package.json,如果有package.json包,可以直接npm install加载依赖组件 npm init 安 ...

  6. 敏捷开发之产品日日新,一步通之---自动化代码构建->自动化打包->自动化安装部署

    本文将介绍如何自动化实现代码构建,自动化代码打包成exe安装包,自动化安装到测试环境.通过计划任务的方式,每天自动化发布最新的产品供老板展示,供测试人员使用,真正实现敏捷的快速迭代. 自动代码构建 自 ...

  7. kill 和killall----杀死进程

    1.根据进程ip查看进程名 Liunx中 通过进程名查找进程PID可以通过 pidof  [进程名] 来查找. 反过来 ,通过PID查找进程名则没有相关命令.但在linux根目录中,有一个/proc的 ...

  8. springMVC修改用户请求内容

    最近在做一个微信相关的网站,很多地方涉及到微信表情的输入,导致内容无法插入到数据库,虽然有用到一个表情过滤的工具类,但是需要过滤的地方比较多,于是想到在过滤器中过滤用户请求的内容. request这个 ...

  9. HTTP和HTTPS有什么区别? 什么是SSL证书?使用ssl证书优势?

    什么是SSL? SSL是指安全套接层协议(以及传输层协议TLS),位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持,是目前使用最广泛的安全协议.它为互联网或内部网络连接,进行操作的两台 ...

  10. angular学习(七)-- Service

    1.7 服务:Service 如果做过后台开发,那么对 Angular 中的服务就好理解多了. 在 Angular 中,服务的概念和后台的服务概念基本是一样的,差别只是在于技术细节. 服务是对公共代码 ...