優化 R Docker image 的建立與部署:套件安裝速度提升與節省空間技巧

  1. 前言
  2. 建立 Docker image 時遇到的瓶頸
  3. Step 1:優化安裝套件的速度
    1. 改用 Precompiled 版本的套件 -> 安裝速度提升 8.6 倍
  4. Step 2:優化 Docker image size
    1. 用 r-ver 取代 tidyverse -> 節省 image size 約 2.8 倍
    2. 使用 Multi-stage Builds:兩階段相同 image -> 沒有太大改變
    3. 使用 Multi-stage builds:第二階段改 ubuntu -> 成功縮減 2 倍 image size
  5. 總結
  6. 後記

前言

近期遇到有部分 R Script 執行時佔用太多 VM 記憶體,所以打算把 R 打包成一個 Docker image,讓他可以在 GCP Cloud Run 上面跑,解放 VM 的資源。

首先我建立了一個基於 tidyverse 的 Dockerfile,安裝常用的兩個套件,並讓這個 image 可以由外部提供一個 JOB_NAME 參數,來動態指定要執行的檔案。
(選擇 tidyverse 的原因是使用 r-base 時會遇到無法安裝 bigrquery 的問題)

FROM rocker/tidyverse:4.4.1

RUN R -e "install.packages(c('dplyr', 'bigrquery'), repos='<http://cran.rstudio.com/>')"

COPY r_jobs /r_jobs

CMD ["sh", "-c", "Rscript /r_jobs/$JOB_NAME"]

建立 Docker image 時遇到的瓶頸

雖然這個 image 是可以正常執行,但 docker build 後發現兩個大問題:

  • Docker image 太胖!
    • image 竟然有 2.5 GB 這麼大,這將會造成部署與存放上的問題。
  • R 套件安裝太慢!
    • 光是安裝兩個套件的步驟,就要花 5 分鐘,安裝 12 個套件需要 20 分鐘(如下圖 1,203 秒),時間成本太高。

基於這兩個問題我開始研究 Docker image 的優化方法。

閱讀更多»

Python 與 R 效能大對決!實測比較 Python 和 R 處理數據時的記憶體使用&執行速度

  1. 前言
  2. 實測環境&版本
  3. 實測程式碼
    1. Python
    2. R
    3. 檢查 Test Data 是否相同
  4. 實測數據
  5. 實測結論
  6. 總結

前言

近期因為遇到在 GCP Compute Engine 跑 R 程式碼發生 OOM (Out of Memory)的記憶體問題,所以研究了很多關於 Python 和 R 之間的比較,看到不少文章都說 R 在效能、記憶體分配和垃圾處理(Garbage collect)上都是輸給 Python 的,也看到很多人不推薦使用 R 做大型數據處理。

秉持著研究精神,還是自己測一次最有感,所以這篇文章就是我自己實測的 Python VS. R 的記憶體 + 執行時間的大對決!

實測環境&版本

  • Macbook Pro
    • 晶片: Apple M3
    • 記憶體: 16 GB
    • MacOS: Sonoma 14.2
  • R
    • IDE: 採用最主流的 R Studio 來執行
    • Version:
      • R version: 4.3.3
      • pryr: 0.1.6
  • Python
    • IDE: 採用市占率最高的 VS Code 來執行
    • Version:
      • Python version 3.11.9
      • psutil: 6.0.0
      • numpy: 1.26.4

實測程式碼

這次直接由 ChatGPT-4o 幫我生成兩種不同程式語言的程式碼,我只有附上自己的註解,以及手動更改建立的數據大小而已(下面圖片中的程式碼範例皆為產出一個 70000 x 70000 的表)

閱讀更多»

【資料工程】關於 Airbyte 的介紹、優缺點以及個人使用心得

  1. 什麼是 Airbyte?
  2. 為什麼要選擇 Airbyte?
  3. 關於 Airbyte 的優點
    1. 介面友善
    2. No-Code & 可重複使用的 connectors
    3. 內建 Connector 一鍵更新版本的功能
    4. 不讓 Schema Change 搞壞 Pipeline
  4. Airbyte 目前還是有些小缺點
    1. 無法管理 Secrets 和版本
    2. 開源版的 Airbyte 免費,但需要自架伺服器成本
    3. Metadata 增加儲存成本
    4. Connections 介面資訊不足
    5. 中文欄位名不支援
  5. 總結

什麼是 Airbyte?

