Azkaban multiple-executor模式部署

以Multi Executor Server部署Azkaban

mysql准备

  1. create database for Azkaban.

    1
    2
    mysql> CREATE DATABASE azkaban;
    Query OK, 1 row affected (0.00 sec)
  2. create a mysql user for Azkaban.

    1
    2
    3
    4
    5
    mysql> CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban123';
    Query OK, 0 rows affected (0.00 sec)

    mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON azkaban.* to 'azkaban'@'%' WITH GRANT OPTION;
    Query OK, 0 rows affected (0.00 sec)
  3. 修改mysql配置my.cnf

    1
    2
    3
    [mysqld]
    ...
    max_allowed_packet=1024M
  4. 重启mysql

安装

  1. 创建安装目录

    1
    2
    [hadoop@hadoop001 ~]$ cd software/
    [hadoop@hadoop001 software]$ mkdir azkaban
  2. 在编译成功的目录下获取以下三个需要的tar包

    1
    2
    3
    [hadoop@hadoop001 azkaban-master]$ cp azkaban-web-server/build/distributions/azkaban-web-server-0.1.0-SNAPSHOT.tar.gz ~/software/azkaban
    [hadoop@hadoop001 azkaban-master]$ cp azkaban-exec-server/build/distributions/azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz ~/software/azkaban
    [hadoop@hadoop001 azkaban-master]$ cp azkaban-db/build/distributions/azkaban-db-0.1.0-SNAPSHOT.tar.gz ~/software/azkaban
  3. 解压并重命名

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [hadoop@hadoop001 azkaban]$ ll
    total 119840
    -rw-rw-r--. 1 hadoop hadoop 8864 Feb 16 13:30 azkaban-db-0.1.0-SNAPSHOT.tar.gz
    -rw-rw-r--. 1 hadoop hadoop 64787133 Feb 16 09:24 azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz
    -rw-rw-r--. 1 hadoop hadoop 57896671 Feb 16 09:25 azkaban-web-server-0.1.0-SNAPSHOT.tar.gz
    drwxr-xr-x. 2 hadoop hadoop 4096 Jan 25 17:53 db
    drwxr-xr-x. 10 hadoop hadoop 4096 Feb 16 17:28 exec
    drwxr-xr-x. 8 hadoop hadoop 4096 Feb 16 17:28 web
    [hadoop@hadoop001 azkaban]$ tar -xzvf azkaban-db-0.1.0-SNAPSHOT .tar.gz
    [hadoop@hadoop001 azkaban]$ mv azkaban-db-0.1.0-SNAPSHOT db
    [hadoop@hadoop001 azkaban]$ tar -xzvf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz
    [hadoop@hadoop001 azkaban]$ mv azkaban-exec-server-0.1.0-SNAPSHOT exec
    [hadoop@hadoop001 azkaban]$ tar -xzvf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz
    [hadoop@hadoop001 azkaban]$ mv azkaban-web-server-0.1.0-SNAPSHOT web
  4. 创建软连接

    1
    [hadoop@hadoop001 azkaban]$ ln -s /home/hadoop/software/azkaban /home/hadoop/app/azkaban
  5. mysql脚本导入

    导入sql脚本,批量创建表

    1
    mysql> source /home/hadoop/software/azkaban/db/create-all-sql-0.1.0-SNAPSHOT.sql
  6. Installing Azkaban Executor Server

    修改exec目录下conf/azkaban.properties:

    1
    2
    3
    # Mysql Configs
    mysql.user=<username>
    mysql.password=<password>

    img

    在azkaban-web-server中的azkaban.properties添加:

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

    启动Executor Server:在下面的步骤统一启动。注意,在Multi Executor Server模式下启动了Executor Server后,需要手动激活其状态。

  7. Installing Azkaban Web Server

    修改web目录下conf/azkaban.properties:

    1
    2
    3
    # Mysql Configs
    mysql.user=<username>
    mysql.password=<password>

    添加用户,修改conf/azkaban-users.xml,如:

    1
    <user password="admin" roles="admin" username="admin"/>                 

启动

因为配置文件下的路径是使用相对路径,所以启动需要进入到其目录下调用命令,具体如下:。

【注意】需要先启动并激活Executor,才能启动web成功。

启动Executor Server,并激活。

1
2
3
4
5
[hadoop@hadoop001 exec]$ pwd
/home/hadoop/software/azkaban/exec
[hadoop@hadoop001 exec]$ ./bin/start-exec.sh
[hadoop@hadoop001 exec]$ curl -G "localhost:$(<./executor.port)/executor?action=activate"
{"status":"success"}[hadoop@hadoop001 exec]$

启动Web Server

