Docker volumes 教學 - 從不熟到略懂


談到 Docker 容器的資料儲存(storage)問題,基本直覺就是透過掛載 Volumes, 不過 Docker 的 Volumes 其實有 3 種不同類型(types):

  1. Bind mount
  2. Volume
  3. tmpfs mount

大家常用的 -v <Host 路徑>:<Container 路徑> 參數其實就是使用 bind mount, 例如以下指令:

$ docker run -it -v /home/user:/data debian /bin/bash

簡而言之,使用 bind mount 的 volume 其實就是透過 host machine 的檔案系統(filesystem)提供容器儲存的能力。

雖然不清楚 volume 的類型,並不會對日常使用上造成任何問題,不過理解其差異仍有其必要,因爲這些差異很可能會在 production 環境上產生重大影響。

Python 套件介紹 - smart_open 不僅聰明還很好用


現今後端(backend)儲存解決方案相較於以往多了許多選擇,從傳統的硬碟儲存到現代各式各樣的雲端儲存服務,例如 AWS S3, Google Cloud Storage, Azure Blob Storage 甚至 HDFS(Hadoop Distributed File System) 等等,因此開發過程不免都會遇到需要整合雲端儲存方案的問題,與其重新發明輪胎,不如選擇 1 套簡單易用而且通吃各家服務的套件,不僅省事還能有效增加開發效率。

所以,你需要 smart_open 的幫忙!

零經驗也可的 PySpark 教學 - 初體驗


Apache Spark 是現今處理巨量資料(large-scale data)分析、資料處理、機器學習(machine learning)的主流叢集運算框架之一,其主打簡單、快速、可擴充(scalable)、統一介面(unified) 4 大特點,更支援多種語言(Python, Java, R, SQL)可供靈活選擇運用。

Spark 採用的是 In-memory 運算技術,運算的資料存在於記憶體之中,相對於使用硬碟等儲存媒介的運算框架(例如 Apache Hadoop)而言, Spark 具有運算速度的優勢。

此外,除了提供核心運算功能的 Spark Core, Apache Spark 更在其基礎上衍生 Spark SQL, Spark Streaming, MLlib, GraphX 四大功能:

  • Spark SQL - 支援以 SQL 對資料進行操作、運算
  • Spark Streaming - 讓 Spark 能夠處理串流(streaming)形式的資料
  • MLlib - 增加機器學習(machine learning)的相關函式庫(library),讓開發者得以利用 Apache Spark 進行機器學習相關的運算
  • GraphX - 支援圖論(graph theory)相關的運算,像社群網絡(social network)相關數據分析就適合使用 GraphX 進行運算


引用自 https://databricks.com

綜觀來說,Apache Spark 是相當值得投資學習的一套運算框架。

本文將透過 Docker 以及 PySpark 為初學者提供接觸 Apache Spark 的一條捷徑。

Apache Parquet 深度介紹與說明


資料科學(data science)的興起以及日益增長的大資料的分析需求,傳統以資料列為導向(row-oriented)的儲存方式逐漸顯現其未逮之處,因此以欄位為導向(column-oriented, 或稱 columnar)的儲存方式應運而生,其中 Apache Parquet 是相當知名的 columnar 檔案格式,也能夠搭配 Hive, Spark 等知名的 Apache 開源專案使用。

本文將介紹 Apache Parquet 儲存格式,並且透過實際操作理解 Parquet 格式與其奧妙之處。

Docker CMD 與 ENTRYPOINT 說明詳解


寫 Dockerfile 時,經常搞不清楚 CMDENTRYPOINT 的差異,雖然兩者用途相當雷同,但還是特別查閱了一下 Docker 的官方文件,了解兩者的用途以及差別,並且透過實際的範例驗證後,記錄成本文。

實戰 Python 效能分析 - 從 cProfile 到 py-spy


Python 應用(application)相較於 Go, C 這類語言所寫的應用,前者執行效率較慢是公認問題,不過 Python 的易用性也相對地提升開發速度,甚至其 batteries included 的哲學以及豐富的生態系也能夠減少重複造輪的情況,大幅縮短從概念到產品的實現路徑。

至於執行效率的問題,其實可以透過多種手段進行改善,譬如進行分散式、多執行緒(multithreading)、多行程(multiprocessing)、改善演算法,或以其他較高效率的語言為 Python 進行擴充(例如 ctypes 模組),雖然無法保證一定能夠像 Go, C 這類語言同樣高效,但也能夠將效率提升到可接受的程度以上。

但在處理真正的效率問題之前,絕大多數可能是我們沒有以正確有效率的方式撰寫 Python 應用,而導致其執行效率較差,並且將問題怪罪於 Python 本身。

因此如何剖析 Python 程式,並且找到隱藏在其中的效率問題,是一門相當重要的課題,本文將從介紹 cProfile 模組開始,並以實際範例找出 Python 程式中的問題點,並使用 py-spy 工具更近一步精準定位問題所在,以提高找出問題的效率。

實戰 Fil 改善 Python 記憶體用量


用 Python resource 模組找出尖峰記憶體用量 一文介紹如何透過 Python resource 模組了解尖峰記憶體用量(peak memory usage), 不過該模組並無法提供更詳細的記憶體統計資料,無法得知具體哪部分的 Python 程式消耗大量記憶體,因此我們需要透過工具剖析(profiling)詳細的記憶體用量,以幫助定位問題之所在。

本文將介紹如何使用 Fil 剖析 Python 程式的記憶體用量,並透過 1 個簡單的範例,實際定位程式中耗用記憶體的部分,並進行改善優化。

用 Python resource 模組找出尖峰記憶體用量


Python 先天的設計使然,所以 Python 相較起其他語言(如 Rust, Go 等)更加耗用記憶體,如果是簡單的 Python 程式(例如自動化腳本)基本不需要太在意記憶體的問題,但如果是需要計較運算資源成本的應用場景,例如使用 AWS, GCP 雲端服務等, Python 的記憶體耗用肯定會對總體花費造成影響,因此了解你的應用使用記憶體的情形是相當重要的一步。

如果要優化記憶體的使用,可先從盤點尖峰記憶體的用量著手,除了可以避免使用等級過高的運算資源之外,還可以針對尖峰用量最大的應用優先降低用量。

Python 也提供內建的 resource 模組可使用,讓開發者可以設定系統資源的使用限制(例如 CPU time, heap size, nice 值 等等),也可以讀取系統資源使用的情況,其中就包含尖峰記憶體(peak memory)用量的資訊。

Docker multistage builds 教學


Docker 映像檔(image)大小在 production 環境中也是相當重要的一環。

如果 Docker 映像檔太大,不僅佔用傳輸頻寬,也會拉長部署(deployment)的時間,因此如何優化 Docker 映像檔案大小是一門重要課題。

優化 Docker 映像檔大小有若干種方法,其中一種為 multistage build, 不過 Docker 官方文件所提供的 multistage builds 範例卻無法正常運作,本篇將修正該範例並實際體驗 multistage builds 的效果。

12322