扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
本篇内容介绍了“azkaban3.9.0的编译安装步骤”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
目前创新互联建站已为数千家的企业提供了网站建设、域名、网页空间、网站托管运营、企业网站设计、镇沅网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
1 Azkaban介绍
大数据业务处理场景中,经常有这样的分析场景:
A 任务:将收集的数据通过一系列的规则进行清洗,然后存入 Hive 表 a 中。
B 任务:将 Hive 中已存在的表 b 和表 c 进行关联得到表 d 。
C 任务:将 A 任务中得到的表 a 与 B 任务中得到的表 d 进行关联得到分析的结果表e 。
D 任务:最后将 Hive 中得到的表 e 通过 sqoop 导入到关系型数据库 MySQL 中供web 端查询使用。
显然,以上任务 C 依赖于任务 A 与任务 B 的结果,任务 D 依赖于任务 C 的结果。我们一般的做法可以打开两个终端分别执行任务 A 与任务 B ,当任务 A 与任务 B 执行完成之后再执行任务 C ,当任务 C 执行完成之后再执行任务 D 。整个任务流程中必须保证任务A 、任务 B 执行完成之后执行任务 C ,然后再执行任务 D 。这样某一个环节都离不开人工的参与,需要时刻盯着各任务的执行进度,非常费力。
以上业务场景就是一个大的任务,任务中分为四个子任务 A 、 B 、 C 、 D ,如果能有一个任务调度器给我们自动实现执行任务 A ,执行任务 B ,然后再执行任务 C ,最后执行任务D ,那么就不需要人工时刻盯着任务是否执行完成,是否该开启下一个任务。 Azkaban 就是这样一个工作流的调度器,可以解决以上场景问题。
2 Azkaban 的安装
2.1 Azkaban 由三个关键组件
Azkaban 是一个批量工作流调度器,底层是使用 java 语言开发,用于在一个工作流内以一定的顺序运行一组任务和流程,并且提供了非常方便的 webui 界面来监控任务调度的情况,方便我们来管理流调度任务。
Azkaban 由三个关键组件组成:
AzkabanWebServer:
主要负责项目管理、用户登录权限认证、定时执行工作任务、跟踪提交任务执行的流程、访问历史执行任务、保存执行计划的状态。
AzkabanExecutorServer:主要负责工作流程的提交、执行、检索和更新当前正在执行计划的数据,处理执行计划的日志。
关系型数据库:
主要是保存工作流中的原数据信息。
下面,让我们从零开始搭建一个 Azkaban 任务流调度系统。
2.2 安装Azkaban
https://github.com/azkaban/azkaban/releases
2.2.1 环境准备
在 Linux 中安装 Azkaban ,系统中需要安装好 jdk,MySQL ,这里选择的是 jdk8和 MySQL5.1 版本。除此之外,还需要安装 git , git 是一个开源的分布式版本控制系统,一般在项目版本控制中会使用 git 控制,这里安装 Azkaban 需要 git 是因为需要通过 git 构建依赖包。
安装git:
yum -y install git
2.2.2 安装 Azkaban
上传下载好的 azkaban ,解压到 /opt/azkaban-temp 文件夹
[root@mynode5 software]# tar -zxvf ./azkaban-3.90.0.tar.gz
[root@mynode5 software]# mv ./azkaban-3.90.0 azkaban-temp
进入 azkaban-temp 目录,进行编译
[root@node4 azkaban]# ./gradlew distTar
...
BUILD SUCCESSFUL in 4m 6s
54 actionable tasks: 40 executed, 14 from cache
注意:编译过程中有可能由于网络延时造成编译时失败,可以多重试几次解决此问题。
3. 新建 azkaban 目录,将编译好的文件复制到此目录下
[root@node4 software]# mkdir ./azkaban
[root@node4 software]# cd azkaban
[root@node4 azkaban]# cp /software/azkaban-temp/azkaban-
db/build/distributions/azkaban-db-0.1.0-SNAPSHOT.tar.gz
/software/azkaban4.
[root@node4 azkaban]# cp /software/azkaban-temp/azkaban-web-
server/build/distributions/azkaban-web-server-0.1.0-SNAPSHOT.tar.gz
/software/azkaban
[root@node azkaban]# cp /software/azkaban-temp/azkaban-exec-
server/build/distributions/azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz
/software/azkaban
在 azkaban 目录下解压各个编译好的压缩包,重新命名
[root@node4 azkaban]# tar -zxvf azkaban-db-0.1.0-SNAPSHOT.tar.gz
[root@node4 azkaban]# tar -zxvf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz
[root@node4 azkaban]# tar -zxvf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz
[root@node4 azkaban]# mv azkaban-db-0.1.0-SNAPSHOT azkaban-db
[root@node4 azkaban]# mv azkaban-web-server-0.1.0-SNAPSHOT azkaban-web
[root@node4 azkaban]# mv azkaban-exec-server-0.1.0-SNAPSHOT azkaban-exec
至此,经历了 Azkaban 的下载、编译, Azkaban 安装基本准备工作已经完成,下一步就是配置 Azkaban ,将 Azkaban 运行起来。
2.2.3 导入数据库
运行 Azkaban 基本的原数据信息库,在编译好的 azkaban-db 中就有基本的库信息,需要将这些数据导入到关系型数据库中,这里就是导入 MySQL 数据库中 , 导入的MySQL 数据库可以和当前 Azkaban 安装在同一节点上,也可以安装在不同的节点上,笔者的 Azkaban 安装在 node4 节点上, MySQL 数据库安装在 node1 节点上。
登录 mysql 数据库,创建 azkaban 数据库
[root@mynode2 ~]# mysql -u root -p
mysql> create database azkaban default character set latin1;
注意:这里创建 azkaban 时建议使用 latin1 编码,因为索引太长, utf8 编码格式不支持,最高支持 1000 。
2. 准备 sql 文件
将 node4 节点上 /software/azkaban/azkaban-db 目录下的 create-all-sql-0.1.0-SNAPSHOT.sql 复制到 node1 节点 /software/test 目录下。
[root@node4 azkaban-db]# scp /software/azkaban/azkaban-db/create-all-
sql-0.1.0-SNAPSHOT.sql
[root@node4:/software/test create-all-sql-0.1.0-SNAPSHOT.sql 100% 12KB 11.8KB/s 00:00
向 MySQL 中导入数据库
mysql> use azkaban;
mysql> source /software/test/create-all-sql-0.1.0-SNAPSHOT.sql
检查导入的数据库表
mysql> show tables;
2.3 配置运行 Azkaban
2.3.1 创建 ssl 配置
HTTP 的全称 是 Hypertext Transfer Protocol Vertion (超文 本传输协议), HTTPS 的全称是 Secure Hypertext Transfer Protocol (安全超文本传输协议), HTTPS 基于 HTTP 开发,使用安全套接字层 (SSL) 进行信息交换,简单来说它是HTTP 的安全版。 Azkaban 支持安全的 https 访问,但是需要创建 ssl 配置。
在 /software/azkaban 目录下执行命令: keytool -keystore keystore -alias jetty -genkey -keyalg RSA 创建 ssl 配置。
[root@mynode5 azkaban]# keytool -keystore keystore -alias jetty -genkey -keyalg RSA
输入密钥库口令:
再次输入新口令:
输入
(如果和密钥库口令相同, 按回车):
输入完信息,执行完以上命令之后,在当前目录下生成一个 keystore 文件,将此文件复制到 azkaban web 服务器根目录下。
[root@node4 azkaban]# mv /software/azkaban/keystore /software/azkaban/azkaban-web
2.3.2 Azkaban web 服务器配置
进 入 /software/azkaban/azkaban-web/conf 目 录 下 , 编 辑azkaban.properties 文件:
[root@node4 conf]# cd /software/azkaban/azkaban-web/conf/
[root@node4 conf]# vim azkaban.properties
编辑内容如下:
# Azkaban Personalization Settings azkaban.name=My Azkaban azkaban.label=My Local Azkaban azkaban.color=#FF3601 azkaban.default.servlet.path=/index web.resource.dir=/root/soft/azkaban/azkaban-web/web/ default.timezone.id=Asia/Shanghai # Azkaban UserManager class user.manager.class=azkaban.user.XmlUserManager user.manager.xml.file=/root/soft/azkaban/azkaban-web/conf/azkaban-users.xml # Loader for projects executor.global.properties=/root/soft/azkaban/azkaban-web/conf/global.properties azkaban.project.dir=projects # Velocity dev mode velocity.dev.mode=false # Azkaban Jetty server properties. jetty.use.ssl=false jetty.maxThreads=25 jetty.port=8081 jetty.keystore=/root/soft/azkaban/azkaban-web/keystore jetty.password=123456 jetty.keypassword=azkaban jetty.truststore=/root/soft/azkaban/azkaban-web/keystore jetty.trustpassword=123456 jetty.ssl.port=8443 executor.connector.stats=true executor.port=12312 # Azkaban Executor settings # mail settings mail.sender= mail.host= # User facing web server configurations used to construct the user facing server URLs. They are useful when there is a reverse proxy between Azkaban web servers and users. # enduser -> myazkabanhost:443 -> proxy -> localhost:8081 # when this parameters set then these parameters are used to generate email links. # if these parameters are not set then jetty.hostname, and jetty.port(if ssl configured jetty.ssl.port) are used. # azkaban.webserver.external_hostname=myazkabanhost.com # azkaban.webserver.external_ssl_port=443 # azkaban.webserver.external_port=8081 job.failure.email= job.success.email= lockdown.create.projects=false cache.directory=cache # JMX stats jetty.connector.stats=true executor.connector.stats=true # Azkaban mysql settings by default. Users should configure their own username and password. database.type=mysql mysql.port=3306 mysql.host=192.168.3.175 mysql.database=azkaban mysql.user=azkaban mysql.password=azkaban mysql.numconnections=100 #Multiple Executor azkaban.use.multiple.executors=true 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
2.3.3 Azkaban executor 服务器配置
进 入 /software/azkaban/azkaban-exec/conf 目 录 下 , 编 辑azkaban.properties 文件:
# Azkaban Personalization Settings azkaban.name=My Azkaban azkaban.label=My Local Azkaban azkaban.color=#FF3601 azkaban.default.servlet.path=/index web.resource.dir=/root/soft/azkaban/azkaban-web/web/ default.timezone.id=Asia/Shanghai # Azkaban UserManager class user.manager.class=azkaban.user.XmlUserManager user.manager.xml.file=/root/soft/azkaban/azkaban-web/conf/azkaban-users.xml # Loader for projects executor.global.properties=/root/soft/azkaban/azkaban-web/conf/global.properties azkaban.project.dir=projects # Velocity dev mode velocity.dev.mode=false # Azkaban Jetty server properties. #jetty.use.ssl=false #jetty.maxThreads=25 #jetty.port=8081 # Where the Azkaban web server is located azkaban.webserver.url=https://localhost:8443 # mail settings mail.sender= mail.host= # User facing web server configurations used to construct the user facing server URLs. They are useful when there is a reverse proxy between Azkaban web servers and users. # enduser -> myazkabanhost:443 -> proxy -> localhost:8081 # when this parameters set then these parameters are used to generate email links. # if these parameters are not set then jetty.hostname, and jetty.port(if ssl configured jetty.ssl.port) are used. # azkaban.webserver.external_hostname=myazkabanhost.com # azkaban.webserver.external_ssl_port=443 # azkaban.webserver.external_port=8081 job.failure.email= job.success.email= lockdown.create.projects=false cache.directory=cache # JMX stats jetty.connector.stats=true executor.connector.stats=true # Azkaban plugin settings azkaban.jobtype.plugin.dir=/root/soft/azkaban/azkaban-exec/plugins/jobtypes # Azkaban mysql settings by default. Users should configure their own username and password. database.type=mysql mysql.port=3306 mysql.host=192.168.3.175 mysql.database=azkaban mysql.user=azkaban mysql.password=azkaban mysql.numconnections=100 # Azkaban Executor settings executor.maxThreads=50 executor.flow.threads=30 executor.port=12321
2.3.4 启动 Azkaban
启动 AzkabanExecutorServer
进入 /software/azkaban/azkaban-exec/bin 目录,启动AzkabanExecutorServer , jps 检查进程 , 出现AzkabanExecutorServer进程表示启动成功。
[root@node4 bin]# cd /software/azkaban/azkaban-exec/bin
[root@node4 bin]# ./start-exec.sh
[root@node4 bin]# jps
激活 AzkabanExecutor
启动/重启 AzkabanExecutor 需要激活,在浏览器中执行如下命令,激活
AzkabanExecutor :
http://node4:12321/executor?action=activate
启动 AzkabanWebServer
进入 /software/azkaban/azkaban-web/bin 目录,启动
AzkabanWebServer,jps 检查进程,出现 AzkabanWebServer 进程表示启动成功。
[root@node4 bin]# cd /software/azkaban/azkaban-web/bin
[root@node4 bin]# ./start-web.sh
3. [root@mynode5 bin]# jps
至此, Azkaban 的搭建已经完成,下面检查 Azkaban 运行情况。
2.4 验证 Azkaban 运行情况
验证 Azkaban 是否启动成功,可以访问 Azkaban 的 WebUI 界面,检查是否启动成功。在浏览器输入 http://node4:8081:
如果配置了ssl请访问:https//node4:port
在这里插入图片描述
输入地址之后,出现以上页面表示配置 Azkaban 没有问题,Azkaban 启动成功,默认的用户名和密码都是 Azkaban ,可以输入用户名和密码登录 Azkaban 的界面提交任务流,进行任务管理和调度。:
在这里插入图片描述
至此, Azkaban 搭建成功,下面我们模拟一个任务流来尝试利用 Azkaban 来进行任务调度。
3. 构建工作流
以上小节介绍了安装部署 Azkaban ,本节中我们将设计一个模拟的任务流程 flow ,通过这个任务流程来学习如何编写 Azkaban 的任务、如何在 WebUI 中查看任务流调度及状态。
首先介绍下 Azkaban 中 project 、 flows 、 job 之间的关系:一个 project 中可以包含一个或者多个 flows ,一个 flows 包含多个 job 。这里的 job 是在 Azkaban 中运行的一个进程,可以是简单的 linux 命令、 shell 脚本、 sql 脚本等。一个 job 可以依赖于另一个 job ,这种多个 job 之间的依赖关系组成 flow ,也就是任务流。
3.1 设计工作流程
假设现在有 5 个 job ,分别是 job1 、 job2 、 job3 、 job4 、 job5 。每个 job 都执行一个 shell 脚本。 job3 依赖与 job1 和 job2 执行的结果, job4 依赖于 job3 执行的结果, job5 依赖于 job4 执行的结果。
针对以上这个任务需求,我们可以设计一个任务流( flow ),这个任务流中有 5 个job ,按照上述 job 依赖的关系,可以编写一个简单的任务流程提交到 Azkaban 中进行调度执行。
3.2 编写各阶段 Job
编写 job 非常容易,需要创建一个以” .job ”结尾的文本文件,文件中书写格式如下:
type=command
command= 需要执行的脚本或命令
type=command 是 告 诉 Azkaban 使 用 unix 原 生 命 令 去 运 行 命 令 或 者 脚 本 ,command= “ xxx ”就是指定当前 job 需要执行的命令或者脚本,如果当前 job 依赖于其他的 job ,只需要在这个文本文件后面加上“ dependencies= 依赖的 job 名称”即可,依赖的 job 只需要写名称,不需要写出后缀“ job ”。
为了方便演示以上工作流程,这里设计的每个 job 都调起 linux 上的一个脚本,脚本中就使用简单的 echo 打印一些信息供参看 ,5 个 job 及对应的脚本设置内容如下:
编写 job 任务
job1.job:
type=command
command= sh job1.sh
job2.job :
type=command
command= sh job2.sh
job3.job:
type=command
command= sh job3.sh
dependencies=job1,job2
job4.job:
type=command
command= sh job4.sh
dependencies=job3
job5.job:
type=command
command= sh job5.sh
dependencies=job4
以上 job 任务的编写可以在本地 window 环境中编写,编写完成后需要将 5 个 job
压缩到一个压缩文件中,后期提交到 Azkaban 中执行。
2. 编写脚本内容
job1.sh:
echo "开始执行 job1... ... "
echo "正在执行 job1... ... "
echo "执行完成 job1... ... "
job2.sh:
echo "开始执行 job2... ... "
echo "正在执行 job2... ... "
echo "执行完成 job2... ... "
job3.sh:
echo "开始执行 job3... ... "
echo "正在执行 job3... ... "
echo "执行完成 job3... ... "
job4.sh:
echo "开始执行 job4... ... "
echo "正在执行 job4... ... "
echo "执行完成 job4... ... "
job5.sh:
echo "开始执行 job5... ... "
echo "正在执行 job5... ... "
echo "执行完成 job5... ... "
以 上 脚 本 是 在 linux 中 编 写 , job1.sh 、 job2.sh 、 job3.sh 、 job4.sh 、job5.sh 几个脚本都需要赋予执行权限。
3.3 配置工作流并执行
Azkaban 中任务提交时,必须将所有 job 文件压缩到一个 zip 文件中再提交到
Azkaban 中执行。首先将以上 5 个 job 压缩到一个 zip 文件中,然后登陆 Azkaban, 点
击右上角的 Create Project 创建一个项目:
在这里插入图片描述
在弹出的框中填写项目名称及项目描述:
在这里插入图片描述
点击 Create Project ,点击 upload ,上传压缩好的任务:
在这里插入图片描述
上传完成之后,查看任务流, Azkaban 默认 Flow 名称是以最后一个没有依赖的 job定义的:
在这里插入图片描述
点击 Execute Flow 可以看到任务流的详细依赖关系:
在这里插入图片描述
点击 Execute 执行任务。
如果想要每隔一段时间执行一次任务,可以点击 Schedule ,配置定时任务,配置好时间之后,点击 Schedule 调度即可。如图示:
在这里插入图片描述
3.4 工作流执行监控
执行任务完成之后,会自动跳转到执行成功界面:
在这里插入图片描述
3.5 Azkaban 问题
如果在提交 Azkaban 时出现任务一直运行状态,但是执行不完成,查看 azkabanwebui 日 志 发 现 “ Cannot request memory (Xms 0 kb, Xmx 0 kb) from system for job job1, sleep for 60 secs and retry, at… … ”问题,这个问题是 executor 执行任务之前检查节点内存是否足够 3G ,如果不够就会出现这个错 误 。 可 以 在 …/azkaban-exec/plugins/jobtype 目 录 下 , 配 置commonprivate.properties 文 件 , 在 文 件 中 加 入“ memCheck.enabled=false ”,不检查内存即可,重启 azkaban 就可。
“azkaban3.9.0的编译安装步骤”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流