「Spark从入门到精通系列」1. Apache Spark简介:一个统一的分析引擎

来源 |  Learning Spark Lightning-Fast Data Analytics,Second Edition

作者 | Damji,et al.

翻译 | 吴邪 大数据4年从业经验,目前就职于广州一家互联网公司,负责大数据基础平台自研、离线计算&实时计算研究

校对 | gongyouliu

编辑 | auroral-L

全文共9094字,预计阅读时间55分钟。

第一章  Apache Spark简介:

一个统一的分析引擎

1  Spark的起源

    1.1  谷歌的大数据和分布式计算

    1.2  Hadoop at Yahoo!

   1.3  初期诞生于AMP实验室的Spark

2.  Spark是什么

    2.1  快速

    2.2  易用

    2.3  通用

    2.4  可扩展

3.  统一的分析引擎

    3.1  Apache Spark 组件栈

    3.2  Apache Spark 分布式执行

4.  开发人员经验

    4.1  使用Spark的群体和目的

    4.2  社区采纳与拓展

本章阐述了Apache Spark的起源及其基本哲学。还讲述了该项目的主要组成部分及其分布式架构,如果你熟悉Spark的发展历史和高级概念,你可以直接跳过本章内容。

 

1.Spark的起源

在本节中,我们将介绍Apache Spark的短期演变过程:它的起源、诞生的灵感以及作为大数据统一处理引擎在社区中的应用。

 

1.1谷歌的大数据和分布式计算

当我们想到数据规模时,我们不禁想到谷歌的搜索引擎能够以闪电般的速度在互联网上索引和搜索全世界的数据,从这一点看谷歌这个名字是数据规模的同义词,事实上,谷歌是一个故意拼写错误的数学术语,谷歌:意思就是1后面加100个零!

传统的存储系统(如关系数据库管理系统(RDBMS))和必要的编程方式都无法处理谷歌想要构建和搜索互联网索引文档的数据规模。新的需求促进了新的技术诞生,这也是后来谷歌“三辆马车”的产生背景,分别是Google文件系统(GFS)、Map Reduce(MR)和Bigtable。

虽然GFS通过许多硬件服务器构成集群从而提供了容错和分布式文件系统的功能,但也只是解决了海量数据存放的问题,而BigTable则提供了GFS文件系统可伸缩扩展的结构化数据存储,将GFS的数据进行映射,另外MR基于函数式编程引入了一种新的并行编程范式,用户可以利用MR对GFS分布式文件系统以及BigTable映射的结构化数据进行大规模计算处理。

从本质上来说,MR应用程序通过与MapReduce System交互将数据发送给计算模块处理,该计算模块主要由map 和reduce函数组成,核心设计理念是“移动计算而不是移动数据”,支持对数据和集群机架的感知,实现就近计算,而不是每次都把数据移动到应用程序做计算,这样可以减少数据传输的成本,从而在一定程度上提供计算效率。

集群中的工作节点会对计算结果进行聚合,减少中间计算,并最终通过reduce函数将结果进行归一化输出,写入到分布式文件系统中去,程序也可以访问分布式文件系统,这样的工作模式可以显著减少网络流量,并且保证大部分的输入/输出(I/O)在本地进行落盘,而不是分配在网络上。

谷歌所做的大部分工作都是属于定制化的,不具备通用性,但是上述三篇论文中所表达的设计思想却激发了开源社区对分布式文件系统和大规模计算以及大数据数据结构化存储的创新想法——尤其是在雅虎,它在搜索引擎处理方面正遇到了类似的大数据挑战。

1.2Hadoop at Yahoo! 

谷歌的GFS论文中所阐述的关于大规模数据计算挑战和解决方案给分布式文件系统(HDFS)的实现提供了蓝图,也包括为分布式计算框架MapReduce提供了实现。2006年4月,它捐赠给了Apache软件基金会(ASF),成为Apache·Hadoop框架(包含Hadoop Common、MapReduce、HDFS和Apache Hadoop YARN等4大块)的一部分。

