大数据(二)--Spark

无论是工业界还是学术界,都已经广泛使用高级集群编程模型来处理日益增长的数据,如MapReduce和Dryad。这些系统将分布式编程简化为自动提供位置感知性调度、容错以及负载均衡,使得大量用户能够在商用集群上分析超大数据集。

大多数现有的集群计算系统都是基于非循环的数据流模型。从稳定的物理存储(如分布式文件系统)中加载记录,记录被传入由一组确定性操作构成的DAG,然后写回稳定存储。DAG数据流图能够在运行时自动实现任务调度和故障恢复。

尽管非循环数据流是一种很强大的抽象方法,但仍然有些应用无法使用这种方式描述。这类应用包括:(1)机器学习和图应用中常用的迭代算法(每一步对数据执行相似的函数);(2)交互式数据挖掘工具(用户反复查询一个数据子集)。基于数据流的框架并不明确支持工作集,所以需要将数据输出到磁盘,然后在每次查询时重新加载,这带来较大的开销。

为此,Berkeley实验室出了一种分布式的内存抽象,称为弹性分布式数据集(RDD,Resilient Distributed Datasets)。它支持基于工作集的应用,同时具有数据流模型的特点:自动容错、位置感知调度和可伸缩性。RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度。
Spark是RDD系统的实现,能够被用于开发多种并行应用。Spark采用Scala语言实现,提供类似于DryadLINQ的集成语言编程接口,使用户可以非常容易地编写并行任务。此外,随着Scala新版本解释器的完善,Spark还能够用于交互式查询大数据集。

RDD

先用一个小例子来具象描述一下RDD的主要工作过程:首先你HDFS中以K-V格式读入一个文件file1,得到r1;r1是第一个RDD,它被载入到内存中。然后对r1操作,找出所有包含“error”的记录,得到r2;r2是第二个RDD,它是从r1经过转换得来的,也被存放在内存中。最后统计r2中的记录数并返回。对RDD的权限是只读的,也就是说能查看它的类信息,或者操作它得到一个新的RDD,却不能改变它。而且,假设file1有100M,在HDFS上有两个块存放在不同节点上,那么r1是有两个分区的,分别位于file1的两个块节点上。

RDD,全称弹性分布式数据集,它最大的特点就是提供了一种高度受限的共享内存模型,也就是说它是只读的记录分区的集合。首先它是只读的,一个RDD只能来自于HDFS等物理存储或者从其他RDD转换而来,这体现出了RDD的高度受限性,但同时这些限制也保证了RDD具有较好的容错机制;其次它是共享内存的,RDD的信息是存放在内存中的,相比于MapReduce要多次读写物理存储来处理中间产出,RDD大大缩减了从物理存储读入和检索所花费的时间;最后,它是分布式的,一个RDD由多个分区组成,每个分区可能存在不同的机器节点的内存中,从而具有很好的并行性。

RDD的定位是解决那些在并行操作中多次重用工作集的计算应用。主要包括两类。一类是迭代式算法,在机器学习和图应用中经常会用到;第二类是交互式数据挖掘工具,也就是用户反复查询一个数据子集。对于这类应用,把常用的数据缓存在内存中,能大大减小因为读取物理存储花费的时间。

RDD是以Java对象的结构存放在内存中。一个RDD包含:(1)一组RDD分区;(2)元数据,也就是分区模式和存放位置的描述;(3)对父RDD的一组依赖,这些依赖关系描述了RDD的lineage;(4)一个函数,也就是从父RDD执行何种计算得到它。

RDD的创建有两种方式:一种是从Hadoop文件系统(或与Hadoop兼容的其它存储系统)输入(例如HDFS)创建。RDD从HDFS读取数据时与Hadoop MapReduce几乎一样的。另一种是从父RDD转换得到新RDD,相应的转换信息会存储到Lineage中,待容错恢复时使用。
待RDD创建成功后,用户可以选择不同的存储级别存储RDD以便重用,目前存储参数有useDisk、useMemory、deserialized、replication,四个参数的组合提供了11种存储级别。RDD默认是存储于内存,但当内存不足时,RDD会spill到disk。RDD在需要进行分区把数据分布于集群中时会根据每条记录Key进行分区(如Hash 分区),以此保证两个数据集在Join时能高效。

RDD有两种计算方式:转换(返回值还是一个RDD)与操作(返回值不是一个RDD)。
转换(Transformations) ,如:map, filter, groupBy, join等,Transformations操作是Lazy的,也就是说从一个RDD转换生成另一个RDD的操作不是马上执行,Spark在遇到Transformations操作时只会记录需要这样的操作,并不会去执行,需要等到有Actions操作的时候才会真正启动计算过程进行计算。

rdd

利用内存加快数据加载,在众多的其它的In-Memory类数据库或Cache类系统中也有实现,Spark的主要区别在于它处理分布式运算环境下的数据容错性(节点实效/数据丢失)问题时采用的方案。为了保证RDD中数据的鲁棒性,RDD数据集通过所谓的血统关系(Lineage)记住了它是如何从其它RDD中演变过来的。相比其它系统的细颗粒度的内存数据更新级别的备份或者LOG机制,RDD的Lineage记录的是粗颗粒度的特定数据转换(Transformation)操作(filter, map, join etc.)行为。当这个RDD的部分分区数据丢失时,它可以通过Lineage获取足够的信息来重新运算和恢复丢失的数据分区。这种粗颗粒的数据模型,限制了Spark的运用场合,但同时相比细颗粒度的数据模型,也带来了性能的提升。

RDD在Lineage依赖方面分为两种:窄依赖(narrow dependencies):子RDD的每个分区依赖于常数个父分区(即与数据规模无关);宽依赖(wide dependencies):子RDD的每个分区依赖于所有父RDD分区。下图是一个例子,其中方框表示RDD,实心矩形表示分区。

rdd-lineage

Spark架构

Spark和Hadoop MapReduce类似,由Master(类似于MapReduce的Jobtracker)和Workers(Spark的Slave工作节点)组成。用户编写的Spark程序被称为Driver程序,Dirver程序会连接master并定义了对各RDD的转换与操作,而对RDD的转换与操作通过Scala闭包(字面量函数)来表示,Scala使用Java对象来表示闭包且都是可序列化的,以此把对RDD的闭包操作发送到各Workers节点。 Workers存储着数据分块和享有集群内存,是运行在工作节点上的守护进程。当它收到对RDD的操作时,根据数据分片信息进行本地化数据操作,生成新的数据分片、返回结果或把RDD写入存储系统。

spark

Spark对于资源管理与作业调度可以使用Standalone(独立模式),Apache Mesos及Hadoop YARN来实现。 Spark on Yarn在Spark0.6时引用,但真正可用是在现在的branch-0.8版本。Spark on Yarn遵循YARN的官方规范实现,得益于Spark天生支持多种Scheduler和Executor的良好设计,对YARN的支持也就非常容易,Spark on Yarn的大致框架图。 让Spark运行于YARN上与Hadoop共用集群资源可以提高资源利用率。
spark-yarn

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值