百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

通过 docker-compose 快速部署 Azkaban 保姆级教程

nanshan 2025-03-03 19:28 6 浏览 0 评论

一、概述

Apache Azkaban 是一个开源的批处理工作流调度系统,用于管理和调度Hadoop生态系统中的任务和作业。

  • Azkaban 提供了一个直观的Web界面,让用户能够轻松地定义、调度和监控作业流。它支持工作流的可视化编辑,可以将任务以依赖关系的方式组织起来,从而实现复杂的工作流程。用户可以定义作业的依赖关系、时间调度、重试机制等,并监控作业的执行情况和日志。
  • Azkaban 可以与Hadoop生态系统中的各种工具和框架集成,如Hadoop、Hive、Pig、Spark等。它通过与这些工具的集成,可以方便地调度和执行这些工具生成的作业。
  • Azkaban 还提供了一套安全机制,可以控制用户对作业流的访问权限,确保敏感数据和任务的安全性。

总的来说,Apache Azkaban是一个功能强大的批处理工作流调度系统,可以帮助用户管理和调度Hadoop生态系统中的作业和任务,提高工作效率和数据处理的可靠性。



这里只是讲解容器化快速部署过程,想了解更多关于 Azkaban 的知识点可关注我以下文章:

二、Azkaban 的调度流程



Apache Azkaban的调度流程可以概括为以下几个步骤:

  1. 定义作业流:使用Azkaban的Web界面或Azkaban的DSL语言,用户定义作业流并指定任务之间的依赖关系。作业流由一系列任务组成,可以按照顺序或并行方式执行。
  2. 作业提交:当作业流需要执行时,Azkaban会将任务提交到执行环境中(如Hadoop集群)。这可以通过调用相应的执行引擎(如Azkaban Executor)来实现。任务提交时,Azkaban会将任务的相关信息和依赖关系传递给执行引擎。
  3. 依赖关系解析:执行引擎接收到任务后,会解析任务之间的依赖关系。它会检查每个任务所依赖的其他任务是否已经完成。如果有未满足的依赖关系,任务将等待依赖任务完成后再执行。
  4. 任务执行:一旦任务的依赖关系满足,执行引擎会开始执行任务。任务可以是各种类型,如Hadoop作业、Shell脚本、Spark作业等。执行引擎会调用相应的执行器来执行任务,并提供所需的参数和配置。
  5. 任务监控和日志:在任务执行期间,Azkaban会实时监控任务的执行状态,并记录任务的日志输出。用户可以通过Azkaban的Web界面查看任务的执行进度、日志和错误信息。这有助于及时发现和排查执行问题。
  6. 依赖关系检查:在任务执行完成后,执行引擎会检查任务的输出和后续任务的依赖关系。如果有后续任务依赖当前任务的输出,执行引擎会传递相应的输出给后续任务,并继续执行后续任务。
  7. 完成和报告:当作业流中的所有任务都执行完成后,Azkaban会将作业流的执行状态标记为完成,并生成执行报告。报告可以包括任务的执行结果、执行时间、日志等信息,以便用户进行审查和分析。

总的来说,Apache Azkaban的调度流程包括定义作业流、任务提交、依赖关系解析、任务执行、监控和日志、依赖关系检查以及完成和报告等步骤。这些步骤确保了作业流的正确执行和管理,并提供了实时的监控和日志记录功能。

三、前期准备

1)部署 docker

# 安装yum-config-manager配置工具
yum -y install yum-utils

# 建议使用阿里云yum源:(推荐)
#yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装docker-ce版本
yum install -y docker-ce
# 启动并开机启动
systemctl enable --now docker
docker --version

2)部署 docker-compose

curl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose
docker-compose --version

四、创建网络

# 创建,注意不能使用hadoop_network,要不然启动hs2服务的时候会有问题!!!
docker network create hadoop-network

# 查看
docker network ls

五、Azkaban 编排部署

1)安装 MySQL

如想快速部署MySQL,可参考我这篇文章:通过 docker-compose 快速部署 MySQL保姆级教程

2)下载 Azkaban 编译

git clone https://github.com/azkaban/azkaban.git

# 编译
cd azkaban; ./gradlew build installDist

这里也提供一下我编译的安装包,下载地址如下:

链接:https://pan.baidu.com/s/1zvUyfXg3sCPqBfESWY-oLQ
提取码:
6666

3)初始化 azkaban 用户和表

创建 azkaban 用户

#【温馨提示】一般公司禁止mysql -u root -p123456这种方式连接,在history里有记录,存在安全隐患,小伙伴不要被公司安全审计哦,切记!!!
mysql -u root -p
# 输入密码:123456

