Spark RDD

来源:互联网 发布:淘宝店铺没了能退款么 编辑:程序博客网 时间:2024/06/05 00:32

RDD是Spark的核心抽象,全称为ResilientDistributedDataSet,弹性分布式数据集
RDD在抽象上来说是一种元素集合的,包含了数据。它是被分区的,分为多个分区的,每个分区分布在集群中的不同节点上,分区即是Partition的,从而让RDD中的数据可以被并行操作的
RDD通常通过Hadoop上的文件,即是HDFS文件来进行创建的,有时也可以通过spark应用程序中的集合来创建的
RDD最重要的特性是提供了容错性的,可以自动从节点失败中恢复过来的额,即如果某个节点上的RDD Partition,因为节点故障,导致数据丢失了,那么RDD会自动通过自己的数据来源重新计算Paritition的,这一切对使用者来说是透明的
RDD的数据默认情况下是存放在内存中的,但是在内存资源不足的时候,Spark会自动将RDD数据写入磁盘中的额,弹性的特性的

创建RDD的三种方式:
在RDD中,通常就代表了和包含了Spark应用程序的输入源数据
当我们,在创建了初始化的RDD之后,才可以通过SparkCore提供的Transformation算子,对该RDD进行transformation转换操作的来获取其他的RDD的
SparkCore为我们提供了三种创建RDD的方式:
使用程序中的集合创建RDD,主要是用于进行测试的,可以在实际部署到集群运行之前,自己使用集合构造测试数据来测试后面的Spark应用的流程的
使用本地文件创建RDD,主要用于在本地临时性地处理一些存储大量数据的文件
使用HDFS文件创建RDD,应该是最常用的生产环境处理方式,主要可以针对HDFS上存储的大数据,进行离线批次处理操作的

并行化创建RDD
如果要通过并行化集合来创建RDD,需要针对程序中的集合,调用SparkContext中的Parallelize方法的,Spark会将集合中的数据拷贝到集群上去的,形成一个分布式的数据集合的,也就是一个RDD,集合中的部分数据到一个节点上的额,另一部分数据会到其他节点的,然后可以采用并行的方式来操作这个分布式数据集合的
val arr=Array(1,2,3,4,5)
val rdd=sc.parallelize(arr)
val sum=rdd.reduce(+)
Typically you want 2-4partitions for each CPU in your cluster,
在调用parallelize()方法时候,有一个重要的参数可以指定的,就是要将集合切分成多少个partition的,Spark会为每一个partition运行一个task来进行处理的,Spark的官方建议是为集群中的每个CPU创建2-4个partition,Spark默认会根据集群的情况来设置partition的数量的,但是也可以调用parallelize方法时候传入第二个参数的, 来设置RDD的partition数量的,

使用TextFile方法,通过本地文件或者HDFS创建RDD
Spark是支持使用任何Hadoop支持的存储系统上的文件创建RDD的,比如说是HDFS,Cassandra,HBase以及本地文件的,通过调用SparkContext的TextFile()方法,可以针对本地文件或 HDFS文件创建RDD,通过调用SparkContext的textFile方法,可以针对本地文件或者是HDFS上的文件创建RDD的,
val rdd=sc.textFile(“/home/hadoop/data.txt”)
val wordcount=rdd.map(line=>line.length).reduce(+)

如果是在Spark集群上针对Linux本地文件,那么需要将文件拷贝到所有的worker节点上的,就是spak-submit上使用–master指定了master节点的,使用standalone模式进行运行的,而TextFile方法内仍然使用的是Linux本地文件的,在这种情况下,是需要将文件拷贝到所有的worker节点上的,

Spark的textFile方法支持针对目录,压缩文件以及通配符进行创建RDD的,
Spark会默认为HDFS文件上的每一个block创建一个partition的,但是也可以通过textFile的第二参数来手动的设置分区数量的,只能比HDFS上的block数量多的额,不能比block数量少的额,