Spark-RDD详解
来源:互联网 发布:linux execl函数作用 编辑:程序博客网 时间:2024/05/22 14:36
什么是RDD?
- 弹性分布式数据集分布在不同集群节点的内存中
- 可以理解成一大数组
- 数组的每一元素是RDD的一分区
- RDD的每一分区是一数据块
- 一个RDD可以分布并被运算在多台计算机节点的内存及硬盘中
RDD代表了一系列数据集合分布在机群的内存中。SPARK CORE 的任务是对这些数据进行分布式计算。
RDD特性
- RDD数据块可以放在磁盘上也可放在内存中(取决于设置)
- 如出现缓存失效或丢失,RDD的分区可以重新计算刷新
- RDD本身是不能被修改的
- 但RDD可以通过API (底层采用Scala)被变换生成新的RDD
RDD的类型
- 并行集合(Parallelized Collections):来自于分布式化的数据对象比如PYTHON 中的list 对象.比如用户自己键入的数据
- 文件系统数据集(如 Hadoop Datasets 或文本文件.比如通过SparkContext.textFile() 读取的数据
并行化集合是通过调用SparkContext的parallelize方法,在一个已经存在的数据集合上创建的(一个Seq对象)。集合的对象将会被拷贝,创建出一个可以被并行操作的分布式数据集
RDD的计算方式
- 变换(Transformations) (如:map, filter)的返回值仍然是一个RDD,Transformations操作是Lazy的,也就是说变换只是一些指令集而并不会去马上执行,需要等到有Actions操作的时候才会真正计算给出结果。Lazy Evaluation。
- 操作(Actions) (如:count, collect),Actions操作会返回结果或把RDD数据输出到各类系统中。Actions触发Spark启动并找到最优的计算途径。返回值是非并行化的数据集合比如 PYTHON 中的list
RDD的持久化
默认情况下当使用action 在RDD上时Spark会重新计算刷新RDD.但也可以通过持久化方法cache和persist将RDD放在内存当中。这样当第二次使用 action 在RDD上时,Spark将不重新计算刷新RDD
举个栗子
path='hdfs://xxxxxxx'rows=sc.textFile(path)rows.persist() #or rows.cacherows.count() #1rows.count() #2
第二个 rows.count() 将不重新从文件中读取RDD
RDD的cache和persist级别
- RDD的持久化或缓存选项是通过persist()或cache()发出的,之后如果某个操作(Action)触发该RDD的数据第一次被计算,那么计算的结果数据(也就是该RDD的数据)就会以分区的形式被缓存于计算节点的内存中;而且这些数据是可以实现容错的,如果这个RDD的某些分区数据丢失(因为节点故障),这些分区的数据可以在使用时通过世代信息(Lineage)被自动恢复
- RDD的存储形式或存储介质是可以通过存储级别(Storage Level)被定义的。例如,将数据持久化到磁盘、将Java对象序列化之后(有利于节省空间)缓存至内存、开启复制(RDD的分区数据可以被备份到多个节点防止丢失)或者使用堆外内存(Tachyon)。persist()可以接收一个StorageLevel对象(Scala、Java、Python)用以定义存储级别,如果使用的是默认的存储级别(StorageLevel.MEMORY_ONLY),Spark提供了一个便利方法:cache()
具体级别如下图
可以通过如下命令更改级别
dataset1=dataset.persist(StorageLevel.MEMORY_ONLY)dataset2=dataset.persist(StorageLevel.MEMORY_AND_DISK)dataset3=dataset.persist(StorageLevel.MEMORY_ONLY_SER)dataset4=dataset.persist(StorageLevel.MEMORY_AND_DISK_SER)dataset5=dataset.persist(StorageLevel.DISK_ONLY)
解释
- 默认选项,RDD的(分区)数据直接以Java对象的形式存储于JVM的内存中,如果内存空间不足,某些分区的数据将不会被缓存,需要在使用的时候根据世代信息重新计算
- RDD的数据直接以Java对象的形式存储于JVM的内存中,如果内存空间不中,某些分区的数据会被存储至磁盘,使用的时候从磁盘读取
- RDD的数据(Java对象)序列化之后存储于JVM的内存中(一个分区的数据为内存中的一个字节数组),相比于MEMORY_ONLY能够有效节约内存空间(特别是使用一个快速序列化工具的情况下),但读取数据时需要更多的CPU开销;如果内存空间不足,处理方式与MEMORY_ONLY相同
- 相比于MEMORY_ONLY_SER,在内存空间不足的情况下,将序列化之后的数据存储于磁盘
- 仅仅使用磁盘存储RDD的数据(未经序列化)
对应上面dataset12345
Shell方式操作RDD
count()
返回RDD里元素数目
lines=sc.textFile('xxx.txt')lines.count()
countByValue()
各RDD元素在RDD中出现的次数
val = sc.parallelize([12,2,6,2,12,2])myCount=val.countByValue()print(myCount)#输出结果如下defaultdict(<class 'int'>,{2: 3, 12: 2, 6: 1})
RDD取值操作
take(n)
返回n个元素 top(n)
返回前n个元素 first()
返回第一个元素 clooect()
返回所有元素 foreach(func)
迭代所有元素进行函数操作 takeSample(withReplacement,num,[seed])
随机取出num个元素 reduceByKey(func)
在每一键组内进行汇总变换 groupByKey()
将值放到每一相同键组内 mapValues(func)
对每一对RDD键值进行函数func值变换二不改变键 sortByKey()
得到以键排序的RDD阅读全文
0 0
- spark RDD 详解
- spark RDD API详解
- Spark RDD详解
- Spark RDD Transformation 详解
- spark RDD详解
- Spark RDD详解
- spark rdd 详解
- Spark RDD详解
- Spark RDD详解
- Spark RDD详解
- Spark RDD详解
- Spark RDD详解
- Spark RDD API详解
- Spark RDD API 详解
- Spark RDD API详解
- Spark RDD详解
- Spark-RDD详解
- Spark RDD使用详解1--RDD原理
- Redis字符串
- jenkins实现本地部署
- Nexus 5 Manually Install Android 6.0
- hibernate使用注解实现多对多关联映射
- 列表中一些基础方法的使用
- Spark-RDD详解
- vue( axios )node mongodb 读取数据库
- linux12-13-14
- Redis哈希
- 在js中对json的各种操作
- centos下安装配置redis
- 函数:通过按值传递及传递结构地址操作结构
- 刘强东母校宿迁中学的九十周年校庆,做主题《看得更远,走得更远》演讲:是想象力限制了你的贫穷
- soc_linux- 前台后台运行程序,后台程序暂停