集群節點初始化腳本

初始化腳本是在每個集群節點啟動期間運行的shell腳本之前Apache Spark驅動程序或worker JVM啟動。

一些由初始化腳本執行的任務的例子包括:

  • 安裝Databricks運行時中不包含的包和庫。要安裝Python包,請使用Databricks皮普二進製文件位於/磚/ python / bin /皮普確保Python包安裝在Databricks的Python虛擬環境中,而不是係統的Python環境中。例如,/磚/ python / bin /皮普安裝<包名稱>

  • 中修改JVM係統類路徑特殊情況

  • 設置JVM使用的係統屬性和環境變量。

  • 修改Spark配置參數。

警告

Databricks掃描預留位置/磚/ init遺留全局初始化腳本默認情況下在新工作區中啟用。Databricks建議避免將初始化腳本存儲在此位置,以避免出現意外行為。

Init腳本類型

Databricks支持兩種初始化腳本:集群範圍的和全局的。

  • 集群級:在每個配置了腳本的集群上運行。這是運行初始化腳本的推薦方式。

  • 全球:在工作區中的每個集群上運行。它們可以幫助您在整個工作空間中強製執行一致的集群配置。小心使用它們,因為它們可能會導致無法預料的影響,比如庫衝突。隻有admin用戶可以創建全局初始化腳本。不運行全局初始化腳本模型服務集群

請注意

有兩種初始化腳本棄用.你應該將這些類型的初始化腳本遷移到上麵列出的腳本:

  • Cluster-named:在與腳本同名的集群上運行。以集群命名的初始化腳本是最好的嚐試(忽略失敗),並嚐試繼續集群啟動過程。應該使用集群作用域的初始化腳本,這是一個完全的替代。

  • 遺留的全球:在每個集群上運行。它們比新的全局初始化腳本框架更不安全,靜默地忽略失敗,並且不能引用環境變量.您應該將現有的遺留全局初始化腳本遷移到新的全局初始化腳本框架。看到從遺留腳本遷移到新的全局初始化腳本

無論何時更改任何類型的初始化腳本,都必須重新啟動受腳本影響的所有集群。

初始化腳本執行順序

初始化腳本的執行順序是:

  1. 遺留全球(棄用)

  2. Cluster-named(棄用)

  3. 全球(新)

  4. 集群級

環境變量

集群作用域和全局初始化腳本支持以下環境變量:

  • DB_CLUSTER_ID:腳本所在的集群ID。看到集群API 2.0

  • DB_CONTAINER_IP:運行Spark的容器的私網IP地址。初始化腳本在這個容器中運行。看到SparkNode

  • DB_IS_DRIVER:該腳本是否在驅動節點上運行。

  • DB_DRIVER_IP:驅動節點IP地址。

  • DB_INSTANCE_TYPE:主機虛擬機的實例類型。

  • DB_CLUSTER_NAME:腳本正在執行的集群名稱。

  • DB_IS_JOB_CLUSTER:集群是否為運行作業而創建。看到創建一個工作

例如,如果你想隻在一個驅動節點上運行腳本的一部分,你可以寫這樣的腳本:

回聲DB_IS_DRIVER美元如果[[DB_IS_DRIVER美元“真正的”]]然後<隻在驅動程序>上運行此部分其他的<隻在工作人員>上運行此部分fi<在司機和工人>上運行此部分

您還可以配置自定義環境變量在初始化腳本中引用這些變量。

在環境變量中使用秘密

在引用秘密時,可以使用任何有效的變量名。對環境變量中引用的秘密的訪問由配置集群的用戶的權限決定。存儲在環境變量中的秘密可以被集群的所有用戶訪問,但是會以正常方式從明文顯示中編校,作為在其他地方引用的秘密。

有關更多細節,請參見在環境變量中引用一個秘密

日誌記錄

初始腳本啟動和結束事件在集群事件日誌中捕獲。詳細信息在集群日誌中捕獲。全局初始化腳本創建、編輯和刪除事件也會在帳戶級審計日誌中捕獲。

