欢迎来到天天文库
浏览记录
ID:40505238
大小:229.49 KB
页数:4页
时间:2019-08-03
《理解Spark的核心RDD》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、RDD,全称为ResilientDistributedDatasets(弹性分布式数据集),是一个容错的、并行的数据结构,可以让用户显式地将数据存储到磁盘和内存中,并能控制数据的分区。同时,RDD还提供了一组丰富的操作来操作这些数据。在这些操作中,诸如map、flatMap、filter等转换操作实现了monad模式,很好地契合了Scala的集合操作。除此之外,RDD还提供了诸如join、groupBy、reduceByKey等更为方便的操作(注意,reduceByKey是action,而非transformation),以支持常见的数据运算。通常来讲,针
2、对数据处理有几种常见模型,包括:IterativeAlgorithms,RelationalQueries,MapReduce,StreamProcessing。例如HadoopMapReduce采用了MapReduces模型,Storm则采用了StreamProcessing模型。RDD混合了这四种模型,使得Spark可以应用于各种大数据处理场景。RDD作为数据结构,本质上是一个只读的分区记录集合。一个RDD可以包含多个分区,每个分区就是一个dataset片段。RDD可以相互依赖。如果RDD的每个分区最多只能被一个ChildRDD的一个分区使用,则称之为
3、narrowdependency;若多个ChildRDD分区都可以依赖,则称之为widedependency。不同的操作依据其特性,可能会产生不同的依赖。例如map操作会产生narrowdependency,而join操作则产生widedependency。Spark之所以将依赖分为narrow与wide,基于两点原因。首先,narrowdependencies可以支持在同一个clusternode上以管道形式执行多条命令,例如在执行了map后,紧接着执行filter。相反,widedependencies需要所有的父分区都是可用的,可能还需要调用类似Ma
4、pReduce之类的操作进行跨节点传递。其次,则是从失败恢复的角度考虑。narrowdependencies的失败恢复更有效,因为它只需要重新计算丢失的parentpartition即可,而且可以并行地在不同节点进行重计算。而widedependencies牵涉到RDD各级的多个ParentPartitions。下图说明了narrowdependencies与widedependencies之间的区别:本图来自MateiZaharia撰写的论文AnArchitectureforFastandGeneralDataProcessingonLargeClust
5、ers。图中,一个box代表一个RDD,一个带阴影的矩形框代表一个partition。RDD如何保障数据处理效率?RDD提供了两方面的特性persistence和patitioning,用户可以通过persist与patitionBy函数来控制RDD的这两个方面。RDD的分区特性与并行计算能力(RDD定义了parallerize函数),使得Spark可以更好地利用可伸缩的硬件资源。若将分区与持久化二者结合起来,就能更加高效地处理海量数据。例如:input.map(parseArticle_).partitionBy(partitioner).cache()
6、partitionBy函数需要接受一个Partitioner对象,如:valpartitioner=newHashPartitioner(sc.defaultParallelism)RDD本质上是一个内存数据集,在访问RDD时,指针只会指向与操作相关的部分。例如存在一个面向列的数据结构,其中一个实现为Int的数组,另一个实现为Float的数组。如果只需要访问Int字段,RDD的指针可以只访问Int数组,避免了对整个数据结构的扫描。RDD将操作分为两类:transformation与action。无论执行了多少次transformation操作,RDD都不会
7、真正执行运算,只有当action操作被执行时,运算才会触发。而在RDD的内部实现机制中,底层接口则是基于迭代器的,从而使得数据访问变得更高效,也避免了大量中间结果对内存的消耗。在实现时,RDD针对transformation操作,都提供了对应的继承自RDD的类型,例如map操作会返回MappedRDD,而flatMap则返回FlatMappedRDD。当我们执行map或flatMap操作时,不过是将当前RDD对象传递给对应的RDD对象而已。例如:defmap[U:ClassTag](f:T=>U):RDD[U]=newMappedRDD(this,sc.c
8、lean(f))这些继承自RDD的类都定义了compute函数。该
此文档下载收益归作者所有