AI & Data Dreamers練功房
寶箱片場規則
前傳・開工前環境安裝

ETL 全貌、FinMind 主線與架構圖:用 diagrams 畫出你的第一張 ETL 圖

← 回資料館・在 GitHub 看原始檔(de-course)・裝到一半卡住?左下角送件鴿或 Discord #觀眾服務台 喊一聲

3. 開場:課程全貌 + FinMind 主線

3-1. 22 集完整路線圖

這門課共 22 集,分成 8 個階段,每個階段讓你的系統多長出一塊:

階段 集數 學什麼 系統長出什麼
S0 基礎工具 EP01-04 架構圖 / WSL / VS Code / Git / Python 環境 / Docker 本機開發環境就緒
S1 分散式爬蟲 EP05-07 爬蟲 / RabbitMQ / Celery / Flower / 多 Worker 能自動爬證交所與櫃買股價
S2 資料儲存 EP08 MySQL / Pandas 清理 / PyMySQL / Docker 部署 爬到的資料清洗後存進 MySQL
S3 資料讀取 EP09-10 FastAPI / RESTful / MongoDB / 容器化 API API 能查詢 MySQL 股價
S4 服務管理 EP11-12 Portainer / Grafana / Prometheus / Metabase BI 監控 Dashboard + 資料儀表板
S5 排程編排 EP13-14 Airflow / DAG / Operator / 分散式執行 整條 pipeline 自動排程
S6 雲端 (1) EP15-18 GCP / GCE / Secret Manager / Cloud SQL / Load Balance 系統搬上雲端,外網可訪問
S7 雲端 (2) EP19-22 Docker Image 管理 / BigQuery / Composer / 壓測 整條產線跑在託管 Airflow

3-2. 整門課跟著一套系統走:FinMind 財經資料系統

FinMind 是一套開源的台灣財經資料系統,爬取證交所、櫃買中心的股價。每一集學的工具,都會用在這套系統上。你的團隊專題用同樣的架構,換成你們自己的資料。

code 來源是 GitHub 上的 FinMindBook/DataEngineering,每集會告訴你去哪個章節拿 code。

📂 你會用到兩個資料夾(先有概念,今天只動第一個)

資料夾 是什麼 何時建
~/projects/(= 你的 GitHub repo) 你自己的練習場 + 個人 MVP,之後都 push 這裡 今天 EP01 就建
~/serial-course/ 老師的 FinMind 範例(標準答案),clone 來看/跑 EP03 才 clone

📣 「記住一句話:~/projects 是你的、能 push;~/serial-course 是老師的、clone 來對答案、不 push。今天先把 ~/projects 建起來。」


4. Part 1:ETL 觀念

4-1. 什麼是 ETL

ETL 是資料工程最核心的概念,三個字母代表資料從來源到可用的完整流程:

字母 全名 中文 做什麼 白話比喻
E Extract 抽取 從各種來源把資料拉回來 去市場買菜
T Transform 轉換 清洗、標準化、轉換格式 洗菜、切菜、備料
L Load 載入 把處理好的資料存到目的地,供人或系統使用 上菜、讓客人吃到

4-2. ETL 在業界的實際應用

幾乎所有資料相關的系統都是 ETL 的變形:

場景 Extract Transform Load
電商數據 爬取訂單 / 用戶行為 log 清洗重複、標準化時間格式 存進資料倉儲、產生報表
金融數據 串接證交所 API / 爬股價 計算技術指標、去缺漏值 存進 MySQL / BigQuery
社群媒體 串接 Twitter/IG API 情感分析、分類、去重 存進 Elasticsearch、推 Dashboard
IoT 感測器 接收設備回傳的 sensor data 過濾雜訊、聚合、轉時區 存進時序資料庫

4-3. ETL vs ELT

你可能會聽到另一個詞 ELT——差別在於清洗的時間點:

模式 流程 什麼時候用 代表工具
ETL 先清洗再存 資料量小、schema 已定義 MySQL、PostgreSQL
ELT 先存再清洗 資料量大、先收進來再分析 BigQuery、Snowflake、Databricks

我們這門課主線用 ETL(先清洗再存 MySQL),EP20 BigQuery 會接觸 ELT。

4-4. FinMind 的 ETL 對應

在我們的 FinMind 財經資料系統中,ETL 具體對應:

步驟 具體做什麼 用什麼工具 哪幾集學
Extract 爬證交所和櫃買中心的股價、法人買賣超、融資融券 requests → Celery 分散式爬蟲 EP05-07
Transform 清洗格式(日期、數字型別)、去重、驗證 pandas + PyMySQL EP08
Load 存進 MySQL,用 FastAPI 對外供查詢 MySQL + FastAPI EP08-10
排程 用 Airflow 每天自動跑一次 Airflow DAG EP13-14
雲端 整套搬上 GCP,資料進 BigQuery GCP + BigQuery + Composer EP15-22

5. 架構圖觀念 + 工具介紹

5-1. 為什麼需要架構圖

架構圖是讓別人一眼看懂你的系統在做什麼的工具。

場景 為什麼需要架構圖
面試 面試官問「你做過什麼系統?」——你要能畫出來
團隊協作 讓隊友知道誰負責哪一塊
文件 README 放一張架構圖,比寫 500 字有用
Debug 系統出問題時,看圖找到是哪一段壞了
規劃 新功能要加在哪裡,看圖就知道

5-2. 架構圖的基本規則

  1. 主流程由左到右(或由上到下)
  2. 箭頭方向代表資料流——資料從哪來、往哪去
  3. 節點文字要具體——不要寫「處理」,要寫「清洗股價格式」
  4. 分群——把 Extract / Transform / Load 用框框分開
  5. 輔助節點放旁邊——排程(Airflow)、部署(GCP)用虛線連

5-3. 架構圖工具:diagrams.net

diagrams.net(原名 draw.io)是一個免費的線上拖拉式架構圖工具:

特性 說明
免費 完全免費,不需要帳號
線上 打開瀏覽器就能用:https://app.diagrams.net/
匯出 可匯出 PNG / SVG / PDF
原始檔 .drawio 格式可以保留,下次打開繼續編輯
離線 也有桌面版可以下載

其他常見的架構圖工具(補充知識):

工具 特性 本課用法
diagrams.net 拖拉式、好上手、免費 ⭐ 主力工具
Mermaid 純文字語法、可嵌入 README、GitHub 自動渲染 EP02 學 Git/GitHub 時會教
Excalidraw 手繪風格、好看 適合簡報用
Lucidchart 專業級、團隊協作 付費,企業用

6. Lab 1:用 diagrams 畫 ETL 架構圖

📂 這段要準備什麼:只需要一台能上網的電腦和瀏覽器。

Step 1:打開 diagrams

  1. 打開瀏覽器(Chrome / Edge / Safari 都可以)
  2. 在網址列輸入 https://app.diagrams.net/
  3. 按 Enter

✅ 預期:看到 diagrams 的首頁,會問你要把圖存在哪裡

📸 截圖 A0:diagrams 入口頁面(標出網址列)

Step 2:選擇儲存位置

  1. 看到儲存位置選擇畫面
  2. 點 Device(本機)
  3. 不要選 Google Drive 或其他雲端(先存本機最簡單)

✅ 預期:跳到「Create New Diagram」畫面

📸 截圖 A1:儲存位置選擇(紅框標出 Device)

Step 3:建立新圖

  1. 點 Create New Diagram
  2. 選 Blank Diagram(空白圖)
  3. 在檔名欄位輸入 etl-architecture.drawio
  4. 點 Create

✅ 預期:看到一個空白的畫布

📸 截圖 A2:Create New Diagram 畫面(標出 Blank Diagram 和檔名欄位)

Step 4:認識 diagrams 畫面

畫面分成四個區域:

區域 位置 用途
Shapes 工具列 左邊 拖拉各種形狀到畫布
畫布 Canvas 中間 畫圖的地方
格式面板 Format 右邊 調整選取物件的顏色、字型、樣式
選單列 上方 File(存檔/匯出)、Edit、View 等

📸 截圖 A3:空白畫布介面(標出 shapes / canvas / format panel / 選單列)

Step 5:放第一個節點

  1. 從左側 Shapes 工具列,找到矩形(最常用的形狀)
  2. 用滑鼠把矩形拖拉到畫布上
  3. 雙擊矩形上的文字
  4. 輸入 資料來源

✅ 預期:畫布上有一個寫著「資料來源」的矩形

📸 截圖 A4:拖拉第一個節點(標出矩形和文字「資料來源」)

