ETL 全貌、FinMind 主線與架構圖:用 diagrams 畫出你的第一張 ETL 圖
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. 架構圖的基本規則
- 主流程由左到右(或由上到下)
- 箭頭方向代表資料流——資料從哪來、往哪去
- 節點文字要具體——不要寫「處理」,要寫「清洗股價格式」
- 分群——把 Extract / Transform / Load 用框框分開
- 輔助節點放旁邊——排程(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
- 打開瀏覽器(Chrome / Edge / Safari 都可以)
- 在網址列輸入
https://app.diagrams.net/ - 按 Enter
✅ 預期:看到 diagrams 的首頁,會問你要把圖存在哪裡
📸 截圖 A0:diagrams 入口頁面(標出網址列)
Step 2:選擇儲存位置
- 看到儲存位置選擇畫面
- 點 Device(本機)
- 不要選 Google Drive 或其他雲端(先存本機最簡單)
✅ 預期:跳到「Create New Diagram」畫面
📸 截圖 A1:儲存位置選擇(紅框標出 Device)
Step 3:建立新圖
- 點 Create New Diagram
- 選 Blank Diagram(空白圖)
- 在檔名欄位輸入
etl-architecture.drawio - 點 Create
✅ 預期:看到一個空白的畫布
📸 截圖 A2:Create New Diagram 畫面(標出 Blank Diagram 和檔名欄位)
Step 4:認識 diagrams 畫面
畫面分成四個區域:
| 區域 | 位置 | 用途 |
|---|---|---|
| Shapes 工具列 | 左邊 | 拖拉各種形狀到畫布 |
| 畫布 Canvas | 中間 | 畫圖的地方 |
| 格式面板 Format | 右邊 | 調整選取物件的顏色、字型、樣式 |
| 選單列 | 上方 | File(存檔/匯出)、Edit、View 等 |
📸 截圖 A3:空白畫布介面(標出 shapes / canvas / format panel / 選單列)
Step 5:放第一個節點
- 從左側 Shapes 工具列,找到矩形(最常用的形狀)
- 用滑鼠把矩形拖拉到畫布上
- 雙擊矩形上的文字
- 輸入
資料來源
✅ 預期:畫布上有一個寫著「資料來源」的矩形
📸 截圖 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:用箭頭連線
- 把滑鼠移到第一個節點(資料來源)的邊緣
- 會出現藍色的連接點
- 從連接點拖拉出一條箭頭到第二個節點(爬蟲 / API)
- 依序把 6 個節點全部連起來
✅ 預期:6 個節點之間有箭頭連線,方向是由左到右
📸 截圖 A6:主流程箭頭(標出箭頭方向和資料流方向)
Step 8:加 ETL 分群
- 在畫布空白處點右鍵 → Insert → Rectangle(或直接從左側拖一個大矩形)
- 把大矩形框住前兩個節點(資料來源 + 爬蟲/API),雙擊輸入
Extract - 同樣方法框住清洗 + MySQL,輸入
Transform - 框住 FastAPI + 使用者,輸入
Load
小技巧:把分群框的填色改成半透明(Format → 調低 Opacity),這樣裡面的節點看得清楚。
✅ 預期:三個大框把 6 個節點分成 E / T / L 三群
📸 截圖 A7:ETL 分群(紅框標出三個群組和標題)
Step 9:加 Airflow 和 GCP 輔助節點
主流程之外,還有兩個「輔助角色」:
| 輔助節點 | 功能 | 連線方式 |
|---|---|---|
| Airflow | 排程:每天自動跑一次爬蟲 | 用虛線連到爬蟲/API |
| GCP | 部署:把整套系統搬上雲端 | 用虛線連到 FastAPI |
- 在主流程上方或下方新增兩個節點:
Airflow和GCP - 用虛線(Format → Dashed)連到對應的主流程節點
- 輔助節點不在主流程線上,放旁邊就好
📸 截圖 A8:輔助節點(標出 Airflow、GCP、虛線)
Step 10:改成你自己團隊專題的版本
- 把「資料來源(證交所/櫃買)」改成你們團隊的資料來源
- 例如:YouBike API、591 房價、Spotify Dataset、求職平台資料、氣象局 API
- 把「使用者 / Dashboard」改成你們的使用情境
- 例如:營運人員、求職者、房仲、音樂行銷團隊、Line 推播
- 至少修改 2 個節點
📸 截圖 A9:團隊專題版本(標出被修改的節點)
Step 11:匯出 PNG
- 點上方選單
File - 選
Export as - 選
PNG - 匯出設定可先用預設值
- 下載圖片
📸 截圖 A10:File → Export as → PNG(標出 File、Export as、PNG)
✅ 預期:下載資料夾裡多了一張
etl-architecture.png。
Step 12:保留 .drawio 原始檔
- 確認 PNG 已經下載成功
- 點 File → Save as
- 確認檔名是
etl-architecture.drawio - 存到跟 PNG 同一個位置
- 之後兩個檔案(PNG + .drawio)都放進
~/projects/專題資料夾
✅ 預期:你現在有兩個檔案——
etl-architecture.png(分享用)和etl-architecture.drawio(編輯用)
📸 截圖 A11:下載 PNG 與 .drawio
架構圖常見錯誤
| 錯誤 | 為什麼是錯的 | 怎麼修 |
|---|---|---|
| 箭頭方向不一致 | 看圖的人不知道資料往哪流 | 統一由左到右或由上到下 |
| 沒有分群 | 看不出 E/T/L 的邊界 | 加大框框和標題 |
| 節點只寫工具名 | 「MySQL」不如「股價清洗入庫(MySQL)」有意義 | 加上這個節點在做什麼 |
| 忘記存 .drawio | 只有 PNG 就不能再編輯了 | 養成習慣:匯出 PNG 後一定存 .drawio |
| 放太多細節 | 架構圖不是 code,太細反而看不懂 | 一張圖最多 10-15 個節點 |

送件鴿飛出去了