spark学习13(spark RDD)
RDD及其特点
1)RDD(Resillient Distributed Dataset)弹性分布式数据集,是spark提供的核心抽象。它代表一个不可变、可分区、里面的元素可并行计算的集合
2)RDD在抽象上来说是一种元素集合,包含了数据。它是被分区的,分为多个分区,每个分区分布在集群中的不同节点上,从而让RDD中的数据可以被并行操作(分布式数据集)
3)RDD通常通过hadoop上的文件,即hdfs文件或者hive表来进行创建,有时也可以通过应用程序中的集合来创建。
4)RDD最重要的特性就是提供了容错性,可以自动从节点失败中恢复过来,即某节点上的RDD partition,因为节点故障,导致数据丢了,那么RDD会自动通过自己数据来源重新计算该partition,这一切对使用者是透明的
5)RDD的数据默认情况下存在内存中,但是在内存资源不足是,spark会自动将RDD数据写入磁盘(弹性)
注意:RDD的每个partition,在spark节点上存储时,默认都是放在内存中的,但是如果说内存放不下这么多数据,比如每个节点最多放5w数据,结果每个partition市10w数据,那么就会把partition中的部分数据写入磁盘,进行保存。而上述这一切,对于用户来说,都是完全透明的,也就是不用去管RDD的数据存放在内存还是磁盘,只要关注你针对RDD来进行计算和处理等操作即可。所以说RDD这种自动进行内存和磁盘之间权衡和切换的机制,就是RDD的弹性的特点所在
RDD的属性
1)
一组分片(patition)。即数据集的基本单位。用户可在创建RDD时指定RDD的分片个数,若没指定,则使用默认值,为程序所分配到的CPU Core的数目
2)一个计算每个分区的函数。spark中RDD的计算是以分片为单位,每个RDD都会实现compute函数以达到这个目的。
3)RDD之间的依赖关系。RDD的每次转换都会生成一个新的RDD,所以RDD之间会形成类似流水线一样的前后依赖关系。在分区数丢失时,spark通过这个依赖关系重新计算丢失的分区数据,而不是对RDD所有分区进行重新计算
4)一个partitioner。即RDD的分片函数。当前spark中实现了两种类型的分片函数,一个是基于哈希的HashPartitioner,另一个是基于范围的RangePartitioner。只有对于于key-value的RDD才会有partitioner,非key-value的RDD的partitioner的值是None
5)一个列表,存储存取每个partition的优先位置。对于一个hdfs文件来说,这个列表保存的就是每个partition所在的块位置
创建RDD
进行spark核心编程时,先要创建一个初始的RDD,该RDD中,通常就代表和包含了spark应用程序的输入源数据,然后在创建了初识的RDD之后,才可以通过spark core提供的transformation算子,对RDD进行转换,来获取其他的RDD。
spark core提供了二种创建RDD的方式,包括
1)由已经存在的Scala集合创建RDD
先要启动spark-shell
scala> val rdd1 = sc.parallelize(Array(1,2,3,4,5,6,7,8,9,10),2)
rdd1: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[1] at parallelize at <console>:24
求和
scala> val sum = rdd1.reduce(_+_)
sum: Int = 55
2)由外部存储系统的数据集创建
使用本地文件创建RDD
使用HDFS文件创建RDD
scala> val rdd3 = sc.textFile("hdfs://master:9000/student/2016113012/spark/words.txt")
rdd3: org.apache.spark.rdd.RDD[String] = hdfs://master:9000/student/2016113012/spark/words.txt MapPartitionsRDD[46] at textFile at <console>:24
统计文本字数
scala> val count = rdd3.map(lines => lines.length()).reduce(_+_)
count: Int = 48
文件内容如下
hello scala
hello java
hello python
hello wujiadong
spark默认会为hdfs的每一个block创建一个partition,但是也可以通过textFile()的第二个参数手动设置分区数量,只能比block数量多,不能比他更少
两种RDD操作
spark支持两种RDD操作,transformation和action。transformation操作会针对已有的RDD创建一个新的RDD,而action则主要是对RDD进行最后的操作,比如遍历,reduce,保存到文件等,并可以返回结果给Driver程序
例如:
map是一种transformation操作,它用于将已有RDD的每个元素传入一个自定义函数,并获取一个新的元素,然后将所有的新元素组成一个新的RDD。
reduce就是一种action操作,它用于对RDD中所有元素尽心聚合操作,并获取一个最终的结果,然后返回给Driver程序
transformation的特点:lazy特性
如果一个spark应用中只定义了transformation操作,那么即使你执行该应用,这些操作也不会执行,即transformation是不会触发spark程序的执行的,只是记录了对RDD所做的操作,但是不会自发的执行,只有当transformation之后,接着执行了了一个action操作,那么所有的transformation才会执行。
spark通过这种lazy特性,来进行底层的spark应用执行的优化,避免产生过多中间结果。
action的特性
action的执行会触发一个spark job的运行,从而触发这个action之前所有的transformation的执行,
Transformation
map(func) :返回一个新的RDD,该RDD由每一个输入元素经过func函数转换后组成
filter(func):返回一个新的RDD,该RDD由经过func函数计算后返回值为true的输入元素组成
flatMap(func) :
mapPartitions(func) :
mapPartitionsWithIndex(func) :
sample(withReplacement, fraction, seed) :
union(otherDataset) :
intersection(otherDataset):
distinct([numTasks])) :
groupByKey([numTasks]) :
reduceByKey(func, [numTasks]) :
aggregateByKey(zeroValue)(seqOp, combOp, [numTasks]) :
sortByKey([ascending], [numTasks]) :
join(otherDataset, [numTasks]) :
cogroup(otherDataset, [numTasks]):
cartesian(otherDataset) :
pipe(command, [envVars]) :
coalesce(numPartitions) :
repartition(numPartitions):
repartitionAndSortWithinPartitions(partitioner) :
Action
reduce(func) :
collect() :
count() :
first() :
take(n) :
takeSample(withReplacement, num, [seed]) :
takeOrdered(n, [ordering]) :
saveAsTextFile(path) :
saveAsSequenceFile(path):
saveAsObjectFile(path) :
countByKey() :
foreach(func) :
spark学习13(spark RDD)的更多相关文章
- Spark学习笔记3——RDD(下)
目录 Spark学习笔记3--RDD(下) 向Spark传递函数 通过匿名内部类 通过具名类传递 通过带参数的 Java 函数类传递 通过 lambda 表达式传递(仅限于 Java 8 及以上) 常 ...
- Spark学习笔记2——RDD(上)
目录 Spark学习笔记2--RDD(上) RDD是什么? 例子 创建 RDD 并行化方式 读取外部数据集方式 RDD 操作 转化操作 行动操作 惰性求值 Spark学习笔记2--RDD(上) 笔记摘 ...
- Spark学习之Spark SQL(8)
Spark学习之Spark SQL(8) 1. Spark用来操作结构化和半结构化数据的接口--Spark SQL. 2. Spark SQL的三大功能 2.1 Spark SQL可以从各种结构化数据 ...
- Spark学习之Spark调优与调试(7)
Spark学习之Spark调优与调试(7) 1. 对Spark进行调优与调试通常需要修改Spark应用运行时配置的选项. 当创建一个SparkContext时就会创建一个SparkConf实例. 2. ...
- Spark学习之Spark Streaming(9)
Spark学习之Spark Streaming(9) 1. Spark Streaming允许用户使用一套和批处理非常接近的API来编写流式计算应用,这就可以大量重用批处理应用的技术甚至代码. 2. ...
- Spark学习一:Spark概述
1.1 什么是Spark Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎. 一站式管理大数据的所有场景(批处理,流处理,sql) spark不涉及到数据的存储,只 ...
- Spark学习之Spark Streaming
一.简介 许多应用需要即时处理收到的数据,例如用来实时追踪页面访问统计的应用.训练机器学习模型的应用,还有自动检测异常的应用.Spark Streaming 是 Spark 为这些应用而设计的模型.它 ...
- Spark学习之Spark调优与调试(二)
下面来看看更复杂的情况,比如,当调度器进行流水线执行(pipelining),或把多个 RDD 合并到一个步骤中时.当RDD 不需要混洗数据就可以从父节点计算出来时,调度器就会自动进行流水线执行.上一 ...
- Spark学习之Spark调优与调试(一)
一.使用SparkConf配置Spark 对 Spark 进行性能调优,通常就是修改 Spark 应用的运行时配置选项.Spark 中最主要的配置机制是通过 SparkConf 类对 Spark 进行 ...
随机推荐
- 2154: Crash的数字表格
2154: Crash的数字表格 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 3372 Solved: 1258[Submit][Status][ ...
- 【BZOJ5070】危险的迷宫 最小费用最大流
[BZOJ5070]危险的迷宫 Description JudgeOnline/upload/201710/55.doc Input 第一行是两个整数A与B(1≤A,B≤10),中间用空格分隔,表示该 ...
- 【BZOJ3931】[CQOI2015]网络吞吐量 最大流
[BZOJ3931][CQOI2015]网络吞吐量 Description 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为 ...
- iOS 导航栏rgb值与设置的有差异
转:http://b2cloud.com.au/how-to-guides/bar-color-calculator-for-ios7-and-ios8/ 计算:http://htmlpreview. ...
- 为什么 Java ArrayList.toArray(T[]) 方法的参数类型是 T 而不是 E ?
前两天给同事做 code review,感觉自己对 Java 的 Generics 掌握得不够好,便拿出 <Effective Java>1 这本书再看看相关的章节.在 Item 24:E ...
- HDU 3388 Coprime(容斥原理+二分)
Coprime Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- attempt to index a nil value (global 'luasql')
require ’socket‘ require ’luasql.mysql' 上述返回结果都是正常 但是执行 env = luasql.mysql(),报错: stdin:1: attempt to ...
- transaction 数据库事务 roolback 回滚
事务是恢复和并发控制的基本单位 https://baike.baidu.com/item/数据库事务/9744607 事务有三种模型: 1.隐式事务是指每一条数据操作语句都自动地成为一个事务,事务的开 ...
- 【查看版本】查看linux版本/查看32还是64
系统/机器信息 1.查看linux是ubuntu还是centos lsb_release --help -a 打印所有信息 -s 简短打印 2.查看系统是64还是32 uname --help -a ...
- linux虚拟机连不上网络
1.修改文件ifcfg-ens33 # 切换目录 [root@localhost ~]# cd /etc/sysconfig/network-scripts/ # 将ONBOOT修改为yes [roo ...