Preface前言这是一本关于机器学习的书,它以Scala为重点,介绍了函数式编程方法以及如何在Spark上处理大数据。九个月前,当我受邀写作本书时,我的第一反应是:Scala、大数据、机器学习,每一个主题我都曾彻底调研过,也参加了很多的讨论,结合任何两个话题来写都具有挑战性,更不用说在一本书中结合这三个主题。这个挑战激发了我的兴趣,于是就有了这本书。并不是每一章的内容都像我所希望的那样圆满,但技术每天都在快速发展。我有一份具体的工作,写作只是表达我想法的一种方式。
下面先介绍机器学习。机器学习经历了翻天覆地的变换;它是由人工智能和统计学发展起来的,于20世纪90年代兴起。后来在2010年或稍晚些时候诞生了数据科学。数据科学家有许多定义,但JoshWills的定义可能最通俗,我有幸在Cloudera工作时和他共事过。这个定义在图1中有具体的描述。虽然细节内容可能会有争议,但数据科学确实是几个学科的交叉,数据科学家不一定是任何一个领域的专家。据JeffHammerbacher(Cloudera的创始人,Facebook的早期员工)介绍,第一位数据科学家工作于Facebook。Facebook需要跨学科的技能,以便从当时大量的社交数据中提取有价值的信息。虽然我自称是一个大数据科学家,但我已经关注这个交叉领域很久了,以至于有太多知识出现混淆。写这本书就是想使用机器学习的术语来保持对这些领域的关注度。
图1数据科学家的一种可能定义最近,在机器学习领域出现了另一个被广泛讨论的话题,即数据量击败模型的复杂度。在本书中可以看到一些SparkMLlib实现的例子,特别是NLP的word2vec。机器学习模型可以更快地迁移到新环境,也经常击败需要数小时才能构建的更复杂的模型。因此,机器学习和大数据能够很好地结合在一起。
最后也很重要的一点是微服务的出现。作者在本书中花了大量的篇幅介绍机器和应用程序通信,所以会很自然地提及Scala与Akkaactor模型。
对于大多数程序员而言,函数式编程更多是关于编程风格的变化,而不是编程语言本身。虽然Java8开始有来自函数式编程的lambda表达式和流,但是人们仍然可以在没有这些机制的情况下编写函数式代码,甚至可以用Scala编写Java风格的代码。使得Scala在大数据世界中名声鹊起的两个重要思想是惰性求值和不可变性,其中惰性求值可大大简化多线程或分布式领域中的数据处理。Scala有一个可变集合库和一个不可变集合库。虽然从用户的角度来看它们的区别很小,但从编译器的角度来看,不变性大大增加了灵活性,并且惰性求值能更好地与大数据相结合,因为REPL将大多数信息推迟到管道的后期处理,从而增加了交互性。
大数据一直备受关注,其主要原因是机器产生的数据量大大超越了人类在没有使用计算机以前的数量。Facebook、Google、Twitter等社交网络公司已经证明专门用于处理大数据的工具(如Hadoop、MapReduce和Spark)可以从这些数据块中提取丰富的信息。
本书后面将介绍关于Hadoop的内容。最初它能在廉价硬件上处理大量的信息,因为当时传统的关系数据库不能处理这样的信息(或能处理,但是代价过高)。大数据这个话题太大了,而Spark才是本书的重点,它是HadoopMapReduce的另一个实现,Spark提高了磁盘上持久化保存数据的效率。通常认为使用Spark有点贵,因为它消耗更多的内存,要求硬件必须更可靠,但它也更具交互性。此外,Spark使用Scala工作(也可以使用Java和Python等),但Scala是主要的API语言。因此Spark用Scala在数据管道的表达方面有一定的协同性。
本书主要内容第1章介绍数据分析师如何开始数据分析。除了允许用户使用新工具查看更大的数据集以外,该章并没有什么新东西。这些数据集可能分布在多台计算机上,但查看它们就像在本地机器上一样简单。当然,不会阻止用户在单个机器上顺序执行程序。但即使如此,作者写作的这个笔记本电脑也有四个核,可同时运行1377个线程。Spark和Scala(并行集合)允许用户透明地使用整个设备,有时并没有显式指定需要并行运行。现代服务器可对OS服务使用多达128个超线程。该章将展示如何使用新工具来进行数据分析,并用它来研究以前的数据集。
第2章介绍在Scala/Spark之前一直存在的数据驱动过程,也会介绍完全数据驱动的企业,这类企业通过多台数据生成机器的反馈来优化业务。大数据需要新的技术和架构来适应新的决策过程。该章借鉴了一些学术资料来阐述数据驱动型业务的通用架构。在这种架构下,大多数工人的任务是监控和调整数据管道。
第3章重点介绍Spark的体系结构,它是前面提及的HadoopMapReduce的替代者(或补充)。该章还将特别介绍MLlib所支持的几个算法。虽然这是一个崭新的话题,但许多算法都对应着各种实现。该章将给出一些例子,比如怎样运行org.apache.spark.mllib包中标准的机器学习算法。最后介绍Spark的运行模式及性能调整。
第4章介绍机器学习的原理,虽然SparkMLlib的内容可能会不断变化,但这些原理是不会变的。监督学习和无监
TheTranslator'sWords译者序大数据是当前热门的话题,其特点为数据量巨大,增长速度快,拥有各种类型。分布式机器学习是一种高效处理大数据的方法,其目的是从大数据中找到有价值的信息。目前各大互联网公司都投入巨资研究分布式机器学习。
在实现分布式机器学习算法时,函数式编程有天生的优势。这是因为函数式编程不会共享状态,也不会造成资源竞争。Scala是一种优秀的函数式编程语言,同时它也是基于Java虚拟机的面向对象的编程语言。使用Scala编程非常方便快捷。
Spark是2009年出现的一种基于内存的分布式计算框架,它的处理速度比经典的分布式计算框架Hadoop快得多。Spark的核心部分是由Scala实现的。Spark对于处理迭代运算非常有效,而分布式机器学习算法经常需要迭代运算,因此Spark能很好地与机器学习结合在一起。
本书共10章,介绍了如何使用Scala在Spark平台上实现机器学习算法,其中Scala的版本为2.11.7,Spark采用基于Hadoop2.6的版本,这些都是比较新的版本。本书从数据分析师怎么开始数据分析入手,介绍了数据驱动过程和Spark的体系结构;通过操作SparkMLlib库,介绍了机器学习的基本原理及MLlib所支持的几个算法;接着介绍了Scala如何表示和使用非结构化数据,以及与图相关的话题;再接着介绍了Scala与R和Python的集成;最后介绍了一些特别适合Scala编程的NLP常用算法及现有的Scala监控解决方案。总之,本书非常适合从事分布式机器学习的数据工作者,使用书中提供的大量针对性编程例子,可提高工程实战能力。
本书的第1~3章和第7章由重庆工商大学计算机科学与信息工程学院刘波博士翻译;第4~6章和第8~10章由重庆工商大学计算机科学与信息工程学院罗棻翻译。同时,刘波博士负责全书的技术审校工作。
翻译本书的过程也是译者不断学习的过程。为了保证专业词汇翻译的准确性,我们在翻译过程中查阅了大量相关资料。但由于时间和能力有限,书中内容难免出现差错。若有问题,读者可通过电子邮件(liubo7971@163.com;luofcn@163.com)与我们联系,欢迎一起探讨,共同进步。并且,我们也会将最终的勘误信息公布在http://www.cnblogs.com/mlcv/上。
本书的顺利出版还要特别感谢机械工业出版社华章公司的编辑在翻译过程中给予的帮助!
本书的翻译也得到如下项目资助:(1)国家自然科学基金一般项目,非同步脉冲神经膜系统研究,项目号:61502063;(2)重庆市检测控制集成系统工程实验室新技术新产品开放课题,基于图像内容的目标检测算法及应用研究,项目号:KFJJ2016042。