浅析工作流调度器Azkaban


title: Azkaban系列


第一章 概述

1.1 为什么需要工作流调度器

1、一个完整的数据分析系统通常都是由大量任务单元组成:
shell 脚本程序,java 程序,mapreduce 程序、hive 脚本等
2、各任务单元之间存在时间先后及前后依赖关系
3、为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行

​ 例如,我们可能有这样一个需求,某个业务系统每天产生 20T原始数据,我们每天都要对其进行处理,处理步骤如下所示:
1、 通过 Hadoop 先将原始数据同步到 HDFS 上;
2、 借助 MapReduce 计算框架对原始数据进行清洗转换,生成的数据以分区表的形式存储 到多张 Hive 表中;
3、 需要对 Hive 中多个表的数据进行处理,得到一个明细数据 Hive 大表;
4、 将明细数据进行各种统计分析,得到结果报表信息;
5、 需要将统计分析得到的结果数据同步到业务系统中,供业务调用使用。

1.2 工作流调度实现方式

简单的任务调度:直接使用 linux 的 crontab 来定义;
复杂的任务调度:开发调度平台或使用现成的开源调度系统,比如 Ooize、Azkaban、DS小海豚、Airflow 等

1.3 常见工作流调度系统

市面上目前有许多工作流调度器
在 hadoop 领域,常见的工作流调度器有 Oozie, Azkaban,Cascading,Hamake、DS小海豚、Airflow等

1.4 各种调度工具对比

​ 下面的表格对上述四种 hadoop 工作流调度器的关键特性进行了比较,尽管这些工作流调度 器能够解决的需求场景基本一致,但在设计理念,目标用户,应用场景等方面还是存在显著 的区别,在做技术选型的时候,可以提供参考

浅析工作流调度器Azkaban_第1张图片

浅析工作流调度器Azkaban_第2张图片

1.5 Azkaban与Oozie对比

​ 对市面上最流行的两种调度器,给出以下详细对比,以供技术选型参考。总体来说,ooize 相比 azkaban 是一个重量级的任务调度系统,功能全面,但配置使用也更复杂。如果可以不 在意某些功能的缺失,轻量级调度器 azkaban 是很不错的候选对象。
​ 详情如下:

功能
两者均可以调度 mapreduce,pig,java,脚本工作流任务
两者均可以定时执行工作流任务

工作流定义
Azkaban 使用 Properties 文件定义工作流
Oozie 使用 XML 文件定义工作流

工作流传参
Azkaban 支持直接传参,例如 i n p u t O o z i e 支 持 参 数 和 E L 表 达 式 , 例 如 {input} Oozie 支持参数和 EL 表达式,例如 inputOozieEL{fs:dirSize(myInputDir)} strust2(ONGL)

定时执行
Azkaban 的定时执行任务是基于时间的
Oozie 的定时执行任务基于时间和输入数据

资源管理
Azkaban 有较严格的权限控制,如用户对工作流进行读/写/执行等操作
Oozie 暂无严格的权限控制

工作流执行
Azkaban 有两种运行模式,分别是 solo server mode(executor server 和 web server 部署在同一 台节点)和 multi server mode(executor server 和 web server 可以部署在不同节点)
Oozie 作为工作流服务器运行,支持多用户和多工作流

工作流管理
Azkaban 支持浏览器以及 ajax 方式操作工作流
Oozie 支持命令行、HTTP REST、Java API、浏览器操作工作流

1.6 Azkaban介绍

​ Azkaban 是由 Linkedin 开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定 的顺序运行一组工作和流程。
​ Azkaban 定义了一种 KV 文件(properties)格式来建立任务之间的依赖关系,并提供一个易于 使用的 web 用户界面维护和跟踪你的工作流。
它有如下功能特点:

	Web 用户界面
	方便上传工作流
	方便设置任务之间的关系
	调度工作流
	认证/授权(权限的工作)
	能够杀死并重新启动工作流
	模块化和可插拔的插件机制
	项目工作区
	工作流和任务的日志记录和审计

