Spark学习总结--(待更)

Spark总结

1. Spark概述

官网:http://spark.apache.org

1.1 Spark是什么?

Spark 是一个用来实现快速而通用的集群计算的平台。

在速度方面,Spark 扩展了广泛使用的 MapReduce 计算模型,而且高效地支持更多计算模式,包括交互式查询和流处理。在处理大规模数据集时,速度是非常重要的。速度快就意味着我们可以进行交互式的数据操作,否则我们每次操作就需要等待数分钟甚至数小时。Spark 的一个主要特点就是能够在内存中进行计算,因而更快。不过即使是必须在磁盘上进行的复杂计算,Spark 依然比 MapReduce 更加高效。

总的来说,Spark 适用于各种各样原先需要多种不同的分布式平台的场景,包括批处理、迭代算法、交互式查询、流处理。通过在一个统一的框架下支持这些不同的计算,Spark使我们可以简单而低耗地把各种处理流程整合在一起。而这样的组合,在实际的数据分析过程中是很有意义的。不仅如此,Spark的这种特性还大大减轻了原先需要对各种平台分别管理的负担。

Spark 所提供的接口非常丰富。除了提供基于 Python、Java、Scala 和 SQL 的简单易用的API 以及内建的丰富的程序库以外,Spark还能和其他大数据工具密切配合使用。例如,Spark 可以运行在 Hadoop 集群上,访问包括 Cassandra 在内的任意 Hadoop 数据源。

1.2 Spark简史

Spark 是由一个强大而活跃的开源社区开发和维护的,社区中的开发者们来自许许多多不同的机构。如果你或者你所在的机构是第一次尝试使用 Spark,也许你会对 Spark 这个项目的历史感兴趣。Spark 是于 2009 年作为一个研究项目在加州大学伯克利分校 RAD 实验室(AMPLab 的前身)诞生。实验室中的一些研究人员曾经用过 Hadoop MapReduce。他们发现 MapReduce 在迭代计算和交互计算的任务上表现得效率低下。因此,Spark 从一开始就是为交互式查询和迭代算法设计的,同时还支持内存式存储和高效的容错机制。

2009 年,关于 Spark 的研究论文在学术会议上发表,同年 Spark 项目正式诞生。其后不久,相比于 MapReduce,Spark 在某些任务上已经获得了 10 ~ 20 倍的性能提升。

Spark 最早的一部分用户来自加州伯克利分校的其他研究小组,其中比较著名的有 Mobile Millennium。作为机器学习领域的研究项目,他们利用 Spark 来监控并预测旧金山湾区的交通拥堵情况。仅仅过了短短的一段时间,许多外部机构也开始使用 Spark。如今,有超过 50 个机构将自己添加到了使用 Spark 的机构列表页面(https://cwiki.apache.org/confluence/display/SPARK/Powered+By+Spark)。在 Spark 社区如火如荼的社区活动 Spark Meetups(http://www.meetup.com/spark-users/)和 Spark 峰会(http://spark-summit.org/)中,许多机构也向大家积极分享他们特有的 Spark 应用场景。除了加州大学伯克利分校,对Spark 作出贡献的主要机构还有 Databricks、雅虎以及英特尔。

2011 年,AMPLab 开始基于 Spark 开发更高层的组件,比如 Shark(Spark 上的 Hive)1 和Spark Streaming。这些组件和其他一些组件一起被称为伯克利数据分析工具栈(BDAS,https://amplab.cs.berkeley.edu/software/)。

Spark 最早在 2010 年 3 月开源,并且在 2013 年 6 月交给了 Apache 基金会,现在已经成了Apache 开源基金会的顶级项目。

1.3 Spark 特点

1.3.1 快

与Hadoop的MapReduce相比,Spark基于内存的运算要快100倍以上,基于硬盘的运算也要快10倍以上。Spark实现了高效的DAG执行引擎,可以通过基于内存来高效处理数据流。
在这里插入图片描述

1.3.2 易用

Spark支持Java、Python和Scala的API,还支持超过80种高级算法,使用户可以快速构建不同的应用。而且Spark支持交互式的Python和Scala的shell,可以非常方便地在这些shell中使用Spark集群来验证解决问题的方法。
在这里插入图片描述

1.3.3 通用

Spark提供了统一的解决方案。Spark可以用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习(Spark MLlib)和图计算(GraphX)。这些不同类型的处理都可以在同一个应用中无缝使用。Spark统一的解决方案非常具有吸引力,毕竟任何公司都想用统一的平台去处理遇到的问题,减少开发和维护的人力成本和部署平台的物力成本。
在这里插入图片描述

1.3.4 兼容性

Spark可以非常方便地与其他的开源产品进行融合。比如,Spark可以使用Hadoop的YARN和Apache Mesos作为它的资源管理和调度器,并且可以处理所有Hadoop支持的数据,包括HDFS、HBase和Cassandra等。这对于已经部署Hadoop集群的用户特别重要,因为不需要做任何数据迁移就可以使用Spark的强大处理能力。Spark也可以不依赖于第三方的资源管理和调度器,它实现了Standalone作为其内置的资源管理和调度框架,这样进一步降低了Spark的使用门槛,使得所有人都可以非常容易地部署和使用Spark。此外,Spark还提供了在EC2上部署Standalone的Spark集群的工具。
在这里插入图片描述

2. Spark RDD

2.1 什么是RDD

RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。RDD具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度。

2.2 RDD特性

RDD有5大特性,分别如下:

  1. 一系列的分区信息。
    RDD源码对应的方法是:
protected def getPartitions:Array[Partition]
  1. 由一个函数计算每一个分片。
    Spark中的RDD的计算是以分片为单位的,每个RDD都会实现compute函数以达到这个目的。
def compute(split:Partition,context:TaskContext):Iterator[T]
  1. RDD之间的依赖关系
    RDD的每次转换都会生成一个新的RDD,那么多个RDD之间就有前后的依赖关系。在某个分区的数据丢失时,Spark可以通过这种依赖关系重新计算丢失的分区数据,而不需要从头对RDD的所有分区数据进行计算。
protected def getDependencies:Seq[Dependency[_]]=deps
  1. Partitioner是RDD中的分区函数。
    可以使得数据按照一定的规则分配到指定的Reducer上去处理。当前Spark中有两种类型的分区函数:一个是基于Hash的HashPartitioner,另一个是基于范围的RangePartitioner。普通数据的Partitioner为None,只有遇到的RDD数据是key-value才会有Partitioner,比如在使用join或者group by时。
@transient val partitioner:Option[Partitioner]=None
  1. 最佳位置列表。
    一个RDD会对应多个Partitioner,那么这些Partitioner最佳的计算位置在哪里?对于HDFS文件来说,最佳位置列表保存的每个分区所在的数据块的位置。按照“移动数据不如移动计算”的理念,Spark在进行任务调度时会尽可能地将计算任务分派到其所在处理数据块的存储位置。
protected def getPreferredLocations(split:Partition):Seq[String]=Nil

3.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值