定时任务
以之前的入门例子Hello World为例
利用此例子的flow、project文件,生成zip文件scheduler.zip,再创建一个项目









删除定时调度

*/1 * ? * * 每分钟执行一次定时调度任务
0 1 ? * * 每天晚上凌晨一点钟执行这个任务
0 */2 ? * * 每隔两个小时定时执行这个任务
30 21 ? * * 每天晚上九点半定时执行这个任务
与crontab语法相似;参考crontab语法
Views: 21
以之前的入门例子Hello World为例
利用此例子的flow、project文件,生成zip文件scheduler.zip,再创建一个项目









删除定时调度

*/1 * ? * * 每分钟执行一次定时调度任务
0 1 ? * * 每天晚上凌晨一点钟执行这个任务
0 */2 ? * * 每隔两个小时定时执行这个任务
30 21 ? * * 每天晚上九点半定时执行这个任务
与crontab语法相似;参考crontab语法
Views: 21
条件工作流功能允许用户自定义条件,决定是否运行某些Job
分两种情况
原理
JOB_OUTPUT_PROP_FILE环境变量所指向的文件${jobName:param}来获取父 Job 输出的参数,参数值与一个字符串或数字进行比较,来定义执行条件支持的比较、逻辑运算符有
== 等于!= 不等于> 大于>= 大于等于< 小于<= 小于等于&& 与|| 或!非先定义一个flow文件,包含两个job
$JOB_OUTPUT_PROP_FILEflow文件runtimeParam.flow内容如下
nodes:
- name: JobA
type: command
config:
command: sh JobA.sh
- name: JobB
type: command
dependsOn:
- JobA
config:
command: sh JobB.sh
condition: ${JobA:dayOfTheWeek} == 2 || ${JobA:dayOfTheWeek} == 4
JobA.sh内容如下
#!/bin/bash
echo "do JobA"
dayOfTheWeek=`date +%w`
echo "{\"dayOfTheWeek\":$dayOfTheWeek}" > $JOB_OUTPUT_PROP_FILE
运行时参数需要重定向到文件
$JOB_OUTPUT_PROP_FILE中
JobB.sh内容如下#!/bin/bash
echo "do JobB"
将 JobA.sh、JobB.sh、 runtimeParam.flow 和 flow20.project 打包成runtimeParam.zip
web ui创建项目、上传zip、执行flow

运行此flow时,是周二,所以符合执行jobB的条件,所以发现jobA、jobB都执行成功



如果不是周二或周日,那么jobB执行失败,如下


Azkaban 中预置了几个预定义宏。
预定义宏会根据当前job的所有父 Job 的完成情况进行判断,再决定是否执行当前job。
可用的预定义宏如下:
all_success: 表示父 Job 全部成功才执行(默认)all_done:表示父 Job 全部完成才执行all_failed:表示父 Job 全部失败才执行one_success:表示父 Job 至少一个成功才执行one_failed:表示父 Job 至少一个失败才执行每个宏对应的job 状态如下
FAILED, KILLED, SUCCEEDED, SKIPPED, FAILED_SUCCEEDED, CANCELLEDSUCCEEDED, SKIPPED, FAILED_SUCCEEDEDFAILED, KILLED, CANCELLED案例:flow中有3个job
flow文件macro.flow内容如下
nodes:
- name: JobA
type: command
config:
command: sh JobA.sh
- name: JobB
type: command
config:
command: sh JobB.sh
- name: JobC
type: command
dependsOn:
- JobA
- JobB
config:
command: echo 'This is jobC'
condition: one_success
将JobB.sh、 macro.flow、flow20.project 打包成macro.zip
JobB.sh跟上个例子相同的文件web ui创建项目、上传zip、执行flow


发现JobA失败;JobB、JobC成功;查看Job List



指定job是否执行的条件,除了单独由一个“运行时参数”或一个“预定义宏”指定外
还可以用两类的组合结果指定条件:
举例:
condition: ${JobA:param1} == 1 && ${JobB:param2} > 5
举例:当前job的父 Job 至少一个成功才执行,当前job才被执行
condition: one_success
举例:
condition: all_done && ${JobC:param3} != "foo"
举例:
{JobD:param4}、{JobE:parm5}、all_success、${JobF:parm6} == "bar"进行复杂的逻辑运算后condition: (!{JobD:param4} || !{JobE:parm5}) && all_success || ${JobF:parm6} == "bar"
flow文件mixtureCondition.flow,内容如下
nodes:
- name: JobA
type: command
config:
command: sh write_to_props.sh
- name: JobB
type: command
dependsOn:
- JobA
config:
command: echo “This is JobB.”
condition: ${JobA:jobAParam1} == 1
- name: JobC
type: command
dependsOn:
- JobA
config:
command: echo “This is JobC.”
condition: ${JobA:jobAParam1} == 2
- name: JobD
type: command
dependsOn:
- JobB
- JobC
config:
command: pwd
condition: one_success
write_to_props.sh内容如下
#!/bin/bash
echo '{"jobAParam1":"1"}' > $JOB_OUTPUT_PROP_FILE
将mixtureCondition.flow、flow20.project、write_to_props.sh打包生成zip
web ui创建项目、上传zip、执行flow