第二章 2.5.0版本安装部署

2.1 准备工作

Azkaban Web 服务器:azkaban-web-server-2.5.0.tar.gz

Azkaban Excutor 执行服务器:azkaban-executor-server-2.5.0.tar.gz

Azkaban 初始化脚本文件:azkaban-sql-script-2.5.0.tar.gz

官网地址:https://azkaban.github.io/

2.2 安装说明

​ 将安装文件上传到集群,最好上传到安装 hive、sqoop 的机器上,方便命令的执行。并最好统一存放在某个目录下,新建 azkaban 目录,用于存放 azkaban 运行程序

浅析工作流调度器Azkaban_第3张图片

2.3 安装Azkaban Web服务器

tar -zxvf azkaban-web-server-2.5.0.tar.gz

2.4 安装Azkaban Excutor服务器

tar -zxvf azkaban-executor-server-2.5.0.tar.gz

2.5 安装Azkaban脚本导入

tar -zxvf azkaban-sql-script-2.5.0.tar.gz

解压并将sql的解压文件重新命名之后的文件如下:

浅析工作流调度器Azkaban_第4张图片

进入MySQL:

[root@hadoop0 azkaban]# mysql -uroot -p111111

创建azkaban数据库

mysql> create database azkaban;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| azkaban            |
| hivedb             |
| mysql              |
| performance_schema |
| test               |
+--------------------+
6 rows in set (0.00 sec)

mysql> use azkaban;
Database changed

导入数据:

mysql> source /software/azkaban/azkaban-sql-2.5.0/create-all-sql-2.5.0.sql;

然后查看表:

浅析工作流调度器Azkaban_第5张图片

2.6 创建SSL配置

最好是在 azkaban 目录下:
执行命令:

[root@hadoop0 azkaban]# keytool -keystore keystore -alias jetty -genkey -keyalg RSA
Enter keystore password:  
Re-enter new password: 
What is your first and last name?
  [Unknown]:  
What is the name of your organizational unit?
  [Unknown]:  
What is the name of your organization?
  [Unknown]:  
What is the name of your City or Locality?
  [Unknown]:  
What is the name of your State or Province?
  [Unknown]:  
What is the two-letter country code for this unit?
  [Unknown]:  CN
Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN correct?
  [no]:  y

Enter key password for 
	(RETURN if same as keystore password):  

Warning:
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore keystore -destkeystore keystore -deststoretype pkcs12".

完成上述工作后,将在当前目录生成 keystore 证书文件,将 keystore 拷贝或者移动到 azkaban web 服务器根目录中:

[root@hadoop0 azkaban]# mv keystore azkaban-web-2.5.0/

2.7 修改配置文件

cd azkaban-web-2.5.0/conf

修改配置文件:vim azkaban.properties

内容如下:

#Azkaban Personalization Settings
azkaban.name=Test
azkaban.label=My Local Azkaban
azkaban.color=#FF3601
azkaban.default.servlet.path=/index
web.resource.dir=/software/azkaban/azkaban-web-2.5.0/web/
default.timezone.id=Asia/Shanghai

#Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager
user.manager.xml.file=/software/azkaban/azkaban-web-2.5.0/conf/azkaban-users.xml

#Loader for projects
executor.global.properties=/software/azkaban/azkaban-executor-2.5.0/conf/global.properties
azkaban.project.dir=/software/azkaban/projects

database.type=mysql
mysql.port=3306
mysql.host=localhost
mysql.database=azkaban
mysql.user=root
mysql.password=111111
mysql.numconnections=100

# Velocity dev mode
velocity.dev.mode=false

# Azkaban Jetty server properties.
jetty.maxThreads=25
jetty.ssl.port=8443
jetty.port=8081
jetty.keystore=/software/azkaban/azkaban-web-2.5.0/keystore
jetty.password=111111
jetty.keypassword=111111
jetty.truststore=/software/azkaban/azkaban-web-2.5.0/keystore
jetty.trustpassword=111111

