《Spark 大数据分析》一书的书评和采访

阅读数:2630 2016 年 7 月 25 日

话题:Book Review大数据语言 & 开发架构AI

主要结论

  • 了解如何将 Apache Spark 用于不同类型的大数据分析用例,例如批处理、互操作、图表、数据流分析,以及机器学习。
  • 了解 Spark Core 及加载项库,包括 Spark SQL、Spark Streaming、GraphX、Mllib 和 Spark ML。
  • 了解开发者在项目中使用 Spark 时可能需要用到的开发和测试工具。
  • Spark 程序性能和调优最佳实践。
  • 了解 Spark 在集群设置、管理和监控中的使用。

Mohammed Guller 撰写的《Spark 大数据分析》(Big Data Analytics with Spark)一书针对使用Apache Spark框架执行批处理、互操作、图表、数据流分析,以及机器学习等不同类型的大数据分析项目提供了实用的指南。其中介绍了Spark core及其加载项库,包括 Spark SQL、Spark Streaming、GraphX、Mllib,以及 Spark ML。

本书读者将了解到如何使用 Apache Spark 框架的内存中(In-memory)缓存和高级执行引擎组件进行数据分析。

作者谈到了如何使用 Spark 作为数据处理的统一平台,执行诸如 ETL 管线、商业智能、实时数据流处理、图表分析,以及机器学习等任务。同时他还讨论了其他话题,例如 Spark 程序的集群管理器和监控。

本书还介绍了经常配合 Spark 使用的其他技术和框架,例如分布式文件管理系统(HDFS)、Avro、Parquet、分布式消息(Kafka)、NoSQL 数据库(CassandraHBase),以及集群管理(Mesos)。

InfoQ 与 Mohammed Guller 讨论了本书、Spark 框架,以及用于 Spark 大数据应用程序的开发者工具。

InfoQ:您对 Apache Spark 框架的定义是怎样的?该框架对大数据分析项目和倡议能提供什么帮助?

Guller:Apache Spark 是一个快速、简单易用、通用的大数据集处理集群式计算框架,可实现极大规模和极高速度。更重要的是,借助该框架可以轻松地针对大规模数据集执行各类数据处理任务。它为批处理、即席分析、机器学习、流处理以及图表分析提供了一套集成库。

数据正在以指数形式增长。另外目前生成的大部分数据并非结构化的,而是多结构化或非结构化的。关系型数据库等传统工具无法应对今天数据的数据量、生成速度和种类。因此需要 Spark 这样的框架。它使得用户能轻松处理不同数量、速度和种类的大数据。另外要注意的是,组织需要通过不同方式处理或分析数据以从中获得价值。Spark 为不同类型数据的处理和分析任务提供了统一平台。与专门承担批处理或流处理任务的专用框架不同,使用 Spark 时无需复制代码或数据。

InfoQ:开发者在项目中使用 Spark 后需要用到哪些开发和测试工具,您能否介绍一下?

Guller:一般来说,开发者可以针对 Spark 所能支持的编程语言使用任何可用的工具。目前 Spark 可支持 Scala、Java、Python 和 R。

以 Scala 为例。Spark 自带一个名为 Spark-Shell 的交互式开发环境,这个环境就是基于 Scala REPL(Read Evaluate Print Loop)工具实现的。用户可以借助它快速简单地上手 Spark。此外开发者还可以使用标准的 Scala IDE,例如 Eclipse 和 IntelliJ IDEA。如果不想使用 IDE,还可以用惯用的文本编辑器编写代码并使用 SBT(Simple Build Tool)编译。

InfoQ:对于刚开始学习 Spark 框架的开发者新手,您是否能提供些最佳实践?

Guller:学习 Spark 的最好方式是大量做实验,并使用 Spark API 编写代码。编写执行代码后,相关概念也会变得更清楚。学习任何新的语言或工具都是如此。

虽然 Spark 是大数据处理框架,但学习 Spark 的过程中并不需要具备大规模集群或大型数据集。你可以在自己的笔记本上使用小规模数据集运行 Spark,借此熟悉 Spark 提供的 API 和各种库。我的书中专门有一章向初学者介绍如何轻松上手 Spark。

InfoQ:Spark 目前支持的编程语言有 Scala、Java、Python 和 R,您觉得这些语言相比而言有什么优劣?如果开发者新手需要选择一种语言,您有什么推荐?

Guller:Spark 本身是使用 Scala 编写的。因此以前 Scala 是 Spark 的“一等公民”,对其他语言的支持都略有滞后。然而目前发布的每个 Spark 新版本中,这样的差距变得越来越小。同理,以前使用 Scala 编写的 Spark 应用程序比 Python 应用程序性能更优,但 Spark 正在对此进行各种优化,速度的差异也会逐渐减小。

我个人很喜欢 Scala,这种语言可以提高生产力,有助于写出更简洁,质量更高的代码。我也正是因此重新拾回了对编程的热爱。