CREATE DATABASE azkaban;
CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban';
GRANT SELECT,INSERT,UPDATE,DELETE ON azkaban.* to 'azkaban'@'%' WITH GRANT OPTION;

开始初始化表数据

cd ${AZKABAN_HOME}/azkaban-db
# 连接mysql
mysql -u root -p
#密码:123456

use azkaban
# 可能版本不一样,sql文件也不太一样,create-all-sql-*.sql
source create-all-sql-3.91.0-313-gadb56414.sql

4)配置

  • conf/exec/azkaban.properties
azkaban.name=Test
azkaban.label=My Local Azkaban
azkaban.default.servlet.path=/index
web.resource.dir=web/
default.timezone.id=Asia/Shanghai
# default.timezone.id=America/Los_Angeles
user.manager.class=azkaban.user.XmlUserManager
user.manager.xml.file=conf/azkaban-users.xml
executor.global.properties=conf/global.properties
azkaban.project.dir=projects
velocity.dev.mode=false
jetty.use.ssl=false
jetty.maxThreads=25
jetty.port=8081
# azkaban.webserver.url=http://localhost:8081
azkaban.webserver.url=https://azkaban-web:8081
mail.sender=
mail.host=
job.failure.email=
job.success.email=
lockdown.create.projects=false
cache.directory=cache
jetty.connector.stats=true
executor.connector.stats=true
azkaban.jobtype.plugin.dir=plugins/jobtypes
database.type=mysql
mysql.port=3306
mysql.host=mysql
# mysql.host=localhost
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections=100
executor.maxThreads=50
executor.flow.threads=30
azkaban.executor.runtimeProps.override.eager=false
executor.port=12321

参数说明:

executor.port:不设置就是随机值了,不方便管理,所以这里还是固定一个端口号,看资料大部分都是使用12321这个端口,这里也随大流
  • conf/web/azkaban.properties
azkaban.name=Test
azkaban.label=My Local Azkaban
azkaban.default.servlet.path=/index
web.resource.dir=web/
default.timezone.id=Asia/Shanghai
# default.timezone.id=America/Los_Angeles
user.manager.class=azkaban.user.XmlUserManager
user.manager.xml.file=conf/azkaban-users.xml
executor.global.properties=conf/global.properties
azkaban.project.dir=projects
velocity.dev.mode=false
jetty.use.ssl=false
jetty.maxThreads=25
jetty.port=8081
mail.sender=
mail.host=
job.failure.email=
job.success.email=
lockdown.create.projects=false
cache.directory=cache
jetty.connector.stats=true
executor.connector.stats=true
database.type=mysql
mysql.port=3306
mysql.host=mysql
# mysql.host=localhost
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections=100
azkaban.use.multiple.executors=true
azkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatus
# azkaban.executorselector.filters=StaticRemainingFlowSize,MinimumFreeMemory,CpuStatus
azkaban.executorselector.comparator.NumberOfAssignedFlowComparator=1
azkaban.executorselector.comparator.Memory=1
azkaban.executorselector.comparator.LastDispatched=1
azkaban.executorselector.comparator.CpuUsage=1

参数说明:

azkaban.executorselector.filters:调度策略
# 把MinimumFreeMemory去掉,因为MinimumFreeMemory是6G,自己电脑资源有限,如果小伙伴的机器资源雄厚,可以保留
# StaticRemainingFlowSize:根据排队的任务数来调度任务到哪台executor机器
# CpuStatus:跟据cpu空闲状态来调度任务到哪台executor机器

5)启动脚本 bootstrap.sh

#!/usr/bin/env sh

wait_for() {
    echo Waiting for $1 to listen on $2...
    while ! nc -z $1 $2; do echo waiting...; sleep 1s; done
}

startAzkaban() {

   node_type=$1

   if [ "$node_type" = "exec" ];then

      {
        activateAzkabanExec
      }&

      # 【注意】需要切到exec目录下启动,因为配置文件配置的是相对路径
      cd ${AZKABAN_HOME}/azkaban-exec-server
      ./bin/internal/internal-start-executor.sh 2>&1 |tee -a executorServerLog__`date +%F+%T`.out
      # 激活 exec
      activateAzkabanExec

   elif [ "$node_type" = "web" ];then
      first_exec=$2
      exec_port=$3
      wait_for $first_exec $exec_port
      # 【注意】需要切到web目录下启动,因为配置文件配置的是相对路径
      cd ${AZKABAN_HOME}/azkaban-web-server
      ./bin/internal/internal-start-web.sh 2>&1 |tee -a webServerLog_`date +%F+%T`.out
   fi

}

