为了使程序运行更快,Spark提供了内存计算,减少了迭代计算时的IO开销;为了使编程更容易,Spark使用简练、优雅的Scala语言编写,基于Scala提供了交互式编程体验。与Hadoop相比,Spark使用十分之一的计算资源,可获得比Hadoop快3倍的速度。
一、Spark与Hadoop
Spark特点:
- 运行速度快:采用DAG(Directed Acyclic Graph,有向无环图)执行引擎,以支持循环数据流与内存计算,基于内存的执行速度可比Hadoop MR快上百倍,基于磁盘的速度也能快十倍。
- 容易使用:支持Scala、Java、Python和R语言进行编程。
- 通用性:提供完整而强大的技术栈,包括SQL查询,流失计算、机器学习和图算法组件。
- 运行模式多样:可运行于独立的集群模式中、Hadoop中、也可运行在Amazon EC2云环境中,可访问HDFS、Cassandra、HBase、Hive等数据源。
Scala是一种现代的多范式编程语言,集成了面向对象和函数式语言的特性;从小脚本到建立大系统的编程任务均可胜任;运行在JVM上,兼容Java程序,能融合到Hadoop生态圈;具有强大的并发性,支持分布式系统。
Hadoop缺点:
- 表达能力有限。计算都要转换成Map和Reduce操作,难以描述复杂的数据处理过程。
- 磁盘IO开销大。每次执行都需从磁盘读数据,计算过程中,需要将中间结果写入磁盘。
- 延迟高。一次计算分解成一些列按顺序执行的MR任务,任务间衔接涉及IO开销,产生较高延迟,且一个任务完成前,其他任务无法开始。难胜任复杂、多阶段计算任务。
Spark与Hadoop相比:
- 其计算模式也属于MR,但不局限与此,还提供多种数据集操作类型(RDD操作),编程模型更加灵活;
- Spark提供内存计算,中间结果放在内存中,IO开销,延迟低,拥有更高地迭代运算效率;
- 基于DAG任务调度执行机制,由于MR迭代执行机制。
- 使用Hadoop需要编写不少相对底层的代码,而Spark提供高层次、简洁的API。
- Spark主要替代Hadoop中的MR,而不能完全替代Hadoop,它很好地融入了Hadoop生态圈,可借助于YARN实现资源调度管理,借助HDFS实现分布式存储。
- Hadoop可使用廉价、异构的机器实现分布式存储和计算,而Spark对硬件(内存、CPU)要求稍高。
二、Spark生态系统
Spark的设计遵循“一个软件栈满足不同应用场景”的理念。其生态系统主要包含Spark Core、Spark SQL、Spark Streaming、MLLib和GraphX等组件。
- Spark Core:包含了Spark的基本功能,如内存计算、任务调度、部署模式、故障恢复、存储管理等。Spark建立在统一的抽象RDD之上,使其可以基本一致的方式应对不同的大数据处理场景。通常所说的Apache Spark,就是指Spark Core;
- Spark SQL:它允许开发人员直接处理RDD,也可查询Hive、HBase等外部数据源。它的一个重要特点是能够统一处理关系表和RDD,使开发人员使用SQL命令进行查询,并进行复杂的数据分析;
- Spark Streaming:支持高吞吐量、可容错处理的实时流数据处理,其核心思路是将流式计算分解成一系列短小的批处理作业。支持多种数据输入源,如Kafka、Flume、和TCP套接字。
- MLlib(机器学习):提供常用的机器学习算法,含聚类、分类、回归、协同过滤。
- GraphX(图计算):是Spark中用于图计算的API,可认为是Pregel在Spark上的重写和优化。
应用场景 | 时间跨度 | 其他框架 | Spark生态系统中的组件 |
---|---|---|---|
复杂的批量数据处理 | 小时级 | MapReduce、Hive | Spark |
基于历史数据的交互式查询 | 分钟级、秒级 | Impala、Dremel、Drill | Spark SQL |
基于实时数据流的数据处理 | 毫秒级、秒级 | Storm、S4 | Spark Streaming |
基于历史数据的数据挖掘 | Mahout | MLLib | |
图结构数据的处理 | Pregel、Hama | GraphX |
三、Spark运行框架
3-1 基本概念
- RDD:Resillient Distributed DataSet,弹性分布式数据集,是分布式内存的一个抽象概念,提供一种高度受限的共享内存模型