Data Engineer on Google Cloud Platform Cheat Sheet


数据工程师是什么?

数据工程通过收集、转换和可视化数据来实现数据驱动的决策。数据工程师设计、构建、维护数据处理系统,并对其进行故障排除,特别关注这些系统的安全性、可靠性、容错性、可伸缩性、保真度(fidelity)和效率。

数据工程师还通过分析数据来洞察业务结果,建立统计模型来支持决策制定,并创建机器学习模型来自动化和简化关键业务流程。

要点:

  • 建立/维护数据结构和数据库
  • 设计数据处理系统
  • 分析数据并启用机器学习
  • 可靠性设计
  • 可视化数据和倡导政策
  • 为业务流程建模以便进行分析
  • 安全性和合规性设计

Google Compute Platform (GCP)

GCP 是通过服务(services)提供的谷歌计算资源的集合。 数据工程服务包括计算、存储、大数据和机器学习。 与 GCP 交互的4种方式包括控制台(console)、命令行接口(CLI command-line-interface)、API 和移动应用程序。 GCP 资源层次结构组织如下:

  • Project: 所有资源(VMs、存储桶等)被组织到项目中。
  • Folders: 项目可以组织到文件夹中,这些文件夹可以包含其他文件夹。所有文件夹和项目都可以放在一个组织节点(organization node)下。可以在项目文件夹和组织节点中定义策略。策略在下游继承,并规定谁可以访问什么资源。 每个资源都必须属于一个项目,并且每个资源都必须有一个与之关联的账单帐户。

优势:

  • 性能(快速解决方案)
  • 价格(分小时计费、长期折扣、自定义机器类型)
  • PaaS 解决方案
  • 健壮的基础设施

Hadoop Overview

Hadoop

由于单机(单片)以无法存储现如今如此大规模的数据,因此设计了一种利用多台计算机处理数据的计算方法(分布式)。 这样的组称为集群,它组成服务器群。 所有这些服务器必须通过以下方式进行协调:

  • 分区数据
  • 协调计算任务
  • 处理容错/恢复和分配处理能力

Hadoop 是一个开源的分布式处理框架,用于管理在集群系统中运行的大数据应用程序的数据处理和存储。 它由3个主要部分组成:

  • Hadoop分布式文件系统(HDFS): 一种分布式文件系统,通过在多台机器上分区数据,提供对应用程序数据的高吞吐量访问
  • Yarn: 用于作业调度和集群资源管理(任务协调)的框架
  • MapReduce: 基于 Yarn 的系统,用于在多台机器上并行处理大数据集

HDFS

集群中不同机器上的每个磁盘由1个主节点(master node)组成,其余是数据节点(data node)。

  • 主节点(master node)通过存储文件的目录结构和元数据来管理整个文件系统。
  • 数据节(data node)点物理地存储数据。 大文件被分解/分布在多台机器上,这些文件被复制到3台机器上以提供容错性。

MapReduce

并行编程范式(parallel programming paradigam),允许在多台机器上运行进程来处理大量数据。定义一个MapReduce作业需要两个阶段: map和reduce。

  • Map: 对数据集的一小部分并行执行的操作。输出是 <K,V> 的键值对
  • Reduce: 对地图结果进行合并操作

YARN - Yet Another Resource Negotiator

协调集群上运行的任务,并在失败时分配新节点。 由2个子组件组成: 资源管理器(resource manager)和节点管理器(node manager)。

  • 资源管理器(resource manager)在单个主节点上运行,并跨节点调度任务。
  • 节点管理器(node manager)在所有其他节点上运行,并管理单个节点上的任务。

Hadoop Ecosystem

一个完整的基于与 Hadoop 的生态系统已经出现,它主要基于与 HDFS 的互动。

Hive

在 Hadoop 之上构建的数据仓库软件,它使用类似sql的查询(HiveQL)方便读写和管理分布在存储中的大型数据集。 Hive 抽象了底层的MapReduce作业,并以表的形式返回 HDFS(不是HDFS)。

Pig

高级脚本语言(Pig Latin),支持编写复杂的数据转换。 它从源中提取非结构化/不完整的数据,对其进行清理,并将其放到数据库/数据仓库中。 Pig 向数据仓库执行 ETL,而 Hive 从数据仓库查询以执行分析(GCP: DataFlow)。