# 激活 exec
activateAzkabanExec(){
  until netstat -ntlp|grep -q :12321; do echo waiting for azkaban-exec; sleep 1; done
  curl -G "`hostname`:12321/executor?action=activate" && echo
}

startAzkaban $@

注意先启动exec,再启动web,否则web会报No active executors found的异常信息。

6)构建镜像 Dockerfile

FROM registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/centos-jdk:7.7.1908

# 添加 azkaban 包
ENV AZKABAN_VERSION 3.91.0-313
RUN mkdir /opt/apache/azkaban-${AZKABAN_VERSION}
ADD ./azkaban-${AZKABAN_VERSION}/azkaban-db.tar.gz /opt/apache/azkaban-${AZKABAN_VERSION}/
ADD ./azkaban-${AZKABAN_VERSION}/azkaban-exec-server.tar.gz /opt/apache/azkaban-${AZKABAN_VERSION}/
ADD ./azkaban-${AZKABAN_VERSION}/azkaban-web-server.tar.gz /opt/apache/azkaban-${AZKABAN_VERSION}/
ENV AZKABAN_HOME /opt/apache/azkaban
RUN ln -s /opt/apache/azkaban-${AZKABAN_VERSION} $AZKABAN_HOME

# copy bootstrap.sh
COPY bootstrap.sh /opt/apache/
RUN chmod +x /opt/apache/bootstrap.sh

RUN chown -R hadoop:hadoop /opt/apache

WORKDIR $AZKABAN_HOME

开始构建镜像

docker build -t registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/azkaban:3.91.0-313 . --no-cache

# 为了方便小伙伴下载即可使用,我这里将镜像文件推送到阿里云的镜像仓库
docker push registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/azkaban:3.91.0-313

### 参数解释
# -t:指定镜像名称
# . :当前目录Dockerfile
# -f:指定Dockerfile路径
#  --no-cache:不缓存

7)编排 docker-compose.yaml

version: '3'
services:
  azkaban-web:
    image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/azkaban:3.91.0-313
    user: "hadoop:hadoop"
    container_name: azkaban-web
    hostname: azkaban-web
    restart: always
    privileged: true
    depends_on:
      - azkaban-exec
    env_file:
      - .env
    volumes:
      - ./conf/web/azkaban.properties:${AZKABAN_HOME}/azkaban-web-server/conf/azkaban.properties
    ports:
      - "${AZKABAN_WEB_PORT}"
    command: ["sh","-c","/opt/apache/bootstrap.sh web azkaban-azkaban-exec-1 ${AZKABAN_EXEC_PORT}"]
    networks:
      - hadoop-network
    healthcheck:
      test: ["CMD-SHELL", "netstat -tnlp|grep :${AZKABAN_WEB_PORT} || exit 1"]
      interval: 10s
      timeout: 20s
      retries: 3
  azkaban-exec:
    image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/azkaban:3.91.0-313
    user: "hadoop:hadoop"
    restart: always
    privileged: true
    deploy:
      replicas: ${AZKABAN_EXEC_REPLICAS}
    env_file:
      - .env
    volumes:
      - ./conf/exec/azkaban.properties:${AZKABAN_HOME}/azkaban-exec-server/conf/azkaban.properties
    expose:
      - "${AZKABAN_EXEC_PORT}"
    command: ["sh","-c","/opt/apache/bootstrap.sh exec"]
    networks:
      - hadoop-network
    healthcheck:
      test: ["CMD-SHELL", "netstat -tnlp|grep :${AZKABAN_EXEC_PORT} || exit 1"]
      interval: 10s
      timeout: 10s
      retries: 3

# 连接外部网络
networks:
  hadoop-network:
    external: true

.env 文件内容

AZKABAN_HOME=/opt/apache/azkaban
AZKABAN_EXEC_REPLICAS=2
AZKABAN_WEB_PORT=8081
AZKABAN_EXEC_PORT=12321

8)开始部署

# --project-name指定项目名称,默认是当前目录名称
docker-compose --project-name=azkaban -f docker-compose.yaml up -d

# 查看
docker-compose --project-name=azkaban -f docker-compose.yaml ps

# 卸载
docker-compose --project-name=azkaban -f docker-compose.yaml down

六、简单测试验证

# 查看对外端口
docker-compose -p=azkaban ps

web 访问:http://ip:port
账号/密码:azkaban/azkaban

七、常用的 Azkaban 客户端命令

1)服务启停

