源码地址:https://github.com/azkaban/azkaban.git
目录结构:
Azkaban分为8个大模块:
- az-core:基础模块.
- azkaban-common:公共模块.
- azkaban-db:提供访问数据库模块.
- azkaban-exec-server:具体执行任务的模块.
- azkaban-web-server:提供web界面展示和接收http请求的模块.
- azkaban-hadoop-security-plugin:Hadoop模块.
- azkaban-solo-server:web和exec运行在同一个 JVM。
- azkaban-spi:
下图为依赖关系:
导入idea后结果,如下:
此方法比较简单,在idea里面新建一个azkaban的 Gradle工程就可以了。
建好之后,把源码的azkaban目录下所有文件复制到新建的工程文件夹azkaban下面,如图:
完成后,返回到idea,过一会就自动构建完成,Build Project也是OK的!
此过程比较复杂,适合对Maven熟悉的玩家使用,结果如下:
1、新建一个azkaban maven工程。
2、按照上述的依赖关系,得一个个子模块依次创建。选中idea的azkaban project,新建一个artifactId为az-core的子模块。
3、然后选中az-core,新建一个module,artifactId输入azkaban-db。
4、选中azkaban-db,新建一个artifactId名为azkaban-common的子模块。
5、后面依次选中子模块创建其下面的子模块。对于有2个父模块的,直接选择只有1个公共的父模块(azkaban-common)或者超父模块(azkaban)。
6、azkaban-solo-server的父模块是azkaban-web-server和azkaban-exec-server。
7、如果上述模块依赖建立错误或者不知道怎么操作,可以根据下面的pom.xml文件来设置依赖关系。
下面是每个pom.xml对应的内容。
azkaban工程的总pom.xml内容:
com.gavin
azkaban
pom
1.0
az-core
azkaban-spi
org.apache.maven.plugins
maven-compiler-plugin
3.5.1
1.8
UTF-8
为了方便快捷,直接加入下面的依赖:
org.assertj
assertj-core
3.8.0
org.awaitility
awaitility
3.0.0
commons-collections
commons-collections
3.2.2
commons-lang
commons-lang
2.6
org.apache.commons
commons-dbcp2
2.1.1
commons-dbutils
commons-dbutils
1.5
commons-fileupload
commons-fileupload
1.2.1
com.google.code.gson
gson
2.8.1
com.google.guava
guava
21.0
com.google.inject
guice
4.1.0
com.h2database
h2
1.4.193
org.apache.hadoop
hadoop-annotations
2.7.2
org.apache.hadoop
hadoop-auth
2.7.2
org.apache.hadoop
hadoop-common
2.7.2
org.apache.hadoop
hadoop-hdfs
2.7.2
org.apache.hadoop
hadoop-mapreduce-client-common
2.7.2
org.apache.hadoop
hadoop-mapreduce-client-core
2.7.2
org.apache.hive
hive-exec
1.1.0
org.apache.hive
hive-metastore
1.1.0
org.apache.httpcomponents
httpclient
4.5.3
commons-io
commons-io
2.4
org.codehaus.jackson
jackson-core-asl
1.9.5
org.codehaus.jackson
jackson-mapper-asl
1.9.5
org.mortbay.jetty
jetty
6.1.26
org.mortbay.jetty
jetty-util
6.1.26
org.apache.commons
commons-jexl
2.1.1
joda-time
joda-time
2.0
net.sf.jopt-simple
jopt-simple
4.3
com.google.code.findbugs
jsr305
3.0.2
junit
junit
4.12
org.apache.kafka
kafka-log4j-appender
0.10.0.0
log4j
log4j
1.2.17
javax.mail
mail
1.4.5
org.apache.commons
commons-lang3
3.4
io.dropwizard.metrics
metrics-core
3.1.0
io.dropwizard.metrics
metrics-jvm
3.1.0
org.mockito
mockito-core
2.10.0
mysql
mysql-connector-java
5.1.36
org.quartz-scheduler
quartz
2.2.1
com.linkedin.pegasus
generator
1.15.7
com.linkedin.pegasus
restli-server
1.15.7
com.linkedin.pegasus
restli-tools
1.15.7
org.slf4j
slf4j-api
1.7.18
org.slf4j
slf4j-log4j12
1.7.18
org.slf4j
slf4j-log4j12
1.7.18
org.yaml
snakeyaml
1.18
org.apache.velocity
velocity
1.7
org.apache.velocity
velocity-tools
2.0
az-core模块下面的pom.xml内容:
azkaban
com.gavin
1.0
../pom.xml
4.0.0
az-core
pom
../azkaban-db
azkaban-db模块下面的pom.xml:
az-core
com.gavin
1.0
../az-core/pom.xml
4.0.0
azkaban-db
pom
../azkaban-common
azkaban-spi的pom.xml
azkaban
com.gavin
1.0
../pom.xml
4.0.0
azkaban-spi
pom
../azkaban-common
azkaban-common模块的pom.xml
azkaban
com.gavin
1.0
../pom.xml
4.0.0
azkaban-common
pom
../azkaban-web-server
../azkaban-hadoop-security-plugin
azkaban-exec-server模块的pom.xml
azkaban-hadoop-security-plugin
com.gavin
1.0
../azkaban-hadoop-security-plugin/pom.xml
4.0.0
azkaban-exec-server
pom
../azkaban-solo-server
azkaban-web-server模块的pom.xml
azkaban-common
com.gavin
1.0
../azkaban-common/pom.xml
4.0.0
azkaban-web-server
pom
../azkaban-solo-server
azkaban-hadoop-security-plugin模块的pom.xml
azkaban-common
com.gavin
1.0
../azkaban-common/pom.xml
4.0.0
pom
azkaban-hadoop-security-plugin
../azkaban-exec-server
azkaban-solo-server模块的pom.xml
azkaban-common
com.gavin
1.0
../azkaban-common/pom.xml
4.0.0
azkaban-solo-server
pom
设置完成后,再在Project Structure里面的Modules里面添加模块依赖。模块依赖+Maven依赖都OK,Build 和Run Project是没问题的。(所有的test模块都可以去掉。选择Project Structure里面的某个Module,切换到Sources页签,取消Tests文件夹的标记即可)
该模块是公共模块,供其它模块调用。
包含在启动前数据库信息的检查。是否缺失表,是否需要执行更新等脚本。
azkaban元数据存储接口及其Exception类。
定义一些常量(属性名,默认值等)的类Constants。
一些通用工具。配置文件定义,读取,JSON的读取,及cron表达式的解析。
提供数据库访问的一些方法。
数据库的初始化,检查是否需要升级等。
初始化SQL脚本。
提供
hadoop
访问相关的模块,支持集群kerberos
验证。
需要在配置文件里面设置hadoop相关的一些参数。如:hadoop.home
,hadoop.conf.dir
或者,设置HADOOP_HOME
,HADOOP_CONF_DIR
等参数。
azkaban的web-server单独模块
入口main:azkaban.webapp.AzkabanWebServer
.
此入口main方法主要逻辑代码:
StdOutErrRedirect.redirectOutAndErrToLog();
Props azkabanSettings = AzkabanServer.loadProps(args);
webServer.prepareAndStartServer();
,getTriggerManager().start();
,azkaban.webapp.WebServerProvider.get(){...final Server server = new Server();...}
final boolean useSsl = this.props.getBoolean("jetty.use.ssl", true);
final Context root = new Context(this.server, "/", Context.SESSIONS);
this.server.start();
Runtime.getRuntime().addShutdownHook(new Thread(){...})
azkaban的executor-server单独模块
入口main:azkaban.execapp.AzkabanExecutorServer
。
此入口main方法主要逻辑:
StdOutErrRedirect.redirectOutAndErrToLog();
final Props props = AzkabanServer.loadProps(args);
azkabanExecutorServer.start();
Runtime.getRuntime().addShutdownHook(new Thread(){...})
入口main:
azkaban.soloserver.AzkabanSingleServer
.
此入口main方法主要逻辑:
if(args.length== 0){args = prepareDefaultConf();}
AzkabanDatabaseUpdater.runDatabaseUpdater(props, scriptDir, updateDB);
AzkabanExecutorServer.launch(this.executor);
权限定义在Permission.Type枚举中