Dataproc + python 软件包:分发更新版本

Dataproc + python package: Distribute updated versions

目前我正在 Google DataProc 上开发一个 Spark 应用程序。我经常需要更新 Python 包。在配置过程中,我 运行 以下命令:

echo "Downloading and extracting source code..."
gsutil cp gs://mybucket/mypackage.tar.gz ./
tar -xvzf mypackage.tar.gz
cd ./mypackage

echo "Installing requirements..."
sudo apt-get install -y python-pip
python setup.py install

但是,在集群内分发更新包的最有效方法是什么?是否已经内置了任何自动化功能(例如 Chef,它有)吗?

目前,我做了两件不同的事情:部署并 bootstrap 一个新集群(需要时间)或 SSH 到每个节点,然后复制并安装更新的包。

初始化操作是否有效? https://cloud.google.com/dataproc/init-actions

一般来说,部署带有初始化操作的新集群是首选方法,因为如果您需要克隆新集群、更改更基本的机器或区域设置,或者以防万一您不小心以混乱的方式破坏现有集群。它还确保为所有已安装的软件提供新补丁,并且与基于 SSH 的配置相比,动态扩展 up/down 您的集群效果很好。

也就是说,要修改现有的集群,您也可以尝试使用 bdutil,只要您不使用任何可抢占的工作线程,它恰好与 Dataproc 的实例命名兼容(但这个官方不保证永远如此)。它将提供一种方便的方式来通过 SSH 在所有节点上执行 运行 命令,如果它失败,还会收集一些有用的错误消息:

CLUSTER=<dataproc-cluster-name>
PROJECT=<Google project you used to create the Dataproc cluster>
BUCKET=<mybucket>
ZONE=<dataproc cluster zone, like us-central1-f>
NUM_WORKERS=<number of workers in dataproc cluster>

# Run "sudo apt-get install -y python-pip" on all nodes
./bdutil -P ${CLUSTER} -p ${PROJECT} -b ${BUCKET} -z ${ZONE} -n ${NUM_WORKERS} \
    run_command -t all -- "sudo apt-get install -y python-pip"

您还可以使用 -t master 仅在主节点上 运行 某些内容,或 -t workers 仅在工作节点上 运行。