话虽如此,开发者其实可以使用自己习惯的任何语言。如果你对 Python 比较在行就用 Python。只要你熟悉的语言是 Spark 所能支持的,就没必要更换或学习新的语言。

如果希望学习新语言并获得更优化的性能,那么我要推荐 Scala。我的书中专门有一章是介绍功能编程和 Scala 的。

InfoQ:在本地计算机或云端设置 Spark 集群的最佳方式是什么?

Guller:Spark 提供的 spark-ec2 脚本可用于在 Amazon AWS 设置 Spark 集群。这个脚本可启动、管理和关闭 Amazon 云中的 Spark 集群。同时该脚本可以安装 Spark 和 HDFS。这是一个非常灵活的脚本,支持多种输入参数,还可针对具体的处理需求和预算创建自定义集群。

InfoQ:能否谈谈使用 Spark Streaming 库执行实时流数据分析?

Guller:Spark Streaming 库扩展了 Spark 的流处理能力,能够为用户提供近乎实时的流数据分析能力。它使用了一种微批(Micro-batching)体系结构。这种技术在本质上会将一条数据流拆分为多个微批,并可由开发者指定批区间(Batch interval)。每个微批可由一个 RDD(Resilient Distributed Dataset)代表,RDD 同时也是 Spark 最主要的数据抽象。

微批体系结构有优势也有劣势。优势方面,可以提供极高的吞吐量,因此 Spark Streaming 非常适合针对流数据执行分析。然而如果应用程序需要以极低延迟(毫秒级别)分别处理流中的每个事件,可能并不适合使用 Spark Streaming。

InfoQ:Spark 程序的性能和调优方面有什么需要注意的?

Guller:这是个很大的话题。Spark 提供了很多性能调优机制,我会介绍一些最需要引起注意的重要事项。

首先,对于大部分数据处理应用程序,磁盘 I/O 都是影响应用程序执行速度的决定性因素。Spark 可以让用户在内存中创建数据,请尽量利用这一特性。将数据缓存在内存中可以让应用程序提速 100 倍以上。当然这也意味着最好使用具有大量内存的计算机搭建 Spark 集群。

其次,请避免需要进行数据重排(Data shuffling)的操作。跨越网络进行数据重排是一种开销很高的操作,在编写数据处理逻辑时一定要注意这一点。有时候相同的逻辑也可以通过更高效的操作实现,例如不要使用 groupByKey 操作,而是可以使用 reduceByKey 操作。

第三,优化数据中的分区数量。如果数据尚未分区,就无法充分利用 Spark 在并行数据处理方面的优势。例如,假设有一个 100 内核的 Spark 集群,但如果数据只有 2 个分区,此时将无法充分运用所有计算能力。

第四,通过共置的数据节点和计算节点可以获得更好的性能。举例来说,如果数据在 HDFS 中,请在同一个 HDFS 集群中安装 Spark。Spark 会在距离数据尽可能近的位置处理这些数据。例如,它首先会尝试在数据所在计算机上执行任务。如果该计算机无法执行任务,随后会尝试使用同一机柜的其他计算机。如果依然不可行,最后才会选择使用任意一台计算机。请尽量将磁盘和网络 I/O 降至最低。

这就是一些值得大家注意的,有关性能的常见注意事项。

InfoQ:目前 Spark 程序在安全保护方面有哪些措施?如何只让获得许可的用户或应用执行这些程序?

Guller:Spark 支持两种身份验证方法:共享密钥(Shared secret)和 Kerberos。共享密钥身份验证机制可以配合所有集群管理器使用:YARN、Mesos,以及独立使用。此外 YARN 还可将 Kerberos 与 Spark 配合使用。

Spark 还支持使用 SSL 与 SASL 进行加密。SSL 主要用于安全通信协议,SASL 主要用于保护块传输服务。

InfoQ:如何使用 Spark Web Console 和其他工具监控 Spark 程序?通常在监控 Spark 程序时您会使用哪些度量指标?

Guller:Spark 提供了完善的监控能力。我的书中有一章专门介绍了这个话题。Spark 不仅可以暴露各种度量指标,而且针对 Spark 集群和其中运行的应用程序提供了基于 Web 的监控界面。此外还能支持第三方监控工具,例如 Graphite、Ganglia 以及基于 JMX 的监控应用。

我会在性能优化和调试过程中进行监控。具体选择的度量指标取决于打算要解决的问题。例如,可以使用监控界面检查集群状态以及应用程序的资源分配情况。同理,也可以使用监控界面查看应用程序所提交的作业中的并行数量。另外还可以查看不同任务处理的数据量和所用时间。这些信息可以帮你找出卡滞的任务,当然这些只是几个简单的例子。

InfoQ:您期待在以后发布的 Spark 版本中见到什么新功能?

