集群节点初始化脚本

init脚本是在每个集群节点启动期间运行的shell脚本之前Apache Spark驱动程序或worker JVM启动。

init脚本执行的一些任务示例包括:

  • 安装Databricks Runtime中未包含的包和库。要安装Python包,请使用Databricks皮普二进制位于/砖/ python / bin /皮普确保Python包安装到Databricks Python虚拟环境,而不是系统Python环境。例如,/砖/ python / bin /皮普安装<包名称>

  • 中的JVM系统类路径修改特殊情况

  • 设置JVM使用的系统属性和环境变量。

  • 修改Spark配置参数。

警告

Databricks扫描预留位置/砖/ init遗留全局初始化脚本默认情况下在新工作区中启用。Databricks建议避免将init脚本存储在此位置,以避免意外行为。

初始化脚本类型

Databricks支持两种初始化脚本:集群范围的和全局的。

  • 集群级:在配置了脚本的每个集群上运行。这是运行init脚本的推荐方式。

  • 全球:在工作区的每个集群上运行。它们可以帮助您在工作空间中强制执行一致的集群配置。小心使用它们,因为它们可能会导致意想不到的影响,比如库冲突。只有admin用户可以创建全局init脚本。不运行全局初始化脚本服务集群模型

请注意

有两种初始化脚本弃用.你应该把这些类型的初始化脚本迁移到上面列出的那些:

  • Cluster-named:在与脚本同名的集群上运行。以集群命名的init脚本是最好的方法(无声地忽略失败),并尝试继续集群启动过程。应该使用集群范围的初始化脚本,这是一个完全的替代品。

  • 遗留的全球:在每个集群上运行。它们的安全性不如新的全局init脚本框架,会默默地忽略失败,并且不能引用环境变量.您应该将现有的遗留全局init脚本迁移到新的全局init脚本框架。看到从遗留的初始化脚本迁移到新的全局初始化脚本

无论何时更改任何类型的init脚本,都必须重新启动受该脚本影响的所有集群。

初始化脚本执行顺序

初始化脚本的执行顺序是:

  1. 遗留全局(已弃用)

  2. Cluster-named(弃用)

  3. 全球(新)

  4. 集群级

环境变量

集群范围和全局初始化脚本支持以下环境变量:

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

  • DB_CONTAINER_IP: Spark运行容器的私网IP地址。init脚本在此容器中运行。看到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,则可以使用文件系统实用程序(dbutls .fs)或者是DBFS CLI.例如,集群ID为1001 - 234039 abcde739

DBFS ls DBFS:/cluster-logs/1001-234039-abcde739/init_scripts . DBFS ls DBFS:/cluster-logs/1001-234039-abcde739/init_scripts . log
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 .sh. txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt

每次集群启动时,它都会向init脚本日志文件夹写入日志。

重要的

创建集群并启用集群日志传递的任何用户都可以查看stderr而且stdout全局初始化脚本的输出。您应该确保全局初始化脚本不输出任何敏感信息。

审计日志

Databricks审计日志捕获事件类型下的全局init脚本创建、编辑和删除事件globalInitScripts.看到配置审计日志记录

集群范围的初始化脚本

集群范围的初始化脚本是在集群配置中定义的初始化脚本。集群范围的初始化脚本适用于您创建的集群和为运行作业而创建的集群。由于脚本是集群配置的一部分,集群访问控制允许您控制谁可以更改脚本。

您可以使用UI、CLI和调用Clusters API来配置集群范围的初始化脚本。本节重点介绍使用UI执行这些任务。有关其他方法,请参见数据库命令行设置和文档而且集群API 2.0

您可以添加任意数量的脚本,这些脚本将按照提供的顺序依次执行。

如果集群范围的init脚本返回非零退出码,则启动集群失败.通过配置,可以对集群范围的初始化脚本进行故障排除集群日志传递检查初始化脚本日志

集群范围的初始化脚本位置

您可以将初始化脚本放在集群可访问的DBFS或S3目录中。DBFS中的集群节点初始化脚本必须存储在DBFS根.砖支持将初始化脚本存储在DBFS目录挂载对象存储

集群范围的初始化脚本示例

本节将展示两个初始化脚本示例。