尽管Apache Hadoop在雅虎之外获得了广泛的应用!由于有一个大型的开源贡献者社区和两个开源的商业公司(Cloudera and Hortonworks,目前合并了)的参与,MapReduce框架在HDFS上还是存在一些缺点,有以下几点。

第一,Apache Hadoop由于繁琐且复杂的操作,使得其很难管理和维护。其次,它的通用批处理MapReduce API非常冗长,需要开发大量的格式化代码,容错性非常差。第三,对于大批量数据作业,通过需要很多组的MR任务进行计算,每组MR的中间计算结果都会写入本地磁盘,然后再通过从磁盘读取进行下一步操作(见图1-1)。如此频繁的磁盘I/O会导致性能非常差,代价不可谓不高,正如我们所了解的,通常大型MR工作可以连续运行数小时甚至几天,计算时间成本和风险是个非常严重的问题,一旦出现运行错误,就需要重头来过。

 

最后,尽管Hadoop MR有利于大型批量处理,但它不支持其他工作场景功能,比如机器学习、流计算或类似SQL的交互式查询。

为了解决Hadoop MR存在的问题,工程师们开发了一系列定制化系统(Apache Hive、Apache  Storm、Apache  Impala、Apache  Giraph、Apache  Drill、Apache  Mahout等等),每个组件都有自己的API和集群配置,进一步丰富了Hadoop的生态,同时对开发人员的学习曲线有了更多的要求。

然后问题变成其他有针对性的问题,正如Alan Kay’s adage所说“Simple things should be simple, complex things should be possible”,简单的事情要简单做,复杂的事情应该是可能的,那么有没有办法让Hadoop和MR变得更简单更快呢?

 

1.3初期诞生于AMP实验室的Spark

加州大学伯克利分校的研究人员之前曾研究过Hadoop MapReduce,他们通过一个名为Spark的项目接受了Apache Hadoop存在的挑战。不得不承认,MR在交互或迭代计算工作方面效率是非常低下(或棘手)的,学习框架复杂,所以他们从一开始就产生了让Spark更简单、更快、更容易使用的想法,这项努力始于2009年的RAD实验室,后来RAD实验室成为了AMP实验室(现在被称为RISELab)。

早期发表在《Spark》上的论文表明,它在某些方面比Hadoop MapReduce的计算速度快10到20倍。如今,这个速度快了很多数量级,相对于Hadoop的MapReduce会在运行完工作后将中介资料存放到磁盘中,Spark使用了存储器内运算技术,能在资料尚未写入硬盘时即在存储器内分析运算。Spark在存储器内运行程序的运算速度能做到比Hadoop MapReduce的运算速度快上100倍,即便是运行程序于硬盘时,Spark也能快上10倍速度。Spark项目的核心主旨是借鉴Hadoop MapReduce中“移动数据不如移动计算”的想法,为了增强系统:使其高度容错和支持高并发,支持内存中存储迭代和交互映射之间的中间结果,减少计算,提供简单和可组合的多种编程语言API作为编程模型,并以统一的方式支持其他工作场景。我们很快就会回到统一的想法上,因为它是Spark中的一个重要主题。

到2013年,Spark获得了广泛的使用,它最初的一些创造者和研究人员——Matei Zaharia, Ali Ghodsi, Reynold Xin, Patrick Wendell, Ion Stoica, and Andy Konwinski——将Spark项目捐赠给了ASF,并成立了一家名为Databricks的公司。

Databricks和开源社区开发者在2014年5月和2014年5月在ASF的管理下发布了Apache Spark 1.0,这个发布的第一个版本,奠定了未来频繁发布的动力,Databricks和100多个商业供应商对Apache Spark的显著特性做出了非常多的贡献。

 

2.Spark是什么

Apache Spark是一个统一的计算引擎,设计用于大型分布式数据处理、数据中心或云计算。

Spark基于内存进行迭代计算,使它比Hadoop MapReduce要快得多。而且它包含了用于机器学习的多种API库(MLlib)、用于交互式查询的SQL(Spark SQL)、用于与实时数据交互的流处理(结构化流)以及图计算(GraphX)这些功能模块。

