自动配置Azkaban的脚本

wen 实用脚本 27

自动配置Azkaban的脚本:从零构建高效工作流部署系统

目录导读

  1. Azkaban自动配置脚本的价值与应用场景
  2. 前置环境准备:依赖项与版本选择
  3. 核心脚本架构设计
  4. 实战:自动配置Azkaban的Shell脚本详解
  5. 配置校验与常见错误排查
  6. 高频问答(FAQ)

Azkaban自动配置脚本的价值与应用场景

在大数据调度领域,Azkaban作为LinkedIn开源的批量工作流调度系统,广泛应用于ETL、数据同步、模型训练等任务管理,手动配置Azkaban集群(包括MySQL初始化、Web Server与Executor Server部署、SSL证书生成、多环境参数修改)往往耗时且易出错。自动配置脚本的价值在于:

自动配置Azkaban的脚本

  • 环境一致性:消除开发、测试、生产环境的配置偏差。
  • 部署效率提升:从30分钟的手动操作缩短至2分钟一键执行。
  • 灾难恢复:通过脚本快速重建失败节点。

典型场景:
✅ 新员工入职时快速搭建本地开发环境。
✅ CI/CD流水线中自动初始化测试集群。
✅ 多云环境(AWS、阿里云)的标准化部署。


前置环境准备:依赖项与版本选择

在编写脚本前,需明确以下组件:

组件 推荐版本 说明
JDK 8+ Azkaban 3.x 依赖Java 8,不支持Java 11+
MySQL 7 或 8.0 必须启用binlog(用于元数据事务)
Azkaban安装包 90.0 当前稳定版,支持多Executor
Python(可选) 6+ 用于扩展脚本日志解析功能

关键检查点(脚本中需自动检测):

  • java -version 输出是否包含“1.8”。
  • MySQL用户是否拥有CREATE DATABASEGRANT权限。
  • 安装包MD5校验通过。

核心脚本架构设计

自动配置脚本采用分层模块化设计,包含三个核心模块:

auto_config_azkaban.sh
├── init_env()          # 安装依赖、创建运行用户
├── setup_mysql()       # 建库、建表、导入初始化SQL
├── configure_web()     # 修改azkaban-web-server配置
├── configure_exec()    # 修改azkaban-exec-server配置
├── generate_ssl()      # 生成自签名证书(生产环境建议替换)
└── start_services()    # 启动服务并检查健康状态

设计原则

  • 幂等性:多次执行脚本不会产生重复配置。
  • 可回滚:每次修改前备份原配置文件到 /tmp/azkaban_backup/
  • 日志审计:所有操作写入 /var/log/azkaban_install.log

实战:自动配置Azkaban的Shell脚本详解

以下脚本核心片段(完整版需结合环境变量调整):

