Learning Spark笔记2-RDD介绍

来源:互联网 发布:林则徐 两句诗 知乎 编辑:程序博客网 时间:2024/05/29 15:50
RDDs编程


一个RDD是一个简单分布式元素集合。在Spark中所有的工作都表达为要么创建新的RDDs,转变已存在RDDs,要么在RDDs中执行计算操作。在后台,Spark会自动在集群中分发RDD中包含的数据,并对你执行的操作进行并行化。




RDD基础


一个RDD在Spark中是一个简单的不可变的分布式对象集合。每个RDD被分割成多个分区,这些分区可能在集群中的不同节点上计算。RDDs可以包含任意类型的Python、Java或Scala对象,包括用户定义的类。


用户创建RDDs有两种方式:


加载一个外部的数据集,或在驱动程序中发布一个对象集合(例如list或set)。


一旦创建,RDDs提供两种类型的操作:转换和动作。


转换是从前一个构建一个新的RDD
动作是基于RDD计算一个结果,要么将它返回到驱动程序中,要么保存它到一个外部的存储系统(例如HDFS)


尽管你可以在任何时候定义一个新的RDD,Spark仅仅通过lazy的方式计算它们:例如,我们定义一个文本文件使用Python过滤行,如果Spark加载存储文件中所有的行,它就会浪费大量的存储空间,因为我们会马上过滤掉很多行。相反的,一旦Spark看到整个转换链,它只计算需要结果的数据。实际上,像是first()动作,Spark仅仅扫描文件直到找到第一个匹配的行,它不会读取整个文件。


最后,默认情况下Spark RDDs会在每次执行一个动作时重新计算。如果你想要在多个动作中重用RDD,你可以调用RDD.persist()把它存起来。我们可以让Spark在不同的地方存储我们的数据。在第一次计算之后,Spark会在内存中存储RDD的内容(在集群跨机器的分区中),重用他们在以后的动作。在磁盘中存储RDDs代替内存是可行的。通常情况下非持久化是不寻常的,但是对于大数据集是有意义的:如果你不打算重用RDD,那就没理由存到磁盘上。




总结:每个Spark程序和shell会话都按以下方式工作


1.从外部的数据创建一些RDDs输入
2.转换他们定义新的RDDs,像是filter()
3.告诉Spark,使用persist()方法存储中间的RDDs,以后用来重用
4.启动像count()、first()的动作开始并行计算,


创建RDDs


Spark提供两个方式创建RDDs:加载外部的数据集和在驱动程序中并行化一个集合。


最简单的方式创建RDDs在你的程序中将一个已存在的集合传给SparkContext的parallelize()方法,但是请记住,在原型和测试之外,因为它需要将整个的数据集放到一个机器上。




RDD操作
如何区分函数时转换还是动作,就看它的返回值,RDDs就是转换其他类型就是动作


1.转换RDDs是lazily计算,只有当你在动作中使用他们的时候。很多转换都是元素级别的,一次在一个元素上工作,但是不适用于所有的转换。


2.动作的操作最终返回一个值到“驱动程序”或将数据写到外部的存储系统。由于需要实际产生输出,因此动作强制对所要求的RDD所需的转换进行评估。


3.Lazy Evaluation


Spark不会执行动作,直到它看到一个动作为止。


Lazy Evaluation的意思是当我们在一个RDD上调用转换(例如,调用map()),这个操作不会立刻执行。相反的,Spark内部记录metadata表示这个操作已经请求过。不要认为RDD包含特定数据,最好认为RDD是由怎样通过转换计算数据组成的。


Spark使用LazyEvaluationSpark来减少通过将操作分组在一起来处理数据的次数。在像Hadoop MapReduce这样的系统,开发者经常会花费大量的时间考虑怎样分组操作可以最小化MaprReduce传递的次数。在Spark中,编写单个复杂的Map代替很多连在一起的简单操作没有什么实质意义。因此,用户可以自由地将他们的程序组织成更小,更易于管理的操作。
0 0
原创粉丝点击