主要结论
了解如何将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数据库( Cassandra 、 HBase ),以及集群管理( Mesos )。
我们与Mohammed Guller讨论了本书、Spark框架,以及用于Spark大数据应用程序的开发者工具。
问:您对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。
问:Spark程序的性能和调优方面有什么需要注意的?
Guller:这是个很大的话题。Spark提供了很多性能调优机制,我会介绍一些最需要引起注意的重要事项。
首先,对于大部分数据处理应用程序,磁盘I/O都是影响应用程序执行速度的决定性因素。Spark可以让用户在内存中创建数据,请尽量利用这一特性。将数据缓存在内存中可以让应用程序提速100倍以上。当然这也意味着最好使用具有大量内存的计算机搭建Spark集群。
其次,请避免需要进行数据重排(Data shuffling)的操作。跨越网络进行数据重排是一种开销很高的操作,在编写数据处理逻辑时一定要注意这一点。有时候相同的逻辑也可以通过更高效的操作实现,例如不要使用groupByKey操作,而是可以使用reduceByKey操作。
第三,优化数据中的分区数量。如果数据尚未分区,就无法充分利用Spark在并行数据处理方面的优势。例如,假设有一个100内核的Spark集群,但如果数据只有2个分区,此时将无法充分运用所有计算能力。
第四,通过共置的数据节点和计算节点可以获得更好的性能。举例来说,如果数据在HDFS中,请在同一个HDFS集群中安装Spark。Spark会在距离数据尽可能近的位置处理这些数据。例如,它首先会尝试在数据所在计算机上执行任务。如果该计算机无法执行任务,随后会尝试使用同一机机柜的其他计算机。如果依然不可行,最后才会选择使用任意一台计算机。请尽量将磁盘和网络I/O降至最低。
这就是一些值得大家注意的,有关性能的常见注意事项。
问:目前Spark程序在安全保护方面有哪些措施?如何只让获得许可的用户或应用执行这些程序?
Guller:Spark支持两种身份验证方法:共享密钥(Shared secret)和Kerberos。共享密钥身份验证机制可以配合所有集群管理器使用:YARN、Mesos,以及独立使用。此外YARN还可将Kerberos与Spark配合使用。
Spark还支持使用SSL与SASL进行加密。SSL主要用于安全通信协议,SASL主要用于保护块传输服务。
问:如何使用Spark Web Console和其他工具监控Spark程序?通常在监控Spark程序时您会使用哪些度量指标?
Guller:Spark提供了完善的监控能力。我的书中有一章专门介绍了这个话题。Spark不仅可以暴露各种度量指标,而且针对Spark集群和其中运行的应用程序提供了基于Web的监控界面。此外还能支持第三方监控工具,例如Graphite、Ganglia以及基于JMX的监控应用。
我会在性能优化和调试过程中进行监控。具体选择的度量指标取决于打算要解决的问题。例如,可以使用监控界面检查集群状态以及应用程序的资源分配情况。同理,也可以使用监控界面查看应用程序所提交的作业中的并行数量。另外还可以查看不同任务处理的数据量和所用时间。这些信息可以帮你找出卡滞的任务,当然这些只是几个简单的例子。
问:您期待在以后发布的Spark版本中见到什么新功能?
Guller:Spark开发者社区在每个新版本中都在尽全力改善Spark。因此我的期待并不重要。但我希望看到更多与机器学习有关的新功能。
另外我觉得Spark还缺少一样东西:针对Scala开发者提供的图表或数据绘图(Plotting)库。探索式可视化是数据分析的重要一环,R开发者可以使用ggplot2,Python有matplotlib,Scala开发者要是也有类似的技术就太好了。
另外我还希望看到Spark的统计和机器学习库能够赶上R提供的类似技术。最后,我还希望能够通过更好的支持让用户使用PMML和PFA等标准导出和导入机器学习模型。
问:Spark Machine Learning目前提供了多种不同算法。你是否看到有其他ML库能够为组织的机器学习和数据科学需求提更多价值?
Guller:你说的没错,Spark的机器学习库提供了丰富的算法,并且每个新版都增加了新的算法。
Spark可以配合外部机器学习库使用,因此无论Spark缺乏哪种能力,都可以通过其他库弥补。例如,Stanford CoreNLP库配合Spark使用可以执行NLP-heavy机器学习任务,类似的SparkNet、CaffeOnSpark、DeepLearning4J或TensorFlow也可以与Spark配合使用实现更深入的学习。
Guller还谈到了Spark框架为用户提供的价值。
Guller:Spark是一个很棒的大数据分析和处理框架,非常易于使用,针对不同任务提供了丰富的库。此外它还针对非常大规模数据集的处理提供了扩展能力和极高的速度。任何需要处理大数据或进入大数据领域的用户都有必要掌握。
他同时还提到有很多人向他询问Hadoop和Spark之间的关系,并回答了两个最长听到的问题。
问: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。
问:为什么有人使用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计算机中心的计算机应用硕士学位。
结语
感谢您的观看,如有不足之处,欢迎批评指正。
如果有对大数据感兴趣的小伙伴或者是从事大数据的老司机可以加群:
658558542
里面整理了一大份学习资料,全都是些干货,包括大数据技术入门,海量数据高级分析语言,海量数据存储分布式存储,以及海量数据分析分布式计算等部分,送给每一位大数据小伙伴,这里不止是小白聚集地,还有大牛在线解答!欢迎初学和进阶中的小伙伴一起进群学习交流,共同进步!
最后祝福所有遇到瓶颈的大数据程序员们突破自己,祝福大家在往后的工作与面试中一切顺利。