### 1、azkaban-exec-server
# azkaban-exec-server 启动(前台)
cd ${AZKABAN_HOME}/azkaban-exec-server
./bin/internal/internal-start-executor.sh
# 后台启动
cd ${AZKABAN_HOME}/azkaban-exec-server
./bin/start-exec.sh
# 重启
cd ${AZKABAN_HOME}/azkaban-exec-server
./bin/shutdown-exec.sh && ./bin/start-exec.sh

### 2、azkaban-web-server
# azkaban-web-server 启动(前台)
cd ${AZKABAN_HOME}/azkaban-web-server
./bin/internal/internal-start-web.sh
# 后台启动
cd ${AZKABAN_HOME}/azkaban-web-server
./bin/start-web.sh
# 重启
cd ${AZKABAN_HOME}/azkaban-web-server
./bin/shutdown-web.sh && ./bin/start-web.sh

2)azkaban exec 节点激活

curl -G "${exec_ip}:12321/executor?action=activate" && echo

3)其它常用api接口

以下是一些Apache Azkaban中常用的API接口:

1、创建项目

URL:/manager?action=create
方法:POST
参数:name(项目名称)、description(项目描述)

2、上传项目ZIP文件

URL:/manager?action=upload
方法:POST
参数:file(ZIP文件)

3、获取项目流列表

URL:/manager?action=fetchprojectflows
方法:GET
参数:project(项目名称)

4、执行项目流

URL:/executor
方法:POST
参数:ajax(固定值executeFlow)、project(项目名称)、flow(流名称)

5、取消执行项目流

URL:/executor
方法:POST
参数:ajax(固定值cancelFlow)、execid(执行ID)

6、获取执行状态

URL:/executor
方法:GET
参数:ajax(固定值fetchexecflow)、execid(执行ID)

7、获取执行日志

URL:/executor
方法:GET
参数:ajax(固定值fetchExecJobLogs)、execid(执行ID)、jobId(任务ID)、offset(偏移量)、length(日志长度)

8、获取执行报告

URL:/executor
方法:GET
参数:ajax(固定值fetchexecflow)&execid(执行ID)

这些API接口可以通过发送HTTP请求与Azkaban的Web服务器进行交互,执行项目的创建、上传、执行以及获取执行状态、日志和报告等操作。可以根据具体需求使用适当的API接口来管理和调度Azkaban中的作业流。

以下是使用Python示例代码来演示如何使用Azkaban的API接口:

import requests

# 创建项目
def create_project(project_name, description):
    url = "http://localhost:8081/manager"
    params = {
        "action": "create",
        "name": project_name,
        "description": description
    }
    response = requests.post(url, params=params)
    print(response.text)

# 上传项目ZIP文件
def upload_project_zip(project_name, zip_file_path):
    url = "http://localhost:8081/manager"
    files = {
        "file": open(zip_file_path, "rb")
    }
    params = {
        "action": "upload",
        "project": project_name
    }
    response = requests.post(url, params=params, files=files)
    print(response.text)

# 执行项目流
def execute_flow(project_name, flow_name):
    url = "http://localhost:8081/executor"
    params = {
        "ajax": "executeFlow",
        "project": project_name,
        "flow": flow_name
    }
    response = requests.post(url, params=params)
    print(response.text)

# 获取执行状态
def get_execution_status(execution_id):
    url = f"http://localhost:8081/executor?ajax=fetchexecflow&execid={execution_id}"
    response = requests.get(url)
    print(response.text)

# 获取执行日志
def get_execution_logs(execution_id, job_id, offset, length):
    url = f"http://localhost:8081/executor?ajax=fetchExecJobLogs&execid={execution_id}&jobId={job_id}&offset={offset}&length={length}"
    response = requests.get(url)
    print(response.text)

# 获取执行报告
def get_execution_report(execution_id):
    url = f"http://localhost:8081/executor?ajax=fetchexecflow&execid={execution_id}"
    response = requests.get(url)
    print(response.text)

# 示例用法
create_project("my_project", "My Azkaban project")
upload_project_zip("my_project", "path/to/project.zip")
execute_flow("my_project", "my_flow")
get_execution_status("12345")
get_execution_logs("12345", "my_job", 0, 100)
get_execution_report("12345")

到此 通过 docker-compose 快速部署 Azkaban 保姆级教程就完结了,有任何疑问欢迎关注我公众号【大数据与云原生技术分享】加群交流或私信沟通,如本篇文章对您有所帮助,麻烦帮忙一键三连(点赞、转发、收藏)~~

相关推荐

详解 HTTPS、TLS、SSL、HTTP区别和关系

