• 浅析工作流调度器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 工作流调度器的关键特性进行了比较,尽管这些工作流调度 器能够解决的需求场景基本一致,但在设计理念,目标用户,应用场景等方面还是存在显著 的区别,在做技术选型的时候,可以提供参考

    在这里插入图片描述

    在这里插入图片描述

    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 用户界面
    	方便上传工作流
    	方便设置任务之间的关系
    	调度工作流
    	认证/授权(权限的工作)
    	能够杀死并重新启动工作流
    	模块化和可插拔的插件机制
    	项目工作区
    	工作流和任务的日志记录和审计
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    第二章 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 运行程序

    在这里插入图片描述

    2.3 安装Azkaban Web服务器

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

    2.4 安装Azkaban Excutor服务器

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

    2.5 安装Azkaban脚本导入

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

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

    在这里插入图片描述

    进入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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    导入数据:

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

    然后查看表:

    在这里插入图片描述

    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".
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

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

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

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

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

    
    	
    	
    	
    	
    	
    	
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    进入到修改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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    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
    
    • 1
    • 2
    • 3

    2.9 启动

    1、启动 web 服务器

    azkaban-web-start.sh
    
    • 1

    执行成功:

    在这里插入图片描述

    停止命令:

    azkaban-web-shutdown.sh
    
    • 1

    2、 启动执行服务器

    azkaban-executor-start.sh
    
    • 1

    执行成功:

    在这里插入图片描述

    停止命名:

    azkaban-executor-shutdown.sh
    
    • 1

    3、通过web页面查看

    https://hadoop0:8443/
    在这里插入图片描述

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

    在这里插入图片描述

    进入之后的页面为:

    在这里插入图片描述

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

    第三章 应用案例演示

    3.1 Commend类型单一job示例

    创建工程

    在这里插入图片描述

    创建成功之后:

    在这里插入图片描述

    点击upload:

    注意要是zip的压缩包

    在这里插入图片描述

    在这里插入图片描述

    点击Execute Flow执行

    在这里插入图片描述

    点击Execute执行

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

    3.2 Commend类型多job工作流flow

    创建工程

    在这里插入图片描述

    上传依赖文件

    在这里插入图片描述

    点击执行

    在这里插入图片描述

    点击Execute

    在这里插入图片描述

    执行结果:

    在这里插入图片描述

    可以点击Details看任务结果。

    3.3 操作HDFS任务

    创建工程

    在这里插入图片描述

    上传压缩包

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    执行成功:

    在这里插入图片描述

    查看结果:

    在这里插入图片描述

    3.4 操作MapReduce任务

    创建工程

    在这里插入图片描述

    上传文件

    在这里插入图片描述

    在这里插入图片描述

    执行中:

    在这里插入图片描述

    执行完毕:

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

    在这里插入图片描述

    在这里插入图片描述

    到HDFS中查看运行结果:

    在这里插入图片描述

    3.5 定时执行设置

    1、依然使用3.1的案例

    在这里插入图片描述

    2、点击左下角的Schedule

    在这里插入图片描述

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

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

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

    7、删除定时调度

    在这里插入图片描述

    8、在History里面也可以看到定时执行的历史过程。
    在这里插入图片描述

    第四章 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 运行程序

    在这里插入图片描述

    [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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    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]# 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    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]# 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

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

    在这里插入图片描述

    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]# 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    再次查看mysql中的active状态

    在这里插入图片描述

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    一些说明:

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

    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

    
      
      
      
    
      
      
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    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 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    可能遇到的问题:

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    重点就是这一句:

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

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

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

    再次启动就可以了

    [root@hadoop10 bin]# ./start-web.sh 
    [root@hadoop10 bin]# jps
    35524 Jps
    35493 AzkabanWebServer
    23786 AzkabanExecutorServer
    [root@hadoop10 bin]# 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.5.4 访问页面

    http://hadoop10:8081/

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

    在这里插入图片描述

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

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

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

    在这里插入图片描述

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    解决方案:

    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]# 
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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

    解决方案:

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

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



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


    By luoyepiaoxue2014

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

  • 相关阅读:
    视频改字祝福 豪车装X系统源码uniapp前端源码
    NLP(六十八)使用Optimum进行模型量化
    【Algorithm】GPLT L3-020 至多删三个字符
    Docker安装Nginx较佳实践
    Centos修改静态IP
    字符串转数字, 数字转字符串
    java+springboot+ssm网上旧书回收二手书店销售管理系统
    初识上位机(下):C#读写PLC数据块数据
    Spring Boot 中的参数验证和自定义响应处理,使用 @Valid 注解
    【MetaAI】2023年MetaAI发布的开源模型和工具
  • 原文地址:https://blog.csdn.net/luoyepiaoxue2014/article/details/128065059