#!/bin/bash
set -euo pipefail
# ======== 全局变量 ========
AZKABAN_HOME="/usr/local/azkaban"
MYSQL_HOST="localhost"
MYSQL_PORT="3306"
MYSQL_USER="azkaban"
MYSQL_PASSWORD="Azkaban@2024"
SSL_DIR="${AZKABAN_HOME}/ssl"
BACKUP_DIR="/tmp/azkaban_backup/$(date +%Y%m%d%H%M%S)"
# ======== 1. 环境初始化 ========
init_env() {
    echo "[INFO] 创建运行用户 azkaban(如已存在则跳过)"
    id -u azkaban &>/dev/null || useradd -m -s /bin/bash azkaban
    echo "[INFO] 解压安装包至 ${AZKABAN_HOME}"
    tar -xzf azkaban-*.tar.gz -C /usr/local/
    mv /usr/local/azkaban-* "${AZKABAN_HOME}"
    chown -R azkaban:azkaban "${AZKABAN_HOME}"
}
# ======== 2. MySQL配置 ========
setup_mysql() {
    echo "[INFO] 创建Azkaban数据库和用户"
    mysql -h "${MYSQL_HOST}" -P "${MYSQL_PORT}" -u root <<-EOF
        CREATE DATABASE IF NOT EXISTS azkaban DEFAULT CHARACTER SET utf8;
        CREATE USER IF NOT EXISTS '${MYSQL_USER}'@'%' IDENTIFIED BY '${MYSQL_PASSWORD}';
        GRANT ALL PRIVILEGES ON azkaban.* TO '${MYSQL_USER}'@'%';
        FLUSH PRIVILEGES;
EOF
    echo "[INFO] 导入Azkaban元数据表结构"
    mysql -h "${MYSQL_HOST}" -P "${MYSQL_PORT}" -u "${MYSQL_USER}" -p"${MYSQL_PASSWORD}" azkaban < "${AZKABAN_HOME}/create-all-sql-3.90.0.sql"
}
# ======== 3.配置 Web Server ========
configure_web() {
    local conf_file="${AZKABAN_HOME}/web/conf/azkaban.properties"
    cp "${conf_file}" "${BACKUP_DIR}/"
    sed -i "s|^database.host=.*|database.host=${MYSQL_HOST}|" ${conf_file}
    sed -i "s|^database.port=.*|database.port=${MYSQL_PORT}|" ${conf_file}
    sed -i "s|^mysql.user=.*|mysql.user=${MYSQL_USER}|" ${conf_file}
    sed -i "s|^mysql.password=.*|mysql.password=${MYSQL_PASSWORD}|" ${conf_file}
    sed -i "s|^jetty.port=.*|jetty.port=8443|" ${conf_file}  # 启用SSL默认端口
    # 生成SSL证书(简化版,生产请使用CA证书)
    generate_ssl
}
# ======== 4. 启动服务验证 ========
start_services() {
    echo "[INFO] 启动Executor Server"
    cd "${AZKABAN_HOME}/exec" && ./bin/start-exec.sh
    echo "[INFO] 启动Web Server"
    cd "${AZKABAN_HOME}/web" && ./bin/start-web.sh
    sleep 5
    if curl -k https://localhost:8443 -o /dev/null -w "%{http_code}" -s | grep -q 200; then
        echo "[SUCCESS] Azkaban Web界面已就绪,访问 https://localhost:8443"
    else
        echo "[ERROR] 启动失败,请检查日志:${AZKABAN_HOME}/web/logs/"
    fi
}
# ======== 主程序入口 ========
main() {
    echo "======== 开始自动配置Azkaban $(date) ========"
    init_env
    setup_mysql
    configure_web
    configure_exec
    start_services
    echo "======== 配置完成 ========"
}
main "$@"

脚本执行方式

chmod +x auto_config_azkaban.sh  
sudo ./auto_config_azkaban.sh 2>&1 | tee /var/log/azkaban_install.log

配置校验与常见错误排查

问题现象 可能原因 脚本解决方案
数据库连接失败 MySQL未启动或密码错误 增加 mysqladmin ping 预检查
Web页面500错误 SSL证书过期或权限不足 脚本中自动更新证书有效期至3650天
Executor无法注册 端口12321被占用 添加 ss -tlnp 端口冲突检测并提示
启动后503 Service Unavailable 元数据库表结构未完全导入 增加 mysqlcheck 修复表逻辑

最佳实践补充

  • 脚本中建议增加 timeout 30 控制MySQL导入超时。
  • 生产环境将 generate_ssl 替换为从秘钥管理系统(如Vault)拉取证书。

高频问答(FAQ)

Q1:脚本是否可以用于多Executor集群?
A:本脚本默认配置单节点,如需多Executor,需额外在 configure_exec() 部分添加 executor.port 差异化配置,并通过环境变量 HOST_ID 传参。

Q2:如何升级Azkaban版本而不影响现有工作流?
A:脚本支持滚动升级:

  1. 停止所有Executor和Web服务。
  2. 备份原 azkaban.properties 和数据库(mysqldump)。
  3. 运行脚本时传入 --upgrade 参数,脚本自动跳过数据库初始化,仅更新应用包。

Q3:脚本中使用了硬编码密码,如何安全改进?
A:强烈建议:

  • 从环境变量读取密码(如 export MYSQL_PASSWORD=$(aws secretsmanager get-secret-value --secret-id azkaban))。
  • 脚本执行后立即清除变量:unset MYSQL_PASSWORD

Q4:如果MySQL和Azkaban不在同一台机器,脚本如何适配?
A:修改顶部变量 MYSQL_HOST 为远程IP,并在脚本开头增加 ssh 端口可达性检测(使用 nc -zv $MYSQL_HOST $MYSQL_PORT)。

Q5:脚本执行一半失败,能否断点续传?
A:脚本目前未设计断点续传,建议每次执行前先运行 cleanup.sh(包含删除数据库和重置文件)确保干净重试,正式环境推荐使用Ansible实现原子化部署。


通过上述自动配置脚本,您可以在5分钟内完成Azkaban的完整部署,脚本遵循幂等原则、包含错误处理与日志审计,适合集成到持续集成流水线中,建议根据实际业务需求扩展以下功能:多集群节点间配置同步、LDAP认证集成、以及基于Grafana的监控看板自动接入。

抱歉,评论功能暂时关闭!