雪花(Snowflake)初學者教程:從架構到運行數據庫

什麼是Snowflake?

如果有人請我以最少的字來描述Snowflake,我會選擇這些:

  • 數據庫
  • 大規模數據
  • 多云
  • 分流
  • 可擴展
  • 靈活
  • 簡單

如果他們想讓我進一步解釋,我會像這樣串聯這些詞:

Snowflake是一個非常受欢迎的基於雲的數據庫管理平台。它之所以從競爭對手中脫穎而出,是因為它能夠更快地、更有效地處理大規模數據和在工作中負荷。它的優越性能來自於其獨特的架构,該架構使用分離的存儲和計算層,使其變得非常靈活和可擴展。此外,它與多家雲服務提供商无缝整合。儘管這些先进功能,它仍然簡單易學易用。

如果他們还想了解更多細節,那麼我會寫這篇教程。如果你完全新材料,DataCamp的Snowflake入門課程是一個非常好的開始。

為什麼使用Snowflake?

Snowflake為全球超過8900個客戶提供服務,並每天處理39億個查询。這種使用統計数据绝非偶然。

以下是一些Snowflake最有吸引力的最佳优势:

1. 基於雲的架構

Snowflake 在雲端運作,讓企業能根據需求彈性地擴展或縮減資源,而無需擔心物理基礎設施(硬體)。該平台還負責例行的維護工作,如軟體更新、硬體管理和性能調校。這有助於減輕維護開支的負擔,讓組織能專注於重要的事務:從數據中提取價值。

2. 弹性和擴展性

Snowflake 將存儲和計算層分離,使用戶能夠獨立於存儲需求擴展計算資源。這種彈性能夠有效地處理多種工作負載,以最佳性能且無不必要的成本進行處理。

3. 並發性和性能

Snowflake 輕鬆處理高並發性:多名用戶可以無損性能地訪問和查詢數據。

4. 數據共享

Snowflake 的安全保護措施能夠讓數據在組織之間、內部部門、外部合作夥伴、客戶或其他利益相關者之間共享。無需進行複雜的數據傳輸。

5. 時間旅行

Snowflake 對數據版本控制使用了一個別名稱“時間旅行”。每次數據庫發生變化時,Snowflake 都會拍攝快照。這讓用戶能夠在過去的各個時間點訪問歷史數據。

6. 成本效益

Snowflake 提供了按使用量付費的模式,因為它能夠動態地擴展資源。您只需為您使用的部分付費。

這些優勢綜合起來,使得 Snowflake 成為一個非常受歡迎的數據倉庫管理工具。

現在,讓我們來看看解锁這些功能的Snowflake底層架構。

什麼是數據庫?

在我們深入了解Snowflake的架構之前,讓我們回顾一下數據庫,以確保我們都在同一頁面上。

數據庫是一個集中的倉儲,用於存放公司從各種來源收集的大量結構化和組織化的數據。組織中不同的角色(員工)使用這些數據來提取不同的洞察。

例如,數據分析师與市場團隊合作,可能會使用銷售表來進行新市場營銷活動的A/B測試。人事專員可能會查詢員工信息以追蹤业绩。

這些是公司全球使用數據庫來推動增長的一些例子。但是,如果不使用像Snowflake這樣的工具進行適當的實施和管理,數據庫仍然是 elaborative 的概念。

您可以通过我们的數據庫课程了解更多信息。

Snowflake 架構

Snowflake 独特的架构,設計用於更快速的析算查詢,來自於其將存儲和計算層分開的設計。這種區別為我們早先提到的益處做出了貢獻。

存儲層

