如何在 EMR 叢集上安裝 Python 程式庫?

1 分的閱讀內容
0

我想在 Amazon EMR 叢集上安裝外部 Python 程式庫

簡短說明

您可以使用引導操作安裝 Python 程式庫。

EMR 使用 Puppet (Apache BigTop 所使用的部署機制) 來設定和初始化執行個體上的應用程式。執行個體控制器是 EMR 的軟體組件,在叢集的每個執行個體上執行。執行個體控制器會初始化,然後根據執行個體設定佈建執行個體。

執行個體控制器會在 /usr/share/aws/emr/node-provisioner/bin/provision-node 執行佈建節點指令碼,以在叢集啟動時啟動NodeProvisionerNodeProvisioner 會針對節點和叢集設定佈建 EMR 發行版的所有應用程式。在叢集的每個節點上執行所有其他引導操作後,才會執行的最終引導操作即為 NodeProvisioner。

解決方案

在最新的 EMR 叢集中,引導操作會於 Amazon EMR 安裝在建立叢集時指定的任何應用程式之前執行。引導操作會在叢集節點開始處理資料之前執行。如果您將節點新增至執行中的叢集,則引導操作也會以相同方式在這些節點上執行。您可以建立自訂引導操作,並指定建立叢集時要安裝的應用程式。如需詳細資訊,請參閱建立引導操作以安裝其他軟體

對由預設程式庫覆寫、使用引導操作安裝的程式庫進行疑難排解

Amazon EMR 預設程式庫可能會覆寫使用引導操作安裝的程式庫。引導指令碼會在叢集建立之前和節點佈建之前執行。因此,程式庫可能會被預設版本覆寫。

若要避免此問題,請建立延遲引導操作,或將第二階段引導操作建立為執行程式碼。或者,在收到 NODEPROVISIONSTATE SUCCESSFUL 訊息之後安裝套件。

下列引導指令碼會在應用程式佈建階段之後升級程式庫。您可以將此指令碼新增為引導指令碼,其在背景執行並成功退出,以便繼續進行叢集佈建。此指令碼會繼續監視節點佈建,並在佈建後升級程式庫。

下列範例指令碼會升級 NumPy 版本:

#!/bin/bash
while true; do
NODEPROVISIONSTATE=\` sed -n '/localInstance [{]/,/[}]/{
/nodeProvisionCheckinRecord [{]/,/[}]/ {
   /status: / { p }
    /[}]/a
   }
  /[}]/a
}'  /emr/instance-controller/lib/info/job-flow-state.txt | awk ' { print \$2 }'\`
        if [ "\$NODEPROVISIONSTATE" == "SUCCESSFUL" ]; then
                     sleep 10;
                echo "Running my post provision bootstrap"
                #your code here
                #Below example lines
                #sudo python3 -m pip uninstall numpy==1.16.5 (this is default version of numpy)
                #sudo python3 -m pip install --upgrade numpy==1.20.1 (new version of numpy)
                exit;
        fi
sleep 10;
done

注意:在某些情況下,執行 Python 套件的 YARN 容器可能不使用可使用先前解決方案安裝的更新套件。如果容器未執行更新的套件,則您在嘗試安裝時會看到找不到模組錯誤。這是因為 YARN NodeManager 負責啟動容器。在 NODEPROVISIONSTATE 為成功之前,NodeManager 的容器可能已在執行中或已配置。在頻繁自動擴展的多租用戶叢集中,通常會出現此問題。

您可以通過輪詢 nodemanager 服務的狀態來避免找不到模組錯誤。然後,在 nodemanager 啟動後立即執行所需的引導操作。


AWS 官方
AWS 官方已更新 1 年前