Spark特点
以下特点来源官网主页,仅做翻译
- Speed(快) 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. 使用了先进的 DAG 调度,查询优化器 和 物理执行引擎
- Ease of Use(易用) Write applications quickly in Java, Scala, Python, R, and SQL. 可以使用 Java,Scala,Python,R,SQL 快速构建应用 Spark offers over 80 high-level operators that make it easy to build parallel apps. Spark 提供超过80个高级的操作来轻松的构建分布式应用 And you can use it interactively from the Scala, Python, R, and SQL shells. 并且你可以使用 Scala, Python, R, 和 SQL shells 来进行混合编程
- Generality(通用) Combine SQL, streaming, and complex analytics. 综合了 SQL处理,流处理 和 复杂的数据分析 Spark powers a stack of libraries including SQL and DataFrames, Spark 提供了一些列的库,包含:SQL and DataFrames(进行sql数据分析) MLlib for machine learning, MLlib 进行机器学习 GraphX, 图计算库 and Spark Streaming. 和 Spark Streaming进行流式计算, You can combine these libraries seamlessly in the same application. 你可以在同一个应用中无缝的组合使用这些库
- Runs Everywhere(运行在任何地方) Spark runs on Hadoop, Apache Mesos, Kubernetes, standalone, or in the cloud. Spark 可以运行在 Hadoop, Apache Mesos, Kubernetes, standalone, 甚至 云端 It can access diverse data sources. 并且其支持访问多种数据源
Spark 和 MapReduce
1.Spark可以基于内存处理数据,MR每次要落地磁盘 2.Spark有DAG有向无环图优化 3.Spark是粗粒度资源申请,MR是细粒度资源申请 4.Spark中有各种算子 ,MR中只有map 和reduce 5.Spark的shuffle 向对于MR来说有自己的优化同时有bypass机制
Spark运行模式
- 本地模式 开发过程中常用的模式, 适用于本地测试调试,相当于一个单机程序。
- Standalone 模式 Spark 自带一种资源调度的集群叫 Standalone, 如果将Spark运行在该集群上,我们叫叫做 Standalone 模式。 在生产环境中使用不多,如果需要保证任务的稳定性, 需要单独搭建一个集群,可以考虑
- Yarn 模式 在国内应该是使用最普遍的模式了吧。 这也是Spark受欢迎的一个重要原因, 毕竟大部分公司都是以 HDFS 作为储存系统, Yarn作为资源调度系统, Spark运行在yarn就可以完美的衔接在一起了。
Spark核心RDD
- 什么是 RDD? RDD全称 Resilient Distributed Dataset,即 弹性分布式数据集。 既然叫他数据集,那么其当然就是用来存储数据的, 不过网上也大部分认为它是不存数据的, 不过不管你怎么认为,在用户看来, 通过从 Source数据 生成RDD, 那么后续的所有对 该RDD 和 该RDD生成的RDD 操作, 都是作用在 Source数据上的。
- RDD 的五大特性
源码中有以下注释:
- A list of partitions RDD 是有一个 分区列表的, 也就是说数据在RDD里面不是一个整体, 而是一个个的分区的。
- A function for computing each split 这里 function 我更愿意理解成 算子,split 大致等于 分区,所以: 一个算子的计算是作用在每一个的 分区的, 所以分区数越多,那么计算的并行度就越高, 结合第一条,那么提升RDD的并行度,只需要提升其分区数
- A list of dependencies on other RDDs 这个话是真不太好翻译,但是大概意思就是,RDD 之间是相互依赖的, RDD除了从源数据生成,就只剩下从RDD生成RDD这个方法了。
- Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned) 可选的,分区器是针对 K-V 格式的 RDD的。 在发送 Shuffle 的时候,分区器决定了每条数据的去向。
- Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file) 可选的,一个首选的位置的列表,可以提供给每个分区的计算的位置。 也就是我们常说的数据本地化,计算向数据移动。
- RDD宽窄依赖
首先明确,依赖是作用于父子RDD之间的。
- 窄依赖: 如果一个父RDD的数据只进入到一个子RDD之中, 那么就是窄依赖。 即,一个子RDD是可以接受来自多个 父RDD 的数据的, 只要这些 父RDD 的数据都是进入到该 子RDD 就还是窄依赖
- 宽依赖 如果一个父RDD的数据进入到多个子RDD之中, 那么这就是宽依赖了。 即,如果一个 父RDD 的数据分配到了多个子RDD 中, 那这就是宽依赖。
- 为什么要分宽窄依赖? 宽窄依赖主要是为了用来切分 Stage 的, 一个Stage里面的数据是通过pipeline的计算模式运行的, 这也就是说,一个Stage里面的数据计算, 是不需要落地,完全基于内存的。 而Stage之间是会发生 Shuffle,会涉及到数据落地到磁盘。 利用宽窄依赖就可以很好区分那部分运算可以分到一个Stage, 减少落地磁盘的数据,加快计算速度。