Spark的设计理念围绕着四个关键特性展开:

  • 快速

  • 易用

  • 通用

  • 可扩展

让我们来看一下这几个特性对Apache Spark这个框架意味着什么。

2.1快速

Spark为了追求计算速度在多个方面做了努力。首先,其内部实现大大受益于硬件行业最近在提高cpu和内存的性价比方面取得的巨大进步。如今的服务器很便宜,有好几百G的内存配置、多核心和基于Unix的底层操作系统充分利用了高效的多线程和并行处理。这些因素使得Spark框架得到很大程度的优化。

其次,Spark将其查询计算构建为有向无环图(DAG);它的DAG调度器和查询优化器构建了一个有效的计算图,通常可以分解为任务,将任务分发到集群的各个工作节点并行执行。第三,它的物理执行引擎,Tungsten引擎,使用全阶段(whole-stage)代码来合并执行代码(我们将在第三章中介绍SQL优化和全阶段代码生成),提高计算效率。

由于所有的中间结果基本都保留在内存中,只有少部分的结果落在磁盘I/O上,这给它带来了性能的巨大提升。

2.2易用

Spark通过提供一个简单逻辑数据结构的基本抽象,称为弹性分布式数据集(RDD),从而来达到简单使用的目的,在此基础上上构造了所有其他更高级别的结构化数据抽象,如DataFrame和DataSet。通过提供一组转换(transfermation)和触发计算(action)操作,Spark提供了一个简单的编程模型,你可以用自己熟悉的语言通过该编程模型构建大数据应用程序。

2.3通用

Spark操作可以应用于许多类型的工作场景,并支持多种编程语言开发:Scala、Java、Python、SQL和R。Spark提供了文档齐全的API统一库,包括了以下几个核心模块组件:Spark SQL、Spark Structreaming、Spark Mllib和GraphX,并将在一个引擎下运行的所有工作场景,组件之间可以结合着使用。我们将在下一节中更仔细地了解所有这些内容。

你可以编写一个Spark应用程序来完成所有的场景,而不需要不同的引擎来实现不同的工作场景,也不需要学习单独的api。通过对Spark的使用,你可以获得针对工作场景的统一处理引擎。

2.4可扩展

Spark是专注于快速,并行计算的引擎,而不是存储。与Apache Hadoop不同,其中包括存储和计算,Spark对存储和计算进行解耦,简单的事情简单做,这意味着你可以使用Spark来读取存储在各种数据源的数据,例如Apache Hadoop、Apache Cassandra、Apache Hbase、MongoDB、Apache Hive、RDBMS等存储介质,并在内存中处理它们。Spark的DataFrameReaders和DataFrameWriters也可以扩展到从其他数据源进行读取,例如将Apache Kafka、Kinesis, Azure Storage, and Amazon S3的数据读到逻辑数据抽象,进一步在这些抽象上操作。

社区的Spark开发人员维护第三方Spark包列表,作为不断丰富的生态系统的一部分(见图1-2)。这个丰富的软件系统包括各种外部数据源的Spark连接器,性能监控等等。

3.统一的分析引擎

虽然统一的概念并不是Spark的唯一项,但却是其设计哲学和进化的核心组成部分。2016年11月,计算机协会(ACM)认可了Apache Spark,基于Spark论文将Apache Spark定位为“大数据处理的统一引擎”,并取得了革命性的进展,因此授予其创始人著名的ACM奖。获奖论文指出,Spark取代了所有单独的批处理、图形计算、流和查询引擎,如Storm, Impala, Dremel, Pregel等。使用一个统一的组件栈,可以解决单个分布式快速引擎下的各种工作场景,适应不同的需求。

3.1Apache Spark组件栈

如图1-3所示,Spark 包括了四种不同的组件:Spark SQL、Spark MLlib、Spark Structured Streaming和GraphX。这些组件都与Spark 的核心容错引擎分开,即使是用API编写Spark 应用程序,Spark 也会将其转换为由核心引擎执行的DAG。那么,无论你是否使用Java的结构化API(我们将在第三章中介绍)、R、Scala、SQL、Python这些编程语言,底层代码被分解为高度合并的字节码,这些代码在整个集群的工作节点的JVM中引用。

