前言
本书适合哪些读者
本书针对专业的软件从业人员,他们可能经常与数据打交道,或者希望在流处理领域提高相应的知识技能,或者已经了解Apache Spark,又或者希望利用Apache Spark 来构建流式应用。
本书对于流处理背后的概念进行了全面的介绍。这些概念是理解Apache Spark 两种流式API(Structured Streaming 和Spark Streaming)的基础。
对于这些API 我们会进行深入研究,并对其特性、应用详细介绍,以及根据实践经验提供相应建议。
除了介绍API 和实际应用之外,我们还讨论了流处理的高级技巧。
所有人都值得仔细阅读这篇序言,只不过专业经验更加丰富的读者可能会从高级技巧的篇章中受益更多,并知道如何进一步学习。
这里并未假定你所需的Spark 基础知识,但如果你对于Spark 数据处理不熟悉,需要注意本书的核心是Spark 流式API 及其功能。关于Spark 功能以及相关生态的基础知识,我们推荐Bill Chambers 和Matei Zaharia 所著的《Spark: The Definitive Guide》。
本书所使用的编程语言为Scala。虽然Spark 在Scala 之外还提供了Java、Python,以及R 语言的支持,但是我们仍然认为Scala 是流式编程的首选语言。虽然很多代码示例可以被翻译为其他语言,但是在某些领域(比如复杂的状态计算)Scala 还是最合适的编程语言。
安装Spark
Spark 是Apache 基金会正式托管的Apache 开源项目,不过大部分人都是在Github
上对其进行开发。你可以在以下地址下载二进制预编译包:https://spark.apache.org/downloads.html。
你可以将Spark 运行在一台或者多台机器上,这一点我们会稍后解释。目前对于主要的Linux 发行版Spark 都有对应的安装包,这对于安装来说很方便。
本书我们所使用的代码示例都是兼容Spark 2.4.0 版本的,除了少量的输出和格式化细节之外,这些示例应该能够兼容Spark 的未来版本。
另外由于Spark 是运行在Java 虚拟机(JVM)上的,所以你需要安装它,并且在Spark 组件运行的所有机器上都可以访问。
对于安装Java 开发包(JDK),我们推荐使用OpenJDK,它一般已经被打包在多数系统中了。
当然,你也可以安装Oracle JDK。
与Scala 程序类似,Spark 也是运行在JDK 6 或者更高版本的系统上。现在推荐的Spark 所依赖Java 版本是:
• Spark 2.0 以下版本,推荐Java 7。
• Spark 2.0 及其以上版本,推荐Java 8。
Scala 基础
本书中的代码示例由Scala 编写。它也是Spark 核心的实现语言,但它并非唯一可用的语言,Spark 也提供了Python、Java,以及R 语言的API。
Scala 是目前世界上特性最完备的编程语言之一,因为它同时提供了函数式与面向对象的支持。而且,它的简洁性和类型推断机制让其语法易于理解。
从教育学的角度来看,Scala 作为一门初学语言有很多优势,其中最重要的是它的语法规则以及语义表示。
——Björn Regnell,隆德大学
因此,我们希望本书的示例足够简洁,让任何读者都能够理解其含义。对于想要Scala 入门教程以及喜欢通过书籍学习的读者来说,我们推荐《Atomic Scala》[Eckel2013]。还有些读者可能只是想要一本参考书来扩展知识, 那么推荐《Programming in Scala》[Odersky2016]。
学习指引
本书分为五个部分:
• 第一部分继续深入讲解我们在序言中提到的这些概念。我们将会介绍流处理的基本概念及其实现架构,深入学习Spark。
• 第二部分,我们会学习Structured Streaming 及其编程模型,以及如何实现流处理程序,包括从简单的无状态转换到高级的有状态操作。还会讨论与监控工具的集成从而支持24/7 级别的运维,以及目前还在开发阶段的实验性模块。
• 第三部分,我们会学习Spark Streaming。与Structured Streaming 类似,我们会学习如何创建流处理程序,管理Spark Streaming 作业,并与Spark 中其他API集成。最后会简要介绍性能调优的相关内容。
• 第四部分将介绍流处理的高级技巧,用概率数据结构和近似技术解决流处理中的一些挑战,并探讨Spark Streaming 对于在线机器学习方面的局限。
• 第五部分谈到Apache Spark 之外的世界。我们调研了其他的流处理器,并提供进一步学习Spark 以及流处理相关内容的方法路径。
这里推荐你通过第一部分的阅读来理解流处理中的概念。这会对于理解接下来的相关术语和概念很有帮助。
第二部分介绍Structured Streaming,第三部分介绍Spark Streaming,内容结构与前者类似。你可以选择其中一个,这取决于你的兴趣和当前的优先级:
• 你可能正在启动一个新项目或者希望了解Structured Streaming ?那么可以从第二部分开始阅读。
• 你当前的项目已经使用了Spark Streaming,而你又希望更加了解它?那么请从第三部分开始阅读。
第四部分则对于概率结构背后的数学知识进行了深入介绍,正所谓“坎坷前面是美景”。
第五部分将Spark 流处理与其他流处理框架进行比较,有助于你尝试多种技术选型并确认最终方案。
本书在线资源可以对你的学习进行补充,其中notebooks 以及代码可以自行尝试。
当然也可以使用其中的代码来开始自己的项目。在线资源的地址是https://github.com/stream-processing-with-spark。
我们非常高兴能够把这些知识以及自身经验记录下来,希望你能够喜欢上这本书。
参考书籍
• [Eckel2013] Eckel, Bruce and Dianne Marsh, Atomic Scala (Mindview LLC, 2013).
• [Odersky2016] Odersky, Martin, Lex Spoon, and Bill Venners, Programming in Scala, 3rd ed. (Artima Press, 2016).
排版约定
在本书中使用以下排版约定:
斜体字(Italic)
表示新的术语、URL 网址、email 地址、文件名和文件扩展名。
等宽字体(Constant width)
表示代码行以及段落内引用的程序中的元素,如变量或函数名、数据库、数据类型、环境变量、语句和关键词。
等宽黑体(Constant width bold)
表示由用户输入的命令或其他文本。
等宽斜体(Constant width italic)
表示应替换为用户提供的值或由上下文确定的值的文本。
使用示例代码
本书在线资源中的补充资料(交互式的notebooks、工程代码示例,以及一些项目)可以扩充你的学习,帮助你进行尝试、理解相关的技术知识。具体地址是https://github.com/stream-processing-with-spark。
需要注意的是,notebooks 需要运行在Spark Notebook 上。Spark Notebook 是一个基于Web 的交互式编程环境,主要使用Scala 来运行Apache Spark 任务。其中实时组件非常适合流处理编程使用,可用于从系统中获取的数据做可视化展示。
Spark Notebook 项目位于Github 上:https://github.com/spark-notebook/sparknotebook,也可以直接从其发布站点http://spark-notebook.io 去下载编译好的版本。
本书的目的在于帮助你更好地完成工作。通常情况下,可以在你的程序或者文档中使用本书的代码。不必联系我们获取代码的使用权,除非你需要使用大量的代码。例如,在写程序的时候引用几段代码不需要向我们申请许可。但以光盘方式销售或者重新发行O’Reilly 书中的示例则需要获得许可。引用本书或引用本书中的示例代码来回答问题也不需要申请许可。但是,如果要将本书中的大量代码加入到你的产品文档,则需要申请许可。
我们欣赏你在引用时注明出处,但不强求。引用通常包括书名、作者、出版社和ISBN。如:“Stream Processing with Apache Spark by Gerard Maas and François Garillot (O’Reilly). Copyright 2019 François Garillot and Gerard Maas Images, 978-1-491-94424-0”。
如果觉得使用示例代码的情况不属于前面列出的合理使用或许可范围,请通过电子邮件联系我们,邮箱地址为permissions@oreilly.com。
O’Reilly 在线学习平台(O’Reilly Online Learning)
近40 年来,O’Reilly Media 致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。
我们有一群独家专家和创新者,他们通过图书、文章、会议和在线学习平台分享知识和技术。O’Reilly 的在线学习平台提供按需访问的直播培训课程、详细的学习路径、交互式编程环境,以及由O’Reilly 和其他200 多家出版社出版的书籍和视频。详情请访问http://oreilly.com。
联系我们
任何有关本书的意见或疑问,请按照以下地址联系出版社。
美国:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国:
北京市西城区西直门南大街2 号成铭大厦C 座807 室(100035)
奥莱利技术咨询(北京)有限公司
本书有一个对应网页,可以看到勘误表、案例及其他相关信息,具体可以访问http://bit.ly/stream-proc-apache-spark。
发表评论或咨询有关本书的技术问题,请发送电子邮件至bookquestions@oreilly.com 邮箱。
关于我们的书籍、课程、会议和新闻的更多信息, 请参阅http://www.oreilly.com。
我们的Facebook:http://facebook.com/oreilly。
我们的Twitter:http://twitter.com/oreillymedia。
我们的YouTube:http://www.youtube.com/oreillymedia。
致谢
本书最初起源于Spark Streaming 学习手册,后来迅速发展成全面介绍Apache Spark在流处理方面的资料。这里要感谢所有的审稿人,你们宝贵的反馈促使了本书发展至今。另外特别感谢来自Datastax 的Russell Spitzer 和Facebook 的Serhat Yilmaz,以及来自Klarrio 的Giselle Van Dongen。
感谢Holden Karau 在本书草稿阶段给予的帮助和建议,以及Bill Chambers 对于我们后来新增的Structured Streaming 模块的帮助。
至于O’Reilly 的编辑Jeff Bleiel,从我们提出最初的想法到草稿版本,再到你手里拿到的这个完整版本,一直全程参与,很有耐心并积极地反馈建议。还要感谢我们在O’Reilly 所接触的第一位编辑Shannon Cutt,她为整个项目的启动提供了不少帮助。此外O’Reilly 其他人在本书撰写的各个阶段都给予了不少帮助,这才让我们走得更远。
另外还要感谢Tathagata Das 与我们之间多次的互动交流,特别是在早期写Spark Streaming 的那段时间,当时我们正在挑战这个框架所能提供的极限。
Gerard
我要感谢Lightbend 的同事对于我在写作和工作之间来回忙碌之时所给予的支持和理解。特别要感谢的是Ray Roestenburg 在我困难时刻对我的鼓励,还有DeanWampler 对于我所做出的努力一直很支持,以及Ruth Stento 对我在写作风格上给出了良好建议。
特别需要提及的是Kurt Jonckheer、Patrick Goemaere 和Lieven Gesquière,他们给予了我不少机会和空间来加深对于Spark 的理解。感谢Andy Petrella 创建的SparkNotebook,但更重要的是他那富有感染力的激情鼓励我去探索编程与数据的交集。最重要的是,我无比感谢我的妻子Ingrid,两个女儿Layla 和Juliana,以及我的母亲Carmen。如果没有她们的爱和关心以及理解,那么不可能完成这个项目。
François
非常感谢Swisscom 以及Facebook 的同事在本书写作期间给予的支持,感谢Chris Fregly、Paco Nathan 和Ben Lorica 对我的建议和支持,以及我的妻子AJung 所做的一切。