介绍 Apache Spark
用于大数据工作负载的分布式开源处理系统
什么是 Apache Spark?
Apache Spark 是一种用于大数据工作负载的分布式开源处理系统。它使用内存中缓存和优化的查询执行方式,可针对任何规模的数据进行快速分析查询。它提供使用 Java、Scala、Python 和 R 语言的开发 API,支持跨多个工作负载重用代码—批处理、交互式查询、实时分析、机器学习和图形处理等。您会发现各行业的众多组织都使用它,其中包括 FINRA、Yelp、Zillow、DataXu、Urban Institute 和 CrowdStrike。Apache Spark 已经成为最受欢迎的大数据分布式处理框架之一,在 2017 年拥有 365000 名会定期参加聚会的会员。

Apache Spark 的发展历史?
Apache Spark 在 2009 年作为加州大学伯克利分校 AMPLab 的一个研究项目而问世,专注于数据密集型应用程序领域的学生、研究人员和教职员工在此项目中开展协作。Spark 的目标是打造一个全新的针对快速迭代处理(如机器学习和交互式数据分析)进行过优化的框架,与此同时保留 Hadoop MapReduce 的可扩展性和容错能力。第一篇题为《Spark: Cluster Computing with Working Sets》的论文发表于 2010 年 6 月,而 Spark 是 BSD 许可协议项下的开源系统。2013 年 6 月,Spark 在 Apache Software Foundation (ASF) 进入孵化状态,并于 2014 年 2 月被确定作为 Apache 顶级项目之一。Spark 可以在 Apache Mesos 上,但最常见的还是在 Apache Hadoop 上单独运行。
如今,Spark 已成为 Hadoop 生态系统中最活跃的项目之一,大量组织都采用 Spark 和 Hadoop 来处理大数据。2017 年,Spark 拥有 365000 名会定期参加聚会的会员,这个数字在两年时间里成长 5 倍之多。从 2009 年开始,共有来自 200 多个组织的超过 1000 名开发人员为它做出过贡献。
Apache Spark 如何运作?
Hadoop MapReduce 是一种用于处理大数据集的编程模型,它采用并行的分布式算法。开发人员可以编写高度并行化的运算符,而不用担心工作分配和容错能力。不过,MapReduce 所面对的一项挑战是它要通过连续多步骤流程来运行某项作业。在每个步骤中,MapReduce 要读取来自集群的数据,执行操作,并将结果写到 HDFS。因为每个步骤都需要磁盘读取和写入,磁盘 I/O 的延迟会导致 MapReduce 作业变慢。
开发 Spark 的初衷就是为了突破 MapReduce 的这些限制,它可以执行内存中处理,减少作业中的步骤数量,并且跨多项并行操作对数据进行重用。借助于 Spark,将数据读取到内存、执行操作和写回结果仅需要一个步骤,大大地加快了执行的速度。Spark 还能使用内存中缓存显著加快在相同数据集上重复调用某函数的机器学习算法的速度,进而重新使用数据。数据重用通过在弹性分布式数据集 (RDD) 上创建数据抽象—DataFrames 得以实现,而弹性分布式数据集是一个缓存在内存中并在多项 Spark 操作中重新使用的对象集合。它大幅缩短了延迟,使 Spark 比 MapReduce 快数倍,在进行机器学习和交互式分析时尤其明显。
Apache Spark vs.Apache Hadoop
除了 Spark 和 Hadoop MapReduce 的设计差异,很多组织还发现这两个大数据框架之间存在互补性,并且会同时使用二者来克服更广泛的业务挑战。
Hadoop 是一种开源框架,它将 Hadoop 分布式文件系统 (HDFS) 用于存储,将 YARN 作为管理由不同应用程序所使用的计算资源的方式,并且实现 MapReduce 编程模型来充当执行引擎。在一般 Hadoop 实现中,还会部署不同的执行引擎,如 Spark、Tez 和 Presto。
Spark 是一种专门用于交互式查询、机器学习和实时工作负载的开源框架。它没有自己的存储系统,但会在其他存储系统,如 HDFS,或其他热门存储,如 Amazon Redshift、Amazon S3、Couchbase、Cassandra 等之上运行分析。Hadoop 上的 Spark 会利用 YARN 来分享常见的集群和数据集作为其他 Hadoop 引擎,确保服务和响应的一致性水平。
Apache Spark 有哪些优点?
Apache Spark 所具有的众多优点使其成为 Hadoop 生态系统中最活跃的项目之一。其中包括:
快速
通过内存中缓存和优化的查询执行方式,Spark 可针对任何规模的数据进行快速分析查询。
开发人员友好
Apache Spark 原生支持 Java、Scala、R 和 Python,可为您提供多种应用程序构建语言。这些 API 让您的开发人员变得更轻松,因为它们可以将复杂的分布式处理隐藏在简单的高级操作符背后,从而大量减少所需的代码数量。
多个工作负载
Apache Spark 自带运行多个工作负载功能,包括交互式查询、实时分析、机器学习和图形处理等。一个应用程序可无缝与多个工作负载整合。
Apache Spark 工作负载
Spark 框架包括:
- Spark Core 是该平台的基础
- 用于交互式查询的 Spark SQL
- 用于实时分析的 Spark Streaming
- 用于机器学习的 Spark MLlib
- 用于图形处理的 Spark GraphX
Spark Core
Spark Core 是该平台的基础。它要负责内存管理、故障恢复、计划安排、分配与监控作业,以及和存储系统进行交互。您可以通过为 Java、Scala、Python 和 R 而构建的应用程序编程接口 (API) 使用 Spark Core。这些 API 会将复杂的分布式处理隐藏在简单的高级操作符的背后。
MLlib
机器学习
Spark 包含 MLlib,它是在大规模数据上进行机器学习所需的算法库。数据科学家可以在任何 Hadoop 数据源上使用 R 或 Python 对机器学习模型进行训练,这些数据源使用 MLlib 保存,并且被导入到基于 Java 或 Scala 的管道当中。Spark 专为在内存中运行的快速交互式计算而设计,使机器学习可以快速运行。它的算法包含分类、回归、集群、协同过滤和模式挖掘等功能。
Spark Streaming
实时
Spark Streaming 是利用 Spark Core 的快速计划功能执行流式分析的实时解决方案。它会提取迷你批处理中的数据,使用为批处理分析编写的相同应用程序代码实现对此类数据的分析。这样一来,开发人员的效率得到改善,因为他们可以将相同代码用于批处理和实时流式处理应用程序。Spark Streaming 支持来自 Twitter、Kafka、Flume、HDFS 和 ZeroMQ 的数据,以及 Spark 程序包生态系统中的其他众多数据。
Spark SQL
交互式查询
Spark SQL 是提供低延迟交互式查询的分布式查询引擎,其速度最高可比 MapReduce 快 100 倍。它包含一个基于成本的优化器、列式存储,能够生成代码并用于快速查询,它还可以扩展到具有数千个节点。业务分析师可以使用标准的 SQL 或 Hive 查询语言来查询数据。开发人员可以使用以 Scala、Java、Python 和 R 提供的 API。它支持各种开箱即用的数据源,包括 JDBC、ODBC、JSON、HDFS、Hive,ORC 和 Parquet。其他热门存储—Amazon Redshift、Amazon S3、Couchbase、Cassandra、MongoDB、Salesforce.com、Elasticsearch,以及其他许多存储,都可以在 Spark 程序包生态系统中找到。
GraphX
图形处理
Spark GraphX 是构建在 Spark 之上的分布式图形处理框架。GraphX 提供 ETL、探索性分析和迭代图形计算,让用户能够以交互方式大规模构建、转换图形数据结构。它自带高度灵活的 API 和一系列分布式图形算法选项。
谁会使用 Apache Spark?
截止到 2016 年,调查结果显示超过 1000 个组织都在生产中使用 Spark。其中有些列在由 Spark 提供支持页面上。Apache Spark 已经成为最受欢迎的大数据分布式处理框架之一,在 2017 年拥有 365000 名会定期参加聚会的会员。不同客户的示例包括:

Yelp 的广告定位团队设计了一些预测模型来确定用户与广告互动的几率。通过使用 Amazon EMR 上的 Apache Spark 处理大量数据来训练机器学习模型,Yelp 提高了收入和广告点击率。

Zillow 拥有并经营着最大的在线房地产网站之一。它在 Amazon EMR 上使用来自 Spark 的机器学习算法,以接近实时的方式处理大型数据集并用于计算 Zestimates。Zestimates 是一款房屋估值工具,为买方和卖方提供具体房屋的估计市价。
Apache Spark 用例
Apache Spark 是一种用于大数据工作负载的通用型分布式处理系统。它已经被部署到每种大数据用例类型中,用来侦测模式并提供实时见解。它的用例示例包括:
金融服务
Spark 被用于银行业务,来预测客户流失与推荐新的金融产品。在投资银行业务中,Spark 被用来分析股价,并预测未来的走势。
医疗保健
Spark 被用于构建全方位的病人照护,在每次与病人的互动中为第一线医疗人员提供数据。Spark 还可被用来预测/推荐病人治疗方案。
制造
Spark 被用来建议在什么时候进行预防性维护,从而避免联网设备停机。
零售
Spark 通过其个性化的服务和产品来吸引和留住客户。
在云中部署 Apache Spark
Spark 是理想的云端工作负载,因为在云中能够实现性能、可扩展性、可靠性、可用性以及大型规模经济。ESG 研究发现,43% 的调查对象认为云是他们部署 Spark 的主要原因。客户将云视为 Spark 的优点之一的主要原因是更好的安全性、更快的部署、更好的可用性、更频繁的特性/功能更新、更具弹性、更广的地理覆盖范围以及与实际利用率相关的成本。
在 Amazon Web Services 的云中构建您的 Apache Spark 集群
Amazon EMR 是在云中部署 Apache Spark 的最佳位置,因为它既具备商用 Hadoop 和 Spark 分配的集成和测试严谨性,又有云的规模、简单性和成本效益。它让您可以在几分钟内启动 Spark 集群,而无需执行节点预置、集群设置、Spark 配置或集群优化。EMR 让您可以在短短几分钟内预置一个、上百个或成千上万个计算实例。您可以使用 Auto Scaling,让 EMR 自动扩展您的 Spark 集群来处理任何规模的数据,并在作业结束时再次缩减,以避免为未使用的容量付费。您可以通过 Amazon EC2 预留实例承诺使用一段固定的时间,实现最多 75% 的节省,或使用 EC2 Spot 在备用的 AWS 计算容量上运行您的集群,实现最多 90% 的节省,从而降低您的账单金额。了解更多。