示例:安装PostgreSQL JDBC驱动程序

下面在Python笔记本中运行的代码段创建了一个init脚本,用于安装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”))

或者,您也可以创建init脚本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

然后复制到dbfs: /砖/脚本使用DBFS CLI

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

示例:使用conda安装Python库

在Databricks Runtime 9.0及以上版本中,不能使用conda安装Python库。有关如何在集群上安装Python包的说明,请参见

重要的

Anaconda公司更新了他们的服务条款将于2020年9月在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配置集群运行初始化脚本。

重要的

  • 该脚本必须存在于配置的位置。如果脚本不存在,集群将无法启动或无法自动扩展。

  • 初始化脚本不能大于64KB。如果脚本超过这个大小,集群将无法启动,集群日志中将出现一条失败消息。

使用UI配置一个集群范围的初始化脚本

使用集群配置界面配置集群运行init脚本。

  1. 2 .在集群配置界面,单击高级选项切换。

  2. 在页面底部,单击Init脚本选项卡。

    Init Scripts选项卡
  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脚本运行在工作区中创建的每个集群上。当您希望强制组织范围的库配置或安全屏幕时,全局init脚本非常有用。只有管理员可以创建全局初始化脚本。您可以使用UI或REST API创建它们。

重要的

小心使用全局初始化脚本:

  • 很容易添加库或进行其他修改,从而导致无法预料的影响。尽可能使用集群范围的初始化脚本。

  • 创建集群并启用集群日志传递的任何用户都可以查看stderr而且stdout全局初始化脚本的输出。您应该确保全局初始化脚本不输出任何敏感信息。

可以通过配置全局初始化脚本进行故障排除集群日志传递检查初始化脚本日志

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

使用管理控制台配置全局初始化脚本:

  1. 转到管理控制台并单击全局初始化脚本选项卡。

    全局初始化脚本选项卡
  2. 点击+添加

  3. 命名脚本,并通过键入、粘贴或拖动文本文件到脚本字段。

    添加全局初始化脚本

    请注意

    初始化脚本不能大于64KB。如果脚本超过该大小,则在尝试保存时出现错误消息。

  4. 如果您为工作区配置了多个全局init脚本,请设置新脚本运行的顺序。

  5. 如果您希望在保存后为所有新的和重新启动的集群启用该脚本,请切换启用

    重要的

    当您添加全局init脚本或更改名称、运行顺序或启用init脚本时,这些更改直到重新启动集群才会生效。

  6. 点击添加

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

方法添加全局初始化脚本Databricks Terraform提供商而且databricks_global_init_script

使用UI编辑全局初始化脚本

  1. 转到管理控制台并单击全局初始化脚本选项卡。

  2. 单击脚本。

  3. 编辑脚本。

  4. 点击确认

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

控件,管理员可以在工作区中添加、删除、重新排序和获取有关全局init脚本的信息全局初始化脚本API 2.0

从遗留的初始化脚本迁移到新的全局初始化脚本

如果你的Databricks工作空间是在2020年8月之前启动的,你可能仍然有遗留的全局init脚本。您应该将它们迁移到新的全局init脚本框架中,以利用新脚本框架中包含的安全性、一致性和可见性特性。

  1. 方法复制现有的遗留全局初始化脚本,并将它们添加到新的全局初始化脚本框架用户界面或者是REST API

    在完成下一步之前,请禁用它们。

  2. 禁用所有遗留全局init脚本。

    在管理控制台中,转到全局初始化脚本选项卡并切换关闭遗留全局初始化脚本开关。

    禁用遗留全局init脚本
  3. 启用新的全局初始化脚本。

    全局初始化脚本选项卡,切换到启用为要启用的每个初始化脚本切换。

    启用全局脚本
  4. 重新启动所有集群。

    • 在自动扩展正在运行的集群期间添加的新节点上,将不会运行遗留脚本。新的全局init脚本也不会在这些新节点上运行。您必须重新启动所有集群,以确保新的脚本在这些集群上运行,并且没有现有集群试图添加没有运行全局脚本的新节点。

    • 当迁移到新的全局init脚本框架并禁用遗留脚本时,可能需要修改非幂等脚本。