Mohammed Guller撰写的《Spark大数据分析》(Big Data Analytics with Spark)一书针对使用Apache Spark框架执行批处理、互操作、图表、数据流分析,以及机器学习等不同类型的大数据分析项目提供了实用的学习指南。我们采访了本书以及各种大数据应用程序开发工具的作者Mohammed Guller。

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

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

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

问:开发者在项目中使用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)编译。

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

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

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

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

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

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

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

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

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

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

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

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

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