什么是Snowflake?
如果有人让我用尽可能少的词来描述Snowflake,我会选择这些:
- 数据仓库
- 大规模数据
- 多云
- 分离
- 可扩展
- 灵活
- 简单
如果他们让我详细说明,我会这样串联这些词语:
Snowflake 是一个非常流行的基于云的数据仓库管理平台。它因能够更快速、更高效地处理大规模数据和工作负载而从竞争对手中脱颖而出。其卓越的性能来自于其独特的架构,该架构使用独立的存储和计算层,使其具有极大的灵活性和可扩展性。此外,它还与多个云服务提供商本地集成。尽管具有这些高级功能,但它仍然易于学习和实施。
如果他们要求更多细节,那么我会写这个教程。如果你对这个主题完全陌生,DataCamp 的 Snowflake简介 课程是一个很好的起点。
为什么使用Snowflake?
Snowflake 在全球拥有超过8900个客户,每天处理39亿个查询。这样的使用统计数据绝非偶然。
以下是Snowflake最吸引人的优势:
1. 基于云的架构
雪球云平台在云中运行,使公司能够根据需求伸缩资源,而无需担心物理基础设施(硬件)。该平台还处理诸如软件更新、硬件管理和性能调优等常规维护任务。这减轻了维护开销的负担,使组织能够专注于最重要的事情:从数据中获取价值。
2. 弹性与可伸缩性
雪球将存储和计算层分离,使用户能够独立于存储需求来扩展计算资源。这种弹性能够高效地处理多样的工作负载,实现最佳性能,而不产生不必要的成本。
3. 并发与性能
雪球能轻松处理高并发性:多个用户可以同时访问和查询数据,而不会损失性能。
4. 数据共享
雪球的安全保障功能可以实现跨其他组织、内部部门、外部合作伙伴、客户或其他利益相关者的数据共享。无需进行复杂的数据传输。
5. 时间旅行
雪球用一个花哨的术语“时间旅行”来表示数据版本控制。无论何时对数据库进行更改,Snowflake都会拍摄一个快照。这使用户能够访问不同时点的的历史数据。
6. 成本效益
由于其能够动态伸缩资源,雪球提供按使用量付费的计费模型。您只需为所用服务付费。
所有这些优点使雪球成为一个非常受欢迎的数据仓库管理工具。
现在,让我们来了解一下Snowflake的底层架构,它解锁了这些功能。
数据仓库是什么?
在我们深入Snowflake的架构之前,让我们回顾一下数据仓库,以确保我们所有人都在同一个页面上。
数据仓库是一个集中存储大量来自公司各种来源的的结构化和组织化数据的中央仓库。组织中的不同人员(员工)使用其中的数据来获取不同的洞察。
例如,数据分析师可以与市场营销团队协作,使用销售表运行新的市场营销活动的A/B测试。人力资源专家可能查询员工信息以跟踪表现。
这些是公司全球使用数据仓库推动增长的一些例子。但是,如果没有像Snowflake这样的工具的正确实施和管理,数据仓库仍然只是一个精致的概念。
您可以通过我们的数据仓库课程了解更多信息。
Snowflake架构
Snowflake独特的架构,设计用于更快的分析查询,来自于其存储层和计算层的分离。这种区分是我们之前提到的优势的贡献。
存储层
在Snowflake中,存储层是一个关键组件,以高效和可扩展的方式存储数据。以下是该层的一些关键特性:
- 云基础:Snowflake与AWS、GCP和Microsoft Azure等主要云服务提供商无缝集成。
- 列式格式:Snowflake以列式格式存储数据,针对分析查询进行优化。与Postgres等工具使用的传统行式格式不同,列式格式非常适合数据聚合。在列式存储中,查询只访问它们需要的特定列,因此效率更高。另一方面,行式格式在进行计算平均值等简单操作时,需要访问内存中的所有行。
- 微分区:Snowflake使用一种称为微分区的方法,将表以小块形式存储在内存中。每个块通常是不可变的,大小只有几兆字节,这使得查询优化和执行速度大大加快。
- 零拷贝克隆: Snowflake有一个独特的功能,可以创建数据的虚拟克隆。克隆是瞬时的,并且在修改新副本之前不会消耗额外的内存。
- 扩展和弹性:存储层水平扩展,这意味着可以通过添加更多服务器来分担负载来处理增加的数据量。此外,这种扩展独立于计算资源,当您希望存储大量数据但只分析其中的一小部分时,这是理想的。
现在,让我们看看计算层。
计算层
计算层是执行您查询的引擎。它与存储层配合处理数据并执行各种计算任务。以下是关于这一层工作方式的更多细节:
- 虚拟仓库:您可以将虚拟仓库视为处理查询的计算机团队(计算节点)。团队中的每个成员处理查询的不同部分,使得执行速度非常快且并行。Snowflake提供不同大小的虚拟仓库,相应地,价格也不同(大小包括XS、S、M、L、XL)。
- 多集群、多节点架构:计算层使用多个带有多个节点的集群实现高并发,允许多个用户同时访问和查询数据。
- 自动查询优化:Snowflake的系统分析所有查询并识别使用历史数据优化的模式。常见的优化包括剪枝不必要的数、使用元数据和选择最有效的执行路径。
- 结果缓存:计算层包括一个缓存,存储经常执行的查询结果。当再次运行相同的查询时,结果几乎可以立即返回。
这些计算层的设计原则都有助于Snowflake在云中处理不同的和高要求的工作负载。
云服务层
最后一层是云服务。由于这一层整合到了Snowflake架构的每一个组件中,因此在它的操作上有许多细节。除了其他层相关的特性外,它还具有以下额外的责任:
- 安全和访问控制:这一层执行安全措施,包括认证、授权和加密。管理员使用基于角色的访问控制(RBAC)来定义和管理用户角色和权限。
- 数据共享:这一层实现了跨不同账户甚至第三方组织的安全数据共享协议。数据消费者可以访问数据,而无需移动数据,从而促进协作和数据货币化。
- 半结构化数据支持:Snowflake的另一个独特优势是,尽管它是一个数据仓库管理平台,但它能够处理半结构化数据,如JSON和Parquet。它可以轻松查询半结构化数据并将结果与现有表整合。这种灵活性在其他RDBMS工具中是看不到的。
现在我们已经对Snowflake的架构有了高层次的了解,让我们在平台上写一些SQL。
设置SnowflakeSQL
Snowflake有自己的SQL版本,称为SnowflakeSQL。它与其他SQL方言的区别类似于英语口音之间的区别。
在像PostgreSQL这样的方言中执行的分析查询很多是不变的,但在DDL(数据定义语言)命令上有些差异。
Snowflake提供了两个接口来运行SnowSQL:
- Snowsight:一个与平台交互的网页界面。
- SnowSQL:一个CLI(命令行界面)客户端,用于管理和查询数据库。
我们将了解如何设置这两个工具并运行一些查询!
Snowsight:网页界面
要开始使用Snowsight,请导航至 Snowflake主页,然后选择“免费开始”。输入您的个人信息并选择任何列出的云提供商。这个选择并不重要,因为免费试用包括任何选项的$400信用额度(您不需要亲自设置云凭据)。
在验证您的电子邮件后,您将被重定向到Worksheets页面。Worksheets是交互式的实时编码环境,您可以在这里编写、执行并查看SQL查询的结果。
要运行一些查询,我们需要一个数据库和一个表(我们不会使用Snowsight中的样本数据)。下面的GIF展示了如何使用本地CSV文件创建一个名为“test_db”的新数据库和一个名为“diamonds”的表。您可以通过在终端运行这个GitHub gist中的代码来下载CSV文件。
在GIF中,Snowsight告诉我们有一个列名有问题。由于“table”是一个保留关键字,所以我用双引号将其括起来。
随后,您将被引导至一个全新的工作表,您可以在其中运行任何想要的SQL查询。正如GIF所示,工作表界面非常直观且功能强大。花几分钟时间熟悉各个面板、按钮及其相应位置。
SnowSQL:命令行界面
没有什么能比从终端管理并查询一个全功能的数据库更令人兴奋了。这就是为什么会有SnowSQL的存在!
然而,为了让它运行起来,我们需要遵循几个步骤,这通常比开始使用Snowsight要慢一些。
作为第一步,从 Snowflake开发者下载页面下载SnowSQL安装程序。下载相关的文件。由于我正在使用WSL2,我将选择Linux版本:
在终端中,我使用复制的链接下载文件,并用bash
执行它:
$ curl -O https://sfc-repo.snowflakecomputing.com/snowsql/bootstrap/1.2/linux_x86_64/snowsql-1.2.31-linux_x86_64.bash $ bash snowsql-1.2.31-linux_x86_64.bash
对于其他平台,您可以遵循 Snowflake文档的这一页中的安装步骤。
成功安装后,您应该会看到以下信息:
在类Unix系统中,确保 snowsql
命令在所有终端会话中可用非常重要。为此,您应该将 /home/username/bin
目录添加到您的 $PATH 变量中。您可以通过将以下行追加到您的 .bashrc
、.bash_profile
或 .zshrc
文件来实现这一点:export PATH=/home/yourusername/bin:$PATH
。请记得将 yourusername
替换为您的实际用户名。
该消息提示我们要配置账户设置以连接到 Snowflake。有两种方法可以实现:
- 在终端中以交互方式传递账户详情。
- 在全局 Snowflake 配置文件中配置凭据。
由于第二种方法更永久、更安全,我们将采用第二种方法。有关特定平台的说明,请阅读文档中的 通过 SnowSQL 连接页面。以下说明适用于类Unix系统。
首先,前往您的电子邮件地址,并找到来自 Snowflake 的欢迎电子邮件。它包含您的账户名称,在登录链接中:account-name.snowflakecomputing.com
。复制它。
接下来,使用文本编辑器(如 VIM 或 VSCode)打开 ~/.snowsql/config
文件。在 connections
部分下,取消注释以下三个字段:
- 账户名称
- 用户名
- 密码
用您复制的光标账户名称和注册时提供的用户名和密码替换默认值。完成后,保存并关闭文件。
然后,回到您的终端,并输入snowsql
。客户端应该会自动连接,并为您提供一个包括代码高亮和制表补全等功能的SQL编辑器。它应该看起来像这样:
正在连接到SnowSQL中的现有数据库
现在,我们还没有连接到任何数据库。让我们通过连接到使用Snowsight创建的test_db
数据库来解决这个问题。首先,使用SHOW DATABASES
检查可用的数据库:
$ SHOW DATABASES $ USE DATABASE TEST_DB
接下来,指定您将从现在起使用test_db
数据库(不区分大小写)。然后,您可以对连接的数据库中的表运行任何SQL查询。
$ SELECT COUNT(*) FROM DIAMONDS
在SnowSQL中创建新数据库和表
如果您是大组织的一部分,可能会有创建数据库并向其填充现有数据的责任落在您的肩上。为了为这种情况做准备,让我们尝试将Diamonds数据集作为表上传到SnowSQL中的新数据库。您可以遵循以下步骤:
1. 创建新数据库:
CREATE DATABASE IF NOT EXISTS new_db;
2. 使用数据库:
USE DATABASE new_db;
3. 为CSV创建文件格式:
CREATE OR REPLACE FILE FORMAT my_csv_format -- 可以命名为任何名称 TYPE = CSV FIELD_DELIMITER = ',' SKIP_HEADER = 1; -- 假设第一行是标题行
我们必须手动定义一个文件格式并为其命名,因为Snowflake无法推断出如CSV、JSON或XML等数据文件的架构和结构。我们上面定义的文件格式适用于我们拥有的diamonds.csv
文件(它是用逗号分隔的,并且包含一个标题)。
4. 创建一个内部阶段:
CREATE OR REPLACE STAGE my_local_files;
在Snowflake中,阶段是一个存储区域,您可以在此区域上传您的本地文件。这些可以是结构化和半结构化数据文件。上面,我们正在创建一个名为my_local_files
的阶段。
5. 将CSV文件放入阶段:
PUT file:///home/bexgboost/diamonds.csv @my_local_files;
6. 创建表:
CREATE TABLE diamonds ( carat FLOAT, cut VARCHAR(255), color VARCHAR(255), clarity VARCHAR(255), depth FLOAT, table FLOAT, price INTEGER, x FLOAT, y FLOAT, z FLOAT );
7. 从阶段将数据加载到表中:
COPY INTO diamonds FROM @my_local_files/diamonds.csv FILE_FORMAT = my_csv_format;
8. 验证:
SELECT COUNT(*) FROM diamonds;
这些步骤将创建一个新的Snowflake数据库,定义一个CSV文件格式,创建一个存储本地文件的阶段,将CSV文件上传到该阶段,创建一个新的表,将CSV数据加载到表中,最后通过计算表中的行数来验证操作。
如果结果返回行数,恭喜您,您已经成功使用SnowSQL将本地数据加载到数据库中。现在,您可以随意查询表。
结论和进一步学习
哇!我们开始时有一些简单概念,但到最后,我们真正深入到了复杂细节。好吧,这就是我认为不错的教程。
你可能已经猜到,雪碧(Snowflake)的内容比我们覆盖的要多得多。实际上,雪碧的文档中包括实际时长为128分钟的快速入门指南!但在你处理这些指南之前,我建议你先尝试一些其他资源。怎么样以下这些呢:
感谢你的阅读!
Source:
https://www.datacamp.com/tutorial/introduction-to-snowflake-for-beginners