让我们来更详细地查看其中的每个组件。

 

Spark SQL

此模块与结构化数据配合使用非常合适。你可以读取存储在RDBMS表中的数据,或从具有结构化数据的文件格式中读(CSV、Text、JSON、Avro、ORC、Parquet等),然后在Spark 中构造成永久性的或临时的表。此外,当在Java、Python、Scala或R使用Spark 的结构化API时,你可以结合类似SQL的查询来查询数据,只要读入Spark 数据框架。到目前为止,Spark SQL是符合ANSISQL:200标准3的,同时它也可以作为一个纯的SQL引擎。

例如,在此Scala代码段中,你可以从存储在AmazonS3上的JSON文件中读取,创建一个临时表,并对作为Spark DataFrame读入内存的结果执行类似SQL的查询:

// In Scala
// Read data off Amazon S3 bucket into a Spark DataFrame
spark.read.json("s3://apache_spark/data/committers.json")
.createOrReplaceTempView("committers")
// Issue a SQL query and return the result as a Spark DataFrame
val results = spark.sql("""SELECT name, org, module, release, num_commits
FROM committers WHERE module = 'mllib' AND num_commits > 10
ORDER BY num_commits DESC""")

你可以在Python、R或Java中编写类似的代码片段,并且生成的字节码将会是完全相同,性能也是相同的。

 

Spark MLlib 

Spark包含了一个包含通用机器学习算法的库,称为MLlib。自Spark 2的首次发布以来,由于Spark 2.x的底层引擎增强,该库组件的性能已显著提高,MLlib提供了许多流行的高级DataFrame API机器学习算法来构建模型。

从Apache Spark1.6开始,MLlib项目被分成两个包:spark.mllib和spark.ml。后者是基于DataFrame API,而前者包含基于RDD的API,它们现在处于维护模式。所有的新功能都进入了spark.ml中。这本书将“MLlib”作为Apache Spark 中机器学习的库。

这些API允许你在部署期间提取或转换特性、构建管道(用于训练和评估)以及持久化模型(用于保存和重新加载它们)。其他实用程序包括使用公共线性代数操作和统计数据。ML库包括其他低级ML原语,包括一个通用的梯度下降优化。以下Python代码段封装了数据科学家在构建模型时可能做的基本操作(第10和11章将讨论):

# In Python
from pyspark.ml.classification import LogisticRegression
...
training = spark.read.csv("s3://...")
test = spark.read.csv("s3://...")
# Load training data
lr = LogisticRegression(maxIter=10, regParam=0.3, elasticNetParam=0.8)
# Fit the model
lrModel = lr.fit(training)
# Predict
lrModel.transform(test)
...

Spark Structured Streaming 

Apache Spark 2.0引入了一个实验性的连续流式模型和结构化的流式API,构建在Spark SQL引擎和基于DataFrame的API上。通过Spark 2.2,Structured Streaming是普遍可用的,这意味着开发者可以选择在他们的生产环境中使用它。

大数据开发人员需要对静态数据和来自Apache Kafka以及其他数据流源等引擎的流数据进行实时计算分析,新模型将流看作一张不断增长的表,并在表的后面一直追加数据。开发人员只能将其视为一个结构化表,并像处理一张静态表一样对其执行查询。

在Structured Streaming模型下,Spark SQL核心引擎处理容错和延迟数据语义的所有方面,允许开发人员相对轻松地专注于Streaming应用程序开发。这个新模型避免了Spark 的1.x系列中的旧数据流模型,我们将在第8章中更详细地讨论它。此外,Spark 2.x和Spark 3.0扩展了Streaming数据源的范围,包括Apache Kafka,Kinesis和基于HDFS或云存储。

以下代码段显示了Structured Streaming应用程序的典型剖析结构。它从本地主机socket读取数据,并将单词计数结果写入Apache Kafka的主题:

# In Python
# Read a stream from a local host
from pyspark.sql.functions import explode, split
lines = (spark
.readStream
.format("socket")
.option("host", "localhost")
.option("port", 9999)
.load())
# Perform transformation
# Split the lines into words
words = lines.select(explode(split(lines.value, " ")).alias("word"))
# Generate running word count
word_counts = words.groupBy("word").count()
# Write out to the stream to Kafka
query = (word_counts
.writeStream
.format("kafka")
.option("topic", "output"))

GraphX

顾名思义,GraphX是一个用于操作图(如社交网络工作图、路由和连接点,或网络拓扑图)和图并行计算的库。它提供了由社区用户贡献的分析、连接和遍历的标准图算法:可用的算法包括PageRank、连接组件和三角形计数。

此代码段显示了如何使用GraphX API连接两个图的简单示例:

// In Scala
val graph = Graph(vertices, edges)
messages = spark.textFile("hdfs://...")
val graph2 = graph.joinVertices(messages) {
(id, vertex, msg) => ...
}

3.2Apache Spark分布式执行

如果你已经阅读了这些内容,你已经知道Spark是一个分布式数据处理引擎,其组件可以在一个机器集群上协同工作。在我们探索本书的以下章节中讲述关于使用Spark进行编程之前,你需要了解Spark分布式体系结构,以及所有组件之间是如何协同工作和通信的,还有组件的部署模式。

让我们首先看看图1-4所示的各个组件以及它们如何融入体系结构。在Spark体系结构的高级别上来看,Spark应用程序包括了一个负责在Spark集群上协调并行操作的驱动程序(Driver)。驱动程序通过SparkSession访问集群中的分布式组件----Spark Executor和集群管理器(Cluster Manager)。

Spark driver

作为负责实例化SparkSession的Spark应用程序的一部分,Spark驱动程序具有多个角色:负责与集群管理器通信;向集群管理器请求资源(CPU、内存等)分配给Spark Executor(JVM)。然后将所有的Spark操作转换为DAG计算、调度并将他们的执行操作作为任务分配给Spark Executor。一旦资源分配好了以后,它会直接与executors通信。

SparkSession

在Spark2.0中,SparkSession成为了所有Spark操作和数据的统一管道。它不仅封装了Spark以前的入口点,如 SparkContext, SQLContext, HiveContext, SparkConf, and StreamingContext,而且它也使得Spark的工作变得更简单和更容易。

虽然在Spark2.x 中SparkSession包含了所有其他的Context上下文环境,你仍然可以访问单独的上下文和它们的规范方法。这样,就可以向后兼容。也就是说,旧的Spark 1.x版本,带有Spark上下文或SQL上下文的代码仍然可以工作。

通过此管道,你可以创建JVM运行时参数、定义DataFrame和DataSet、从数据源中读取、访问目录元数据以及执行SparkSQL查询。SparkSession为Spark的所有功能提供了一个单一的统一的入口点。

在Standalone模式下的Spark应用程序中,你可以使用你所选择的编程语言中的一个高级API来创建SparkSession。在Spark shell中(下一章将详细介绍)将为你创建SparkSession,你可以通过一个名为spark或sc的全局变量访问它。

而在Spark1.x中你必须创建单独的上下文(Streaming、SQL等)。引入额外的样板代码,在Spark2.x应用程序中,你可以为每个JVM创建一个SparkSession,并使用它来执行各种Spark操作。

让我们来看看下面的一个例子:

// In Scala
import org.apache.spark.sql.SparkSession
// Build SparkSession
val spark = SparkSession
.builder
.appName("LearnSpark")
.config("spark.sql.shuffle.partitions", 6)
.getOrCreate()
...
// Use the session to read JSON
val people = spark.read.json("...")
...
// Use the session to issue a SQL query
val resultsDF = spark.sql("SELECT city, pop, state, zip FROM table_name")


Cluster Manager(集群管理器) 

集群管理器负责管理和分配运行Spark应用程序的集群节点的资源。目前,Spark支持四种集群管理器:内置的Standalone集群管理器、Apache Yarn、Apache Mesos和Kubernetes。

Spark executor 