# Azkaban Executor settings
executor.port=12321

# mail settings
mail.sender=
mail.host=
job.failure.email=
job.success.email=

lockdown.create.projects=false

cache.directory=cache

修改用户配置文件:vim azkaban-users.xml


	
	
	
	
	
	

进入到修改executor里面:

cd /software/azkaban/azkaban-executor-2.5.0/conf

同样vim azkaban.properties

#Azkaban
default.timezone.id=Asia/Shanghai

# Azkaban JobTypes Plugins
azkaban.jobtype.plugin.dir=/software/azkaban/azkaban-executor-2.5.0/plugins/jobtypes

#Loader for projects
executor.global.properties=/software/azkaban/azkaban-executor-2.5.0/conf/global.properties
azkaban.project.dir=/software/azkaban/projects

database.type=mysql
mysql.port=3306
mysql.host=localhost
mysql.database=azkaban
mysql.user=root
mysql.password=111111
mysql.numconnections=100

# Azkaban Executor settings
executor.maxThreads=50
executor.port=12321
executor.flow.threads=30

2.8 配置环境变量

export AZKABAN_WEB_HOME=/software/azkaban/azkaban-web-2.5.0
export AZKABAN_EXE_HOME=/software/azkaban/azkaban-executor-2.5.0
export PATH=$PATH:$AZKABAN_WEB_HOME/bin:$AZKABAN_EXE_HOME/bin

2.9 启动

1、启动 web 服务器

azkaban-web-start.sh

执行成功:

在这里插入图片描述

停止命令:

azkaban-web-shutdown.sh

2、 启动执行服务器

azkaban-executor-start.sh

执行成功:

在这里插入图片描述

停止命名:

azkaban-executor-shutdown.sh

3、通过web页面查看

https://hadoop0:8443/
浅析工作流调度器Azkaban_第6张图片

使用刚刚配置的admin用户登录

浅析工作流调度器Azkaban_第7张图片

进入之后的页面为:

浅析工作流调度器Azkaban_第8张图片

到此就代码Azkaban的安装完全成功了。

第三章 应用案例演示

3.1 Commend类型单一job示例

创建工程

浅析工作流调度器Azkaban_第9张图片

创建成功之后:

浅析工作流调度器Azkaban_第10张图片

点击upload:

注意要是zip的压缩包

浅析工作流调度器Azkaban_第11张图片

浅析工作流调度器Azkaban_第12张图片

点击Execute Flow执行

浅析工作流调度器Azkaban_第13张图片

点击Execute执行

浅析工作流调度器Azkaban_第14张图片

浅析工作流调度器Azkaban_第15张图片

浅析工作流调度器Azkaban_第16张图片

点击上图中的Details,查看打印结果:

浅析工作流调度器Azkaban_第17张图片

在自己配置的Projects目录下面可以看到上传的项目:

浅析工作流调度器Azkaban_第18张图片

3.2 Commend类型多job工作流flow

创建工程

浅析工作流调度器Azkaban_第19张图片

上传依赖文件

浅析工作流调度器Azkaban_第20张图片

点击执行

浅析工作流调度器Azkaban_第21张图片

点击Execute

浅析工作流调度器Azkaban_第22张图片

执行结果:

浅析工作流调度器Azkaban_第23张图片

可以点击Details看任务结果。

3.3 操作HDFS任务

创建工程

浅析工作流调度器Azkaban_第24张图片

上传压缩包

浅析工作流调度器Azkaban_第25张图片

浅析工作流调度器Azkaban_第26张图片

浅析工作流调度器Azkaban_第27张图片

执行成功:

浅析工作流调度器Azkaban_第28张图片

查看结果:

浅析工作流调度器Azkaban_第29张图片

3.4 操作MapReduce任务