Spark

为数据处理和分析编写快速、分布式程序的框架。 解决了与 Hadoop MapReduce 类似的问题,但采用了一种快速的内存方法。 它是一个统一的引擎,支持SQL查询、流数据、机器学习和图形处理。 可以独立于Hadoop操作,但与Hadoop集成良好。 使用弹性分布式数据集(RDDs)处理数据,RDDs是不可变的(immutable)、延迟计算(lazily evaluated)和跟踪沿袭(tracks lineages)的。

Hbase

运行于HDFS之上的非关系型(non-relational)、NoSQL、面向列(column-oriented)的数据库管理系统。 非常适合于稀疏数据集(GCP: BigTable)

Flink/Kafka

流处理框架。 批处理(batch processing)是有界的(bounded),有限的(finite)数据集,定期更新(periodic update)和延迟处理(delay processing)。 流处理(streaming processing)是为无边界数据集(unbounded),具有连续更新(continuous update)和立即处理(immediate processing)。 流数据(stream data)和流处理(streaming processing)必须通过消息队列(message queue)解耦(decouple)。 可以使用翻滚(tumbling)(non-tumbling time)(注:就是使用固定时间段来划分)、滑动(sliding)(重叠时间 overlapping time)或会话(seesion)(会话间隙 session gap)窗口 对 流数据(窗口)进行分组。 (GCP: Pub/Sub)

Beam

定义和执行数据处理管道的编程模型,包括ETL、批处理和流(连续)处理。 在构建管道之后,它由 Beam 的一个分布式处理后端(Apache Apex | Apache Flink | Apache Spark | Google Cloud Dataflow)执行。 建模为有向无环图(DAG)。 (GCP: Dataflow)

Oozie

用于管理 Hadoop 作业的工作流调度系统

Sqoop

将大量数据从关系数据库(MySQL)传输到 HDFS 的传输框架

IAM

Identity Access Management (IAM)

访问管理服务来管理平台的不同成员-谁对哪个资源有什么访问。 每个成员都有角色和权限来允许他们在平台上执行自己的职责。 3种会员类型:

  • 谷歌账户(单人、gmail账户)
  • 服务账户(非人、应用)
  • 谷歌组(多人)。

角色是成员的一组特定权限。 不能直接给用户分配权限,必须分配角色。 如果授予更高层次级别上的成员访问权,则该成员也将拥有该层次级别以下的所有级别的访问权。 您不能被限制在较低的级别。 策略是分配的和继承的策略的联合。

Primitie Roles: 原始角色

  • 所有者(对资源的完全访问权、管理角色) Owner
  • 编辑者(对资源的编辑访问权、更改或添加) Editor
  • 查看者(对资源的读访问权) Viewers

Predefined Roles: 预定义角色 比 Primitie Roles 粒度更细,由 Google Cloud 定义。

Customer Rolse: 自定义角色

最佳实践:使用预定义角色当存在时,遵循 least privileged favors 原则(即给所需权限的用户其能实现其自身诉求的最小权限)。

Stackdriver (GCP: Cloud Monitoring & Logging)

GCP 监视、日志和诊断解决方案。 提供对应用程序运行状况、性能和可用性的洞察。

主要功能:

  • Debugger: 实时监测应用状态而无需中断、调慢
  • Error Repoting 错误报告: 计算、分析、汇总云服务的崩溃
  • Monitoring 监控: 性能,正常运行时间和云服务的健康情况(维度、事件、元数据)的概览
  • Alerting 预警: 创建政策通知你 当健康和正常运行时间检查结果超过一定限制
  • Tracing 跟踪: 跟踪请求如何通过应用程序传播/接收接近实时的性能结果、vm
  • Logging 日志: 存储、搜索、监控和分析来自 GCP 的日志数据和事件

Key Concepts

OLAP vs. OLTP

  • 在线分析处理(OLAP):主要目标是数据分析。它是一个使用数据仓库的数据量大、查询复杂的在线分析和数据检索过程。 (GCP: BigQuery ...)
  • 在线事务处理(OLTP):主要目标是数据处理,管理数据库修改,特点是大量的短联机事务,简单的查询和传统的DBMS。(GCP: Cloud SQL / Cloud Spanner ...)