Views: 33
type 类型为 javaprocess的job,可以运行一个自定义Java类的main方法,可用的配置如下:
案例:
package com.kkb.azkaban;
public class JavaProcessTest {
public static void main(String[] args) {
System.out.println("This is " + args[0] + " javaprocess job type test!");
}
}

代码打包,生成jar包

编写flow文件javaProcessTest.flow,内容如下
nodes:
- name: testJavaProcess
type: javaprocess
config:
Xms: 96M
Xmx: 200M
java.class: com.kkb.azkaban.JavaProcessTest
main.args: MyAzkaban
将jar包、flow文件、project文件压缩生成zip文件
web ui创建工程、上传zip、执行flow





Views: 20
azkaban 4.x目前同时支持flow1.0与flow 2.0;
官网说flow 1.0将来会被淘汰,所以本文档使用flow 2.0
如果对flow 1.0感兴趣的同学,可以参考文章自行学习体验
Azkaba内置的任务类型支持command、java
windows或mac中,创建文件flow20.project,内容如下azkaban-flow-version: 2.0
basic.flow文件,内容如下nodes:
- name: jobA
type: command
config:
command: echo "Hello World! This is an flow 2.0 example."
文件中要有
nodes的部分,包含所有你想要运行的job需要为每个job指定
name、type大多的job需要
config
Archive.zip用户名:kkbrwe
密码:kkb123






Execution queued successfully with exec id 8表示,web server选择id是8的exec server执行此流
Job List


nodes:
- name: jobA
type: command
config:
command: mkdir /export/servers/azkaban-exec-server-4.0.0/executions/test1
command.1: mkdir /export/servers/azkaban-exec-server-4.0.0/executions/test2
第一个command用command表示
第二个用command.1表示
第三个用command.2表示,以此类推
dependon.flow,内容如下nodes:
- name: jobC
type: noop
# jobC depends on jobA and jobB
dependsOn:
- jobA
- jobB
- name: jobA
type: command
config:
command: echo "This is echoed by jobA."
- name: jobB
type: command
config:
command: pwd
jobC依赖jobA、jobB
Noop: A job that takes no parameters and is essentially a null operation. Used for organizing your graph
入门例子Hello World相似dependon.flow与flow20.project压缩生成zip文件dependon.zipJob List及job日志







jobA日志
jobB日志
nodes:
- name: JobA
type: command
config:
command: sh /a_non_exists.sh
retries: 3
retry.backoff: 3000
说明:
/a_non_exists.sh是一个不存在的sh脚本
retries重试次数
retry.backoff每次重试的时间间隔,单位毫秒
以下操作跟上边的例子入门例子Hello World相似
retry.flow与flow20.project压缩生成zip文件retry.zip
web server ui界面创建项目,然后上传项目zip文件,然后执行,并查看Job List及job日志
部分截图略




config:
retries: 3
retry.backoff: 3000
nodes:
- name: JobA
type: command
config:
command: sh /a_non_exists.sh
手动失败重试场景:
一个flow中,有5个job,有依赖关系如下
创建flow文件manulretry.flow内容如下
nodes:
- name: JobA
type: command
config:
command: echo "This is JobA."
- name: JobB
type: command
dependsOn:
- JobA
config:
command: echo "This is JobB."
- name: JobC
type: command
dependsOn:
- JobB
config:
command: sh /export/servers/azkaban-exec-server-4.0.0/tmp.sh
- name: JobD
type: command
dependsOn:
- JobC
config:
command: echo "This is JobD."
- name: JobE
type: command
dependsOn:
- JobD
config:
command: echo "This is JobE."





那么在对应的exec server的对应目录下创建此sh脚本文件
[hadoop@node01 azkaban-exec-server-4.0.0]$ cd
[hadoop@node01 ~]$ cd /export/servers/azkaban-exec-server-4.0.0
[hadoop@node01 azkaban-exec-server-4.0.0]$ vim tmp.sh
[hadoop@node02 azkaban-exec-server-4.0.0]$ cd
[hadoop@node02 ~]$ cd /export/servers/azkaban-exec-server-4.0.0
[hadoop@node02 azkaban-exec-server-4.0.0]$ vim tmp.sh
[hadoop@node03 azkaban-exec-server-4.0.0]$ cd
[hadoop@node03 ~]$ cd /export/servers/azkaban-exec-server-4.0.0
[hadoop@node03 azkaban-exec-server-4.0.0]$ vim tmp.sh
#!/bin/bash
echo 'this is echoed by tmp sh script'











