Spark-RDD初识

RDD简介

RDD(Resilient Distributed Dataset),表示弹性分布式数据集,它是spark最基本的数据抽象/数据结构,它代表了一个不可 变、可分区、里面的元素可以被并行操作的集合。
Dataset:
数据集,可以理解成它是一个集合,集合中存储了很多数据
Distributed:
它的数据是进行了分布式存储,为了方便于后期进行分布式计算
Resilient :
弹性,rdd的数据可以保存在内存中或者是磁盘中
RDD是Spark的核心数据结构,通过RDD的依赖关系形成Spark的调度顺序。通过对RDD的操作形成整个Spark程序。

RDD特征

1.一个RDD有很多个分区,一组分区列表 后期spark的任务是以rdd的分区为单位,一个分区对应一个task线程,
spark 任务最后是以task线程的方式运行在worker节点上的executor进程中
2.作用在每一个分区中的函数(计算每个分片的函数)
val rdd2=rdd1.map(x =>(x,1))
3.一个rdd会依赖于其他多个rdd,这里就涉及到rdd与rdd之间的依赖关系,spark任务的容错机制就是根据这个特性而来
4.(可选项) 对于kv类型的RDD才有分区函数(必须产生shuffle),如果不 是kv类型的RDD它的分区函数是None-----就是表示没有
在spark中,有2种分区函数:
第一种:HashPartitioner分区函数(默认值) 对key取
hashcode值 然后对分区数取余得到对应的分区号-------> key.hashcode % 分区数= 分区号
第二种:RangePartitioner分区函数 ,它是按照一定的范围进行 分区,相同的范围的key会进入到同一个分区。
5.(可选项) 一组最优的数据分区位置列表,数据的本地性、数据的位置最优
spark后期任务的计算会优先考虑存有数据的的节点开启计算任务,数据在哪里,就在当前节点开启计算任务,大大减少数据的网络
注:分区是个逻辑概念,变换前后的新旧分区在物理上可能是同一块内存存储。

RDD数据存储模型

RDD1中含有5个分区(p1,p2,p3,p4,p5),分别存储在4个节点(Node1,Node2,Node3,Node4)中。RDD2含有3个分区(p1,p2,p3),
分布在三个节点(Node2,Node3,Node4)中。
在物理上,RDD对象实质上是一个元数据结构,存储着Block,Node等的映射关系,以及其他的元数据信息。一个RDD就是一组分区,在物理数据存储上,RDD的每个分区对应的就是一个Block,Block可以存储在内存,当内存不够时可以存储到磁盘上。
每个Block中存储着RDD所有的数据项的一个子集,暴露给用户的可以是一个Block的迭代器(eg:用户可以通过mapPartitions获得分区迭代器进行操作),也可以就是一个数据项(eg:通过map函数对每个数据项并行计算)。
如果是从HDFS等外部存储作为输入数据源,数据按照HDFS中的数据分布策略进行数据区分,HDFS中的一个Block对应Spark的一个分区。同时Spark支持重分区,数据通过Spark默认的或者用户自定义的分区器决定数据块的分布在哪些节点。(eg:Hash分区 / Range分区策略)。

RDD创建方式

1.本地文件系统创建RDD 或 从Hadoop文件系统(或与Hadoop兼容的其他持久化存储系统,如Hive,Cassandra,HBase)输入(HDFS)创建。

// 实现文件字数统计
// textFile()方法中输入本地文件路径或HDFS路径
// HDFS:hdfs://spark1:9000/data.txt
// local:/home/hadoop/data.txt
val rdd = sc.textFile(/home/hadoop/data.txt”)
val wordCount = rdd.map(line => line.length).reduce(_ + _)

2.从父RDD转换得到新RDD(程序中已有的集合)。

//parallelize 并行化创建RDD 实现1到6的累加求和
val arr = Array(1,2,3,4,5,6)
val rdd = sc.parallelize(arr)
val sum = rdd.reduce(_ + _)

注:在调用parallelize()方法时,有一个重要的参数可以指定,就是要将集合切分成多少个partition。Spark会为每一个partition运行一个task来进行处理。Spark官方的建议是,为集群中的每个CPU创建2-4个partition。Spark默认会根据集群的情况来设置partition的数量。但是也可以在调用parallelize()方法时,传入第二个参数,来设置RDD的partition数量。比如,parallelize(arr, 10)
3.其他方式
Apart from text files, Spark’s Scala API also supports several other data formats:
SparkContext.wholeTextFiles lets you read a directory containing multiple small text files, and returns each of them as (filename, content) pairs. This is in contrast with textFile, which would return one record per line in each file. Partitioning is determined by data locality which, in some cases, may result in too few partitions. For those cases, wholeTextFiles provides an optional second argument for controlling the minimal number of partitions.

For SequenceFiles, use SparkContext’s sequenceFile[K, V] method where K and V are the types of key and values in the file. These should be subclasses of Hadoop’s Writable interface, like IntWritable and Text. In addition, Spark allows you to specify native types for a few common Writables; for example, sequenceFile[Int, String] will automatically read IntWritables and Texts.

For other Hadoop InputFormats, you can use the SparkContext.hadoopRDD method, which takes an arbitrary JobConf and input format class, key class and value class. Set these the same way you would for a Hadoop job with your input source. You can also use SparkContext.newAPIHadoopRDD for InputFormats based on the “new” MapReduce API (org.apache.hadoop.mapreduce).

RDD.saveAsObjectFile and SparkContext.objectFile support saving an RDD in a simple format consisting of serialized Java objects. While this is not as efficient as specialized formats like Avro, it offers an easy way to save any RDD.

注:官网链接 http://spark.apache.org/docs/latest/rdd-programming-guide.html#resilient-distributed-datasets-rdds

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值