在 Snowflake 中,存儲層是一個关键组件,以有效和可擴展的方式存儲數據。這層的一些主要特點如下:

  1. 雲端基礎: Snowflake與AWS、GCP和Microsoft Azure等主要雲端服務提供商無縫整合。
  2. 列儲格式: Snowflake以列儲格式儲存數據,這種格式針對分析查詢進行了優化。與像Postgres這樣使用傳統行儲格式的工具不同,列儲格式更適合數據聚合。在列儲存中,查詢只需要訪問它們需要的特定列,因此效率更高。另一方面,行儲格式在進行計算平均值這樣的簡單操作時,需要訪問記憶體中的所有行。
  3. 微分割: Snowflake使用一種稱為微分割的技術,將表以小塊的形式儲存在記憶體中。每個塊通常是不可變的,大小只有幾百萬字節,這使得查詢優化和執行速度更快。
  4. 零拷貝克隆: Snowflake有一項獨特功能,可以創建數據的虛擬克隆。克隆是瞬間完成的,并且在對新副本進行更改之前不消耗額外的記憶體。
  5. 縮放和彈性: 儲存層可以水平縮放,這意味著它通過添加更多服務器來分配負載,可以處理日益增多的數據量。此外,這種縮放與計算資源獨立進行,這在您希望儲存大量數據但只分析其中一小部分時非常理想。

現在,讓我們來看看計算層。

計算層

正如其名,計算層是執行您的查詢的引擎。它與存儲層共同processing 數據並執行各種計算任務。以下是一些有關此層如何運作得更詳細的資訊:

  1. 虛擬倉庫:您可以將虛擬倉庫視為設計用來處理查詢處理的電腦團隊(計算節點)。團隊中的每個成員負責處理查詢的 different 部分,使執行速度驚人且並行。Snowflake 提供不同大小的虛擬倉庫,相對地,價格也不一樣(大小包括 XS、S、M、L、XL)。
  2. 多集群、多節點架構:計算層使用多個集群與多個節點來實現高並發,讓多個用戶同時存取和查詢數據。
  3. 自動查詢優化:Snowflake 的系統會分析所有查詢並通過使用歷史數據識別模式來進行優化。常見的優化包括摒除不必要的數據、使用 metadata 以及選擇最有效的執行路徑。
  4. 結果快取:計算層包括一個快取,用於存儲經常執行的查詢的結果。當同樣的查詢再次運行時,結果會 almost 瞬間返回。

計算層的這些設計原則都有助於 Snowflake 在雲中處理不同的和工作負載。

雲服務層

最後一層是雲端服務。由於這一層已集成到Snowflake架構的每個組件中,其操作上有許多細碎的細節。除了與其他層相關的功能外,它還具有以下額外的責任:

  1. 安全和訪問控制:這層执行安全措施,包括身份驗證、授權和加密。管理員使用基于角色的訪問控制(RBAC)來定義和管理用戶角色和權限。
  2. 數據共享:這層實現跨不同账戶甚至第三方組織的安全數據共享協議。數據消費者可以无需搬移數據就能訪問數據,促進合作和數據貨幣化。
  3. 半結構化數據支持: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: CLI

沒有任何東西能比從終端管理並查詢一個成熟的數據庫更令人興奮了。這就是 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-like系統上,重要的是要確保在所有終端會話中都可以使用snowsql命令。為了達到此目的,您應該將/home/username/bin目錄添加到您的$PATH變量中。您可以通過將以下行附加到您的.bashrc.bash_profile.zshrc文件來實現這一點:export PATH=/home/yourusername/bin:$PATH。記得將yourusername替換為您的實際用戶名。

這個訊息提示我們配置帳戶設定以連接到Snowflake。有兩種方法可以做到這一點:

  1. 在終端中互動式地傳遞帳戶詳細信息。
  2. 在全局Snowflake配置文件中配置憑證。

由於第二種方法更為永久和安全,我們將採用這個選項。對於平台特定的說明,請閱讀文檔中的通過SnowSQL連接頁面。以下的指示適用於Unix-like系統。

首先,登錄您的電子郵件地址,找到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 中創建新數據庫和表

如果您屬於大組織的一部分,可能會有一些情況 where 創建數據庫並將现有數據填充到其中的責任落在您的肩上。為 了 熟 練 這 種 情 境,讓我們試著將 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 的功能遠遠超過我們所涵蓋的內容。事實上,Snowflake 的文件中包含了實際長達 128 分鐘的快速入門指南!但在您攻克的同時,我建議您先透過一些其他資源來親自體驗一下。以下是一些資源:

感謝您的閱讀!

Source:
https://www.datacamp.com/tutorial/introduction-to-snowflake-for-beginners