1. azkaban源码编译
这个部分比较简单,根据官方文档的命令编译即可,大概需要20分钟编译时间。
# Build Azkaban
./gradlew build
# Clean the build
./gradlew clean
# Build and install distributions
./gradlew installDist
# Run tests
./gradlew test
# Build without running tests
./gradlew build -x test
编译完成之后会有如下目录:
az-core az-hadoop-jobtype-plugin azkaban-exec-server build.gradle gradlew.bat temp
az-crypto az-hdfs-viewer azkaban-hadoop-security-plugin CONTRIBUTING.md LICENSE test
az-examples az-intellij-style.xml azkaban-solo-server docs NOTICE tools
az-exec-util az-jobsummary azkaban-spi gradle README.md
az-flow-trigger-dependency-plugin azkaban-common azkaban-web-server gradle.properties requirements.txt
az-flow-trigger-dependency-type azkaban-db az-reportal gradlew settings.gradle
2. azkaban安装模式
azkaban分2种运行模式,solo-server以及Multi Executor Server。 不论哪种模式,实际上都有2个组件构成 web及executor,只不过solo-server 同时包含这2个东西,而multi Executor server可以把web及executor 分开安装。
solo-server的包为:azkaban-solo-server, multi executor server为 azkaban-web-server和azkaban-exec-server.
至于具体的安装不做介绍,这个官方文档有详细的介绍。只不过有一点,对于multi executor server来说,启动了executor之后需要再激活,而solo-server不需要。
curl -G "localhost:$(<./executor.port)/executor?action=activate" && echo
azkaban数据库的executions表可以看到,默认状态是0,表示未激活,1表示激活。
3. multi executor server介绍
这种模式可以有多个executor, 前端web会根据参数对后端的executor进行探测,从web的日志也可以看到相应信息。
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
azkaban.activeexecutor.refresh.milisecinterval=10000
azkaban.queueprocessing.enabled=true
azkaban.activeexecutor.refresh.flowinterval=10
azkaban.executorinfo.refresh.maxThreads=10
探测的意义是为了知道有哪些executor还活着,这样在分配任务的时候可以根据实际的executor进行分配。
根据我实际测试,最新的3.7有很多BUG,稍后进行说明。
4. 任务调度用户
1)调度用户 默认创建的用户为azkaban,但是实际上你跑JOB的时候并不想使用这个用户,也许你连接HIVE,那么希望使用HIVE用户,那么需要根据文档设置execute-as-user.
参数为plugin目录下的common文件:
execute.as.user=true
azkaban.native.lib=/opt/azkaban/plugins/jobtypes
另外必须根据官方文档编译出execute-as-user文件:
scp ./azkaban-common/src/main/c/execute-as-user.c onto the Azkaban box
run: gcc execute-as-user.c -o execute-as-user
run: chown root execute-as-user (you might need root privilege)
run: chmod 6050 execute-as-user (you might need root privilege)
在编辑JOB的时候添加user.to.proxy
---
config:
failure.emails: noreply@foo.com
user.to.proxy: hive
nodes:
- name: jobA
type: command
config:
command: touch /tmp/1.log
这3个步骤完成后,你提交的任务就是user.to.proxy的用户。
2)任务调度用户权限
这个是通过azkaban-users.xml 文件控制。
<azkaban-users>
<user groups="azkaban" password="azkaban" roles="admin" username="azkaban"/>
<user password="metrics" roles="metrics" username="metrics"/>
<user username="xxx" password="wangjialong" groups="readonly" />
<user username="xxxx" password="wangjialong" role="admin" />
<group name="readonly" role="readonly"/>
<role name="readonly" permissions="READ"/>
<role name="admin" permissions="ADMIN"/>
<role name="metrics" permissions="METRICS"/>
</azkaban-users>
整体分为用户,组,角色, 角色就是权限,可以给组,也可以给用户。 设置完这个文件之后,还需要项目管理通过WEB添加用户方可以使用。 我发现一个问题,权限设置出了XML设置好之后,在WEB里也可以修改,这个感觉很奇怪,既然如此要这个XML干鸟?
3)调度方式
我看大部分人使用azkaban调度都是通过shell来调,比如我想跑一个HIVE的脚本,也是使用hive -e 或者hive -f , 这种方式也没问题,主要是JOB还要打个包,真是有病。
另外,既然你要跑HIVE, 跑SPARK,很显然这些组件必须也安装一个客户端在azkaban里,否者你执行的时候命令也没有。
4. azkaban的几个问题
1)根据实际测试,多executor模式下,如果你关闭了某台executor, 前端WEB根本探测不到,我认为这是一个极大的BUG,除非你重启WEB。
2)如果你机器资源不足,你提交JOB的时候会发现JOB一直preparing, 根本不执行。按照网上的说法,好像是剩余内存必须大于6G还是8G
Successfully refreshed executor: 10.40.2.175:33785 (id: 7), active=true with executor info : ExecutorInfo{remainingMemoryPercent=36.99734851425452, remainingMemoryInMB=5901, remainingFlowCapacity=30, numberOfAssignedFlows=0, lastDispatchedTime=0, cpuUsage=0.0}
这完全不可思议,为什么是8G或者6G? 4G就不能执行吗? 真是莫名其妙
3)用户权限开始提过,XML设置好权限之后,通过WEB竟然还可以修改,那请问要XML干鸟?
4) 大部分人使用command来作为调度,太不合理,HIVE, SPARK等等很多都有thrift server,凭什么要用command ?
5) azkaban的文档机器糟糕,一坨屎一样。
有人拿azkaban和oozie比,我认为,差距太大,不要侮辱了oozie.