集群的每个工作节点中都运行Spark Executor进程。executor与驱动程序沟通,并负责执行worker节点上的任务。在大多数部署模式中,每个节点只运行单个 Executor。

Deployment modes(部署模式)

Spark的一个有吸引力的特性是它支持各种部署模式,使Spark能够在不同的配置和环境中运行。因为集群管理员不知道其运行位置(只要它能够管理Spark的executor并满足资源请求),Spark可以部署在大多数据主流的环境中,如Apache Hadoop YARN和Kubernetes,并且可以在不同的模式下运行。表1-1总结了可用的部署模式。

Distributed data and partitions(数据分区)

实际物理数据分布在HDFS或云存储中分区中,进行数据持久化(见图1-5)。虽然数据通过分区分布在物理集群中,但Spark将每个分区视为高级逻辑数据抽象——内存中的DataFrame。尽可能保证每个Spark Executor最好被分配一个任务,要求它在network中读取最接近它的分区,观察数据的局部性。

分区允许实现高效的并行性。将数据分解成块或分区的分布式方案允许Spark Executor只处理接近这些它们的数据,从而最小化网络带宽。也就是说,每个Executor core分配到自己的数据分区执行任务(见图1-6)。

例如,此代码段将存储在集群中的物理数据分成八个分区,每个 Executor将获得一个或多个分区并将分区数据读取到其内存中:

# In Python
log_df = spark.read.text("path_to_large_text_file").repartition(8)
print(log_df.rdd.getNumPartitions())

该代码将创建一个DataFrame随机生成10000个整数,分成8个分区分布到内存中:

# In Python
df = spark.range(0, 10000, 1, 8)
print(df.rdd.getNumPartitions())

这两个代码片段都将打印出8。

在第3章和第7章中,我们将讨论如何根据Executor上的核心数量来调整和更改分区配置的最大并行度。

 

4.开发人员经验

对于开发人员来说,没有什么比一组能够提高生产效率、易于使用、直观和具有表达力的API更有吸引力的了。Apache Spark对开发者的主要吸引力之一是它易于使用的API,适用于数据规模大或小的数据集,其次跨语言:Scala、Java、Python、SQL和R。

Spark2.x背后的一个主要动机是统一和简化框架,通过限制开发人员必须掌握的各种概念的数量。Spark2.x引入了更高层次的抽象API作为特定领域的语言构造,这使得Spark编程具有高度表达力和收到开发人员的喜爱。你只需要表达了你想要的任务或操作来计算内容,而不是如何来计算它,而Spark可以帮你确定如何最优地帮你实现出来。我们将在第三章介绍这些结构化API,但首先让我们看看Spark开发人员都有哪些群体。

4.1使用Spark的群体和目的

毫不奇怪,大多数处理大数据问题的开发人员都是数据工程师、数据科学家或机器学习工程师。他们之被Spark吸引是因为Spark允许他们使用一个引擎和熟悉的编程语言来构建一系列的应用程序。

当然,开发人员可能需要担任很多种角色,解决各种五花八门的工作任务,有时会同时做数据科学和数据工程任务,特别是在初创公司或较小的公司中。然而,在所有这些任务中,都是基于大量的数据。

 

数据科学的任务

作为一门在大数据时代已经突出起来的学科,数据科学就是利用数据来讲故事的。但在他们能够讲述这些故事之前,数据科学家必须清洗这些数据,进行探索发现价值,并建立模型来预测或训练研究结果。其中一些任务需要统计学、数学、计算机科学和编程方面的知识。

大多数数据科学家都熟练使用像SQL这样的分析工具,熟悉Numpy和Pandas这样的库,熟悉像R和Python这样的编程语言,但他们也必须知道如何转换数据,以及如何使用已建立的分类、回归或聚类算法来构建模型。他们的任务通常是迭代的、交互式的或特别的,或实验性的来验证他们的假设。

幸运的是,Spark支持这些不同的工具。Spark的MLlib提供了一套常用的机器学习算法,以使用高级estimators、transformers和数据featurizers来构建模型管道。Spark SQL和Spark Shell支持对数据的交互式和即席查询。