Enable 和 Disable 下面都分别有如下参数:
Parents:该作业的上一个job
Ancestors:该作业前的所有job
Children:该作业后的一个job
Descendents:该作业后的所有job
Enable All: 所有的job
[hadoop@node01 bin]$ su root
密码:
[root@node01 bin]#
[root@node01 bin]# cd
[root@node01 ~]# start-all.sh
operateHdfs.flow,内容如下nodes:
- name: jobA
type: command
config:
command: echo "start execute"
command.1: /export/servers/hadoop-2.7.5/bin/hdfs dfs -mkdir /azkaban
command.2: /export/servers/hadoop-2.7.5/bin/hdfs dfs -put /export/servers/hadoop-2.7.5/NOTICE.txt /azkaban

historyserver,否则执行mr项目时,job的日志会报如下类似错误日志22-03-2021 23:17:23 CST jobMR INFO - 21/03/22 23:17:23 INFO impl.YarnClientImpl: Submitted application application_1616423563192_0001
22-03-2021 23:17:39 CST jobMR INFO - 21/03/22 23:17:39 INFO mapred.ClientServiceDelegate: Application state is completed. FinalApplicationStatus=SUCCEEDED. Redirecting to job history server
22-03-2021 23:17:41 CST jobMR INFO - 21/03/22 23:17:41 INFO ipc.Client: Retrying connect to server: node01/192.168.77.30:10020. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
22-03-2021 23:17:42 CST jobMR INFO - 21/03/22 23:17:42 INFO ipc.Client: Retrying connect to server: node01/192.168.77.30:10020. Already tried 1 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
22-03-2021 23:17:44 CST jobMR INFO - 21/03/22 23:17:44 INFO ipc.Client: Retrying connect to server: node01/192.168.77.30:10020. Already tried 2 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
192.168.77.30:10020 应该是hadoop集群的historyserver服务
mr.flow,内容如下nodes:
- name: jobMR
type: command
config:
command: /export/servers/hadoop-2.7.5/bin/hadoop jar /export/servers/hadoop-2.7.5/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.5.jar pi 3 3
[hadoop@node01 azkaban-exec-server-4.0.0]$ su root
[root@node01 azkaban-exec-server-4.0.0]# hdfs dfs -chmod -R 777 /tmp/


hive.sql,内容如下create database if not exists azhive;
use azhive;
create table if not exists aztest(id string,name string) row format delimited fields terminated by '\t';
hive.flow内容如下nodes:
- name: jobHive
type: command
config:
command: /export/servers/apache-hive-3.1.2/bin/hive -f 'hive.sql'
hive.sql、hive.flow、flow20.project生成zip项目文件、web ui上传zip、执行flow

Flow Log,发现选择的executor是node02;而node02上没有安装hive


kkbadmin
kkbadmin登录azkaban,并指定执行executor是node03(安装了hive的机器)kkbadmin,并且此用户属于node03的linux用户组myazkaban(参考创建kkbrwe的做法即可)[hadoop@node03 ~]$ sudo groupadd kkbadmin
[sudo] hadoop 的密码:
[hadoop@node03 ~]$ sudo useradd -g myazkaban kkbadmin
[hadoop@node03 ~]$ sudo passwd kkbadmin
更改用户 kkbadmin 的密码 。
新的 密码:123456
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
# 将kkbadmin添加附加用户组
[hadoop@node03 ~]$ sudo usermod -a -G hadoop kkbadmin
# 查看用户kkbadmin
[hadoop@node03 ~]$ sudo id kkbadmin
uid=1002(kkbadmin) gid=1001(myazkaban) 组=1001(myazkaban),1000(hadoop)
kkbrwe没有ADMIN权限,所以先退出登录web ui界面kkbadmin登录web ui界面


[hadoop@node03 bin]$ mysql -uroot -p
mysql> use azkaban;
mysql> select * from executors;
+----+--------+-------+--------+
| id | host | port | active |
+----+--------+-------+--------+
| 7 | node01 | 39689 | 1 |
| 8 | node02 | 42295 | 1 |
| 9 | node03 | 35891 | 1 |
+----+--------+-------+--------+
3 rows in set (0.00 sec)
比如此时发现noded 03的id是9(根据自己的实际情况填写executor id)
上边azkaban界面输入参数如下,然后执行