创建工程

浅析工作流调度器Azkaban_第30张图片

上传文件

浅析工作流调度器Azkaban_第31张图片

浅析工作流调度器Azkaban_第32张图片

执行中:

浅析工作流调度器Azkaban_第33张图片

执行完毕:

可以看到执行中和执行完毕颜色不同

浅析工作流调度器Azkaban_第34张图片

浅析工作流调度器Azkaban_第35张图片

到HDFS中查看运行结果:

浅析工作流调度器Azkaban_第36张图片

3.5 定时执行设置

1、依然使用3.1的案例

浅析工作流调度器Azkaban_第37张图片

2、点击左下角的Schedule

浅析工作流调度器Azkaban_第38张图片

如上设置的就是每1分钟执行一次。

3、点击Flow里面的名字观察结果

浅析工作流调度器Azkaban_第39张图片

4、点击进去之后,点击Executions

浅析工作流调度器Azkaban_第40张图片

5、点击最左下方的id可以看到具体的每次执行的结果

浅析工作流调度器Azkaban_第41张图片

6、点击Job List就可以看到了

浅析工作流调度器Azkaban_第42张图片

7、删除定时调度

浅析工作流调度器Azkaban_第43张图片

8、在History里面也可以看到定时执行的历史过程。
浅析工作流调度器Azkaban_第44张图片

第四章 3.90.0版本安装部署

4.1 准备工作

Azkaban Web 服务器:azkaban-web-server-3.90.0

Azkaban Excutor 执行服务器:azkaban-exec-server-3.90.0.tar.gz

Azkaban 初始化脚本文件:azkaban-db-3.90.0.tar.gz

官网地址:https://azkaban.github.io/

4.2 安装说明(上传解压重命名)

​ 将安装文件上传到集群,最好上传到安装 hive、sqoop 的机器上,方便命令的执行。并最好统一存放在某个目录下,新建 azkaban 目录,用于存放 azkaban 运行程序

浅析工作流调度器Azkaban_第45张图片

[root@hadoop10 azkaban]# tar -zxvf azkaban-db-3.90.0.tar.gz
[root@hadoop10 azkaban]# tar -zxvf azkaban-exec-server-3.90.0.tar.gz
[root@hadoop10 azkaban]# tar -zxvf azkaban-web-server-3.90.0.tar.gz


解压:tar -zxvf
压缩:tar -zcvf

4.3 安装配置db

1、启动 MySQL
[root@hadoop10 azkaban]# mysql -uroot -p111111

2、(这一步不做也行,后面用root登录也可以)创建 azkaban 用户,任何主机都可以访问 azkaban ,密码是 111111
mysql> CREATE USER 'azkaban'@'%' IDENTIFIED BY '111111';

3、赋予 azkaban 用户增删改查权限
mysql> GRANT select,insert,update,delete ON azkaban.* to 'azkaban'@'%' WITH GRANT OPTION;

4、创建 azkaban 表,并导入数据
mysql> create database azkaban;
mysql> use azkaban;
mysql> source /software/azkaban/azkaban-db-3.90.0/create-all-sql-0.1.0-SNAPSHOT.sql
mysql> show tables;
mysql> quit;

4.4 安装配置exec

4.4.1 首先在hadoop10上面修改

cd /software/azkaban/azkaban-exec-server-3.90.0/conf

[root@hadoop10 conf]# vim azkaban.properties

具体如下:

# Azkaban Personalization Settings
azkaban.name=Test
azkaban.label=My Local Azkaban
azkaban.color=#FF3601
azkaban.default.servlet.path=/index
web.resource.dir=web/
default.timezone.id=Asia/Shanghai
# Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager
user.manager.xml.file=conf/azkaban-users.xml
# Loader for projects
executor.global.properties=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=http://hadoop10:8081
executor.port=12321
# 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=/software/azkaban/azkaban-exec-server-3.90.0/plugins/jobtypes
# Azkaban mysql settings by default. Users should configure their own username and password.
database.type=mysql
mysql.port=3306
mysql.host=hadoop10
mysql.database=azkaban
mysql.user=azkaban
mysql.password=111111
mysql.numconnections=100
# Azkaban Executor settings
executor.maxThreads=50
executor.flow.threads=30

