好吧,这很奇怪。我有一些我想在集群启动时运行的初始化脚本
集群有 init 脚本,它在一个文件中(在 dbfs 中)
基本上这个
dbfs:/databricks/init-scripts/custom-cert.sh
现在,当我像这样制作初始化脚本时,它可以工作(我的端点没有 ssl 错误。此外,集群的事件日志显示初始化脚本的持续时间为 1 秒
dbutils.fs.put("/databricks/init-scripts/custom-cert.sh", """#!/bin/bash
cp /dbfs/orgcertificates/orgcerts.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
echo "export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt" >> /databricks/spark/conf/spark-env.sh
""")
但是,如果我只是将 init 脚本放在 bash 脚本中并通过管道将其上传到 DBFS,那么 init 脚本不会做任何事情。它根据事件日志执行,但执行持续时间为 0 秒。
我在一个名为的文件中有 sh 脚本
custom-cert.sh
内容同上,即
#!/bin/bash
cp /dbfs/orgcertificates/orgcerts.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
echo "export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt"
但是当我检查 /usr/local/share/ca-certificates/ 时,它不包含 /dbfs/orgcertificates/orgcerts.crt,即使集群初始化脚本已经运行。
另外,我在两种情况下都比较了初始化脚本的内容,至少肉眼比较,我不知道有什么区别
IE
%sh
cat /dbfs/databricks/init-scripts/custom-cert.sh
在两个场景中显示相同的内容。第二种情况有什么问题?
编辑:我阅读了更多关于初始化脚本的内容,发现初始化脚本的日志写在这里
%sh
ls /databricks/init_scripts/
查看该位置的 err 文件,似乎有错误
sudo: update-ca-certificates
: command not found
为什么在第一种情况下会发现 update-ca-certificates 但当我将相同的脚本放在 sh 脚本中并将其上传到 dbfs 时(而不是在笔记本中执行 dbutils.fs.put)?
编辑2:响应第一个答案。运行命令后
dbutils.fs.put("/databricks/init-scripts/custom-cert.sh", """#!/bin/bash
cp /dbfs/orgcertificates/orgcerts.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
echo "export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt" >> /databricks/spark/conf/spark-env.sh
""")
输出是文件 custom-cert.sh,然后我使用初始化脚本位置作为 dbfs:/databricks/init-scripts/custom-cert.sh 重新启动集群,然后它就可以工作了。因此,它本质上与 init 脚本正在读取的内容相同(即生成的 sh 脚本)。如果我不使用 dbfs put 而是将内容放入 bash 文件并在 CI/CD 过程中上传,为什么它无法读取?