在資料工程領域,最常見的工作內容就是處理 ETL/ELT Pipeline(Extract, Load & Transform),現在 ELT 架構比 ETL 更加普及,因為 ETL 會先將資料進行處理後才儲存,就犧牲了資料的彈性(如果後續想要的資料長不一樣會很麻煩),ELT 則是從資料來源先儲存 Raw data,之後有需要做任何處理和變更都會更方便。

Airbyte 是一個開源的資料整合工具,主要是用來建立 ELT Pipeline 中的 EL,也就是把數據從一個來源同步到另一個目的地做儲存,Airbyte 提供很多預先定義好的 Connectors,使用者只要輸入一些資訊就可以建立好一條完整的 EL Pipeline,近期我也花了不少時間研究並嘗試使用 Airbyte,這篇文章就記錄一些心得感想。

為什麼要選擇 Airbyte?

做 EL 的工具很多,就我所知市面上比較熱門的應該是 Fivetran,但 Fivetran 算是需要付費的工具,而且並沒有做開源,因此我覺得 Airbyte 在開源+免費的這部分很有優勢,截至撰文的此時(2024 年 6 月)GitHub 星數已經穩定上升到快 15K。

閱讀更多»

【資料工程】關於 Data Lakehouse 的崛起與目前主流框架

  1. 前言
  2. Data Lakehouse 的崛起
  3. 目前 Data Lakehouse 主流框架
  4. 個人感想
  5. 2024.10.13 補充
  6. 參考資料

前言

這幾年數據量增加速度越來越快,過去很多工具都標榜 Petabyte 等級,但今年開始有些公司的數據量已經達到 Exabyte (EB) 等級,例如 Uber 在近期的技術文章中就有提到他們 Hadoop 數據量已經超過 1 EB。

按照過去已經成熟普及的 Data Lake + Data Warehouse 體系,這麼大量的數據進到 Data Lake 後,再做處理儲存到 Data Warehouse 的流程,除了會造成非常大量的資料移動、資料處理、重複的數據產生之外,還需要維護複雜的大型 ETL Pipeline(Data Engineer 的惡夢…)

Data Lakehouse 的崛起

而這一兩年崛起的 Data Lakehouse 就是在解決這樣的問題,Data Lakehouse 通常會採用 Zero-copy + Open Table Format 的方式,讓 Data Lake 數據也兼具 Warehouse 的功能。

例如 Dashborad 使用的資料其實是直接取用自 Data Lake 的 Raw Data,等於直接省去了 Data Warehouse 這一層,這樣節省下來的成本會非常驚人!

目前 Data Lakehouse 主流框架

閱讀更多»

資料傳輸效能提升 70%!實測 GCP 的 gcloud storage 與 gsutil 指令的差異

  1. 前言
  2. 什麼是 gsutil 指令?
  3. 什麼是 gcloud 指令?
  4. 官方建議使用 gcloud storage 取代 gsutil
  5. 自行實測結果
    1. 實測環境
    2. 實測結果表
    3. 實測 1:複製一個 249.1 MiB 小型檔案
      1. gsutil cp: 5.4 sec
      2. gcloud storage cp: 3.2 sec ( Speed Up 40% )
    4. 實測 2:複製一個 1.0 GiB 大型檔案
      1. gsutil cp: 24 sec
      2. gcloud storage cp: 6.3 sec ( Speed Up 74% )
  6. 總結
  7. 補充資料

前言

在資料工程師的工作中,常會使用雲端 Google Cloud Platform (GCP) 的 Google Cloud Storage (GCS) 作為 Data Lake 儲存一些非結構化資料,而操作 GCS 的指令我都是用 gsutil 來進行,但近期發現有另一個指令是 gcloud storage ,所以這篇文章記錄我針對這兩種指令實測後發現的差異,以及官方文件的建議。

什麼是 gsutil 指令?

  • gsutil 是一個 Python application,主要用來讓使用者可以透過 Command Line 操作 Cloud Storage,操作包含:
    • Creating and deleting buckets.
    • Uploading, downloading, and deleting objects.
    • Listing buckets and objects.
    • Moving, copying, and renaming objects.
    • Editing object and bucket ACLs.

什麼是 gcloud 指令?

  • gcloud 是 GCP 主要的 CLI 工具,用途更廣不限於 GCS,操作包含:
    • Manages authentication, local configuration and developer workflow.
    • Interactions with the Google Cloud APIs.
閱讀更多»