此外,Spark使数据科学家能够处理大型数据集,并扩展他们的模型进行训练和评估。Apache Spark2.4引入了一个新的gang调度器,作为Hydrogen项目的一部分,以适应分布式训练和调度深度学习模型的容错需求,Spark3.0介绍了在Standalone、YARN和Kubernetes部署模式中支持GPU资源调度的能力。这意味着,对于某些任务,需要具备深度学习技术的开发人员才有能力使用Spark。

 

数据工程师任务

在构建了他们的模型之后,数据科学家通常需要与其他团队合作,他们可能负责部署这些模型。或者,他们可能需要与他人密切合作,构建并将原始的、脏的数据转化为其他数据科学家易于消费或使用的干净数据。例如,一个分类或集群模型并不单独存在;通常与其他组件一起工作,如web应用程序或Streaming引擎,如Apache Kafka,或者作为更大的数据管道的一部分。这条管道通常是由数据工程师构建出来的。

数据工程师对软件工程原理和方法有深刻的理解,并拥有为指定的业务用例构建可伸缩的数据管道的技能。数据管道允许对来自各种数源的原始数据进行端到端转换——数据清洗,以便开发人员可以在下游使用,将数据存储在云中或NoSQL或RDBMS中用于生成报告,或者通过商业智能工具让数据分析人员使用。

Spark2.x介绍了一种称为结构化流连续应用的流模型(第8章详细讨论)。使用结构化流式API,数据工程师可以构建复杂的数据管道,使他们能够对来自实时和静态数据源进行ETL操作。

数据工程师喜欢使用Spark是因为它提供了一种简单的并行计算方法,并隐藏了分布的所有复杂性和容错性。这使得他们可以更多地专注于使用基于DataFrame的高级API和特定领域的语言(DSL)查询来执行ETL,读取和联合来自多个源的数据。

Spark2.x的性能,Spark3.0的改进,由于SQL优化器和Tungsten引擎对代码执行计划的提升,使数据工程师的工作变得容易得多。他们可以选择使用适合手头任务的三个Spark组件---RDD、DataFrame或DataSet中的任何一个,享受Spark带来的好处。

 

常用的Spark用例

无论你是数据工程师、数据科学家还是机器学习工程师,你都会发现Spark对以下用例有用:

  • 并行处理跨集群分布的大型数据集

  • 执行临时查询或交互式查询,以探索和可视化数据集

  • 使用MLlib库构建、训练和评估机器学习模型

  • 实现来自无界数据流的端到端数据管道

  • 分析图形数据集和社交网络

 

4.2社区采纳与扩展

毫不奇怪,Apache Spark在开源社区引起了共鸣,尤其是数据工程师和数据科学家。它的设计理念和作为Apache 软件基金会项目的包容性已经引起了开发者社区的巨大兴趣。

今天,全球有超过600个Apache Spark Meetup group,拥有近50万名成员。每周世界上都会有人在一个Meetup或会议上发表演讲,或者分享一篇关于如何使用Spark来构建数据管道的博客文章。Spark人工智能峰会是规模最大的会议,致力于讨论如何使用Spark进行机器学习、数据工程和跨许多垂直领域的数据科学。

自从2014年Spark的第一次1.0发布以来,已经有了许多较小的和重大的发布,而Spark3.0的最近一次主要发布是在2020年。这本书将涵盖Spark2.x的各个方面和Spark3.0。等到这本书出版时,社区将已经发布Spark3.0,这本书中的大部分代码已经用Spark3.0兼容2.x版本完成测试了。

在其发行的过程中,Spark继续吸引了来自世界各地和许多组织的贡献者。今天,Spark有近1500个贡献者,以及超过100个版本,21000个forks,在GitHub大约有27000个提交记录,如图1-7所示。我们希望当你看完这本书时,你也会感到想为Spark做出贡献的冲动。

 

现在我们可以把注意力转向学习的乐趣——在哪里以及如何开始使用Spark。在下一章中,我们将告诉你如何通过三个简单的步骤启动并运行Spark。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据与智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值