本文让我们来聊一聊Spark是什么,以及涉及到的相关概念
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 支持在各种集群管理器(cluster manager)上运行,包括 Hadoop YARN、Apache Mesos,以及 Spark 自带的一个简易调度 器,叫作独立调度器。
1.3 Spark的存储层次
Spark 不仅可以将任何 Hadoop 分布式文件系统(HDFS)上的文件读取为分布式数据集, 也可以支持其他支持 Hadoop 接口的系统,比如本地文件、亚马逊 S3、Cassandra、Hive、 HBase 等。我们需要弄清楚的是,Hadoop 并非 Spark 的必要条件,Spark 支持任何实现 了 Hadoop 接口的存储系统。Spark 支持的 Hadoop 输入格式包括文本文件、SequenceFile、 Avro、Parquet 等。
1.4 驱动器
每个 Spark 应用都由一个驱动器程序(driver program)来发起集群上的各种 并行操作。驱动器程序包含应用的 main 函数,并且定义了集群上的分布式数据集,还对这 些分布式数据集应用了相关操作。在一般的的例子里,实际的驱动器程序就是 Spark shell 本 身,你只需要输入想要运行的操作就可以了。 驱动器程序通过一个 SparkContext 对象来访问 Spark。这个对象代表对计算集群的一个连 接。shell 启动时已经自动创建了一个 SparkContext 对象,是一个叫作 sc 的变量。
1.5 SparkContext
scala> val lines = sc.textFile("README.md") // 创建一个名为lines的RDD
lines: spark.RDD[String] = MappedRDD[...]
scala> lines.count() // 统计RDD中的元素个数
res0: Long = 127
一旦有了SparkContext ,你就可以用它来创建 RDD。我们调用了 sc.textFile() 来创建一个代表文件中各行文本的 RDD。我们可以在这些行上进行各种操 作,比如 count()。 要执行这些操作,驱动器程序一般要管理多个执行器(executor)节点。
比如,如果我们在 集群上运行 count() 操作,那么不同的节点会统计文件的不同部分的行数。由于我们刚才是 在本地模式下运行 Spark shell,因此所有的工作会在单个节点上执行,但你可以将这个 shell 连接到集群上来进行并行的数据分析。图 2-3 展示了 Spark 如何在一个集群上运行。