跳至主要内容

数据科学家的云计算与架构

了解数据科学家如何利用云将数据科学解决方案部署到生产环境,或扩展计算能力。
Alex Castrounis
Alex Castrounis

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续继续即表示您接受我们的 使用条款,我们的 隐私政策 ,并且您的数据存储在美国。

超越本地机器的可扩展数据科学

数据科学这个术语代表着多个重要领域的交汇点。

我认为数据科学的专业能力有几个支柱,即:

  • 业务领域
  • 概率与统计
  • 计算机科学与软件编程
  • 书面与口头沟通

所谓的第三个支柱,核心在于理解计算机科学与软件编程。

虽然对成长中的数据科学家而言,这一点可能并不立刻显而易见,但这一领域也常常包括 devops、云计算、数据管道、数据工程、不同类型数据库的查询经验、构建与部署生产级软件解决方案等内容。

此外,数据科学家需要具备扎实的编程技能,但与受过良好训练或经验丰富的软件工程师相比,他们在计算机科学、编程概念或通用的生产级软件架构与基础设施方面的教育背景或实践经验可能不及对方。任何人开始从事数据科学时,通常都会在本地计算机上安装 Python 和/或 R,然后在本地集成开发环境(IDE)中编写并运行代码,例如 Jupyter Notebook 应用或 RStudio。

同时,随着高级分析的普及和数据科学团队的壮大,对协作式交付洞见、预测分析、推荐系统等的需求日益增长。可复现研究与笔记本工具结合代码版本控制是协作的一部分方案,而利用协作型云端在线工具和平台则是另一部分。

协作需求也延伸到数据科学团队之外,尤其是因为数据科学在很大程度上是为实现业务目标而部署的。因此,数据科学项目的相关方可能包括高管、部门负责人,以及其他数据团队成员,如架构师、数据工程师、分析师等。

本文旨在让数据科学家了解本地笔记本或台式机之外的世界,特别是在将数据科学解决方案投入生产,或扩展计算能力与功能的语境下。根据您在这些主题上的经验差异,这些内容应当对各个水平的数据科学家都有所裨益。

让我们开始吧!

究竟什么是云?

啊,是的,那个声名在外却常常仍未被充分理解的“云”。尽管它听起来既假设又抽象,但云在本义上其实非常具体。在谈论云的概念之前,我们先来定义一些关键概念。

相互连接并共享资源的计算机称为一个网络,其中互联网本身就是最大、最知名的计算机网络示例。家庭网络(如局域网 LAN 或 WiFi 服务集标识 SSID),其中多台计算机相互连接,也是一个例子,尽管要小得多。这里所说的资源可以包括网页、媒体、数据存储、应用服务器、打印机等。

网络中的计算机通常称为节点,它们通过定义明确的协议彼此通信,例如超文本传输协议(HTTP)、传输控制协议(TCP)/互联网协议(IP)等。这些通信可用于状态更新、监控、请求/响应以及许多其他用途。

此外,计算机往往不在本地部署,这意味着应用与数据常常托管在位于数据中心的计算机上。这些场所提供维护并成功运行大量计算机所需的全部基础设施,如电力、制冷、安全、灾难防护等,并向企业或更广泛的外部世界提供访问。

由于计算设备与存储的成本随时间相对降低,许多解决方案如今采用多台计算机协同工作的方式来扩展,而不是通过购买单台超级强大且昂贵的计算机来扩展。协同工作的一部分目标是确保即使其中一台计算机发生故障,解决方案也能自动继续运行,同时系统还能自动扩展以应对加诸其上的负载。

Twitter、Facebook、Instagram、Snapchat、Netflix 和 YouTube 就是需要以这两种方式扩展的云端应用的典型代表。它们的应用几乎不可能“完全宕机”,且能够应对数以百万计的日活用户与其平台交互。

当某组计算机连接到同一网络并协同完成同一任务或一组任务时,这被称为一个集群。可以把集群看作一台计算机,但与单机相比,它能在性能、可用性与可扩展性上提供巨大的提升。本文后面将讨论这些优势。

分布式计算或分布式系统指的是为了利用集群执行特定任务而编写的软件与系统,例如 Hadoop、Spark 与 MapReduce。

最后,来说说云的定义。除了上面提到的共享资源外,其他重要的解决方案资源还可以包括服务器、服务、微服务、网络等。云描述的是这样一种情形:由单一方拥有、管理并运营一组联网计算机与共享资源,通常用于托管和提供基于软件的解决方案。基于此定义,尽管互联网无疑是一个网络,但它并非云,因为它不是由单一方所有。

若要更深入了解云计算,以及在创建可扩展软件与大数据架构时的关键概念探讨,欢迎查看我关于该主题的三部分深度系列。

云中的数据科学

本文已对云计算和其他相关概念进行了足够的讨论,希望能阐明相关理念。如果您目前对软件架构与工程的接触仅限于本地开发,您可能会疑惑:这与数据科学家有何关联?下面就来说明。

如果您熟悉数据科学流程,您会知道多数数据科学工作流程通常是在数据科学家的本地计算机上进行的。该计算机上安装了所选语言,如 Python 和 R,以及数据科学家偏好的 IDE。另一项主要的开发环境设置是通过诸如 Anaconda 等包管理器安装相关包,或手动安装各个包。

当开发环境就绪后,典型的数据科学工作流程或过程便会开始,而多数情况下,唯一还需要的就是数据。迭代的工作流程步骤通常包括:

  • 获取数据
  • 解析、清洗、整理、转换与净化数据
  • 分析与挖掘数据,例如探索性数据分析(EDA)、汇总统计等
  • 构建、验证与测试模型,例如预测、推荐等
    • 注意:如果不构建模型,则识别模式或趋势、生成可操作洞见、提取有用信息、创建报告等。在此,本文将这两种情况统称为“创建可交付物”。
  • 调优并优化模型或可交付物