Row vs. Columnar Database

  • 行格式: 按行存储数据
  • 列格式: 按列而不是按行存储数据表,适合于分析查询处理和数据仓库

IaaS, Paas, SaaS

  • IaaS: 提供基础设施部分(vm),但您必须维护/连接不同的基础设施部分,以使您的应用程序工作。最灵活的选择。(GCP: Cloud Compute Engine)
  • PaaS: 提供已经加入的所有基础设施,因此您只需在平台上部署源代码,应用程序就可以工作。(GCP: Cloud App Engine) PaaS解决方案是托管服务/无操作(高可用/可靠)和无服务器/自动压缩(弹性)。 不如IaaS灵活

Fully Managed, Hotspotting

  • Fully Managed 全托管
  • Hotspoting 热点 形成热点的其中一个原因是将值单调递增的列作为首个键部分,这会导致所有插入操作都发生在键空间的末尾。这种模式是不理想的,因为 Cloud Spanner 会按照键范围划分服务器之间的数据,这意味着,您的所有插入操作都将集中于单个服务器,并于其上完成所有工作。 架构设计最佳做法#1:不要选择列值单调递增或递减的列作为高写入速率表的第一个关键部分。 避免热点的方式有:
    • 对唯一键进行哈希处理并将写入分布到逻辑碎片中
    • 使用通用唯一标识符 (UUID)
    • 对顺序值进行位反转 ...

Compute Choices

Google App Engine

用于构建高可用性应用程序的灵活的、无服务器的平台。当您希望专注于编写和开发代码,而不想管理服务器、集群或基础设施时,这是理想的选择。 用例: web站点,移动应用程序和游戏后端,RESTful api,物联网应用。

Google Kubernetes (Container) Engine

由Kubernetes提供的逻辑基础设施,这是一个开源的容器编排系统。非常适合在生产环境中管理容器,提高速度和可操作性,并且不依赖于操作系统。 用例: 包含的工作负载、云本地分布式系统、混合应用程序。

Google Compute Engine (IaaS)

运行在谷歌全局数据中心中的虚拟机。 当您需要完全控制您的基础设施和直接访问高性能hardward或需要os级别的更改时,非常理想。 用例: 任何需要特定OS或OS配置的工作负载,当前部署的和想要在云中运行的本地软件。

总结

  • AppEngine 是 PaaS 选项 —— 没有服务器和ops。
  • ComputeEngine 是 IaaS 的选项 —— 在操作系统级别完全可控。
  • Kubernetes 引擎位于中间 —— 运行 Kuberenetes 的机器集群和托管容器。

Additional Notes

您还可以混合和匹配多个计算选项。

  • 可抢占实例(Preemptible Instances):以低得多的价格运行但可以随时终止的实例,在24小时后自动终止。 理想的可中断工作负载
  • 快照:用于磁盘备份镜像:VM OS (Ubuntu, CentOS)

Storage

Persistent Disk 持久化磁盘

适用于 VMs/容器 的持久磁盘全托管块存储(ssd)。适合用于数据备份的快照(snapshots) / 跨 VMs 共享只读数据。

Cloud Storage GCS

无限扩展、全托管和高可用的对象/blob存储。 适合二进制数据: 图像、图片、视频。 不能按内容进行查询。 要使用 GCS,需要创建桶来存储数据,并且可以指定位置。 Bucket名是全局唯一的(可以以项目名称作为前缀,因为项目名称也是全局唯一的)。有4种存储类:

  • Multi-Regional 多区域: 经常从世界任何地方访问。用于“热门数据”
  • Regional 区域: 在区域内具有较高的本地性能
  • Nearline 近线: 每月访问数据少于一次的存储(存档)
  • Coldline 冷数据: 每年少于一次(存档)

Data Transfer

如果从本地复制文件(<1TB),请使用gsutil。

Storage Transfer Service

就是数据传输服务,可以从其他云服务上或本地存储空间来移动或备份到 Cloud Storage,也可以在不同 bucket 之间进行移动,或者在数据处理流水线中进行移动