Init腳本事件

集群事件日誌捕獲兩個初始化腳本事件:INIT_SCRIPTS_STARTED而且INIT_SCRIPTS_FINISHED,指示計劃執行哪些腳本,哪些已成功完成。INIT_SCRIPTS_FINISHED還捕獲執行持續時間。

全局初始化腳本在日誌事件詳細信息中按鍵指示“全球”集群範圍內的初始化腳本由鍵指示“集群”

請注意

集群事件日誌不會記錄每個集群節點的初始化腳本事件;隻選擇一個節點來表示所有節點。

Init腳本日誌

如果集群日誌交付為集群配置時,初始化腳本日誌寫入到/ < cluster-log-path > / < cluster-id > / init_scripts.集群中每個容器的日誌都被寫入子目錄init_scripts / < cluster_id > _ < container_ip >.例如,如果cluster-log-path被設置為cluster-logs,特定容器的日誌路徑為:dbfs: / cluster-logs / < cluster-id > / init_scripts / < cluster_id > _ < container_ip >

如果集群已配置將日誌寫入DBFS,則可以使用文件係統實用程序或者是DBFS CLI.例如,如果集群ID為1001 - 234039 abcde739

dbfs ls dbfs: / cluster-logs / 1001 - 234039 abcde739 / init_scripts
1001 - 234039 abcde739_10_97_225_1661001 - 234039 abcde739_10_97_231_881001 - 234039 abcde739_10_97_244_199
dbfs ls dbfs: / cluster-logs / 1001 - 234039 abcde739 / init_scripts / 1001 - 234039 abcde739_10_97_225_166
<時間> _ < log-id > _ < init-script-name > .sh.stderr.log<時間> _ < log-id > _ < init-script-name > .sh.stdout.log

當未配置集群日誌傳遞時,日誌將被寫入/磚/ init_scripts.你可以在筆記本中使用標準shell命令來列出和查看日誌:

%sh ls /databricks/init_scripts/ cat /databricks/init_scripts/__.sh.stdout.log .log .sh /databricks/init_scripts/__.sh.stdout.log .log .sh

每次集群啟動時,它都會向初始化腳本日誌文件夾寫入一個日誌。

重要的

創建集群並啟用集群日誌傳遞的任何用戶都可以查看stderr而且stdout全局初始化腳本的輸出。您應該確保全局初始化腳本不輸出任何敏感信息。

審計日誌

Databricks審計日誌捕獲事件類型下的全局初始化腳本創建、編輯和刪除事件globalInitScripts.看到配置審計日誌記錄

集群級init腳本

集群作用域的初始化腳本是在集群配置中定義的初始化腳本。集群作用域的初始化腳本適用於您創建的集群和為運行作業而創建的集群。由於腳本是集群配置的一部分,集群訪問控製讓您控製誰可以更改腳本。

您可以使用UI、CLI和調用Clusters API配置集群範圍內的初始化腳本。本節重點介紹如何使用UI執行這些任務。有關其他方法,請參見磚CLI而且集群API 2.0

您可以添加任意數量的腳本,並且這些腳本將按照所提供的順序依次執行。

如果集群範圍內的初始化腳本返回非零退出碼,則集群啟動失敗.可以通過配置來排除集群範圍內的初始化腳本的故障集群日誌交付和檢查init腳本日誌

集群範圍內的初始化腳本位置

可以將初始化腳本放在集群可訪問的DBFS或S3目錄中。DBFS中的集群節點初始化腳本必須存儲在DBFS根.磚支持將初始化腳本存儲在DBFS目錄中越來越多的對象存儲

示例集群範圍內的初始化腳本

本節展示兩個初始化腳本示例。

示例:安裝PostgreSQL JDBC驅動程序

