Terraform创建Databricks集群后配置Datadog日志推送及问题咨询
使用Terraform为Databricks集群配置Datadog日志推送
问题描述
我通过Terraform创建Databricks集群,想要在集群(主/工作节点)创建时自动配置Datadog,将日志推送至Datadog平台。目前遇到两个问题:
- 初始化脚本中部分标记为
?的变量不知道如何获取并传递; - Datadog官网提供的是Python/Notebook版本的安装脚本,需要适配为Terraform中可用的bash初始化脚本。
现有代码示例:
resource "databricks_cluster" "cluster" { cluster_name = "abc" # 其他集群配置... }
resource "databricks_global_init_script" "init-datadog" { source = data.template_file.global_init.rendered name = "install dd script" } data "template_file" "global_init" { template = "${file("${path.module}/script/datadog-install-driver.worker.sh")}" vars = { DD_API_KEY = "xxx" DD_ENV = "dev" DB_IS_DRIVER = true DB_DRIVER_IP = ? DB_CLUSTER_ID = ? SPARK_LOCAL_IP = ? DB_DRIVER_PORT = ? hostile = ? DB_CLUSTER_NAME = ? } }
解决方案
一、未知变量的获取与优化
大部分变量无需从Terraform硬编码传递,可通过集群节点自身环境或Terraform资源属性获取,优化后的变量配置如下:
data "template_file" "global_init" { template = "${file("${path.module}/script/datadog-install-driver.worker.sh")}" vars = { DD_API_KEY = var.datadog_api_key # 建议用Terraform变量/密钥服务管理密钥 DD_ENV = var.datadog_env DB_CLUSTER_ID = databricks_cluster.cluster.id DB_CLUSTER_NAME = databricks_cluster.cluster.cluster_name } }
各原变量的处理方式:
DB_DRIVER_IP:无需传递,驱动节点IP可在脚本中通过节点本地IP关联Spark默认端口,或通过集群内部DNS获取DB_CLUSTER_ID:直接引用Terraform创建的集群资源IDdatabricks_cluster.cluster.idSPARK_LOCAL_IP:在bash脚本中通过hostname -i或云实例元数据接口(如AWS的curl -s http://169.254.169.254/latest/meta-data/local-ipv4)获取,每个节点的本地IP唯一,无需提前传递DB_DRIVER_PORT:Spark驱动默认端口为4040,若集群自定义了端口,可在脚本中读取Spark配置或直接硬编码默认值hostile:应为拼写错误(hostname),在脚本中用hostname命令直接获取DB_IS_DRIVER:Databricks会自动为节点设置环境变量DB_IS_DRIVER,驱动节点值为true,工作节点为false,脚本中直接读取该环境变量即可DB_CLUSTER_NAME:引用Terraform集群资源的cluster_name属性databricks_cluster.cluster.cluster_name
二、Datadog安装与日志配置的Bash脚本
以下是适配Databricks节点的bash初始化脚本,包含Agent安装、Spark集成、日志收集配置:
#!/bin/bash set -e # 1. 安装Datadog Agent DD_API_KEY=${DD_API_KEY} DD_SITE="datadoghq.com" bash -c "$(curl -L https://s3.amazonaws.com/dd-agent/scripts/install_script.sh)" # 2. 配置Agent基础信息(环境、标签) sed -i "s/# env:.*/env: ${DD_ENV}/" /etc/datadog-agent/datadog.yaml sed -i "s/# tags:.*/tags: [\"cluster_id:${DB_CLUSTER_ID}\", \"cluster_name:${DB_CLUSTER_NAME}\"]/" /etc/datadog-agent/datadog.yaml # 3. 获取节点本地IP与主机名 SPARK_LOCAL_IP=$(hostname -i) NODE_HOSTNAME=$(hostname) NODE_TYPE=${DB_IS_DRIVER:-worker} # 自动识别节点类型,默认worker # 4. 配置Spark集成(监控Spark指标) mkdir -p /etc/datadog-agent/conf.d/spark.d cat > /etc/datadog-agent/conf.d/spark.d/conf.yaml << EOF init_config: instances: - spark_url: http://${SPARK_LOCAL_IP}:4040 cluster_name: ${DB_CLUSTER_NAME} cluster_id: ${DB_CLUSTER_ID} node_type: ${NODE_TYPE} EOF # 5. 配置Databricks日志收集 mkdir -p /etc/datadog-agent/conf.d/databricks.d cat > /etc/datadog-agent/conf.d/databricks.d/conf.yaml << EOF logs: # 收集Databricks节点日志 - type: file path: /databricks/logs/*/*.log service: databricks source: databricks sourcecategory: log_collection tags: - cluster_id:${DB_CLUSTER_ID} - cluster_name:${DB_CLUSTER_NAME} - node_type:${NODE_TYPE} # 收集Spark作业日志(可选) - type: file path: /dbfs/logs/*/*.log service: spark-jobs source: spark sourcecategory: log_collection tags: - cluster_id:${DB_CLUSTER_ID} - cluster_name:${DB_CLUSTER_NAME} EOF # 6. 重启Datadog Agent使配置生效 systemctl restart datadog-agent
注意事项
- 确保Databricks集群节点有公网权限(或通过VPC端点访问Datadog资源),否则无法下载Agent安装包
- 建议将
DD_API_KEY存储在Terraform变量或密钥管理服务(如AWS Secrets Manager)中,避免硬编码 - 若使用Datadog国内站点(datadoghq.cn),需修改脚本中的
DD_SITE为datadoghq.cn
内容的提问来源于stack exchange,提问作者raj
相关产品推荐
相关产品推荐

