Spark内核介绍

来源:互联网 发布:淘宝小号可以开店吗 编辑:程序博客网 时间:2024/06/05 10:42
相信大数据工程师都非常了解Hadoop MapReduce一个最大的问题是在很多应用场景中速度非常慢,只适合离线的计算任务。这是由于MapReduce需要将任务划分成map和 reduce两个阶段,map阶段产生的中间结果要写回磁盘,而在这两个阶段之间需要进行shuffle操作。Shuffle操作需要从网络中的各个节点 进行数据拷贝,使其往往成为最为耗时的步骤,这也是Hadoop MapReduce慢的根本原因之一,大量的时间耗费在网络磁盘IO中而不是用于计算。在一些特定的计算场景中,例如像逻辑回归这样的迭代式的计 算,MapReduce的弊端会显得更加明显。

那Spark是如果设计分布式计算的呢?首先我们需要理解Spark中最重要的概念--弹性分布数据集(Resilient Distributed Dataset),也就是RDD。

2.1 弹性分布数据集RDD
RDD是Spark中对数据和计算的抽象,是Spark中最核心的概念,它表示已被分片(partition),不可变的并能够被并行操作的数据集 合。对RDD的操作分为两种transformation和action。Transformation操作是通过转换从一个或多个RDD生成新的 RDD。Action操作是从RDD生成最后的计算结果。在Spark最新的版本中,提供丰富的transformation和action操作,比起 MapReduce计算模型中仅有的两种操作,会大大简化程序开发的难度。

RDD的生成方式只有两种,一是从数据源读入,另一种就是从其它RDD通过transformation操作转换。一个典型的Spark程序就是通 过Spark上下文环境(SparkContext)生成一个或多个RDD,在这些RDD上通过一系列的transformation操作生成最终的 RDD,最后通过调用最终RDD的action方法输出结果。

每个RDD都可以用下面5个特性来表示,其中后两个为可选的:
分片列表(数据块列表)计算每个分片的函数对父RDD的依赖列表对key-value类型的RDD的分片器(Partitioner)(可选)每个数据分片的预定义地址列表(如HDFS上的数据块的地址)(可选)

虽然Spark是基于内存的计算,但RDD不光可以存储在内存中,根据useDisk、useMemory、useOffHeap, deserialized、replication五个参数的组合Spark提供了12种存储级别,在后面介绍RDD的容错机制时,我们会进一步理解。值 得注意的是当StorageLevel设置成OFF_HEAP时,RDD实际被保存到Tachyon中。Tachyon是一个基于内存的分布式文件系统,目前正在快速发展,本文不做详细介绍,可以通过其官方网站进一步了解。

classStorageLevelprivate(  privatevar _useDisk:Boolean,  privatevar _useMemory:Boolean,  privatevar _useOffHeap:Boolean,  privatevar _deserialized:Boolean  privatevar _replication:Int=1)  extendsExternalizable{//… }  val NONE =newStorageLevel(false,false,false,false)  val DISK_ONLY =newStorageLevel(true,false,false,false)  val DISK_ONLY_2 =newStorageLevel(true,false,false,false,2)  val MEMORY_ONLY =newStorageLevel(false,true,false,true)  val MEMORY_ONLY_2 =newStorageLevel(false,true,false,true,2)  val MEMORY_ONLY_SER =newStorageLevel(false,true,false,false)  val MEMORY_ONLY_SER_2 =newStorageLevel(false,true,false,false,2)  val MEMORY_AND_DISK =newStorageLevel(true,true,false,true)  val MEMORY_AND_DISK_2 =newStorageLevel(true,true,false,true,2)  val MEMORY_AND_DISK_SER =newStorageLevel(true,true,false,false)  val MEMORY_AND_DISK_SER_2 =newStorageLevel(true,true,false,false,2)  val OFF_HEAP =newStorageLevel(false,false,true,false)
0 0
原创粉丝点击