在Python筆記本中運行的以下代碼片段創建了一個安裝PostgreSQL JDBC驅動程序的初始化腳本。

  1. 創建一個DBFS目錄,用於存儲初始化腳本。這個示例使用dbfs: /磚/腳本

    dbutilsfsmkdir“dbfs: /磚/腳本/”
  2. 創建一個名為postgresql-install.sh在該目錄:

    dbutilsfs“磚/腳本/ postgresql-install.sh”"""# !/bin/bashwget——quiet -O /mnt/driver-daemon/jars/postgresql-42.2.2.jar https://repo1.maven.org/maven2/org/postgresql/postgresql/42.2.2/postgresql-42.2.2.jar"""真正的
  3. 檢查腳本是否存在。

    顯示dbutilsfsls“dbfs: /磚/腳本/ postgresql-install.sh”))

或者,您可以創建初始化腳本postgresql-install.sh本地:

# !/bin/bashwget——quiet -O /mnt/driver-daemon/jars/postgresql- 42.2.2.l .jar https://repo1.maven.org/maven2/org/postgresql/postgresql/42.2.2/postgresql-42.2.2.jar

然後複製到dbfs: /磚/腳本使用DBFS CLI

DBFS cp postgresql-install.sh DBFS:/databricks/scripts/postgresql-install.sh

示例:使用conda安裝Python庫

在Databricks Runtime 9.0及以上版本中,不能使用conda來安裝Python庫。有關如何在集群上安裝Python包的說明,請參見

重要的

蟒蛇公司更新了他們的服務條款觀看anaconda.org頻道。根據新的服務條款,如果您依賴Anaconda的包裝和分銷,您可能需要一個商業許可證。看到蟒蛇商業版常見問題解答為更多的信息。你對蟒蛇通道的使用由他們的服務條款

由於這個更改,Databricks刪除了Conda包管理器的默認通道配置。這是一個突破性的變化。您必須更新初始化腳本中conda命令的用法,以指定使用的通道- c.如果不指定通道,conda命令將失敗PackagesNotFoundError

在Databricks Runtime 8.4 ML及以下版本中,使用Conda安裝Python包的包管理器。要在集群初始化時安裝Python庫,可以使用如下腳本:

# !/bin/bash-ex /databricks/python/bin/python/databricks/conda/etc/profile.d/conda.sh conda activate /databricks/python conda install -c conda-forge -y astropy .sh

配置一個集群範圍的初始化腳本

您可以通過UI或API配置集群運行初始化腳本。

重要的

  • 腳本必須存在於配置的位置。如果腳本不存在,集群將無法啟動或自動擴展。

  • init腳本的大小不能超過64KB。如果腳本超過這個大小,集群將無法啟動,並在集群日誌中顯示一條失敗消息。

使用UI配置集群範圍內的初始化腳本

使用實例使用集群配置界麵設置集群運行init腳本。

  1. 在集群配置頁麵,單擊高級選項切換。

  2. 在該頁的底部,單擊Init腳本選項卡。

    Init腳本選項卡
  3. 目的地下拉菜單,選擇目標類型。在上一節的示例中,目的地為DBFS

  4. 指定初始化腳本的路徑。在上例中,路徑為dbfs: / / postgresql-install.sh磚/腳本

  5. 如果目標類型為S3:

    1. 選擇一個地區。

    2. 確保集群配置了實例配置文件getObjectAcl訪問桶的權限。例如:

      “版本”“2012-10-17”“聲明”“效應”“允許”“行動”“s3: getObjectAcl”],“資源”“攻擊:aws: s3::: < my-s3-bucket > / *”
  6. 點擊添加

要從集群配置中刪除腳本,請單擊刪除圖標在劇本的右邊。當您確認刪除時,係統將提示您重新啟動集群。您可以選擇從上傳腳本文件的位置刪除腳本文件。

使用DBFS REST API配置一個集群範圍內的初始化腳本

使用集群API 2.0配置帶有ID的集群1202 - 211320 brick1運行上述init腳本的命令如下:

curl -n -X POST -H“application / json內容類型:- d”{“cluster_id”:“1202 - 211320 brick1”,“num_workers”:1、:“spark_version 7.3.x-scala2.12”,:“node_type_id i3.2xlarge”," cluster_log_conf ": {" dbfs ": {“目的地”:“dbfs: / cluster-logs”},“init_scripts”:[{" dbfs ": {“目的地”:“dbfs: /磚/腳本/ postgresql-install.sh”})}'https:// < databricks-instance > / api / 2.0 /集群/編輯

全球init腳本

在工作區中創建的每個集群上運行全局初始化腳本。當您希望強製執行組織範圍的庫配置或安全屏幕時,全局初始化腳本非常有用。隻有管理員可以創建全局初始化腳本。您可以使用UI或REST API創建它們。

重要的

慎用全局初始化腳本:

  • 可以很容易地添加庫或進行其他修改,從而導致無法預料的影響。盡可能使用集群作用域的初始化腳本。

  • 創建集群並啟用集群日誌傳遞的任何用戶都可以查看stderr而且stdout全局初始化腳本的輸出。您應該確保全局初始化腳本不輸出任何敏感信息。

您可以通過配置來排除全局初始化腳本的故障集群日誌交付和檢查init腳本日誌

使用UI添加全局初始化腳本

使用管理控製台配置全局初始化腳本:

  1. 轉到管理控製台並單擊全球Init腳本選項卡。

    全局初始化腳本選項卡
  2. 點擊+添加

  3. 為腳本命名,並通過鍵入、粘貼或拖動文本文件到腳本字段。

    添加全局初始化腳本

    請注意

    init腳本的大小不能超過64KB。如果腳本超過該大小,則在嚐試保存時出現錯誤消息。

  4. 如果為工作區配置了多個全局初始化腳本,請設置新腳本運行的順序。

  5. 如果您希望在保存後為所有新的和重新啟動的集群啟用該腳本,請切換啟用

    重要的

    當您添加全局初始化腳本或更改名稱、運行順序或啟用初始化腳本時,這些更改直到重新啟動集群才會生效。

  6. 點擊添加

使用Terraform添加全局初始化腳本

方法可以添加全局初始化腳本磚起程拓殖的提供者而且databricks_global_init_script

使用UI編輯全局初始化腳本

  1. 轉到管理控製台並單擊全球Init腳本選項卡。

  2. 單擊一個腳本。

  3. 編輯腳本。

  4. 點擊確認

使用API配置全局初始化腳本

控件可以在工作區中添加、刪除、重新排序和獲取關於全局初始化腳本的信息全局初始化腳本API 2.0

從遺留腳本遷移到新的全局初始化腳本

如果您的Databricks工作空間是在2020年8月之前啟動的,那麼您可能仍然有遺留的全局初始化腳本。您應該將這些遷移到新的全局初始化腳本框架中,以利用新腳本框架中包含的安全性、一致性和可見性特性。

  1. 複製現有的遺留全局初始化腳本,並將它們添加到新的全局初始化腳本框架中用戶界麵或者是REST API

    在完成下一步之前,請禁用它們。

  2. 禁用所有遺留全局初始化腳本。

    在管理控製台中,轉到全球Init腳本選項卡並切換關閉遺留全局初始化腳本開關。

    禁用遺留全局初始化腳本
  3. 啟用新的全局初始化腳本。

    全球Init腳本選項卡,切換到啟用為您想啟用的每個初始化腳本進行切換。

    啟用全局腳本
  4. 重新啟動集群。

    • 遺留腳本不會在自動擴展運行集群期間添加的新節點上運行。新的全局初始化腳本也不會在這些新節點上運行。您必須重新啟動所有集群,以確保在這些集群上運行新腳本,並且沒有現有集群試圖添加沒有在它們上運行全局腳本的新節點。

    • 當您遷移到新的全局初始化腳本框架並禁用遺留腳本時,可能需要修改非冪等腳本。