2019年1月7日 星期一

Google Cloud Dataproc 如何建立 Custom Image 加快 PySpark 部署環境速度



這陣子最常使用的GCP服務就是 Cloud Dataproc , Cloud Dataproc 是為了簡化Spark及Hadoop服務而設計,能讓使用者進行批次處理、查詢、資料串流及機器學習等工作,其自動化工具可協助使用者更快新增及更容易管理資料叢集,並且能在不使用時關閉,以降低成本,使企業能把心力花在資料分析的核心工作上。

對我來說他有幾個優點:
  • 不用自己維運一組Yarn Spark Cluster,更不用煩惱需要擴充配置的問題
  • 需要用就直接開,開完就砍掉,一切自動化又省錢



不過有在玩 Spark 而且是用PySpark 的人可能會遇到不少環境設定的問題,之所以會使用PySpark 開發就是貪圖python 的許多ML 和科學運算相關 Library,這時候就會遇到需要再每一台spark worker node 上安裝python lib 的問題,要解決這個問題有兩種方法:
  1. 利用Cloud Dataproc script 啟動 cluster 時,增加開機執行指令透過pip安裝套件
  2. 利用Cloud Dataproc script 啟動 cluster 時,直接使用 Custom Image 來開啟woker node

可想而知,第二個方法一定會比第一個方法(dataproc-initialization-actions)快的多,省掉了等待安裝套件的時間,所以本篇文章就來教大家怎麼使用Dataproc Custom Image 預先把需要用到的python lib 裝好。

參考資料:

準備環境 (我是mac 開發環境)

透過Script 產生 custom Image

 產生custom Image 的script 可以參考我的repo:
這邊有幾個參數(expire-day)你需要注意,代表你的這個image 會再一年後過期,到時候就要重新做一個。


python generate_custom_image.py \ --image-name pyspark-with-conda-v2-365 \ --dataproc-version 1.3.5 \ --customization-script customization_script.sh \ --daisy-path ~/bin/daisy \ --zone asia-east1-b \ --gcs-bucket gs://pvmax-spark-image \ --expire-day 365


custom image 你需要安裝什麼套件,則是修改這個檔案 customization_script.sh

#!/bin/bash

# Initialization actions examples: # # apt-get -y update # apt-get install python-dev # apt-get install python-pip # pip install numpy
# https://github.com/GoogleCloudPlatform/dataproc-initialization-actions/tree/master/conda
gsutil -m cp -r gs://dataproc-initialization-actions/conda/bootstrap-conda.sh . gsutil -m cp -r gs://dataproc-initialization-actions/conda/install-conda-env.sh .
chmod 755 ./*conda*.sh
# Install Miniconda / conda ./bootstrap-conda.sh
# Update conda root environment with specific packages in pip and conda CONDA_PACKAGES='numpy pyspark requests scipy tzlocal python-dateutil' PIP_PACKAGES='slackclient gpyopt' CONDA_PACKAGES=$CONDA_PACKAGES PIP_PACKAGES=$PIP_PACKAGES ./install-conda-env.sh

透過Custom Image 產生Cluster

gcloud dataproc clusters create ${GCS_CLUSTER} \ --scopes cloud-platform \ --image pyspark-with-conda-v2-365 \ --bucket ${bucket_name} \ --zone ${gcp_zone} \ --master-boot-disk-size 500GB \ --master-machine-type n1-highmem-2 \ --num-masters 1 \ --num-workers 2 \ --worker-machine-type n1-standard-8 \ --num-preemptible-workers 2 \ --preemptible-worker-boot-disk-size 500GB \ --properties ${PROPERTIES} \ --metadata slack_key=${slack_key}



因為 datarpoc 把工作的stdout 整合在後台,所以要察看程式執行結果只需要到選單(Dataproc --> 工作),就可以看到歷史執行狀況






結論


透過custom Image 可以有效降低啟動cluster 的時間,另外可以搭配程式執行完畢透過script 把cluster 自動砍掉,這樣一來就能有效降低運算分析的 Cost 。



張貼留言