一、什么是HTTPS、TLS、SSLHTTPS,也称作HTTPoverTLS。TLS的前身是SSL,TLS1.0通常被标示为SSL3.1,TLS1.1为SSL3.2,TLS1.2为SSL...

锐安信SSL证书自动化运维系统:灵活管理SSL/TLS证书全生命周期

点击上方关注“锐成云分销”,云建站解决方案专家!域名、SSL证书、DNS、主机一站选齐在SSL/TLS证书的生命周期管理中,证书的各种操作方式是基础且核心的部分之一,更是保障用户数据传输加密的关键。这...

宝塔免费的 SSL/TLS 证书如何续签

申请之前,请确保域名已解析,如未解析会导致审核失败(包括根域名)宝塔SSL申请的是免费版TrustAsiaDVSSLCA-G5证书,仅支持单个域名申请有效期1年,不支持续签,到期后需要重新申...

HTTPS、HTTP、TLS/SSL工作及握手原理、PKI/CA密钥体系

一、HTTPS与HTTP介绍二、TLS/SSL工作原理三、TSL/SSL握手过程四、HTTPS性能优化五、PKI体系一、HTTPS与HTTP介绍1.Https(SecureHypetextTran...

什么是SSL证书卸载 SSL证书卸载有什么作用

SSL证书是数字证书的一种,安装部署的话可以对网站起到身份验证和数据加密的作用。网站部署SSL证书,相对就必然会有SSL证书卸载,那么SSL证书卸载是什么呢?SSL证书卸载有什么作用?随着SSL通信量...

让SSL/TLS协议流行起来:深度解读SSL/TLS实现1

一前言SSL/TLS协议是网络安全通信的重要基石,本系列将简单介绍SSL/TLS协议,主要关注SSL/TLS协议的安全性,特别是SSL规范的正确实现。本系列的文章大体分为3个部分:SSL/TLS协...

苹果、谷歌、微软等一致同意!SSL/TLS证书最长有效期锐减至47天

快科技4月14日消息,苹果此前向CA/B论坛(负责管理SSL/TLS证书的行业组织)提议,将所有证书有效期缩短至45天。日前CA/B论坛服务器证书工作组投票通过SC-081v3提案,最终决定将SSL/...

Android怎么设置端口转发,将访问本设备的端口转到另外一台设备

一、Android系统怎么设置端口转发,将访问本设备的端口转到另外一台设备?要设置端口转发,您需要先在Android设备上安装一个支持端口转发的应用程序。其中一个常用的应用是"Termux&#...

大神级产品:手机装 Linux 运行 Docker 如此简单

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:灵昱Termux作为一个强大的Android终端模拟器,能够运行多种Linux环境。然而,直接在Termux上运行Docker并不可行,需要...

关于H3C交换机的SSH功能配置方法(华三交换机ssh配置)

对于交换机的初步学习,作为初学者的我,还望诸位不吝赐教。若存在不足之处,烦请大家多提宝贵意见。同样身为初学者的我们,亦可携手共进,相互分享技术经验。一、本地用户配置(核心步骤)1.创建用户并设置密码...

Linux常用操作ssh(linux中的ssh命令)

ssh#p是小写ssh-p22user@hostsftp#连接sftp-P22root@host#将文件上传到服务器上:put[本地文件的地址][服务器上文件存储的位置]#将...

小白心得,如何使用SSH连接飞牛系统(fnos)?

一、背景作为一个刚接触飞牛系统的小白,在研究飞牛os的时候,发现很多功能都需要连接ssh,但是如何使用SSH连接飞牛系统成为入门飞牛os的一道坎。下面以自己的学习经历详细记录下过程吧。二、系统设置1、...

如何在 Windows 11 或 10 上使用 Winget 安装 OpenSSH

SSH(SecureShell)是大多数开发人员和系统管理员用来通过Linux远程连接托管服务器或任何云服务的工具,因为SSH在Linux中是内置的。然而,对于Windows呢?是的...

linux文件之ssh配置文件的含义与作用

ssh远程登录命令是操作系统(包括linux和window系统)下常用的操作命令,可以帮助用户,远程登录服务器系统,查看,操作系统相关信息。linux系统对于ssh命令有专门保存其相关配置的目录和文件...

害怕Linux SSH不安全?这几个小妙招安排上!

ssh是访问远程服务器最常用的方法之一,同时,其也是Linux服务器受到攻击的最常见的原因之一。不过别误会...我们并不是说ssh有什么安全漏洞,相反,它在设计上是一个非常安全的协议。但是安...

取消回复欢迎 发表评论: