1、产生背景,MR和Spark对比
1)编程
MR有局限性,编程繁杂,只提供了map和reduce方法,而spark是High-Level,提供了80多个算子
2)进程级别
MR中maptask和reducetask有很多的进程,进程启动和销毁要花大量的时间。
spark的task基于线程,在每一个executor中都有一个线程池。
3)资源申请
在MR中,每个job的maptask和reducetask都需要单独的申请资源 ,资源反复申请很耗时。
在spark中,无论一个应用程序有多少个job,只需要申请一次资源即可。
当然,spark资源的释放要所有job执行完才可以。
4)IO
MR基于磁盘和有限的内存,Spark基于内存。所以这就造成了IO上的差异。
MR的I/O频繁,比如Mapper和Reducer读取、溢写、merge、结果输出、shuffle、combiner
spark的I/O较少,数据读取、结果输出,可能存在的shuffle及持久化
spark是基于pipeline进行数据的处理的,一个stage内的一个task一次处理一条数据,处理完保存在内存中,然后处理下一条
5)排序
MR的执行流程中会进行排序,有些业务是不需要排序的
在spark中开启bypass机制可以避免排序
6)迭代处理
MR的迭代处理基于磁盘,每个job完成数据落盘,下一个job磁盘读取文件接着处理,且job间的衔接是需要程序员介入的。
spark迭代处理基于内存,job可以在内存串联执行,一个job完成紧接着下一个job执行。在迭代处理上,spark具有天然的优势。
7)适用场景
一个MR的执行是需要花费大量时间的,所以MR只适合做离线批计算。
spark中spark-core也可以离线批计算,比MR该更好用。
spark中有spark-sql,提供了sql式的离线批计算。
spark中有spark-streaming,提供实时计算。
spark中有spark-mllib,机器学习库。
spark中有spark-graphx,图计算。
8)框架对比
如果使用Hive,要做机器学习,中间就要用到Mahout来解决;各个框架各自为战。
而Spark基于丰富的RDD算子,可以做到一站式的解决方案。
2、Spark特点,官网解读
GitHub:https://github.com/apache/spark
官网地址:http://spark.apache.org/
Lightning-fast unified analytics engine
闪电般的快速统一分析引擎
非常醒目的一句话:
Apache Spark™ is a unified analytics engine for large-scale data processing.
Apache Spark™是一个用于大规模数据处理的统一分析引擎。
从上面两句话知道,Spark处理数据非常快,仅仅做计算,没有存储,类似MapReduce
1)Speed:快
Run workloads 100x faster.(这一句话适合大部分场景,和MR比起来,这点是毋庸置疑的)
Apache Spark achieves high performance for both batch and streaming data, using a state-of-the-art DAG scheduler, a query optimizer, and a physical execution engine.
Apache Spark使用最先进的DAG调度程序、查询优化器和物理执行引擎,实现了高性能的批处理和流数据
2) Ease of Use:易用
Spark offers over 80 high-level operators that make it easy to build parallel apps. And you can use it interactively from the Scala, Python, R, and SQL shells.
Spark提供了80多个高级操作程序,可以轻松地构建并行应用程序。您可以从Scala、Python、R和SQL shell交互式地使用它。
3) Generality:通用
Spark powers a stack of libraries including SQL and DataFrames, MLlib for machine learning, GraphX, and Spark Streaming. You can combine these libraries seamlessly in the same application.
Spark支持一系列库,包括SQL和DataFrames、用于机器学习的MLlib、GraphX和Spark流。您可以在同一个应用程序中无缝地组合这些库。
4) Runs Everywhere:运行范围广
Spark runs on Hadoop, Apache Mesos, Kubernetes, standalone, or in the cloud. It can access diverse data sources.
Spark运行在Hadoop、Apache Mesos、Kubernetes、standalone或云中。它可以访问不同的数据源(访问外部数据源是spark非常核心,重要的一个功能)。
3、Spark版本
两个重要的版本
1.6.x
2.2.x