初识
是用于大数据处理的集群计算框架,Spark并没有以 MapReduce 作为执行引擎,而是使用了它自己的分布式运行环境在集群上执行工作。Spark最突出的表现在于它能够将作业与作业之间产生的大规模的工作数据集存储在内存中。即使你不需要在内存中进行缓存,Spark还会因为其出色的 DAG 引擎和用户体验而具有吸引力。与 MapReduce 不同,Spark 的 DAG 引擎可以处理任意操作流水线,并为用户将其转换为单个作业。Spark 还是用于构建分析工具的出色平台。为此,Apache Spark项目包括用于处理机器学习(MLlib)、图算法(Graphx)、流逝计算(Spark Streaming)和 SQL查询(Spark SQL)等模块。
Spark 应用、作业、阶段和任务
Spark 作业是由任意的多阶段(stages)有向无环图(DAG)构成,其中每个阶段大致相当于 MapReduce 中的 map 阶段或 reduce 阶段。这些阶段又被运行环境分解为多个任务(task),任务并行运行在分布于集群中的 RDD 分区上,就像 MapReduce 中的任务一样。
Spark 是用 Scala 实现的,而 Scala 作为基于 JVM 的语言,与 Java 有着良好集成关系。
Spark 通过一个名为 PySpark 的 API 来为 Python 提供语言支持。
弹性分布式数据集(RDD)
弹性分布式数据集(RDD) 是所有 Spark 程序的核心。
创建
RDD 的创建有三种方法:来自一个内存中的对象集合(也称为并行化为一个集合);使用外部的存储器(如HDFS)中的数据集;对现有的RDD进行转换。
第一种方法适用于对少量的输入数据进行并行的 CPU 密集型计算。
例如,对数字1-10运行独立运算
val params = sc.parallelize(1 to 10)
val result = params.map(performExpensiveComputatuon)
第二种方法是创建一个对外部数据集的引用
val text: RDD[String] = sc.textFile(inputPath)
第三种方法是通过现有 RDD 的转换来创建 RDD
Spark 为 RDD 提供了两大类操作:转换(transformation)和 动作(action)。转换是从现有的 RDD 生成新的 RDD,而动作则触发对 RDD 的计算并对计算结果执行某种操作,要么返回给用户,要么保存到外部存储器中。
例如:用于小写字母化文本文件中的文本行
val text = sc.textFile(inputPath)
val lower: RDD[String] = text.map(_.toLowerCase())
lower.foreach(println(_)