Transfer Applicance

用于移动离线数据、大型数据集(PB级)或带宽受限的来源中的数据 (这个比较粗暴,将设备装入机架,捕获数据,然后将数据寄送到 Google Cloud,包括 100TB/480TB 版本)

BigQuery Data Transfer Severice

将数据从 SaaS 应用移至 BigQuery,支持 Google Ads、Campaign Manager、Google Ad Manager 和 YouTube 等 Google 应用来源,同时支持如 Teradata、Amazon S3、Amazon Redshift 等.

Transfer Service for On Premises Data

将数据从本地机器移至 Cloud Storage,特点在于无需编写自定义脚本或购买现成的解决方案。 需要在本地安装 Docker,并运行一个称为代理的小型软件,该软件会访问本地装载的 NFS 数据,并将其上传至 Cloud Storage.

Cloud SQL & Cloud Spanner-Relational DBs

Cloud SQL

完全托管的关系数据库服务(支持 MySQL 或 PostgreSQL、SQL Server)。 用于关系数据: 表、行和列以及超结构化数据。 SQL兼容并可以更新字段。可拓缩(最大到 64 个处理器核心以及超过 400 GB RAM 和 30 TB 存储空间)。适合 web 框架和 OLTP 工作负载(而不是 OLAP)。 可以设置读取副本,处理日益增长的读取流量。

Cloud Spanner

Google 专有产品,比 Cloud SQL 更高级。 关键任务,关系数据库。 支持水平扩展。 结合了关系数据库和非关系数据库的优点。

  • 理想: 需要高可用性、强一致性和事务性读写的关系型、结构化和半结构化数据
  • 避免: 数据不是关系型或结构化的,需要开源RDBMS,没有必要使用强一致性和高可用性

Cloud Spanner Data Model

一个数据库可以包含1+个表。表看起来像关系数据库表。 数据是强类型的:必须为每个数据库定义一个模式,该模式必须指定每个表的每个列的数据类型。

  • Parent-Child Relationships 父-子关系: 可以选择定义表之间的关系,以便在物理上共同定位它们的行,以便有效地检索(数据本地:物理上存储一个表的1+行和另一个表的一行。

BigTable

列式数据库,适用于需要高吞吐量、低延迟和可伸缩性(物联网、用户分析、时间序列数据、图形数据)的非结构化键/值数据(每个值< 10 MB)。 对每行中的单个值进行索引,该值称为行键(row key)。 不支持SQL查询。区域服务。不适合小于1TB的数据或大于10mb的items(一个 Key-value 对). 适合长时间处理大量数据(TB/PB)。

Data Model

4维: 行键、列族(表名)、列名、时间戳。

  • 行键唯一地标识一个实体,列包含每一行的单个值。
  • 相似的列被分成列族。
  • 每个列由列族和列限定符的组合标识,列限定符是列族中的唯一名称。

Load Balancing

自动管理拆分、合并和再平衡。 主进程在集群中平衡工作负载/数据量。 主服务器将繁忙/较大的平板一分为二,并将访问较少/较小的平板合并在一起,在节点之间重新分配它们。 最好的写性能可以通过使用不遵循可预测顺序的行键和对相关行进行分组,使它们相邻,从而提高同时读取多行的效率。

Security

安全性可以在项目级和实例级进行管理。不支持表级、行级、列级或单元级的安全限制。

Other Storage Options

  • OLTP 需要 SQL: CloudSQL/Cloud Spanner。
  • 需要 OLAP 交互查询:BigQuery。
  • 需要存储大于 10mb 的 blob: Cloud Storage。 -> 这里的 blods 表述为大型二进制对象 -> 如果是小于 10mb 就可以考虑 Cloud Bigtable 了
  • 需要在文档数据库中存储结构化对象,使用 ACID 和 sql 查询: Cloud Datastore。

Designing Your Schema

设计 Bigtable 模式与为 RDMS 设计模式是不同的。 重要注意事项:

  • 每个表只有一个索引,行键(4 KB)
  • 行按行键按字典顺序排序。
  • 所有操作都是行级的原子操作(ACID)。
  • 两个读写应该均匀分布
  • 尽量保持一个实体的所有信息在一个行
  • 相关实体应该存储在相邻的行
  • 尝试10 MB存储在单个细胞(max 100 MB)和100 MB (256 MB)
  • 每个实例最大支持 1000 个表
  • 选择不遵循可预测顺序的行键
  • 可以使用大约100个列族
  • 列限定符: 可以在每行中创建您需要的任意多的列限定符,但是应该避免跨更多的列限定符拆分数据,而不需要跨更多的列限定符(16 KB)。
  • 表是稀疏的,空列不占用任何空间。可以创建大量的列,即使大多数行中的大多数列是空的。
  • 字段提升(将列作为行键的一部分移动)和盐腌(时间戳散列的剩余部分加上行键)是帮助设计行键的方法。

对于时间序列数据,使用高/窄表格。 非正规化-偏好多个高而窄的桌子

BigQuery

可伸缩的、完全管理的数据仓库,具有非常快的SQL查询。 允许以快速的速度查询大量数据。适合 OLAP 工作负载(pb -scale),大数据探索和处理,以及通过商业智能(BI)工具进行报告。 支持 SQL 查询非关系数据。存储成本相对低廉,但查询/处理成本较高。适合分析历史数据。

Data Model

数据表被组织成称为数据集的单元,数据集是表和视图的集合。表必须属于数据集,数据集必须属于对象。表包含有行和列(字段)的记录。 可以通过两种方式将数据加载到BigQuery中:批量加载(免费)和流媒体加载(昂贵)。

Security

BigQuery使用IAM管理对资源的访问。BigQuery中的三种类型的资源是组织、项目和数据集。安全性可以应用于项目和数据集级别,但不能应用于表或视图级别。

Views

视图是由SQL查询定义的虚拟表。当您创建一个视图时,您可以使用与查询表相同的方式查询它。 授权视图允许您与特定用户/组共享查询结果,而不允许他们访问底层数据。 当用户查询视图时,查询结果只包含定义视图的查询中指定的表和字段中的数据。

Billing

账单基于存储(存储的数据量)、查询(数据量/查询处理的字节数)和流插入。 存储选项是活动的和长期的(修改过的或不超过90天)。 查询选项是按需的和固定费率的。 查询成本基于您读取/处理的数据量,因此如果您只读取表(分区)的一个部分,您的成本将会降低。 发生的任何费用都将寄到所附的账单账户。导出/导入/复制数据是免费的。

Partitioned tables

根据列或分区键划分为多个分区的特殊表。数据存储在不同的目录中,特定的查询将只在数据片上运行,这提高了查询性能并降低了成本。注意,分区的大小将不相同。BigQuery自动执行此操作。 每个分区表最多可以有2500个分区 (2500天或者几年)。每天的限制是每个表每天更新2000个分区。速率限制:每10秒更新50个分区。

两种分区表:

  • 摄入时间: 根据数据摄入(加载)日期或到达日期划分的表。每个分区表都有伪列将PARTITIONTIME或时间数据加载到表中。伪列是为表保留的,用户不能使用。
  • 分区表: 基于时间戳或日期列分区的表。

Windowing

窗口函数通过提供复杂的操作而不需要许多中间计算,提高了分析数据集分区(窗口)的查询的效率和降低了复杂性。它们减少了存储临时数据的中间表的需求

Bucketing

与分区类似,但每个分区的大小应该相同,并且基于列的哈希函数。 每个桶是一个单独的文件,这有助于更有效地采样和连接数据。

Querying

在将数据加载到BigQuery之后,您可以使用标准SQL(Standard SQL)(首选)或遗留SQL(Legacy SQL)(旧的)。 查询作业是为加载、导出、查询或复制数据而异步执行的操作。 结果可以保存到永久(存储)或临时(缓存)表。 2种查询类型:

  • 交互式:立即执行查询,计数为每日/并发使用(默认)
  • 批处理:当空闲资源可用时,批量查询进行排队,查询开始,每天计数,如果空闲24小时,则切换为交互

Wildcard Tables (通配符表)

用于将所有具有相似名称的相似表联合起来。‘’ (例如 from project.dataset.Table )

Optimizing BigQuery

Contoring Costs

  • 避免SELECT (全扫描),只选择需要的列 (SELECT EXCEPT)
  • 样本数据使用预览选项免费
  • 预览查询以估算成本(dryrun)
  • 使用最大字节收费限制查询成本
  • 不要使用限制条款来限制成本(仍然是全扫描)
  • 使用仪表板和审计日志监控成本
  • 分区数据的日期
  • 中断查询结果进入阶段
  • 使用默认表过期删除不需要的数据
  • 慎用流式插入
  • 设置每天处理的字节(成员)的硬限制

Query Performance

一般来说,完成较少工作的查询性能更好。

输入数据/数据源

  • 避免SELECT *
  • 删除分区查询(对于分时分区的表,使用PARTITIONTIME伪列过滤分区)
  • 数据去规范化(使用嵌套和重复字段)
  • 适当使用外部数据源
  • 避免过多的通配符表

SQL Anti-Patterns

  • 避免自连接。使用窗口函数(跨多个相关表行执行计算当前行)
  • 分区/斜: 避免大小不一的分区,或者当一个值通常比其他任何值出现
  • 交叉连接:避免产生更多的输出比输入连接(pre-aggregate数据或使用窗口函数)
  • 更新/插入一行/列:避免的具体 DML,而不是批处理更新和插入

管理查询输出

  • 避免重复连接和使用相同的子查询
  • 编写大型 sets 影响性能/成本。
  • 使用 LIMIT 子句针对大型的 SORTS

优化查询计算

  • 避免通过SQL查询重复转换数据
  • 避免使用JavaScript用户定义函数
  • 使用近似聚合函数(约计数)
  • 排序查询操作以最大化性能。
  • 仅在最外层的查询中使用ORDER BY,将复杂操作推到查询的末尾。
  • 对于从多个表连接数据的查询,优化连接模式,从最大的表开始。

DataStore

自动处理分片和复制的 NoSQL 文档数据库(高可用性、可伸缩性和持久性)。支持ACID事务,类似 sql 的查询。 查询执行取决于返回结果的大小,而不是数据集的大小。非常适合“大海捞针”操作和大规模依赖高可用结构化数据的应用程序

Data Model

数据存储中的数据对象称为实体。一个实体有一个或多个命名属性,每个命名属性可以有一个或多个值。中的每个实体都有一个惟一标识它的键。您可以使用实体的键获取单个实体,或者基于实体的键或属性值查询一个或多个实体。 非常适合大规模的高度结构化数据:产品目录、基于用户过去活动/偏好的客户体验、游戏状态。如果您需要极低的延迟或分析(复杂连接等),请不要使用。

DataProc

完全托管的云服务运行 Spark 和 Hadoop 集群。 提供对在GCP上的 Hadoop 集群的访问,以及 hadoop 生态系统工具(Pig, Hive, Spark)的访问。 可用于实现 ETL 仓库解决方案。 如果迁移现有的本地 Hadoop 或在不需要再开发的情况下,启动 GCP 的基础设施,Dataflow 是新开发的首选。

DataFlow

用于开发和执行流和批处理数据的数据处理模式(ETL)(基于Apache Beam)的托管服务。 首选新的Hadoop or Spark 基础设施建设。 通常位于前端和后端存储解决方案之间。

Concepts

  • Pipeline 管道: 封装一系列计算,这些计算接受来自外部源的输入数据,转换数据以提供一些有用的智能,并生成输出
  • PCollection: 抽象表示潜在分布的、多元素数据集,充当管道数据。PCollection 对象表示输入、中间和输出数据。管道的边缘。
  • Transforms 转换: 管道中的操作。转换接受一个 PCollection 作为输入,对该集合中的每个元素执行指定的操作,并生成一个新的输出 PCollection。使用what/where/when/how模型。 管道中的节点。复合转换是多种转换:组合、映射、转移、减少或统计分析。
  • Pipeline I/O: 源/接收(source/sink),数据流入和流出的地方。支持对许多常见数据存储类型的读和写转换,以及自定义转换。

Windowing

根据每个元素的关联事件时间,打开一个PCollection窗口将元素划分为多个窗口。 对于大小无限制的pcollection特别有用,因为它允许对子组(迷你批)进行操作。

Triggers

允许指定一个触发器来控制何时(在处理时间内)产生给定窗口的结果。如果未指定,默认行为是在水印 watermark 通过窗口末端时首先触发,然后在每次有延迟到达的数据时再次触发。

Pub/Sub

解耦发送方和接收方的异步消息传递服务。允许在独立编写的应用程序之间进行安全和高可用性通信。 发布者 publisher 应用程序创建并发送消息给一个主题 topic。订阅者应用程序 Subscirber application 创建对主题的订阅 subscription,以便从该主题接收消息。 通信可以是一对多(扇出 fan-out)、多对一(扇入 fan-in)和多对多。 在从队列中删除之前至少有一次传递。

适用场景

  • 平衡网络集群中的工作负载——队列可以有效地分配任务
  • 实现异步工作流
  • 来自各种进程或设备的数据流
  • 可靠性改进 —— 以防区域故障
  • 分发事件通知
  • 刷新分布式缓存
  • 登录到多个系统

Benefits/Feature

统一的消息传递、全局存在、推拉(push&pull)式订阅、复制存储和至少保证一次的消息传递、在 rest/transit 环节的加密、易于使用的 REST/JSON API

Data Model

  • 主题(Topic)
  • 订阅(Subscription)
  • 消息(Message)(发布者发送给主题并最终交付给订阅者的数据和属性的组合)
  • 消息属性(Message Attribute)(发布者可以为消息定义的键-值对)

Message Flow

  • 发布者在云发布/订阅服务中创建一个主题并向该主题发送消息。
  • 消息被持久化在消息存储中,直到订阅者传递和确认它们。
  • 发布/订阅服务将一个主题的消息单独转发给它的所有订阅。每个订阅通过推/拉接收消息。
  • 订阅者从其订阅服务器接收等待消息和确认消息。
  • 当消息被订阅者确认后,它将从订阅者的消息队列中删除。

ML Engine

利用 TensorFlow 的强大和灵活性管理 GCP 的基础设施。 可以使用它大规模地训练 ML 模型,并托管经过训练的模型来对云中的新数据进行预测。 支持的框架包括 Tensorflow、scikit-learn 和 XGBoost。

ML Workflow

评估问题:问题是什么,ML 是最好的解决方法吗? 你将如何衡量 model 的成功?

  • 选择开发环境: 支持 Python2/3 支持TF, scikit-learn, XGBoost 作为框架。
  • 数据准备和探索: 包括数据聚集、清洗、转换、探索、分割、预处理,同样包括特征工程。
  • 模型培训/测试: 提供对训练、测试数据的访问,并且批量的训练他们。评估流程/结果并且需需要进行调整。导出模型(<250mb & 部署在 ML Engine 上)
  • 超参数(Hyperparameter)调优: 超参数一个关于训练进程的变量,和训练集往往无关,通常在训练过程中进行管理。
  • 预测: 在云中托管经过训练的ML模型并使用 Cloud ML 预测服务来推断目标新数据的值

ML APIs

  • 语音识别: 语音转换
  • 文本->语音: 语音转换
  • 翻译: 语言之间的动态翻译
  • 视觉: 从图像中获得洞察力(对象/文本)
  • 自然语言: 提取关于文本的信息(情绪、意图、实体和语法):人物、地点。
  • 视频智能: 从视频中提取元数据

Cloud Datalab

交互式工具(在实例上运行),用于探索、分析、转换和可视化数据,并构建机器学习模型。建立在Jupyter。Datalab是免费的,但可能会根据其他服务的使用情况收取费用。

Data Studio

将数据转换为指示板和报告。 数据更新将自动更新dashbaord。 查询缓存会记住报表中组件发出的查询(对数据的请求)——对于频繁更改的数据、希望优先考虑新鲜度而不是性能的数据、或者使用会导致使用成本的数据源(如BigQuery),将关闭。 预取缓存通过分析报表上的维度、指标、过滤器和日期范围属性和控件来预测可能被请求的数据。

ML Concepts/Terminology

  • 特征: ML模型使用的输入数据
  • 特性工程:将输入特性转换为对模型更有用的特性。例如,将类别映射到bucket,在-1和1之间规范化,删除null
  • Training / Eval / Test: training是用于优化模型的数据,evaluation 是用于在 training 期间对新数据进行模型评估,Test 是用于提供最终结果
  • 分类/回归(Classification/Regression): 回归是对一个数字(如房价)的预测,分类是对一组类别(如房价)的预测。预测红色/蓝色/绿色)
  • 线性回归: 用多元预测输出
  • 逻辑回归: 类似于线性回归,但预测概率
  • 神经网络: 由神经元(简单的积木,实际学习),包含激活函数,可以预测非线性输出
  • 激活函数: 数学函数,引入非线性网络 例如 RELU, tanh
  • Sigmoid 函数: 本质上就是将线性的预测结果,放缩到0,1区间,以根据阈值来进行类别的划分
  • 对预测概率有用的梯度下降/反向传播: 基本的损失函数优化算法,其他算法通常基于此。反向传播类似于梯度下降,但针对的是神经网络
  • Optimizer 优化器: 改变权值和偏差以减少损失的操作。例如Adagrad或Adam
  • weights 权重 / biases 偏差: 权值是输入特征乘以预测输出值的值,偏差是权值为 0 时输出的值。
  • converge 收敛: 收敛的算法最终会得到最优解,即使非常慢。不收敛的算法可能永远不会得到最优答案。
  • learning rate 学习率: 优化器改变权重和偏差的比率。学习率高,训练的快,但是有不收敛的可能。学习率低,则训练的慢。
  • overfitting 过度拟合: 模型在输入数据上表现的很好,但是在测试集上表现很差(通常采用 dropout / 早停法 / 减少节点或层数的方式来改善)
  • bias 偏差 / variance 方差: 高方差->过拟合, 高偏差->欠拟合
  • regulartization 正则化: 各种各样的方法来减少过度拟合,包括添加权重损失函数,随机删除层(dropout)
  • ensemble learning 集成学习: 使用不同的参数训练多个模型来解决相同的问题
  • embedding: 从离散映射对象,如单词映射到实数向量。有用是因为分类器/神经网络在实数向量上工作得很好

Tensorflow

Tensorflow 是一个使用数据流图进行数值计算的开源软件库。TF 中的一切都是一个图,其中节点表示对数据的操作,边表示数据。 TF 的第一阶段是建立一个计算图,第二阶段是执行它。它也是分布式的,这意味着它可以在一个机器集群上运行,也可以只在一台机器上运行。

Tensors 张量

在图中,张量是边,是流经图的多维数据数组。 TF 中数据的中心单元,由一组形成任意维数数组的原始值组成。 张量的特征是它的秩(张量的维数)、形状(维数和大小)、数据类型(张量中每个元素的数据类型)。

Placeholders and Variables

  • Variables: 表示程序操作的共享持久状态的最佳方式。这些是在训练过程中改变/训练 ML 模型的参数。训练变量。
  • Placeholders: 一种在运行时为一个张量保留位置的图形中指定输入的方法。 他们只分配一次,以后不改变。输入节点

Popular Architechtures

  • Linear Classifier 线性分类器: 获取输入特征,并将其与权重和偏差相结合来预测输出值
  • DNNClassifer: 深层神经网络,包含代表“隐藏特征”(hidden features)的中间层节点(intermediate layers of nodes)和代表非线性(non-linearity)的激活函数(activation function)
  • ConvNets: 卷积神经网络。流行用于图像分类。
  • Transfer Learning 迁移学习: 使用现有的训练过的模型作为起点,并为特定的用例添加额外的层。其理念是,经过高度训练的现有模型知道一般的特性,这些特性可以作为针对特定示例训练小网络的良好起点
  • RNN: 循环神经网络,设计用于处理具有序列记忆的输入序列。lstm 是 RNNs 的花哨版本,在 NLP 中很流行
  • GAN: 生成对抗网络,一个模型生成假示例,另一个模型同时提供假示例和真实示例,并要求进行区分
  • Wide and Deep: 结合线性分类器和深度神经网络分类器,“宽”的线性部分代表记忆特定的例子,“深”部分代表理解高级特征