1
2
3
[hadoop@hadoop001 web]$ pwd
/home/hadoop/software/azkaban/web
[hadoop@hadoop001 exec]$ ./bin/start-web.sh

查看进程,访问UI页面

1
2
3
4
[hadoop@hadoop001 web]$ jps
9989 Jps
9868 AzkabanExecutorServer
9965 AzkabanWebServer

Web UI:http://hadoop001:8081/

azkaban project案例

文件准备

  • flow20.project

    1
    azkaban-flow-version: 2.0
  • spring.flow

    1
    2
    3
    4
    5
    nodes:
    - name: hello
    type: command
    config:
    command: echo "hello world"

把以上两个文件夹放到同一个文件夹下,并压缩为zip文件,上传到project上执行即可。

优化

  1. 更换日志文件目录

    修改 azkaban-web-server/conf/log4j.properties

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 默认为INFO, Console 需要修改
    log4j.rootLogger=INFO, server
    log4j.logger.azkaban=INFO, server
    log4j.appender.server=org.apache.log4j.RollingFileAppender
    log4j.appender.server.layout=org.apache.log4j.PatternLayout
    # 修改为绝对路径
    log4j.appender.server.File=/home/hadoop/log/azkaban/azkaban-webserver.log
    log4j.appender.server.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss.SSS Z} %5p [%c{1}] [%t] [Azkaban] %m%n
    # 修改为1024MB,默认为102400MB,显然是不合理的
    log4j.appender.server.MaxFileSize=1024MB
    log4j.appender.server.MaxBackupIndex=2
    log4j.appender.Console=org.apache.log4j.ConsoleAppender
    log4j.appender.Console.layout=org.apache.log4j.PatternLayout
    log4j.appender.Console.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss.SSS Z} %5p [%c{1}] [%t] [Azkaban] %m%n
  2. web-server和exec-server启停脚本的修改

    优化点:

    • 因为启动web-server和exec-server,在哪个目录下执行启动服务,就会生成一个.out日志文件。由于已经更改日志文件存储目录,于是修改azkaban-web-server的bin/start-web.sh和azkaban-exec-server的bin/start-exec.sh

    • exec-server的临时文件

      启动exec-server,在哪个目录下执行启动服务,就会生成executions目录、temp目录和executor.port文件这些临时的目录或文件,然后停止服务后,也不会删除这些临时目录或文件,于是:

      azkaban/azkaban-exec-server目录下新建tmp目录用于存放这些临时目录或文件;

    • 激活executor(修改后启动后自动激活)

    修改后脚本:

    start-web.sh:

    1
    2
    3
    4
    5
    6
    #!/bin/bash

    script_dir=$(dirname $0)

    #${script_dir}/internal/internal-start-web.sh >webServerLog_`date +%F+%T`.out 2>&1 &
    ${script_dir}/internal/internal-start-web.sh >/dev/null 2>&1 &

    start-exec.sh

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/bin/bash

    #script_dir=$(dirname $0)
    script_dir=/home/hadoop/app/azkaban/exec/tmp
    cd ${script_dir}


    # pass along command line arguments to the internal launch script.
    #${script_dir}/internal/internal-start-executor.sh "$@" >executorServerLog__`date +%F+%T`.out 2>&1 &
    ../bin/internal/internal-start-executor.sh "$@" >/dev/null 2>&1 &

    # 这里休眠5s是为了给exec-server启动后提供一些准备时间
    sleep 5s
    # 然后再激活executor
    curl -G "hadoop001:$(<${script_dir}/executor.port)/executor?action=activate"
    ~

其他问题

  1. Azkaban 部署完成后 执行 job 一直处于 Preparing 状态

    主要原因:没有可运行的executor

    可能:1.没激活;2.激活了但被过滤掉不可用。

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

    修改 azkaban-web-server/conf/azkaban.properties

    1
    2
    #MinimumFreeMemory 过滤器会检查 executor 主机空余内存是否会大于 3G,如果不足 3G,则 web-server 不会将任务交由该主机执行
    azkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatus
  2. Azkaban异常:Cannot request memory (Xms 0 kb, Xmx 0 kb) from system for job XX, sleep for 60 secs and retry, attempt 1 of 72

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

    解决方法:

    1. 增加系统内存

    2. 关闭检测内存的选项。
      具体办法为,在azkaban/azkaban-exec-server/plugins/jobtypes/目录下的commonprivate.properties的文件中添加一下内容:

      1
      memCheck.enabled=false
  3. jobtypes错误解决

    在executor的根目录下创建plugins\jobtypes\commonprivate.properties

    1
    2
    3
    # set execute-as-user
    execute.as.user=false
    azkaban.native.lib=false