Views: 26
https://azkaban.readthedocs.io/en/latest/getStarted.html
简单的任务调度:直接使用linux的crontab来定义;
复杂的任务调度:开发调度平台或使用现成的开源调度系统,比如ooize、azkaban、airflow、dophinschedule等
Azkaban是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流(work flow)内以一个特定的顺序运行一组工作和流程。
Azkaban定义了一种KV格式文件(properties)来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。
它有如下功能特点:
提供功能清晰、简单易用的web UI界面
方便上传工作流
调度工作流
能够杀死并重新启动工作流
工作流和任务的日志记录和审计
提供job配置文件快速建立任务和任务之间的关系
提供模块化的可插拔机制,原生支持command、java、hive、hadoop
安全性高:认证/授权(权限的工作)
提供分布式的多个执行服务器executor
提供conditional workflow工作流

solo server mode是azkaban的一个独立的实例
易于安装:不需要安装mysql,它内置了H2数据库,作为它的底层持久化存储
易于开始使用:管理服务器web server和执行服务器execute server都在一个进程中运行,任务量不大项目可以采用此模式
包含azkaban所有的功能
有兴趣的同学,可以参考官网文档
建议:直接使用老师编译出来的安装包进行安装
所以“编译azkaban”这个步骤,可以做个了解即可,不用亲自动手编译
这里选用azkaban4.0.0这个版本的源码进行重新编译,编译完成之后得到我们需要的安装包,然后进行安装
注意:
Gradle编译azkaban源码https://github.com/azkaban/azkaban/releases,下载源码包

cd /export/softwares/
wget https://github.com/azkaban/azkaban/archive/4.0.0.tar.gz
将azkaban-4.0.0.tar.gz源码包上传到编译源码的虚拟机的/export/softwares目录,然后解压并编译
提示:最好有一个虚拟机,专门用于编译各种框架的源码
# 切换到root用户
su root
cd /export/softwares/
tar -xzvf azkaban-4.0.0.tar.gz -C /export/servers/
cd /export/servers/azkaban-4.0.0/
使用gradle进行编译源码,此过程中
vim /export/servers/azkaban-4.0.0/build.gradle
在如下2个位置添加maven仓库url
maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
maven{ url 'http://maven.oschina.net/content/groups/public/'}
位置①

位置②

cd /export/servers/azkaban-4.0.0
yum -y install git
yum -y install gcc-c++
./gradlew build installDist -x test
#开始下载,控制台会打印如下类似的日志
Downloading https://services.gradle.org/distributions/gradle-4.6-all.zip
..........

编译之后,获得安装包如下
编译完成之后得到我们需要的安装包在以下目录下即可获取得到azkaban-exec-server存放目录
cd /export/servers/azkaban-4.0.0/azkaban-exec-server/build/distributions/
ll

azkaban-web-server存放目录
cd /export/servers/azkaban-4.0.0/azkaban-web-server/build/distributions/
ll

azkaban-solo-server存放目录
cd /export/servers/azkaban-4.0.0/azkaban-solo-server/build/distributions/
ll

azkaban two server模式下需要的C程序在这个路径下面
cd /export/servers/azkaban-4.0.0/az-exec-util/src/main/c
ll

数据库脚本文件在这个路径下面
cd /export/servers/azkaban-4.0.0/azkaban-db/build/sql/
ll

如果不想手动编译可以直接使用我这里编译好的文件,百度网盘链接:https://pan.baidu.com/s/14owbePcSBXBW_bwyLTVVNQ
提取码:NIIT
前提:某节点已经安装mysql,此文档以node03已经安装mysql为例
若没有特殊说明,所有操作都是使用
hadoop普通用户操作
在node03节点操作
Azkaban Web服务安装包
azkaban-web-server-0.1.0-SNAPSHOT.tar.gz
Azkaban执行服务安装包
azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz
编译之后的sql脚本
create-all-sql-0.1.0-SNAPSHOT.sql
C程序文件脚本
execute-as-user.c
将以上4个文件上传到node03的/export/softwares目录
进入mysql的客户端执行以下命令
[hadoop@node03 ~]$ mysql -uroot -p123456
mysql中执行以下命令:
-- 设置密码的验证强度等级
set global validate_password_policy=LOW;
set global validate_password_length=6;
-- 创建数据库azkaban,用于存储使用azkaban框架过程中产生的数据
CREATE DATABASE azkaban;
CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban';
GRANT SELECT,INSERT,UPDATE,DELETE ON azkaban.* to 'azkaban'@'%' identified by 'azkaban' WITH GRANT OPTION;
flush privileges;
use azkaban;
source /export/softwares/create-all-sql-0.1.0-SNAPSHOT.sql;
exit;

更改 MySQL 包大小;防止 Azkaban 连接 MySQL 阻塞
hadoop@node03 ~]$ sudo vim /etc/my.cnf
在文件末尾增加如下内容;然后保存、退出
max_allowed_packet=1024M

重启mysql服务
[hadoop@node03 sbin]$ sudo /sbin/service mysqld restart
# 输出如下日志
Redirecting to /bin/systemctl restart mysqld.service
解压azkaban-web-server
[hadoop@node03 ~]$ cd
[hadoop@node03 ~]$ cd /export/softwares/
[hadoop@node03 softwares]$ tar -zxvf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz -C /export/servers
[hadoop@node03 softwares]$ cd /export/servers
[hadoop@node03 servers]$ mv azkaban-web-server-0.1.0-SNAPSHOT/ azkaban-web-server-4.0.0
解压azkaban-exec-server
[hadoop@node03 servers]$ cd /export/softwares/
[hadoop@node03 softwares]$ tar -zxvf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz -C /export/servers
[hadoop@node03 softwares]$ cd /export/servers
[hadoop@node03 servers]$ mv azkaban-exec-server-0.1.0-SNAPSHOT/ azkaban-exec-server-4.0.0
安装ssl安全认证,允许我们使用https的方式访问我们的azkaban的web服务;
密码一定要一个个的字母输入,或者粘贴也行
[hadoop@node03 servers]$ cd /export/servers/azkaban-web-server-4.0.0
[hadoop@node03 azkaban-web-server-4.0.0]$ keytool -keystore keystore -alias jetty -genkeypair -keyalg RSA
具体输入如下:
如果你的linux是中文环境

如果是英文环境,上图中的“是”用“yes”代替
发现目录中多出一个秘钥文件keystore
[hadoop@node03 azkaban-web-server-4.0.0]$ pwd
/export/servers/azkaban-web-server-4.0.0
[hadoop@node03 azkaban-web-server-4.0.0]$ ls
bin conf keystore lib web
补充:keytool的用法
# keytool中有很多的cmd及option;查看keytool用法
[hadoop@node03 azkaban-web-server-4.0.0]$ man keytool
# 提示:搜索关键字,如-genkeypair
OPTION DEFAULTS
The following examples show the defaults for various option values.
-alias "mykey"
-keystore <the file named .keystore in the user's home directory>
-genkeypair 生成一个秘钥对(公钥、私钥)
-keyalg RSA 指定使用某算法生成秘钥对
修改azkaban-web-server的配置文件
[hadoop@node03 azkaban-web-server-4.0.0]$ cd /export/servers/azkaban-web-server-4.0.0/conf
[hadoop@node03 conf]$ vim azkaban.properties
修改文件中的如下属性
# Azkaban Personalization Settings
azkaban.name=Azkaban
azkaban.label=My Azkaban
...
default.timezone.id=Asia/Shanghai
...
# Azkaban Jetty server properties.
jetty.use.ssl=true
...
# 新增内容
jetty.ssl.port=8443
jetty.keystore=/export/servers/azkaban-web-server-4.0.0/keystore
jetty.password=azkaban
jetty.keypassword=azkaban
jetty.truststore=/export/servers/azkaban-web-server-4.0.0/keystore
jetty.trustpassword=azkaban
...
mysql.host=node03
...
azkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatus
说明:
需要修改的项目如下图

文件/export/servers/azkaban-web-server-4.0.0/conf/azkaban.properties中默认有如下属性
user.manager.class=azkaban.user.XmlUserManager
user.manager.xml.file=conf/azkaban-users.xml
上边的XmlUserManager是azkaban内置的UserManager用户管理器
XmlUserManager读取上边配置文件azkaban.properties,然后解析azkaban-users.xmlhadoop[hadoop@node03 conf]$ pwd
/export/servers/azkaban-web-server-4.0.0/conf
[hadoop@node03 conf]$ vim azkaban-users.xml
内容如下(注意:在向内容拷贝到xml文件时,注意格式缩进)
<user password="kkb123" roles="myread" username="kkbread"/>
<user password="kkb123" roles="mywrite" username="kkbwrite"/>
<user password="kkb123" roles="admin" username="kkbadmin"/>
<user password="kkb123" roles="myread, mywrite" username="kkbrwe" groups="groupx"/>
<group name="groupx" roles="myexe"/>
<role name="myread" permissions="READ"/>
<role name="mywrite" permissions="WRITE"/>
<role name="myexe" permissions="EXECUTE"/>

此文件格式解析,可以参考官网文档
user格式
| Attributes | Values | Required? |
|---|---|---|
| username | 登录用户名 The login username. | 必须有 |
| password | 密码 The login password. | 必须有 |
| roles | role角色,如果是多个角色的话,中间逗号分隔 Comma delimited list of roles that this user has. |
非必须 |
| groups | 用户所属组,如果是多个组,中间逗号分隔 Comma delimited list of groups that the users belongs to. |
非必须 |
| proxy | 代理 Comma delimited list of proxy users that this users can give to a project | 非必须 |
group
| Attributes | Values | Required? |
|---|---|---|
| name | 组名 The group name | 必须有 |
| roles | role角色,如果是多个角色的话,中间逗号分隔 Comma delimited list of roles that this user has. |
非必须 |
role
| Attributes | Values | Required? |
|---|---|---|
| name | role角色名称 The role name | 必须有 |
| permissions | 权限,如果是多个权限的话,中间逗号分隔 Comma delimited list global permissions for the role |
必须有 |
可选的权限有
| Permissions | Values |
|---|---|
| ADMIN | 管理员权限,拥有azkaban中所有的权限 Grants all access to everything in Azkaban. |
| READ | 对每个project有只读权限 Gives users read only access to every project and their logs |
| WRITE | 允许用户上传文件、修改job的properties、删除project Allows users to upload files, change job properties or remove any project |
| EXECUTE | 允许用户执行任何flow Allows users to trigger the execution of any flow |
| SCHEDULE | 允许用户给任意flow添加或移除指定的调度 Users can add or remove schedules for any flows |
| CREATEPROJECTS | 如果创建project功能被锁死,有此权限的用户拥有创建project的权限 Allows users to create new projects if project creation is locked down |
修改azkaban-exec-server的配置文件
[hadoop@node03 ~]$ cd /export/servers/azkaban-exec-server-4.0.0/conf
[hadoop@node03 conf]$ vim azkaban.properties
# Azkaban Personalization Settings
azkaban.name=Azkaban
azkaban.label=My Azkaban
...
default.timezone.id=Asia/Shanghai
...
jetty.use.ssl=true
......
# 新增内容 添加如下5行内容
jetty.keystore=/export/servers/azkaban-web-server-4.0.0/keystore
jetty.password=azkaban
jetty.keypassword=azkaban
jetty.truststore=/export/servers/azkaban-web-server-4.0.0/keystore
jetty.trustpassword=azkaban
...
# Where the Azkaban web server is located
azkaban.webserver.url=https://node03:8443
...
mysql.host=node03
...
将我们编译后的C文件execute-as-user.c上传或拷贝到/export/servers/azkaban-exec-server-4.0.0/plugins/jobtypes
[hadoop@node03 conf]$ cp /export/softwares/execute-as-user.c /export/servers/azkaban-exec-server-4.0.0/plugins/jobtypes/
然后执行以下命令生成execute-as-user
# 在线安装gcc-c++
[hadoop@node03 conf]$ sudo yum -y install gcc-c++
[hadoop@node03 conf]$ cd /export/servers/azkaban-exec-server-4.0.0/plugins/jobtypes
[hadoop@node03 jobtypes]$ gcc execute-as-user.c -o execute-as-user
# 添加root特权
[hadoop@node03 jobtypes]$ sudo chown root execute-as-user
[sudo] hadoop 的密码:
[hadoop@node03 jobtypes]$ sudo chmod 6050 execute-as-user

备注:数字表示的权限为6050,那对应的字母表示是什么呢?
其实在UNIX的实现中,文件权限用12个二进制位表示,如果该位置上的值是1,表示有相应的权限:|
11 10 9 8 7 6 5 4 3 2 1 0 S G T r w x r w x r w x第11位为
SUID(Set User ID)位,第10位为SGID(Set Group ID)位,第9位为sticky位,第8-0位对应于上面的三组rwx位。-rwsr-xr-x的值为: 表示所属用户有特殊权限SUID
1 0 0 1 1 1 1 0 1 1 0 1-rw-r-Sr--的值为: 表示所属用户组有特殊权限SGID
0 1 0 1 1 0 1 0 0 1 0 0给文件加
SUID和SUID的命令如下:
chmod u+s filename设置SUID位
chmod u-s filename去掉SUID设置
chmod g+s filename设置SGID位
chmod g-s filename去掉SGID设置另外一种方法是
chmod接4位八进制表示法。比如
chmod 6050,6050对应的2进制110 000 101 000对应的是权限是 SG --- rx ---
就是用户组有读写权限,并且同时有用户和用户组的特殊权限
但是使用命令
ll列出文件的权限表示是这样
--S r-s ---这是因为其中S表示设置SUID,s表示设置SGID同时用户组有执行权限
SUID和SGID的作用:随意设置会威胁到系统安全因此终端上显示成红色背景,特殊权限只在执行普通文件时生效。
比如本来是只有
root用户才能执行的命令,加了SUID后,普通用户就可以像root一样用这个命令,权限提升了。上面是对于文件来说的,对于目录也差不多!目录的
S属性使得在该目录下创建的任何文件及子目录属于该目录所拥有的组,目录的T属性使得该目录的所有者及root才能删除该目录。还有对于s与S,设置SUID/SGID需要有运行权限,否则用ls -l后就会看到S,证明你所设置的SUID/SGID没有起作用。
修改配置文件
[hadoop@node03 jobtypes]$ cd /export/servers/azkaban-exec-server-4.0.0/plugins/jobtypes
[hadoop@node03 jobtypes]$ vim commonprivate.properties
增加或修改如下内容
execute.as.user=true
azkaban.native.lib=/export/servers/azkaban-exec-server-4.0.0/plugins/jobtypes
azkaban.group.name=myazkaban
memCheck.enabled=false
azkaban.native.lib=false
遇到报错
Missing required property “azkaban.native.lib”的解决办法:/plugins/jobtypes目录下修改commonprivate.properties配置文件,内容中添加:azkaban.native.lib=false。然后重启启动exec服务,并激活executor。
将exec拷贝到另外两个节点,并修改所属用户
[hadoop@node03 servers]$ cd /export/servers/
[hadoop@node03 servers]$ scp -r azkaban-exec-server-4.0.0/ root@node01:$PWD
[hadoop@node03 servers]$ scp -r azkaban-exec-server-4.0.0/ root@node02:$PWD
node01节点
[root@node01 ~]# su root
[root@node01 servers]# cd /export/servers/
[root@node01 servers]# chown -R hadoop:hadoop azkaban-exec-server-4.0.0/
[root@node01 servers]# su hadoop
[hadoop@node01 jobtypes]$ cd /export/servers/azkaban-exec-server-4.0.0/plugins/jobtypes
# 添加root特权
[hadoop@node01 jobtypes]$ sudo chown root execute-as-user
[sudo] hadoop 的密码:
[hadoop@node01 jobtypes]$ sudo chmod 6050 execute-as-user
node02节点
[hadoop@node02 ~]$ su root
密码:
[root@node02 servers]# cd /export/servers/
[root@node02 servers]# chown -R hadoop:hadoop azkaban-exec-server-4.0.0/
[root@node02 servers]# su hadoop
[hadoop@node02 jobtypes]$ cd /export/servers/azkaban-exec-server-4.0.0/plugins/jobtypes
# 添加root特权
[hadoop@node02 jobtypes]$ sudo chown root execute-as-user
[sudo] hadoop 的密码:
[hadoop@node02 jobtypes]$ sudo chmod 6050 execute-as-user
web server
/export/servers/azkaban-web-server-4.0.0/conf/azkaban-users.xml中,添加了许多用户,如kkbread、kkbrwe等等
exec server
/export/servers/azkaban-exec-server-4.0.0/plugins/jobtypes/commonprivate.properties中execute.as.user=true表示,azkaban的登录用户,同时作为linux服务器的系统用户azkaban.group.name=myazkaban表示,这些azkaban用户(linux系统用户)都属于myazkaban用户组kkbrwe、用户组myazkabankkbrwe属于用户组myazkabankkbrwe添加附属组hadoop中kkbrwe用户为例(如果使用其他用户,按照此方式创建即可)具体命令如下hadoop用户已经有sudoers权限sudo groupadd myazkaban
[sudo] hadoop 的密码:
sudo useradd -g myazkaban kkbrwe
sudo passwd kkbrwe
新的 密码:123456
重新输入新的密码:
# 将kkbrwe添加附加用户组
sudo usermod -a -G hadoop kkbrwe
# 查看用户kkbrwe
sudo id kkbrwe
uid=1001(kkbrwe) gid=1001(myazkaban) 组=1001(myazkaban),1000(hadoop)
exec服务器在执行flow时,会在/export/servers/azkaban-exec-server-4.0.0目录创建目录executions,为了解决权限问题,3台节点都需要做如下操作
node01节点
[hadoop@node01 ~]$ cd /export/servers/azkaban-exec-server-4.0.0
[hadoop@node01 azkaban-exec-server-4.0.0]$ mkdir executions
[hadoop@node01 azkaban-exec-server-4.0.0]$ sudo chown :myazkaban executions/
node02节点
[hadoop@node02 ~]$ cd /export/servers/azkaban-exec-server-4.0.0
[hadoop@node02 azkaban-exec-server-4.0.0]$ mkdir executions
[hadoop@node02 azkaban-exec-server-4.0.0]$ sudo chown :myazkaban executions/
node03节点
[hadoop@node03 ~]$ cd /export/servers/azkaban-exec-server-4.0.0
[hadoop@node03 azkaban-exec-server-4.0.0]$ mkdir executions
[hadoop@node03 azkaban-exec-server-4.0.0]$ sudo chown :myazkaban executions/
说明:
:myazkaban对应exec的commonprivate.properties的azkaban.group.name=myazkaban属性
[root@node01 servers]# cd /export/servers/
[root@node01 servers]# su hadoop
[hadoop@node01 servers]$ cd azkaban-exec-server-4.0.0/
[hadoop@node01 azkaban-exec-server-4.0.0]$ bin/start-exec.sh
[hadoop@node01 azkaban-exec-server-4.0.0]$ jps

关闭exec server:
bin/shutdown-exec.sh
每次启动exec都需要激活
node01机器下执行以下命令
[hadoop@node01 azkaban-exec-server-4.0.0]$ cd /export/servers/azkaban-exec-server-4.0.0
[hadoop@node01 azkaban-exec-server-4.0.0]$ curl -G "node01:$(<./executor.port)/executor?action=activate" && echo
{"status":"success"}

在node02上启动exec server并激活(同上)
[root@node02 servers]# cd /export/servers/
[root@node02 servers]# su hadoop
[hadoop@node02 servers]$ cd azkaban-exec-server-4.0.0/
[hadoop@node02 azkaban-exec-server-4.0.0]$ bin/start-exec.sh
[hadoop@node02 azkaban-exec-server-4.0.0]$ jps
[hadoop@node02 azkaban-exec-server-4.0.0]$ cd /export/servers/azkaban-exec-server-4.0.0
[hadoop@node02 azkaban-exec-server-4.0.0]$ curl -G "node02:$(<./executor.port)/executor?action=activate" && echo
{"status":"success"}
在node03上启动exec server并激活(同上)
[hadoop@node03 servers]$ cd /export/servers/
# 如果当前用户不是hadoop,则切换到hadoop;否则,可以省略此命令
[hadoop@node03 servers]$ su hadoop
密码:
[hadoop@node03 servers]$ cd azkaban-exec-server-4.0.0/
[hadoop@node03 azkaban-exec-server-4.0.0]$ bin/start-exec.sh
[hadoop@node03 azkaban-exec-server-4.0.0]$ jps
17203 AzkabanExecutorServer
17224 Jps
[hadoop@node03 azkaban-exec-server-4.0.0]$ cd /export/servers/azkaban-exec-server-4.0.0
[hadoop@node03 azkaban-exec-server-4.0.0]$ curl -G "node03:$(<./executor.port)/executor?action=activate" && echo
{"status":"success"}
三个节点的exec server都启动后,可以去mysql中确认下,node03执行命令
[hadoop@node03 azkaban-web-server-4.0.0]$ mysql -uroot -p
Enter password:
mysql> use azkaban;
mysql> show tables;
mysql> select * from executors;
+----+--------+-------+--------+
| id | host | port | active |
+----+--------+-------+--------+
| 1 | node01 | 39157 | 1 |
| 2 | node02 | 41613 | 1 |
| 3 | node03 | 34589 | 1 |
+----+--------+-------+--------+
3 rows in set (0.00 sec)
发现,确实有3个exec server,active=1,表示已激活
也可以在MySQL中使用update语句设置active为1完成激活
[hadoop@node03 azkaban-exec-server-4.0.0]$ cd /export/servers/azkaban-web-server-4.0.0/
[hadoop@node03 azkaban-web-server-4.0.0]$ bin/start-web.sh
[hadoop@node03 azkaban-web-server-4.0.0]$ jps
17298 AzkabanWebServer
17203 AzkabanExecutorServer
17322 Jps
关闭web server命令:
bin/shutdown-web.sh注意,无论启动一定要在server根目录下使用相对命令的方式执行,如 bin/cmd,这是因为启动脚本中使用了相对路径读取权限相关的xml文件。

宿主机浏览器访问地址:https://node03:8443
前提:宿主机的hosts文件中配置了node03 ip地址与主机名node03的映射,类似

注意一定要使用https://协议访,问若浏览器界面出现类似情况,按图操作即可



用户名和密码可以是node03的文件/export/servers/azkaban-web-server-4.0.0/conf中指定的用户名及密码,如下
比如此处使用用户kkbrwe,密码kkb123

登录后,进入界面

之前在安装虚拟机时,已经设置时区为“亚洲/上海”所以不用担心时区问题,不需要修改时区
注:先配置好服务器节点上的时区
但是如果你的时区不是“亚洲/上海”,那么需要修改成此时区
确认时区;CST +0800表示时区是东八区(“亚洲/上海”)
[root@localhost azkaban-master]# date +"%Z %z"
CST +0800
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
Views: 52