4.4.2 复制到其他节点

给hadoop10上面的exec文件夹复制到hadoop11和hadoop12

先到hadoop11和hadoop12创建对应的文件夹
[root@hadoop11 software]# mkdir -p /software/azkaban/azkaban-exec-server-3.90.0
[root@hadoop12 software]# mkdir -p /software/azkaban/azkaban-exec-server-3.90.0

在hadoop10上面进行复制操作
scp -r /software/azkaban/azkaban-exec-server-3.90.0 hadoop11:/software/azkaban
scp -r /software/azkaban/azkaban-exec-server-3.90.0 hadoop12:/software/azkaban

4.4.3 在三台机器上面启动executor server

cd /software/azkaban/azkaban-exec-server-3.90.0/bin

在三台机器上面分别启动executor server

hadoop10节点:

[root@hadoop10 bin]# ll
total 8
drwxrwxr-x. 2 root root  55 Oct 20 16:42 internal
-rwxr-xr-x. 1 root root 214 Jun  2  2020 shutdown-exec.sh
-rwxr-xr-x. 1 root root 207 Jun  2  2020 start-exec.sh
[root@hadoop10 bin]# pwd
/software/azkaban/azkaban-exec-server-3.90.0/bin
[root@hadoop10 bin]# ./start-exec.sh 
[root@hadoop10 bin]# jps
23797 Jps
23786 AzkabanExecutorServer

hadoop11节点:

[root@hadoop11 bin]# ll
total 8
drwxrwxr-x. 2 root root  55 Oct 20 17:48 internal
-rwxr-xr-x. 1 root root 214 Oct 20 17:48 shutdown-exec.sh
-rwxr-xr-x. 1 root root 207 Oct 20 17:48 start-exec.sh
[root@hadoop11 bin]# pwd
/software/azkaban/azkaban-exec-server-3.90.0/bin
[root@hadoop11 bin]# ./start-exec.sh 
[root@hadoop11 bin]# jps
23427 AzkabanExecutorServer
23493 Jps
[root@hadoop11 bin]# 

hadoop12节点:

[root@hadoop12 bin]# ll
total 8
drwxrwxr-x. 2 root root  55 Oct 20 17:48 internal
-rwxr-xr-x. 1 root root 214 Oct 20 17:48 shutdown-exec.sh
-rwxr-xr-x. 1 root root 207 Oct 20 17:48 start-exec.sh
[root@hadoop12 bin]# pwd
/software/azkaban/azkaban-exec-server-3.90.0/bin
[root@hadoop12 bin]# ./start-exec.sh 
[root@hadoop12 bin]# jps
22769 AzkabanExecutorServer
22780 Jps
[root@hadoop12 bin]# 

4.4.4 去mysql的页面里面去看看没有激活的状态

点击azkaban数据库,点击进去executors表,可以看到active的状态为0,表示未激活状态。

浅析工作流调度器Azkaban_第46张图片

4.4.5 激活 executor

curl -G "hadoop10:12321/executor?action=activate" && echo
curl -G "hadoop11:12321/executor?action=activate" && echo
curl -G "hadoop12:12321/executor?action=activate" && echo

[root@hadoop10 bin]# curl -G "hadoop10:12321/executor?action=activate" && echo
{"status":"success"}
You have new mail in /var/spool/mail/root
[root@hadoop10 bin]# curl -G "hadoop11:12321/executor?action=activate" && echo
{"status":"success"}
[root@hadoop10 bin]# curl -G "hadoop12:12321/executor?action=activate" && echo
{"status":"success"}
[root@hadoop10 bin]# pwd
/software/azkaban/azkaban-exec-server-3.90.0/bin
[root@hadoop10 bin]# 

