Spark入门讲解
Posted 大数据每日文摘
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark入门讲解相关的知识,希望对你有一定的参考价值。
为什么需要Spark?
MapReduce的缺陷
第一,MapReduce模型的抽象层次低,大量的底层逻辑都需要开发者手工完成。
第二,只提供Map和Reduce两个操作。
举个例子,两个数据集的Join是很基本而且常用的功能,但是在MapReduce的世界中,需要对这两个数据集 做一次Map和Reduce才能得到结果。
第三,在Hadoop中,每一个Job的计算结果都会存储在HDFS文件存储系统中,所以每一步计算都要进行硬 盘的读取和写入,大大增加了系统的延迟。
第四,只支持批数据处理,欠缺对流数据处理的支持。
Spark的优势
Spark最基本的数据抽象叫作弹性分布式数据集(Resilient Distributed Dataset, RDD),它代表一个可以被 分区(partition)的只读数据集,它内部可以有很多分区,每个分区又有大量的数据记录(record)。
RDD是Spark最基本的数据结构。Spark提供了很多对RDD的操作,如Map、Filter、flatMap、groupByKey和Union等等,极大地提升了对各 种复杂场景的支持。开发者既不用再绞尽脑汁挖掘MapReduce模型的潜力,也不用维护复杂的MapReduce 状态机。
相对于Hadoop的MapReduce会将中间数据存放到硬盘中,Spark会把中间数据缓存在内存中,从而减少了 很多由于硬盘读写而导致的延迟。
在任务(task)级别上,Spark的并行机制是多线程模型,而MapReduce是多进程模型。
多进程模型便于细粒度控制每个任务占用的资源,但会消耗较多的启动时间。
而Spark同一节点上的任务以多线程的方式运行在一个JVM进程中,可以带来更快的启动速度、更高的CPU 利用率,以及更好的内存共享。
弹性分布式数据集(Resilient Distributed Dataset, RDD)
RDD表示已被分区、不可变的,并能够被并行操作的数据集合。
分区
分区代表同一个RDD包含的数据被存储在系统的不同节点中。逻辑上,我们可以认为RDD是一个大的数组。数组中的每个元素代表一个分区(Partition)。
在物理存储中,每个分区指向一个存放在内存或者硬盘中的数据块(Block),而这些数据块是独立的,它 们可以被存放在系统中的不同节点。
RDD中的每个分区存有它在该RDD中的index。通过RDD的ID和分区的index可以唯一确定对应数据块的编 号,从而通过底层存储层的接口中提取到数据进行处理。
不可变性
不可变性代表每一个RDD都是只读的,它所包含的分区信息不可以被改变。
我们只可以对现有的RDD进行转换转换(Transformation)操作,得到新的RDD作为中间计算的结果。
如: