Skip to content

Latest commit

 

History

History
209 lines (127 loc) · 24.5 KB

File metadata and controls

209 lines (127 loc) · 24.5 KB

十一、构建数据科学应用

数据科学应用程序正在获得大量的兴奋,主要是因为它们在利用数据和提取可消费的结果方面的承诺。已经有几个成功的数据产品对我们的日常生活产生了变革性的影响。无处不在的推荐系统、垃圾邮件过滤器、定向广告和新闻内容已经成为生活的一部分。音乐和电影已经成为从 iTunes 和网飞等提供商流出的数据产品。企业,尤其是零售等领域的企业,正在积极寻求通过使用数据驱动的方法研究市场和客户行为来获得竞争优势的方法。

在前面的章节中,我们已经讨论了模型构建阶段之前的数据分析工作流。但是模型的真正价值在于它实际部署在生产系统中的时候。最终产品是数据科学工作流的成果,是可操作的数据产品。在本章中,我们将讨论数据分析工作流的这一最终阶段。我们不会进入实际的代码片段,而是后退一步,获得完整的图片,包括非技术方面。

完整的画面不仅限于开发过程。它包括用户应用程序、Spark 本身的发展,以及大数据领域发生的快速变化。我们将首先从用户应用程序的开发过程开始,并讨论每个阶段的各种选项。然后我们将深入研究最新的 Spark 2.0 版本和未来计划中的特性和增强功能。最后,我们将尝试对大数据趋势,尤其是 Hadoop 生态系统给出一个大致的概述。参考资料和有用的链接包含在章节末尾的单独章节中,以获得关于特定上下文的更多信息。

开发范围

数据分析工作流可以大致分为两个阶段,构建阶段和操作阶段。第一阶段通常是一次性运动,有大量的人为干预。一旦我们获得了合理的最终结果,我们就可以开始操作产品了。第二阶段从第一阶段生成的模型开始,并使它们成为某些生产工作流程的一部分。在本节中,我们将讨论以下内容:

  • 预期
  • 演示选项
  • 开发和测试
  • 数据质量管理

期望

数据科学应用的主要目标是建立“可操作”的见解,可操作是关键词。许多用例,如欺诈检测,需要以一种可消费的方式,近乎实时地生成和提供洞察力,如果你期望任何行动能力的话。数据产品的最终用户因用例而异。他们可能是电子商务网站的客户,也可能是大型企业集团的决策者。最终用户不必总是人。它可能是金融机构的风险评估软件工具。一刀切的方法不适用于许多软件产品,数据产品也不例外。但是,对数据产品有一些共同的期望,如下所列:

  • 第一个也是最重要的期望是,基于真实世界数据的洞察生成时间框架应该在“可操作的”时间框架内。实际的时间框架因用例而异。

  • 数据产品应该集成到一些(通常已经存在的)生产工作流程中。

  • 这些见解应该转化为人们可以使用的东西,而不是模糊的数字或难以解释的图表。演示应该不引人注目。

  • 数据产品应该能够根据输入的数据进行微调(自适应)。

  • 理想情况下,必须有某种方式来接收人类的反馈,这些反馈可以作为自我调整的来源。

  • 应该有一种机制,定期自动定量评估其有效性。

演示选项

数据产品的多样性要求不同的呈现方式。有时,数据分析练习的最终结果是发表一篇研究论文。有时它可能是仪表板的一部分,成为在单个网页上发布结果的几个来源之一。它们可能是公开的,以人类消费为目标,或者是隐蔽的,并被输入到其他软件应用程序中。您可以使用诸如 Spark 这样的通用引擎来构建您的解决方案,但是演示必须与目标用户群高度一致。

有时候,你所需要做的就是写一封电子邮件,附上你的发现,或者只是导出一个关于见解的 CSV 文件。或者,您可能需要围绕您的数据产品开发一个专用的 web 应用程序。这里讨论了其他一些常见的选择,你必须选择适合当前问题的正确选择。

互动笔记本

交互式笔记本是网络应用程序,允许您创建和共享包含代码块、结果、公式、图像、视频和解释文本的文档。它们可以被视为具有可视化和方程支持的可执行文档或 REPL 壳。这些文档可以导出为 pdf、Markdown 或 HTML。笔记本包含几个执行代码块的“内核”或“计算引擎”。

如果数据分析工作流的最终目标是生成书面报告,交互式笔记本是最合适的选择。有几款笔记本,很多都有 Spark 支持。这些笔记本也是探索阶段的有用工具。在前面的章节中,我们已经介绍了 IPython 和齐柏林飞艇笔记本。

参考文献

Web API

一个应用编程接口 ( API )是一个软件到软件的接口;描述可用功能、必须如何使用以及输入和输出是什么的规范。软件(服务)提供商将其部分功能公开为应用编程接口。开发人员可以开发使用该应用编程接口的软件组件。例如,Twitter 提供了一些 API,可以在 Twitter 上获取或发布数据,或者以编程方式查询数据。Spark 发烧友可能会编写一个软件组件,自动收集#Spark 上的所有推文,根据他们的要求进行分类,并在他们的个人网站上发布这些数据。网络应用编程接口是一种应用编程接口,其中接口被定义为一组超文本传输协议 ( HTTP )请求消息以及响应消息结构的定义。如今,代表性状态转移已经成为事实上的标准。

您可以将您的数据产品实现为一个应用编程接口,这可能是最强大的选择。然后,它可以插入一个或多个应用程序,比如管理仪表板以及营销分析工作流。您可以将特定领域的“洞察即服务”开发为带有订阅模型的公共网络应用编程接口。网络应用编程接口的简单性和普遍性使它们成为构建数据产品最引人注目的选择。

参考文献

PMML 和 PFA

有时,您可能必须以其他数据挖掘工具可以理解的方式公开您的模型。模型以及完整的预处理和后处理步骤应转换为标准格式。PMML 和 PFA 是数据挖掘领域中的两种标准格式。

预测模型标记语言 ( PMML )是一种基于 XML 的预测模型交换格式,Apache Spark API 开箱即用地将模型转换为 PMML。PMML 消息可能包含无数的数据转换以及一个或多个预测模型。不同的数据挖掘工具可以导出或导入 PMML 消息,而不需要自定义代码。

分析的可移植格式 ( PFA )是下一代预测模型交换格式。它交换 JSON 文档,并继承了 JSON 文档相对于 XML 文档的所有优点。此外,PFA 比 PMML 更灵活。

参考文献

开发和测试

Apache Spark 是一个通用的集群计算系统,它可以自己运行,也可以通过几个现有的集群管理器运行,如 Apache Mesos、Hadoop、that 和 Amazon EC2。此外,几家大数据和企业软件公司已经将 Spark 集成到他们的产品中:微软 Azure HDInsight、Cloudera、IBM Analytics for Apache Spark、SAP HANA 等等。由 Apache Spark 的创建者创建的公司 Databricks 拥有自己的数据科学工作流产品,从摄取到生产。您的责任是了解您的组织要求和现有人才库,并决定哪个选项最适合您。

无论选择哪种选项,在任何软件开发生命周期中都要遵循通常的最佳实践,例如版本控制和同行评审。尽可能使用高级 API。生产中使用的数据转换管道应该与构建模型中使用的管道相同。记录数据分析工作流程中出现的任何问题。这些通常会导致业务流程的改进。

一如既往,测试对于产品的成功极其重要。您必须维护一组自动化脚本,这些脚本提供易于理解的结果。测试案例至少应包括以下内容:

  • 遵守时间表和资源消耗要求
  • 对坏数据的弹性(例如,数据类型违规)
  • 模型构建阶段未遇到的分类特征中的新值
  • 目标生产系统中预期的数据很少或太多

监控日志、资源利用率等,以发现任何性能瓶颈。Spark 用户界面提供了丰富的信息来监控 Spark 应用程序。以下是一些帮助您提高性能的常见提示:

  • 缓存任何可能被多次使用的输入或中间数据。
  • 查看 Spark 用户界面,找出引起大量混乱的工作。检查代码,看看是否可以减少洗牌。
  • 操作可以将数据从工作人员传输到驱动程序。确保您没有传输任何非绝对必要的数据。
  • 散兵游勇;跑得比别人慢;“可能会增加整体工作完成时间。散兵游勇可能有几个原因。如果一个作业由于慢节点而运行缓慢,您可以将spark.speculation设置为true。然后 Spark 会自动在不同的节点上重新启动这样的任务。否则,你可能不得不重新审视这个逻辑,看看它是否可以改进。

参考文献

数据质量管理

首先,我们不要忘记,我们正在尝试从不可靠的、通常是非结构化的和不受控制的数据源构建容错软件数据产品。因此,数据质量管理在数据科学工作流中变得更加重要。有时,数据可能仅来自受控的数据源,例如组织中的自动化内部流程工作流。但是在所有其他情况下,您需要精心设计数据清理过程来保护后续处理。

元数据由数据的结构和含义组成,显然是最关键的存储库。它是关于单个数据源的结构以及该结构中每个组件的含义的信息。您可能无法总是编写一些脚本并提取这些数据。单个数据源可能包含具有不同结构的数据,或者单个组件(列)在不同时间可能意味着不同的事情。诸如 owner 或 high 之类的标签在不同的数据源中可能意味着不同的东西。收集和理解所有这些细微差别和记录是一项乏味的迭代任务。元数据的标准化是数据转换开发的先决条件。

这里列出了一些适用于大多数用例的广泛准则:

  • 所有数据源都必须有版本和时间戳
  • 数据质量管理过程通常需要最高当局的参与
  • 屏蔽或匿名化敏感数据
  • 经常被遗漏的一个重要步骤是保持可追溯性;每个数据元素(比如一行)与其原始源之间的链接

斯卡拉优势

Apache Spark 允许您用 Python、R、Java 或 Scala 编写应用程序。有了这种灵活性,就有责任为您的需求选择合适的语言。但是不管您通常选择哪种语言,您可能都希望考虑将 Scala 用于您的 Spark 支持的应用程序。在本节中,我们将解释原因。

让我们先离题,对命令式和函数式编程范式有一个高层次的理解。C、Python 和 Java 等语言属于命令式编程范式。在命令式编程范式中,程序是一系列指令,它有一个程序状态。程序状态通常表示为一组变量及其在任何给定时间点的值。指派和重新指派相当普遍。变量值预计会在一个或多个函数的执行期间发生变化。函数中的变量值修改不限于局部变量。全局变量和公共类变量就是这类变量的一些例子。

相比之下,用函数式编程语言(如 Erlang)编写的程序可以被视为无状态表达式求值器。数据是不可变的。如果用同一组输入参数调用一个函数,那么它将产生相同的结果(即,引用透明性)。这是可能的,因为没有来自全局变量等形式的变量上下文的干扰。这意味着功能评估的顺序并不重要。函数可以作为参数传递给其他函数。递归调用替换循环。状态的缺失使得并行编程变得更加容易,因为它消除了对锁定和可能的死锁的需要。当执行顺序不那么重要时,协调就变得简单了。这些因素使得函数式编程范式非常适合并行编程。

纯函数式编程语言很难使用,因为大多数程序都需要改变状态。大多数函数式编程语言,包括很好的老 Lisp,都允许在变量中存储数据(副作用)。Scala 等一些语言借鉴了多种编程范式。

回到 Scala,它是一种基于 JVM 的、静态类型的多范例编程语言。它内置的类型推断机制允许程序员省略一些冗余的类型信息。这给人一种由动态语言提供的灵活性的感觉,同时保留了更好的编译时检查和快速运行时的健壮性。Scala 是一种面向对象的语言,因为每个值都是一个对象,包括数值。函数是一级对象,可以用作任何数据类型,并且可以作为参数传递给其他函数。Scala 与 Java 及其工具的互操作性很好,因为 Scala 运行在 JVM 上。Java 和 Scala 类可以自由混合。这意味着 Scala 可以轻松地与 Hadoop 生态系统交互。

当您为应用程序选择正确的编程语言时,应该考虑所有这些因素。

Spark 发展现状

截至 2015 年底,就贡献者数量而言,Apache Spark 已成为 Hadoop 生态系统中目前最活跃的项目。Spark 于 2009 年在加州大学伯克利分校 AMPLAB 开始作为一个研究项目,与 Apache Hadoop 等项目相比,它仍然相对年轻,并且仍在积极开发中。2015 年发布了三个版本,从 1.3 到 1.5,分别包含数据框架应用编程接口、SparkR 和钨项目等功能。1.6 版于 2016 年初发布,包括新的数据集应用编程接口和数据科学功能的扩展。Spark 2.0 于 2016 年 7 月发布,作为一个主要版本,它有许多新特性和增强功能,值得拥有自己的一部分。

Spark 2.0 的特性和增强功能

Apache Spark 2.0 包括三个主要的新特性和其他几个性能改进和幕后变化。本节试图给出一个高层次的概述,但也要深入细节,以便在需要时给出概念性的理解。

统一数据集和数据框架

数据框架是支持数据抽象的高级应用编程接口,在概念上相当于关系数据库中的表或 R 和 Python(pandas 库)中的数据框架。数据集是数据框架应用编程接口的扩展,它提供了一个类型安全、面向对象的编程接口。数据集向数据框添加静态类型。在数据帧上定义一个结构可以为核心提供信息,从而实现优化。它还有助于在早期捕捉分析错误,甚至在分布式作业开始之前。

关系数据库、数据集和数据框架是可以互换的。RDDs 仍然是低级 API。数据帧、数据集和 SQL 共享相同的优化和执行管道。机器学习库采用数据帧或数据集。数据帧和数据集都在钨上运行,这是一项提高运行时性能的举措。它们利用了钨的快速内存编码,负责在 JVM 对象和 Spark 的内部表示之间进行转换。同样的应用编程接口也适用于流,引入了连续数据帧的概念。

结构化流

结构流应用编程接口是建立在 Spark SQL 引擎上的高级应用编程接口,用于扩展数据帧和数据集。结构化流统一了流、交互和批处理查询。在大多数用例中,流数据需要与批处理和交互式查询相结合,以形成连续的应用程序。这些应用编程接口旨在满足这一需求。Spark 负责在流数据上增量地、连续地运行查询。

结构化流的第一个版本将专注于 ETL 工作负载。用户将能够指定输入、查询、触发器和输出类型。输入流在逻辑上等同于只追加的表。用户定义查询就像他们在传统的 SQL 表上定义查询一样。触发是一个时间框架,比如一秒钟。提供的输出模式是完整输出、增量或适当的更新(例如,数据库表)。

举个例子:您可以将数据聚合到一个流中,使用 Spark SQL JDBC 服务器为其提供服务,并将其传递给数据库,如用于下游应用程序的 MySQL。或者,您可以运行针对最新数据的临时 SQL 查询。您还可以构建和应用机器学习模型。

钨项目二期

钨项目背后的中心思想是通过本机内存管理和运行时代码生成使 Spark 的性能更接近裸机。它首先包含在 Spark 1.4 中,并在 1.5 和 1.6 中增加了增强功能。它侧重于大幅提高 Spark 应用程序的内存和 CPU 效率,主要通过以下方式:

  • 显式管理内存并消除 JVM 对象模型和垃圾收集的开销。例如,在 JVM 对象模型中,一个四字节的字符串将占用大约 48 个字节。由于 Spark 不是通用应用程序,并且比垃圾收集器更了解内存块的生命周期,因此它可以比 JVM 更有效地管理内存。
  • 设计缓存友好的算法和数据结构。
  • Spark 执行代码生成,将部分查询编译成 Java 字节码。这个范围正在扩大,以涵盖大多数内置表达式。

Spark 2.0 推出了第 2 阶段,速度快了一个数量级,包括:

  • 通过移除昂贵的迭代器调用和跨多个运算符进行融合来生成全阶段代码,从而使生成的代码看起来像手动优化的代码
  • 优化的输入和输出

店里有什么?

Apache Spark 2.1 预计具有以下特点:

  • 连续 SQL ( CSQL )
  • 商业智能应用集成
  • 支持更多流源和接收器
  • 包含用于结构化流的附加操作符和库
  • 对机器学习包的增强
  • 钨中的柱状内存支持

大数据趋势

大数据处理一直是信息技术行业不可或缺的一部分,在过去十年中更是如此。Apache Hadoop 和其他类似的努力都集中在构建存储和处理大量数据的基础设施上。经过 10 多年的发展,Hadoop 平台被认为是成熟的,几乎是大数据处理的代名词。Apache Spark 是一个通用计算引擎,可以很好地与 is 协同工作,并且不限于 Hadoop 生态系统,它在 2015 年非常成功。

构建数据科学应用程序需要了解大数据环境以及现成的软件产品。我们需要仔细规划出符合我们要求的正确区块。有几个功能重叠的选项,选择合适的工具说起来容易做起来难。应用程序的成功在很大程度上取决于技术和流程的正确组合。好消息是,有几个开源选项可以降低大数据分析的成本;同时,您还拥有由 Databricks 等公司支持的企业级端到端平台。除了手头的用例之外,跟踪行业总体趋势也同样重要。