浅析工作流调度器Azkaban_第47张图片

再次查看mysql中的active状态

浅析工作流调度器Azkaban_第48张图片

4.5 安装配置web

4.5.1 修改 azkaban.properties

[root@hadoop10 bin]# cd /software/azkaban/azkaban-web-server-3.90.0/conf/

[root@hadoop10 conf]# vim azkaban.properties

[root@hadoop10 conf]# cat azkaban.properties 
# Azkaban Personalization Settings
azkaban.name=Test
azkaban.label=My Local Azkaban
azkaban.color=#FF3601
azkaban.default.servlet.path=/index
web.resource.dir=web/
default.timezone.id=Asia/Shanghai
# Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager
user.manager.xml.file=conf/azkaban-users.xml
# Loader for projects
executor.global.properties=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
# 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=hadoop10
mysql.database=azkaban
mysql.user=azkaban
mysql.password=111111
mysql.numconnections=100
#Multiple Executor
azkaban.use.multiple.executors=true
azkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatus
azkaban.executorselector.comparator.NumberOfAssignedFlowComparator=1
azkaban.executorselector.comparator.Memory=1
azkaban.executorselector.comparator.LastDispatched=1
azkaban.executorselector.comparator.CpuUsage=1

一些说明:

azkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatus
#StaticRemainingFlowSize:正在排队中的任务数
#CpuStatus:CPU 占用的资源情况
#MinimumFreeMemory:内存占用资源情况。注意哈,测试环境,需要将 MinimumFreeMemory 删除掉,否则它会认为集群资源不够,不执行滴。 

4.5.2 修改 azkaban-users.xml 文件,添加admin超级用户

cd /software/azkaban/azkaban-web-server-3.90.0/conf

vim azkaban-users.xml

修改用户配置文件:vim azkaban-users.xml


  
  
  

  
  

4.5.3 启动web server

[root@hadoop10 bin]# pwd
/software/azkaban/azkaban-web-server-3.90.0/bin
[root@hadoop10 bin]# ll
total 8
drwxrwxr-x. 2 root root  50 Oct 20 16:45 internal
-rwxr-xr-x. 1 root root 211 Jun  2  2020 shutdown-web.sh
-rwxr-xr-x. 1 root root 123 Jun  2  2020 start-web.sh
[root@hadoop10 bin]# ./start-web.sh 

可能遇到的问题:

2021/10/20 18:13:34.436 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] com.google.inject.ProvisionException: Unable to provision, see the following errors:

1) Error in custom provider, java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
  at azkaban.webapp.AzkabanWebServerModule.createUserManager(AzkabanWebServerModule.java:93)
  at azkaban.webapp.AzkabanWebServerModule.createUserManager(AzkabanWebServerModule.java:93)
  while locating azkaban.user.UserManager
    for the 8th parameter of azkaban.webapp.AzkabanWebServer.(AzkabanWebServer.java:165)
  at azkaban.webapp.AzkabanWebServer.class(AzkabanWebServer.java:121)
  while locating azkaban.webapp.AzkabanWebServer