Step 6:放出主流程 6 個節點

用複製(Ctrl+C / Cmd+C → Ctrl+V / Cmd+V)或繼續從左側拖拉,依序放出以下 6 個節點,由左到右排列:

順序 節點名稱 屬於 ETL 的哪一段
1 資料來源(證交所/櫃買) Extract
2 爬蟲 / API Extract
3 清洗 / 正規化 Transform
4 MySQL Transform
5 FastAPI Load
6 使用者 / Dashboard Load

✅ 預期:畫布上由左到右排了 6 個矩形,各自有名稱

📸 截圖 A5:6 個節點排列(標出左到右的順序)

Step 7:用箭頭連線

  1. 把滑鼠移到第一個節點(資料來源)的邊緣
  2. 會出現藍色的連接點
  3. 從連接點拖拉出一條箭頭到第二個節點(爬蟲 / API)
  4. 依序把 6 個節點全部連起來

✅ 預期:6 個節點之間有箭頭連線,方向是由左到右

📸 截圖 A6:主流程箭頭(標出箭頭方向和資料流方向)

Step 8:加 ETL 分群

  1. 在畫布空白處點右鍵 → Insert → Rectangle(或直接從左側拖一個大矩形)
  2. 把大矩形框住前兩個節點(資料來源 + 爬蟲/API),雙擊輸入 Extract
  3. 同樣方法框住清洗 + MySQL,輸入 Transform
  4. 框住 FastAPI + 使用者,輸入 Load

小技巧:把分群框的填色改成半透明(Format → 調低 Opacity),這樣裡面的節點看得清楚。

✅ 預期:三個大框把 6 個節點分成 E / T / L 三群

📸 截圖 A7:ETL 分群(紅框標出三個群組和標題)

Step 9:加 Airflow 和 GCP 輔助節點

主流程之外,還有兩個「輔助角色」:

輔助節點 功能 連線方式
Airflow 排程:每天自動跑一次爬蟲 用虛線連到爬蟲/API
GCP 部署:把整套系統搬上雲端 用虛線連到 FastAPI
  1. 在主流程上方或下方新增兩個節點:Airflow 和 GCP
  2. 用虛線(Format → Dashed)連到對應的主流程節點
  3. 輔助節點不在主流程線上,放旁邊就好

📸 截圖 A8:輔助節點(標出 Airflow、GCP、虛線)

Step 10:改成你自己團隊專題的版本

  1. 把「資料來源(證交所/櫃買)」改成你們團隊的資料來源
    • 例如:YouBike API、591 房價、Spotify Dataset、求職平台資料、氣象局 API
  2. 把「使用者 / Dashboard」改成你們的使用情境
    • 例如:營運人員、求職者、房仲、音樂行銷團隊、Line 推播
  3. 至少修改 2 個節點

📸 截圖 A9:團隊專題版本(標出被修改的節點)

Step 11:匯出 PNG

  1. 點上方選單 File
  2. 選 Export as
  3. 選 PNG
  4. 匯出設定可先用預設值
  5. 下載圖片

📸 截圖 A10:File → Export as → PNG(標出 File、Export as、PNG)

✅ 預期:下載資料夾裡多了一張 etl-architecture.png。

Step 12:保留 .drawio 原始檔

  1. 確認 PNG 已經下載成功
  2. 點 File → Save as
  3. 確認檔名是 etl-architecture.drawio
  4. 存到跟 PNG 同一個位置
  5. 之後兩個檔案(PNG + .drawio)都放進 ~/projects/ 專題資料夾

✅ 預期:你現在有兩個檔案——etl-architecture.png(分享用)和 etl-architecture.drawio(編輯用)

📸 截圖 A11:下載 PNG 與 .drawio

架構圖常見錯誤

錯誤 為什麼是錯的 怎麼修
箭頭方向不一致 看圖的人不知道資料往哪流 統一由左到右或由上到下
沒有分群 看不出 E/T/L 的邊界 加大框框和標題
節點只寫工具名 「MySQL」不如「股價清洗入庫(MySQL)」有意義 加上這個節點在做什麼
忘記存 .drawio 只有 PNG 就不能再編輯了 養成習慣:匯出 PNG 後一定存 .drawio
放太多細節 架構圖不是 code,太細反而看不懂 一張圖最多 10-15 個節點