最近拥有自己的接口的 NOSQL 数据存储的激增正在增加基于 SQL 的接口,尽管它们不是关系数据存储,并且可能不符合 ACID 属性。这是一个受欢迎的趋势,因为跨关系和非关系数据存储聚合到一个单一的、古老的接口可以提高程序员的工作效率。

在过去的几十年里,操作(OLTP)和分析(OLAP)系统一直作为独立的系统进行维护,但这是融合发生的又一个地方。这种融合为我们带来了近乎实时的用例,例如欺诈防范。Apache Kylin 是 Hadoop 生态系统中的一个开源分布式分析引擎,它提供了一个规模极快的 OLAP 引擎。

物联网的出现加速了实时和流分析,带来了大量新的用例。云将组织从运营和信息技术管理开销中解放出来,使他们能够专注于核心能力,尤其是在大数据处理方面。基于云的分析引擎、自助数据准备工具、自助 BI、即时数据仓库、高级分析、富媒体分析和敏捷分析是一些常用的流行语。大数据这个术语本身正在慢慢蒸发或变得含蓄。

大数据领域有大量功能重叠的软件产品和库,如下图所示(http://matt sourck . com/WP-content/uploads/2016/02/matt _ turck _ big _ data _ landscape _ v 11 . png)。为您的应用程序选择正确的块是一项艰巨但非常重要的任务。这里有一个让你开始的项目的简短列表。该列表不包括像 Cassandra 这样的流行名称,并试图包括具有补充功能的模块,这些模块主要来自 Apache 软件基金会:

  • Apache Arrow(https://arrow.apache.org/)是内存中的柱状层,用于加速分析处理和交换。这是一种高性能、跨系统和内存数据表示,有望带来 100 倍的性能提升。

  • Apache 拼花(https://parquet.apache.org/)是柱状存储格式。Spark SQL 支持读写拼花文件,同时自动捕获数据结构。

  • Apache Kafka(http://kafka.apache.org/)是一个流行的、高吞吐量的分布式消息系统。Spark streaming 有一个直接的 API 来支持从 Kafka 接收流数据。

  • Alluxio(http://alluxio.org/)以前称为快子,是一个以内存为中心的虚拟分布式存储系统,支持以内存速度跨集群共享数据。它的目标是成为大数据事实上的存储统一层。Alluxio 位于 Spark 等计算框架和亚马逊 S3、HDFS 等存储系统之间。

  • graph frames(https://databricks . com/blog/2016/03/03/introduction-graph frames . html)是一个基于 DataFrames API 构建的 Apache spark 图形处理库。

  • Apache Kylin(http://kylin.apache.org/)是一款分布式分析引擎,旨在 Hadoop 上提供 SQL 接口和多维分析(OLAP),支持超大数据集。

  • Apache Sentry(http://sentry.apache.org/)是一个对存储在 Hadoop 集群上的数据和元数据实施基于角色的细粒度授权的系统。在撰写本书时,它正处于孵化阶段。

  • Apache Solr(http://lucene.apache.org/solr/)是一个极快的搜索平台。查看此演示文稿以整合 Solr 和 Spark。

  • TensorFlow(https://www.tensorflow.org/)是一个机器学习库,内置了对深度学习的广泛支持。查看这个博客,了解它如何与 Spark 一起使用。

  • 齐柏林飞艇(http://zeppelin.incubator.apache.org/)是一款基于网络的笔记本电脑,支持交互式数据分析。它包含在数据可视化一章中。

总结

在最后一章中,我们讨论了如何使用 Spark 构建真实世界的应用程序。我们讨论了由数据分析工作流的技术和非技术方面组成的大局。

参考文献

  • Spark Summit 网站有大量关于 Apache Spark 和已完成活动的相关项目的信息
  • kd 掘金采访 Matei Zaharia
  • 为什么 Spark 在 2015 年由马修·梅奥从 kd 掘金达到了临界点
  • 上线:准备您的第一个 Spark 生产部署是一个非常好的起点
  • *什么是 Scala?*来自 Scala 主页
  • Scala 的创造者马丁·奥德斯基解释了 Scala 融合命令式编程和函数式编程的原因