1 error
2021/10/20 18:13:34.436 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1028)
2021/10/20 18:13:34.436 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1054)
2021/10/20 18:13:34.436 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at azkaban.webapp.AzkabanWebServer.main(AzkabanWebServer.java:227)
2021/10/20 18:13:34.436 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] Caused by: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
2021/10/20 18:13:34.436 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at azkaban.webapp.AzkabanWebServerModule.createUserManager(AzkabanWebServerModule.java:102)
2021/10/20 18:13:34.436 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at azkaban.webapp.AzkabanWebServerModule$$FastClassByGuice$$2f44d056.invoke()
2021/10/20 18:13:34.436 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.ProviderMethod$FastClassProviderMethod.doProvision(ProviderMethod.java:264)
2021/10/20 18:13:34.436 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.ProviderMethod$Factory.provision(ProviderMethod.java:401)
2021/10/20 18:13:34.437 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.ProviderMethod$Factory.get(ProviderMethod.java:376)
2021/10/20 18:13:34.437 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
2021/10/20 18:13:34.437 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092)
2021/10/20 18:13:34.437 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
2021/10/20 18:13:34.437 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:194)
2021/10/20 18:13:34.437 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
2021/10/20 18:13:34.437 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
2021/10/20 18:13:34.437 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
2021/10/20 18:13:34.437 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:110)
2021/10/20 18:13:34.437 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:90)
2021/10/20 18:13:34.437 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:268)
2021/10/20 18:13:34.437 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
2021/10/20 18:13:34.437 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092)
2021/10/20 18:13:34.437 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
2021/10/20 18:13:34.437 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:194)
2021/10/20 18:13:34.438 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
2021/10/20 18:13:34.438 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.InjectorImpl$2$1.call(InjectorImpl.java:1019)
2021/10/20 18:13:34.438 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1085)
2021/10/20 18:13:34.438 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1015)
2021/10/20 18:13:34.438 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	... 2 more
2021/10/20 18:13:34.438 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] Caused by: java.lang.reflect.InvocationTargetException
2021/10/20 18:13:34.438 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
2021/10/20 18:13:34.438 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
2021/10/20 18:13:34.438 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
2021/10/20 18:13:34.438 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
2021/10/20 18:13:34.438 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at azkaban.webapp.AzkabanWebServerModule.createUserManager(AzkabanWebServerModule.java:99)
2021/10/20 18:13:34.438 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	... 24 more
2021/10/20 18:13:34.438 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] Caused by: java.lang.IllegalArgumentException: User xml file conf/azkaban-users.xml doesn't exist.
2021/10/20 18:13:34.438 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at azkaban.user.XmlUserManager.parseXMLFile(XmlUserManager.java:97)
2021/10/20 18:13:34.438 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at azkaban.user.XmlUserManager.(XmlUserManager.java:81)
2021/10/20 18:13:34.439 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	at azkaban.user.XmlUserManager.(XmlUserManager.java:75)
2021/10/20 18:13:34.439 +0800 ERROR [StdOutErrRedirect] [main] [Azkaban] 	... 29 more

重点就是这一句:

Caused by: java.lang.IllegalArgumentException: User xml file conf/azkaban-users.xml doesn't exist.

给相应的路径改成绝对路径:

user.manager.xml.file=/software/azkaban/azkaban-web-server-3.90.0/conf/azkaban-users.xml

再次启动就可以了

[root@hadoop10 bin]# ./start-web.sh 
[root@hadoop10 bin]# jps
35524 Jps
35493 AzkabanWebServer
23786 AzkabanExecutorServer
[root@hadoop10 bin]# 

4.5.4 访问页面

http://hadoop10:8081/

你会发现页面没有什么样式。这个时候给所有的路径改成绝对路径吧。

浅析工作流调度器Azkaban_第49张图片

其实我这里就修改了web中的conf里面的

web.resource.dir=/software/azkaban/azkaban-web-server-3.90.0/web/

修改好了就变成了下面的样子了。就可以的啦。

浅析工作流调度器Azkaban_第50张图片

4.6 遇到问题总结

4.6.1 页面没有格式

见4.5.4 解决方案

4.6.2 Missing required property ‘azkaban.native.lib’

操作的时候遇到的问题:

Job Logs
20-10-2021 19:05:58 CST command INFO - Starting job command at 1634727958034
20-10-2021 19:05:58 CST command INFO - job JVM args: '-Dazkaban.flowid=command' '-Dazkaban.execid=1' '-Dazkaban.jobid=command'
20-10-2021 19:05:58 CST command INFO - user.to.proxy property was not set, defaulting to submit user admin
20-10-2021 19:05:58 CST command INFO - Building command job executor. 
20-10-2021 19:05:58 CST command INFO - Failed with 5 inputs with exception e = null
20-10-2021 19:05:58 CST command INFO - Memory granted for job command
20-10-2021 19:05:58 CST command INFO - 1 commands to execute.
20-10-2021 19:05:58 CST command INFO - cwd=/software/azkaban/azkaban-exec-server-3.90.0/bin/executions/1
20-10-2021 19:05:58 CST command INFO - effective user is: admin
20-10-2021 19:05:58 CST command ERROR - Job run failed!
azkaban.utils.UndefinedPropertyException: Missing required property 'azkaban.native.lib'
	at azkaban.utils.Props.getString(Props.java:450)
	at azkaban.jobExecutor.ProcessJob.run(ProcessJob.java:242)
	at azkaban.execapp.JobRunner.runJob(JobRunner.java:830)
	at azkaban.execapp.JobRunner.doRun(JobRunner.java:607)
	at azkaban.execapp.JobRunner.run(JobRunner.java:568)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
20-10-2021 19:05:58 CST command ERROR - Missing required property 'azkaban.native.lib' cause: null
20-10-2021 19:05:58 CST command INFO - Finishing job command at 1634727958186 with status FAILED

解决方案:

1、去三个节点上面给azkaban.jobtype.plugin.dir改成具体路径
azkaban.jobtype.plugin.dir=/software/azkaban/azkaban-exec-server-3.90.0/plugins/jobtypes

2、vim commonprivate.properties ,增加azkaban.native.lib=false
[root@hadoop12 jobtypes]# pwd
/software/azkaban/azkaban-exec-server-3.90.0/plugins/jobtypes
[root@hadoop12 jobtypes]# cat commonprivate.properties 
# set execute-as-user
execute.as.user=false
azkaban.native.lib=false
[root@hadoop12 jobtypes]# 


4.6.3 Cannot request memory (Xms 0 kb, Xmx 0 kb) from system for job hdfs, sleep for 60 secs and retry, attempt 1 of 720

原因分析:

azkaban默认情况下在开始运行job时会检测系统的内存,最低要求的内存是3G,如果系统内存不足3G,便会出现运行的job一直卡在那不动的情况。

解决方案:

1、增加系统内存
2、关闭检测内存的选项。
具体操作地方为:注意所有的exec节点都要修改。
在/software/azkaban/azkaban-exec-server-3.90.0/plugins/jobtypes目录下的commonprivate.properties的文件中添加一下内容:
memCheck.enabled=false
添加之后如下:
[root@hadoop10 jobtypes]# cat commonprivate.properties 
# set execute-as-user
execute.as.user=false
azkaban.native.lib=false
memCheck.enabled=false
[root@hadoop10 jobtypes]# 

添加后重启服务即可。
(1)启动exec
cd /software/azkaban/azkaban-exec-server-3.90.0/conf
(2)激活exec
curl -G "hadoop10:12321/executor?action=activate" && echo
curl -G "hadoop11:12321/executor?action=activate" && echo
curl -G "hadoop12:12321/executor?action=activate" && echo
(3)启动web
[root@hadoop10 bin]# ./start-web.sh 
[root@hadoop10 bin]# pwd
/software/azkaban/azkaban-web-server-3.90.0/bin

最后:按照上面的文档安装遇不到上面的问题了,因为我给大家提供的配置就是修改之后的配置了。



声明:
        文章中代码及相关语句为自己根据相应理解编写,文章中出现的相关图片为自己实践中的截图和相关技术对应的图片,若有相关异议,请联系删除。感谢。转载请注明出处,感谢。


By luoyepiaoxue2014

B站: https://space.bilibili.com/1523287361 点击打开链接
微博地址: http://weibo.com/luoyepiaoxue2014 点击打开链接

你可能感兴趣的:(任务调度,Azkaban,大数据,工作流调度)