通过 docker-compose 快速部署 Azkaban 保姆级教程
wptr33 2025-01-27 00:37 53 浏览
一、概述
Apache Azkaban 是一个开源的批处理工作流调度系统,用于管理和调度Hadoop生态系统中的任务和作业。
- Azkaban 提供了一个直观的Web界面,让用户能够轻松地定义、调度和监控作业流。它支持工作流的可视化编辑,可以将任务以依赖关系的方式组织起来,从而实现复杂的工作流程。用户可以定义作业的依赖关系、时间调度、重试机制等,并监控作业的执行情况和日志。
- Azkaban 可以与Hadoop生态系统中的各种工具和框架集成,如Hadoop、Hive、Pig、Spark等。它通过与这些工具的集成,可以方便地调度和执行这些工具生成的作业。
- Azkaban 还提供了一套安全机制,可以控制用户对作业流的访问权限,确保敏感数据和任务的安全性。
总的来说,Apache Azkaban是一个功能强大的批处理工作流调度系统,可以帮助用户管理和调度Hadoop生态系统中的作业和任务,提高工作效率和数据处理的可靠性。
这里只是讲解容器化快速部署过程,想了解更多关于 Azkaban 的知识点可关注我以下文章:
二、Azkaban 的调度流程
Apache Azkaban的调度流程可以概括为以下几个步骤:
- 定义作业流:使用Azkaban的Web界面或Azkaban的DSL语言,用户定义作业流并指定任务之间的依赖关系。作业流由一系列任务组成,可以按照顺序或并行方式执行。
- 作业提交:当作业流需要执行时,Azkaban会将任务提交到执行环境中(如Hadoop集群)。这可以通过调用相应的执行引擎(如Azkaban Executor)来实现。任务提交时,Azkaban会将任务的相关信息和依赖关系传递给执行引擎。
- 依赖关系解析:执行引擎接收到任务后,会解析任务之间的依赖关系。它会检查每个任务所依赖的其他任务是否已经完成。如果有未满足的依赖关系,任务将等待依赖任务完成后再执行。
- 任务执行:一旦任务的依赖关系满足,执行引擎会开始执行任务。任务可以是各种类型,如Hadoop作业、Shell脚本、Spark作业等。执行引擎会调用相应的执行器来执行任务,并提供所需的参数和配置。
- 任务监控和日志:在任务执行期间,Azkaban会实时监控任务的执行状态,并记录任务的日志输出。用户可以通过Azkaban的Web界面查看任务的执行进度、日志和错误信息。这有助于及时发现和排查执行问题。
- 依赖关系检查:在任务执行完成后,执行引擎会检查任务的输出和后续任务的依赖关系。如果有后续任务依赖当前任务的输出,执行引擎会传递相应的输出给后续任务,并继续执行后续任务。
- 完成和报告:当作业流中的所有任务都执行完成后,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 保姆级教程就完结了,有任何疑问欢迎关注我公众号【大数据与云原生技术分享】加群交流或私信沟通,如本篇文章对您有所帮助,麻烦帮忙一键三连(点赞、转发、收藏)~~
相关推荐
- [常用工具] git基础学习笔记_git工具有哪些
-
添加推送信息,-m=messagegitcommit-m“添加注释”查看状态...
- centos7安装部署gitlab_centos7安装git服务器
-
一、Gitlab介1.1gitlab信息GitLab是利用RubyonRails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。...
- 太高效了!玩了这么久的Linux,居然不知道这7个终端快捷键
-
作为Linux用户,大家肯定在Linux终端下敲过无数的命令。有的命令很短,比如:ls、cd、pwd之类,这种命令大家毫无压力。但是,有些命令就比较长了,比如:...
- 提高开发速度还能保证质量的10个小窍门
-
养成坏习惯真是分分钟的事儿,而养成好习惯却很难。我发现,把那些对我有用的习惯写下来,能让我坚持住已经花心思养成的好习惯。...
- 版本管理最好用的工具,你懂多少?
-
版本控制(Revisioncontrol)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。...
- Git回退到某个版本_git回退到某个版本详细步骤
-
在开发过程,有时会遇到合并代码或者合并主分支代码导致自己分支代码冲突等问题,这时我们需要回退到某个commit_id版本1,查看所有历史版本,获取git的某个历史版本id...
- Kubernetes + Jenkins + Harbor 全景实战手册
-
Kubernetes+Jenkins+Harbor全景实战手册在现代企业级DevOps体系中,Kubernetes(K8s)、Jenkins和Harbor组成的CI/CD流水...
- git常用命令整理_git常见命令
-
一、Git仓库完整迁移完整迁移,就是指,不仅将所有代码移植到新的仓库,而且要保留所有的commit记录1.随便找个文件夹,从原地址克隆一份裸版本库...
- 第三章:Git分支管理(多人协作基础)
-
3.1分支基本概念分支是Git最强大的功能之一,它允许你在主线之外创建独立的开发线路,互不干扰。理解分支的工作原理是掌握Git的关键。核心概念:HEAD:指向当前分支的指针...
- 云效Codeup怎么创建分支并进行分支管理
-
云效Codeup怎么创建分支并进行分支管理,分支是为了将修改记录分叉备份保存,不受其他分支的影响,所以在同一个代码库里可以同时进行多个修改。创建仓库时,会自动创建Master分支作为默认分支,后续...
- git 如何删除本地和远程分支?_git怎么删除远程仓库
-
Git分支对于开发人员来说是一项强大的功能,但要维护干净的存储库,就需要知道如何删除过时的分支。本指南涵盖了您需要了解的有关本地和远程删除Git分支的所有信息。了解Git分支...
- git 实现一份代码push到两个git地址上
-
一直以来想把自己的博客代码托管到github和coding上想一次更改一次push两个地址一起更新今天有空查资料实践了下本博客的github地址coding的git地址如果是Gi...
- git操作:cherry-pick和rebase_git cherry-pick bad object
-
在编码中经常涉及到分支之间的代码同步问题,那就需要cherry-pick和rebase命令问题:如何将某个分支的多个commit合并到另一个分支,并在另一个分支只保留一个commit记录解答:假设有两...
- 模型文件硬塞进 Git,GitHub 直接打回原形:使用Git-LFS管理大文件
-
前言最近接手了一个计算机视觉项目代码是屎山就不说了,反正我也不看代码主要就是构建一下docker镜像,测试一下部署的兼容性这本来不难但是,国内服务器的网络环境实在是恶劣,需要配置各种镜像(dock...
- 防弹少年团田柾国《Euphoria》2周年 获世界实时趋势榜1位 恭喜呀
-
当天韩国时间凌晨3时左右,该曲在Twitter上以“2YearsWithEuphoria”的HashTag登上了世界趋势1位。在韩国推特实时趋势中,从上午开始到现在“Euphoria2岁”的Has...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
程序员的开源月刊《HelloGitHub》第 71 期
-
详细介绍一下Redis的Watch机制,可以利用Watch机制来做什么?
-
假如有100W个用户抢一张票,除了负载均衡办法,怎么支持高并发?
-
Java面试必考问题:什么是乐观锁与悲观锁
-
如何将AI助手接入微信(打开ai手机助手)
-
SparkSQL——DataFrame的创建与使用
-
redission YYDS spring boot redission 使用
-
一文带你了解Redis与Memcached? redis与memcached的区别
-
如何利用Redis进行事务处理呢? 如何利用redis进行事务处理呢英文
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)