《Trino权威指南2》第一章:Trino介绍

可能你听说过 Trino,并找到了这本书。或许你只是在浏览这一节,想知道是否应该深入了解。在这个介绍性的章节中,我们将讨论你可能遇到的与数据大规模增长以及其中封存的价值有关的问题。Trino 是处理所有数据并通过经过验证的成功工具提供访问这些数据的关键支持者,这些工具基于结构化查询语言(SQL)。

Trino 的设计和功能使你能够获得更好的洞察力,超越目前可获得的洞察力。你可以更快地获得这些洞察力,同时获取以前因为成本过高或获取时间过长而无法获取的信息。而且,所有这些,你最终会使用更少的资源,从而在预算上花费更少,这样你就可以用来进一步学习! 我们还会向你介绍本书之外的更多资源,但是,当然,我们希望你首先加入我们这里。

大数据的问题

每个人都在从设备指标、用户行为跟踪、业务交易、位置数据、软件和系统测试流程以及工作流程等方面捕获越来越多的数据。从理解和处理这些数据中获得的洞察力可以决定任何计划甚至公司的成功与否。

与此同时,可用于存储数据的机制的多样性也在激增:关系型数据库、NoSQL 数据库、文档数据库、键值存储、对象存储系统等等。这些机制在当今的组织中许多都是必需的,不再可能只使用其中的一种。正如您在图 1-1 中所见,处理这些问题可能是一项艰巨的任务,让人感到无所适从。

图片

此外,所有这些不同的系统都不允许您使用标准工具查询和检查数据。各种专用系统都使用不同的查询语言和分析工具。与此同时,您的业务分析师习惯于行业标准的 SQL 语言。大量功能强大的工具依赖于 SQL 进行分析、创建仪表板、生成丰富的报告和其他业务智能工作。

数据分布在各种数据孤岛中,其中一些甚至无法以必要的性能进行查询以满足您的分析需求。与现代云应用程序不同,其他系统将数据存储在无法横向扩展的整体性系统中。如果没有这些能力,您将限制潜在的用例和用户数量,从而限制了数据的有用性。

在全球范围内,创建和维护大型专用数据仓库的传统方法已被证明非常昂贵。往往情况下,这种方法对于许多用户和使用模式来说也太慢且繁琐。创建数据湖的常见解决方案最终成为了一个无人再次查看的数据存储区,或者需要极大努力来尝试分析数据。即使是新的数据湖仓库综合体方法承诺将仓库和湖泊的优势结合起来,也不会成为唯一的解决方案。数据将继续分布,存储在各个地方,并在越来越多的系统中出现。

您可以看到解锁所有这些价值的系统的巨大机会。

Trino 拯救大势所趋

Trino 能够解决所有这些问题,并通过对不同系统进行联合查询、并行查询、水平集群扩展等方式来开启新的机会。您可以在图 1-2 中看到 Trino 项目的标志。

图片

Trino 是一个开源的分布式 SQL 查询引擎。它从零开始设计和编写,可以高效地对各种规模的异构数据源进行查询,从几 GB 到几 PB 不等。Trino 打破了使用昂贵商业解决方案进行快速分析或使用需要大量硬件资源的缓慢的“免费”解决方案之间的虚假选择。

专为性能和规模而设计

Trino 是一种工具,旨在通过使用分布式执行高效地查询大量数据。如果您需要查询的数据达到了千兆字节甚至百万亿字节级别,您可能会使用与 Hadoop 及其 Hadoop 分布式文件系统(HDFS)交互的工具,如 Apache Hive,或者类似的系统,如由云服务提供商提供的 Amazon Simple Storage Service(S3)和其他用于自托管的兼容部署。Trino 被设计为这些工具的替代方案,以更高效地查询这些数据。

需要对实时分析进行毫秒级到秒级和分钟级的 SQL 响应时间的分析师应该使用 Trino。Trino 支持 SQL,这是数据仓库和分析中常用的用于分析数据、聚合大量数据和生成报表的查询语言。这些工作负载通常被归类为在线分析处理(OLAP)。

尽管 Trino 理解并且能够高效地执行 SQL,但 Trino 并不是一个数据库,因为它不包括自己的数据存储系统。它并不意味着要成为用于替代 Microsoft SQL Server、Oracle Database、MySQL 或 PostgreSQL 的通用关系数据库。此外,Trino 也不适用于处理在线事务处理(OLTP)。这对于其他为数据仓库或分析而设计和优化的数据库,如 Teradata、Netezza、Vertica 和 Amazon Redshift,也同样适用。

Trino 利用了众所周知的和新颖的分布式查询处理技术。这些技术包括内存并行处理、集群中节点之间的流水线执行、多线程执行模型以保持所有 CPU 核心的繁忙状态、高效的扁平内存数据结构以最小化 Java 垃圾回收,以及 Java 字节码生成。本书不涵盖这些复杂的 Trino 内部技术的详细描述。对于 Trino 用户来说,这些技术意味着以其他解决方案的一小部分成本获得更快的数据洞察力。

SQL-on-Anything

Trino 最初设计用于从 HDFS 查询数据。正如您将在后面了解到的那样,它可以非常高效地执行此任务。但它的应用范围不仅限于此。相反,Trino 是一个查询引擎,可以查询来自对象存储、关系数据库管理系统(RDBMS)、NoSQL 数据库和其他系统的数据,如图 1-3 所示。

Trino 可以直接在数据所在的位置查询数据,而无需将数据迁移到单一位置。因此,Trino 允许您在 HDFS 和其他分布式对象存储系统中查询数据。它还允许您查询 RDBMS 和其他数据源。通过在数据所在的位置进行查询,Trino 可以替代传统、昂贵且繁重的抽取、转换和加载(ETL)过程。或者至少,它可以通过提供一个查询引擎,让您在必要时使用现代工具(如 dbt)在所有数据源上运行高性能的 ETL 过程,并减少甚至避免对 ETL 过程的需求。因此,Trino 显然不仅仅是另一个 SQL-on-Hadoop 解决方案。

图片

对象存储系统包括 Amazon S3、Microsoft Azure Blob Storage、Google Cloud Storage,以及 MinIO 和 Ceph 等兼容 S3 的存储系统。这些系统可以使用传统的 Hive 表格格式,以及更新的替代品 Delta Lake 和 Iceberg。Trino 可以查询传统的关系数据库管理系统,如 Microsoft SQL Server、PostgreSQL、MySQL、Oracle、Teradata 和 Amazon Redshift。Trino 还可以查询 NoSQL 系统,如 Apache Cassandra、Apache Kafka、MongoDB 或 Elasticsearch。Trino 几乎可以查询任何数据源,真正实现了 SQL-on-Anything 的功能。

对用户来说,这意味着他们不再需要依赖特定的查询语言或工具来与这些特定系统中的数据进行交互。他们只需利用 Trino 和现有的 SQL 技能以及熟悉的分析、仪表盘和报告工具。这些基于 SQL 的工具允许分析那些存储在不同系统中的额外数据集,而这些数据集通常被锁定在各自的系统中。用户甚至可以使用 Trino 以他们已经熟悉的 SQL 跨不同系统进行查询。

数据存储和查询计算资源的分离

Trino 不是一个带有存储的数据库,而是直接在数据所在的位置进行查询。在使用 Trino 时,存储和计算是解耦的,可以独立进行扩展。Trino 代表计算层,而底层数据源代表存储层。

这使得 Trino 可以根据分析需求来调整计算资源的规模,以进行查询处理。您无需移动数据,根据当前查询的确切需求来提供计算和存储资源,也无需根据查询需求的变化频繁进行调整。

Trino 可以通过动态扩展计算集群来扩展查询能力,并且数据可以直接在数据源所在的位置进行查询。这个特性使您能够极大地优化硬件资源需求,从而降低成本。

Trino 用户场景

Trino 的灵活性和强大功能使您可以自行决定如何使用 Trino 以及您希望利用哪些优势和功能。您可以从解决特定问题的一个小用途开始。大多数 Trino 用户都是这样开始的。

一旦您和组织中的其他 Trino 用户习惯了其优势和功能,您将发现新的应用场景。口碑传播开来,很快您会看到 Trino 通过访问各种数据源满足了各种需求。

在本节中,我们讨论了几种这些应用案例。请记住,您可以扩展您的使用范围以涵盖所有这些案例。另一方面,只使用 Trino 解决一个特定的问题也完全可以。只要准备好喜欢 Trino 并在之后增加其使用就可以了。

一个 SQL 分析访问点

关系型数据库管理系统(RDBMS)和 SQL 的使用已经存在了很长时间,并且被证明非常有用。没有一个组织可以在没有它们的情况下运行。实际上,大多数公司都在运行多个系统。像 Oracle Database 或 IBM DB2 这样的大型商业数据库可能支持您的企业软件。开源系统如 MariaDB 或 PostgreSQL 可能用于其他解决方案和一些内部应用程序。

作为消费者和分析师,您可能会遇到许多问题:

  • 有时候您甚至不知道数据在哪里可以供您使用,只有公司内部的部落知识或多年对内部设置的经验可以帮助您找到正确的数据。
  • 查询各种源数据库需要您使用不同的连接,并且运行不同的 SQL 方言的不同查询。它们足够相似以看起来相同,但它们的行为有足够的差异会导致混淆和需要学习细节的需求。 您无法在查询中组合来自不同系统的数据,除非使用数据仓库。

Trino 可以帮助您解决这些问题。您可以将所有这些数据库公开在一个位置:Trino。

您可以使用一个 SQL 标准来查询所有系统 - Trino 支持的标准化 SQL、函数和运算符。

您的所有仪表板、分析工具和其他用于商业智能需求的系统都可以指向一个系统 - Trino,并访问组织中的所有数据。

数据仓库和源系统的访问点

当组织需要更好地理解和分析其众多的关系型数据库管理系统(RDBMS)中的数据时,创建和维护数据仓库系统就会发挥作用。从各个系统选择的数据经过复杂的 ETL 过程,并且通常通过长时间运行的批处理作业,最终进入一个受严格控制的大型数据仓库中。

尽管在许多情况下这对您非常有帮助,但作为数据分析师,您现在遇到了新的问题:

  • 现在,除了所有数据库本身之外,您还有了另一个入口点,用于您的工具和查询。
  • 您今天需要的特定数据不在数据仓库中。添加数据是一个痛苦、昂贵且充满阻碍的过程。

Trino 允许您将任何数据仓库数据库作为数据源添加,就像任何其他关系型数据库一样。 如果您想深入了解数据仓库查询,您可以在同一个系统中进行。您可以在同一位置访问数据仓库和源数据库系统,甚至编写组合它们的查询。Trino 允许您在同一系统中查询任何数据库,包括数据仓库、源数据库和任何其他数据库。

为任何数据提供基于 SQL 的访问 只使用关系型数据库管理系统(RDBMS)的日子早已过去。数据现在存储在许多针对相关用例进行优化的不同系统中。基于对象的存储、键值存储、文档数据库、图数据库、事件流系统和其他所谓的 NoSQL 系统都提供了独特的功能和优势。 至少其中一些系统在您的组织中正在使用,其中包含了对理解和改进业务至关重要的数据。

当然,所有这些系统都要求您使用不同的工具和技术来查询和处理数据。 至少,这是一项复杂的任务,具有巨大的学习曲线。然而更有可能的是,您只能对数据表面进行涉猎,没有真正获得完整的理解。您缺乏一种良好的查询数据的方式。可视化和详细分析的工具很难找到,或者根本不存在。

另一方面,Trino 允许您将所有这些系统连接为数据源。它将数据暴露出来,使用标准的美国国家标准学会(ANSI)SQL 进行查询,并提供使用 SQL 的所有工具,如图 1-4 所示。

图片

因此,使用 Trino,首次能够更加简单地理解所有这些完全不同的系统中的数据,甚至可能性成为现实。

联邦查询

将所有数据孤岛暴露在 Trino 中是了解您的数据的重要一步。您可以使用 SQL 和标准工具对它们进行查询。然而,通常您想要回答的问题需要您深入数据孤岛,从中提取相关方面,然后将它们组合在一个位置。

Trino 通过使用联邦查询(federated queries)使您能够实现这一点。联邦查询是一种 SQL 查询,它在同一语句中引用和使用完全不同系统中的数据库和模式。在 Trino 中,所有数据源都可以同时使用相同的 SQL 在同一查询中进行查询。

您可以定义来自对象存储中的用户跟踪信息与关系数据库中的客户数据之间的关系。如果您的键值存储包含更多相关信息,您也可以将其连接到您的查询中。

使用 Trino 的联邦查询使您能够获取以其他方式无法获得的洞察力。

虚拟数据仓库的语义层

数据仓库系统不仅为用户带来了巨大的好处,也给组织带来了一些负担:

  • 运行和维护数据仓库是一个庞大而昂贵的项目。
  • 专门的团队负责管理数据仓库和相关的 ETL 过程。
  • 将数据导入数据仓库需要用户克服繁文缛节,通常需要太长的时间。

另一方面,Trino 可以用作虚拟数据仓库。它可以通过使用一个工具和标准的 ANSI SQL 来定义您的语义层。一旦所有数据库在 Trino 中配置为数据源,您就可以对它们进行查询。Trino 提供了必要的计算能力来查询数据库中的存储。使用 SQL 和支持的函数和运算符,Trino 可以直接从源头提供您所需的数据。在进行分析之前,无需复制、移动或转换数据。

由于针对所有连接的数据源支持标准 SQL,您可以更简单地创建所需的语义层,以便从工具和最终用户进行查询。而且,该层可以涵盖所有底层数据源,而无需迁移任何数据。Trino 可以在源头和存储级别查询数据。

使用 Trino 作为这种“即时数据仓库”为组织提供了增强现有数据仓库的潜力,或者甚至避免构建和维护数据仓库。

数据湖查询引擎

数据湖这个术语通常用于指代一个大型的 HDFS 或类似的分布式对象存储系统,其中各种类型的数据被随意地倾倒进去,对于如何访问这些数据并没有太多考虑。Trino 将其解锁,使其成为一个有用的数据仓库。实际上,Trino 起源于 Facebook,是为了处理比 Hive 和其他工具更快速、更强大地查询非常庞大的 Hadoop 数据仓库。这导致了 Trino Hive 连接器的诞生,详见“用于分布式存储数据源的 Hive 连接器”。

现代数据湖通常使用除了来自云服务提供商或其他开源项目的 HDFS 之外的其他对象存储系统。Trino 可以针对这些系统使用 Hive 连接器,从而在数据湖上实现基于 SQL 的分析,无论数据湖位于何处,以及数据的存储方式如何。

新的表格格式(如 Delta Lake 和 Iceberg)的创建极大地提高了数据湖的可用性,以至于出现了新的术语“数据湖仓库”。通过 Delta Lake 和 Iceberg 连接器,Trino 是查询这些新型数据湖仓库的首选工具。

SQL 转换和 ETL

凭借对关系数据库管理系统(RDBMS)和其他数据存储系统的支持,Trino 可以用于数据移动。使用 SQL 和丰富的 SQL 函数集,您可以查询数据、转换数据,然后将数据写入同一数据源或任何其他数据源。

在实践中,这意味着您可以从对象存储系统或键值存储中复制数据,并将其移入 RDBMS 中,并将其用于以后的分析。当然,您也可以对数据进行转换和聚合,以获得新的理解。

另一方面,常见的做法是从操作性 RDBMS 或者诸如 Kafka 的事件流系统中提取数据,并将其移入数据湖,以减轻 RDBMS 在多个分析师查询方面的负担。ETL 过程,现在通常也被称为数据准备,可以是该过程的重要组成部分,用于改进数据并创建更适合查询和分析的数据模型。

在这种情况下,Trino 是整体数据管理解决方案的关键部分,而对于现代数据湖处理的容错执行的支持使得 Trino 成为这些用例的优秀选择。

由于更快的响应时间,可以获得更好的洞察力

提出复杂问题并使用庞大的数据集时常常会遇到限制。将数据复制并加载到数据仓库中进行分析可能会变得过于昂贵。计算所需的计算资源可能过多,无法运行,或者需要数天时间才能得到答案。

Trino 通过设计避免了数据复制的问题。并行处理和大量的优化通常会为您的分析提供性能改进。

如果以前需要三天才能运行的查询现在只需 15 分钟,那么重新运行该查询可能是值得的。而且从结果中获得的知识将为您带来优势,并提供运行更多查询的能力。

Trino 的更快处理时间可以实现更好的分析和结果。

大数据、机器学习和人工智能

Trino 将越来越多的数据暴露给围绕 SQL 的标准工具,并且可以扩展查询到大规模的数据集,使其成为大数据处理的首选工具。现在,这通常包括统计分析,并且逐渐发展到机器学习和人工智能系统的复杂领域。通过对 R 和其他工具的支持,Trino 在这些用例中肯定有一定的作用。

其他场景

在前面的章节中,我们对 Trino 的用例进行了高级概述。新的用例和组合也在不断涌现。 在第 13 章中,您可以了解一些知名公司和组织如何使用 Trino。我们将这些信息放在书的最后部分,这样您可以先通过阅读后续章节获取理解所需的知识,然后再了解相关数据的使用情况。

Trino 资源

除了本书之外,还有许多其他资源可供您扩展对 Trino 的了解。在本节中,我们列举了一些重要的起点。其中大部分包含大量信息,并提供了进一步资源的指引。

网站

Trino 软件基金会负责管理开源 Trino 项目的社区,并维护项目网站。您可以在图 1-5 中看到主页。该网站包含文档、联系方式、社区博客文章,涵盖最新的新闻和活动,还提供以音频和视频格式呈现的 Trino 社区广播节目以及其他信息,网址为 trino.io。

图片

文档

Trino 的初学者、高级用户和专家用户,以及贡献者和维护者组成的社区非常支持,并在每天的社区聊天中积极合作。您可以在 trinodb.slack.com 加入社区聊天。加入公告频道,然后浏览众多专注于各种主题的频道,例如初学者帮助、错误处理、发布、开发,以及用于讨论 Kubernetes 或特定连接器的更具体的频道。

源代码、许可证和版本

Trino 是一个开源项目,遵循 Apache 许可证 v2 进行分发。其源代码托管在 Git 仓库 github.com/trinodb/tri…github.com/trinodb的tri… 组织下,还有许多与该项目相关的其他仓库,例如网站的源代码、客户端、其他组件以及贡献者许可证管理仓库等。Trino 是一个活跃的开源项目,经常发布新版本。通过使用最新版本,您能够利用最新的功能、错误修复和性能改进。本书在撰写时参考和使用的是最新的 Trino 版本 392。如果您选择了不同且更新的 Trino 版本,它应该与本书中描述的相同。虽然您可能不太可能遇到问题,但请务必查阅发布说明和文档以了解任何变更。

贡献

正如我们之前提到的,Trino 是一个由社区驱动的开源项目,欢迎并鼓励您的贡献。该项目在社区聊天中非常活跃,开发者和其他贡献者都会在那里提供帮助。 以下是一些开始贡献的任务:

  • 查看文档中的开发者指南部分。
  • 按照 README 文件中的说明,学习如何从源代码构建项目。
  • 阅读网站的社区页面中链接的研究论文。
  • 阅读同一页面上的行为准则(Code of Conduct)。
  • 找到一个标记为"good first issue"的问题。
  • 签署贡献者许可协议(CLA)。

该项目持续接收各种复杂程度的贡献,从小的文档改进到新的连接器或其他插件,甚至是对 Trino 内部的深层改进。 当然,社区欢迎您在与 Trino 相关的任何工作。这当然包括看似无关的工作,如撰写博客文章、在用户组会议或会议上进行演讲,或者独立编写和管理插件,例如针对您使用的数据库系统。 总体而言,我们鼓励您与团队合作并参与其中。项目将因每个人的贡献而不断成长和繁荣。我们随时准备提供帮助。您能做到!

鸢尾花数据集

在本书的后续章节中,您将遇到关于鸢尾花和鸢尾花数据集的示例查询和用例。这是一个著名的数据集,在数据科学分类示例中经常被使用,它涉及到鸢尾花的相关数据。 该数据集由一个简单的表格组成,包含 150 条记录和各列对应的萼片长度、萼片宽度、花瓣长度、花瓣宽度以及物种的值。

由于数据集的规模较小,用户可以轻松测试和运行查询,并进行各种分析。这使得该数据集非常适合学习,包括在使用 Trino 时。您可以在维基百科的相关页面上了解更多关于该数据集的信息。 我们的书籍仓库包含一个名为 iris-data-set 的目录,其中包含以逗号分隔值(CSV)格式的数据,以及一个用于创建表格和插入数据的 SQL 文件。在阅读第 2 章和“Trino 命令行界面”之后,以下指令将很容易理解。

您可以通过将 etc/catalog/brain.properties 文件复制到与 Trino 安装位置相同的位置,并重新启动 Trino 来使用该数据集。 现在,您可以使用 Trino 命令行界面将数据集导入到 brain 目录的默认模式中的 iris 表中:

$ trino -f iris-data-set/iris-data-set.sql
USE
CREATE TABLE
INSERT: 150 rows

确认数据能够被查询:

$ trino --execute 'SELECT * FROM brain.default.iris;'
"5.1","3.5","1.4","0.2","setosa"
"4.9","3.0","1.4","0.2","setosa"
"4.7","3.2","1.3","0.2","setosa"
...

或者,您可以在连接到 Trino 的任何 SQL 管理工具中运行查询;例如,可以使用在“Trino JDBC 驱动程序”中描述的 Java 数据库连接(JDBC)驱动程序。 后续章节中包括在第 8 章和第 9 章中使用该数据集运行的示例查询,以及在“Memory Connector”中使用的 brain 目录中的内存连接器的相关信息。

Trino 的历史

在 2008 年,Facebook 将 Hive(后来成为 Apache Hive)开源。Hive 在 Facebook 内部广泛使用,用于对其庞大的 Apache Hadoop 集群中的 HDFS 数据进行分析。

Facebook 的数据分析师使用 Hive 在其大型数据仓库上运行交互式查询。在 Facebook 出现 Presto 之前,所有数据分析都依赖于 Hive,但在 Facebook 规模上并不适合进行交互式查询。2012 年,Facebook 的 Hive 数据仓库规模达到 250 PB,并且每天需要处理数百个用户发出数万个查询。Hive 开始在 Facebook 内部遇到限制,并且无法查询 Facebook 内部的其他数据源。

Presto 从一开始就被设计成可以在 Facebook 规模下运行快速查询的系统。Presto 不是创建一个新系统来移动数据,而是通过其可插拔连接器系统从存储位置读取数据。Presto 最早开发的连接器之一就是 Hive 连接器,可以参考“用于分布式存储数据源的 Hive 连接器”。该连接器可以直接查询存储在 Hive 数据仓库中的数据。2012 年,四名 Facebook 工程师开始开发 Presto,以解决 Facebook 进行分析时的性能、可伸缩性和可扩展性需求。从一开始,Presto 就被打造成一个开源项目。2013 年初,Presto 的初始版本在 Facebook 的生产环境中推出。到 2013 年秋季,Presto 正式作为开源项目发布。在看到 Facebook 的成功后,其他大型互联网企业开始采用 Presto,包括 Netflix、LinkedIn、Treasure Data 等。许多公司继续追随使用。

2015 年,Teradata 宣布投入 20 名工程师为 Presto 作出贡献,重点是添加企业级功能,如安全增强和生态系统工具集成。同年晚些时候,亚马逊将 Presto 纳入其 AWS Elastic MapReduce(EMR)服务中。2016 年,亚马逊宣布推出 Athena,其中 Presto 作为一个重要的基础组件。2017 年成立了 Starburst 公司,致力于推动 Presto 的成功普及。

2018 年底,创始人离开 Facebook,成立了 Presto Software Foundation,以确保项目保持协作和独立性。该项目被称为 PrestoSQL。所有的贡献者和用户与项目的创始人和维护人员一起转移到了 PrestoSQL 代码库。自那时以来,该项目的创新和增长更加迅速。

2020 年底,该项目又取得了一个里程碑。为了消除 PrestoSQL、传统的 PrestoDB 项目和其他版本之间的混淆,社区决定更改项目的名称。经过长时间寻找,选择了 Trino 作为新名称。项目的代码、网站以及周边一切都已更新为使用 Trino。该基金会更名为 Trino Software Foundation。PrestoSQL 标志下的最后一个版本是 350。版本 351 及以后使用 Trino。社区对这个改变表示欢迎和庆祝,跟随项目并为新吉祥物“Commander Bun Bun”选择了一个名字。

如今,Trino 社区正在蓬勃发展壮大,许多知名公司继续大规模使用 Trino。Trino 的核心维护者和更广泛的社区不断推动创新,提供新的 SQL 支持,更新运行时使用 Java 17,现代化的代码和架构以支持容错执行和提高性能,并与客户端工具进行报告和数据平台需求的集成。该项目由来自世界各地许多公司的开发人员和贡献者的蓬勃发展社区维护,包括亚马逊、彭博社、Eventbrite、Gett、谷歌、Line、LinkedIn、Lyft、Netflix、Pinterest、Red Hat、Salesforce、Shopify、Starburst、Treasure Data、Zuora 以及这些用户的许多客户。

发表回复