然而,有时在本地开发环境中执行所有数据科学或大数据相关任务并不现实或不可取。以下是一些主要原因:

  • 数据集过大,无法在开发环境的系统内存(RAM)中容纳以进行模型训练或其他分析
  • 开发环境的处理能力(CPU)无法在合理或足够的时间内完成任务,甚至根本无法完成
  • 可交付物需要部署到生产环境,并可能作为组件纳入更大型的应用(例如 Web 应用、SaaS 平台等)
  • 只是更倾向于使用更快、更强大的机器(CPU、RAM 等),而不希望把必要的负载施加在本地开发机器上

当出现这些情况时,有多种可选方案。与其使用数据科学家的本地开发机器,通常会将计算工作转移到本地机房的机器,或基于云的虚拟机(例如 AWS EC2、AWS Elastic Beanstalk)。使用虚拟机及其自动伸缩集群的好处在于,可以按需创建和销毁,并可按需定制以满足计算与数据存储需求。

若将可交付物部署到生产环境,作为更大应用或数据管道的一部分来使用,则需要考虑许多选项与挑战。对此的进一步讨论超出了本文范围。

除定制开发的云端或生产级数据科学解决方案与工具外,知名厂商也提供了许多云与服务型产品,且往往能与 Jupyter 等笔记本工具良好配合。这些大多以大数据、机器学习与人工智能 API 的形式提供,包括 AWS 人工智能平台、Databricks、Google Cloud Platform 的 Datalab 与 Machine Learning 等等。

若想更详细、深入地讨论生产与开发环境中的数据科学与高级分析,包括对语言、包、框架与平台的建议,欢迎查阅我关于该主题的三部分系列。我关于可扩展软件与大数据架构的系列也是理解云计算的极佳补充。

软件架构与质量属性

软件架构涉及设计一个软件系统,通常是云端的,用来代表一个产品、服务或基于任务的计算系统。您也可能会听到“系统架构”或“软件架构”这两个术语,它们基本上含义相近。

设计软件架构的一部分工作是在编程语言与技术(亦称技术栈)、组件、包、框架、平台等之间做出适当选择。这需要大量权衡,尤其围绕系统的既定用途以及其他重要取舍。软件架构的这一面向需要诸如软件架构师这类人员随时间积累的技能、知识与经验。

系统与软件架构和工程的另一个关键方面是所谓的质量属性或非功能性需求。这对真实世界的生产解决方案尤为重要。

非功能性需求通常包括:

  • 可用性
  • 性能
  • 可靠性
  • 可扩展性(向上与向外)
  • 可扩展性(功能扩展)
  • 可用性(易用性)
  • 模块化
  • 可复用性

在本文中,您将对其中四个最重要的属性有一个简要概览,即可用性、性能、可靠性与可扩展性。需要注意,讨论将保持在高层次,而不会深入到基于指标的定义或这些质量属性的具体要求。

可用性顾名思义,指系统处于可用状态,换言之处于正常运行状态。这可以有多种含义,并且高度依赖于可靠性与可扩展性。“正常运行”意味着系统按预期工作,并在需要时可用。无论是终端用户尝试使用系统(如 Facebook 或 Netflix),还是一组用于处理数据的云端服务,皆属此列。

可靠性表示系统在无故障或无错误的情况下正确运行的能力。系统越能以这种方式运行,就被认为越具容错性。由于很难事先想到并测试所有可能的使用场景与边界情况,实现 100% 的可靠性非常困难。此外,失败可能由多种原因导致,代码缺陷、环境问题与资源受限(CPU、RAM、磁盘等)是主要元凶之一。

性能用于描述系统执行任务的速度,或者说系统完成某项特定任务所需的时间。以 YouTube 为例。您希望当准备观看视频时,视频能在合理时间内加载并开始播放。Google 使 YouTube 的性能越好,视频加载与开始播放得越快,用户就越满意,也越不可能放弃该应用。反之,如果 YouTube 慢到得不偿失,人们就会停止使用。幸运的是,大多数时候现实是前者而非后者。

最后,可扩展性对某些应用至关重要,它表示系统在负载增加的情况下,仍能维持某一水平(仍为高层定义)的性能的能力。负载指的是系统同时或并发请求的数量。

一个需要可扩展性的绝佳例子是热门体育队伍或知名歌手的门票刚开售时。根据热度,当门票刚开售时,像 Ticketmaster 这样的网页应用可能会迎来数十万并发购票请求。取决于系统的可扩展能力,这要么会极大地降低其性能,要么会直接导致系统整体宕机。这两种情况都不理想。

为满足这一需求,通常会使用技术手段进行纵向扩展或横向扩展。纵向扩展是将系统中的计算设备更换为更强大(更高 CPU、更多少核等)、更可靠、并具有更大资源(如系统内存或 RAM)的机器。这类机器可能费用高昂。

另一方面,横向扩展是使用低成本的通用设备,单机性能并不特别强大,但作为一个整体时完全能胜任系统的负载。由于采用这种技术的解决方案需要多台计算机,因此必须设置系统以自动处理一台或多台计算机(节点)发生故障或崩溃(故障转移)等情形。

结语

希望本文有助于您更好地理解本地开发之外、且面向真实生产解决方案的数据科学诸多重要方面。在处理生产级数据解决方案或需要额外计算能力与资源时,了解基于云的计算与架构概念至关重要。

欢迎在下方评论区分享您的想法。如果您想进一步了解,欢迎在 Twitter 关注 @innoarchitech,订阅 InnoArchiTech 的新闻通讯,并查看 InnoArchiTech 的博客。您也可以看看我的目标驱动的人工智能与机器学习课程。

主题