Guller:Spark 开发者社区在每个新版本中都在尽全力改善 Spark。因此我的期待并不重要。但我希望看到更多与机器学习有关的新功能。

另外我觉得 Spark 还缺少一样东西:针对 Scala 开发者提供的图表或数据绘图(Plotting)库。探索式可视化是数据分析的重要一环,R 开发者可以使用 ggplot2,Python 有 matplotlib,Scala 开发者要是也有类似的技术就太好了。

另外我还希望看到 Spark 的统计和机器学习库能够赶上 R 提供的类似技术。最后,我还希望能够通过更好的支持让用户使用 PMML 和 PFA 等标准导出和导入机器学习模型。

InfoQ:Spark Machine Learning 目前提供了多种不同算法。你是否看到有其他 ML 库能够为组织的机器学习和数据科学需求提更多价值?

Guller:你说的没错,Spark 的机器学习库提供了丰富的算法,并且每个新版都增加了新的算法。

Spark 可以配合外部机器学习库使用,因此无论 Spark 缺乏哪种能力,都可以通过其他库弥补。例如,Stanford CoreNLP 库配合 Spark 使用可以执行 NLP-heavy 机器学习任务,类似的 SparkNet、CaffeOnSpark、DeepLearning4J 或 TensorFlow 也可以与 Spark 配合使用实现更深入的学习。

Guller 还谈到了 Spark 框架为用户提供的价值。

Guller:Spark 是一个很棒的大数据分析和处理框架,非常易于使用,针对不同任务提供了丰富的库。此外它还针对非常大规模数据集的处理提供了扩展能力和极高的速度。任何需要处理大数据或进入大数据领域的用户都有必要掌握。

他同时还提到有很多人向他询问 Hadoop 和 Spark 之间的关系,并回答了两个最长听到的问题。

InfoQ:Spark 会取代 Hadoop 吗?

Guller:简单来说,不会。今天的 Hadoop 代表了多个产品组成的生态系统,Spark 也是这个生态系统的成员。就算最核心的 Hadoop 也包含三个组件:一个集群管理器,一个分布式计算框架,以及一个分布式文件系统。其中集群管理器是 YARN,计算框架是 MapReduce,分布式文件系统是 HDFS。Spark 是 Hadoop MapReduce 组件的继任者。

很多人在使用 Spark 作业取代原有的 MapReduce 作业,或在 Spark 中编写新的作业。因此可以说 Spark 会取代 MapReduce,但无法取代 Hadoop。

另外有个重要的事情需要注意,Spark 可以配合 Hadoop 使用,但也可以在不具备 Hadoop 的情况下使用。例如,可以使用 Mesos 或独立集群管理器替代 YARN,同理也可以使用 S3 或其他数据源代替 HDFS。因此使用 Spark 并非必须要同时使用 Hadoop。

InfoQ:为什么有人使用 Spark 代替 MapReduce?

Guller:相比 MapReduce,Spark 可以提供更多优势。

首先,Spark 比 MapReduce 速度快很多。取决于具体应用,可能会比 MapReduce 快 100 倍。Spark 如此之快的一个原因在于其先进的作业执行引擎。Spark 作业可以划分为任意数量的阶段(Stage),而 MapReduce 作业只能分为两个阶段。另外 Spark 可以让应用程序将数据缓存在内存中。缓存机制可极大改进应用程序性能。磁盘 I/O 会大幅影响数据处理应用程序的执行速度,Spark 则能将磁盘 I/O 降至最低。

其次,Spark 很易用。Spark 提供了丰富的 API 和超过 80 种操作,MapReduce 只能提供两种操作:Map 和 Reduce。Spark API 可以通过 Scala、Python、Java 和 R 四种语言使用。相比在 MapReduce 中编写的作业,相同数据处理作业使用 Scala/Spark 编写时代码量可以减少 5-10 倍。因此 Spark 也能大幅提高开发者的生产力。

第三,Spark 针对不同类型的数据处理任务提供了统一的工具。该产品内置了用于批处理、交互式分析、机器学习、流处理,以及图表分析的集成库,用户不再需要学习多种工具。也不需要将代码和数据复制到多个位置。另外从运营的角度来说,一个集群的管理,无疑要比针对不同类型作业创建多个专用集群管理起来更简单。

关于这本图书的作者

Mohammed Guller是 Glassbeam 的首席架构师,主要负责高级分析和预测分析产品的开发。过去 20 多年来,Mohammed 成功地领导了诸多创新式技术产品从概念到发布的全过程。在加入 Glassbeam 之前,他是 TrustRecs.com 的创始人,这是他在 IBM 工作五年后成立的。加入 IBM 之前,他曾就职于多个高科技初创公司,负责新产品的开发工作。Mohammed 具备美国加州大学伯克利分校工商管理硕士学位,以及印度古吉拉特邦大学 Rollwala 计算机中心的计算机应用硕士学位。

查看英文原文:Big Data Analytics with Spark Book Review and Interview