之前已经比较详细的介绍过了 Azkaban,现在来简单介绍下 Azkaban 的安装。

Azkaban安装

安装包

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
下载地址:http://azkaban.github.io/downloads.html

解压安装包

[root@hadoop01 ~] tar -zxvf azkaban-web-server-2.5.0.tar.gz -C apps/ azkaban/
[root@hadoop01 ~] tar -zxvf azkaban-executor-server-2.5.0.tar.gz -C apps/ azkaban/
[root@hadoop01 ~] tar -zxvf azkaban-sql-script-2.5.0.tar.gz -C apps/ azkaban/ 

Azkaban脚本导入

[root@hadoop01 ~] tar -zxvf azkaban-sql-script-2.5.0.tar.gz -C apps/ azkaban/
#进入MySQL执行脚本:
mysql> create database azkaban; Query OK, 1 row affected (0.01 sec) 

mysql> use azkaban; 
Database changed 

mysql> source /home/hadoop/apps/azkaban/azkaban-script-2.5.0/create-all-sql-2.5.0.sql; 

创建SSL配置

#最好是在azkaban 目录下:
[root@hadoop01 ~] keytool -keystore keystore -alias jetty -genkey -keyalg RSA

此命令执行之后会提示输入当前生成 keystore 的密码及相应信息,输入密码请劳记,信息如下:

[root@hadoop1 azkaban] keytool -keystore keystore -alias jetty -genkey - 
keyalg RSA
Enter keystore password:  
Re-enter new password: 
What is your first and last name?
    [Unknown]:  firstName
What is the name of your organizational unit?
    [Unknown]:  companyName
What is the name of your organization?
    [Unknown]:  groupName
What is the name of your City or Locality?
    [Unknown]:  shanghai
What is the name of your State or Province?
    [Unknown]:  shanghai
What is the two-letter country code for this unit?
    [Unknown]:  CN
Is CN=firstName, OU=companyName, O=groupName, L=shanghai, ST=shanghai, C=CN correct?
    [no]:  Y        

Enter key password for <jetty>
    (RETURN if same as keystore password):  

然后将在当前目录生成 keystore 证书文件,将 keystore 拷贝到 azkaban web 服务器根目录中。如:

[root@hadoop01 ~] cp keystore azkaban/azkaban-web-2.5.0

修改配置文件

#先配置好服务器节点上的时区
#先生成时区配置文件 Asia/Shanghai,用交互式命令 tzselect 即可
#拷贝该时区文件,覆盖系统本地时区配置
[hadoop@hadoop01 ~]$ sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 
#azkaban web 服务器配置进入 azkaban web 服务器安装目录 conf 目录
[hadoop@hadoop01 ~]$ cd apps/azkaban/azkaban-web-2.5.0/conf/ 

修改 azkaban.properties 文件

#用户配置,具体配置参加下文
#Loader for projects   # global 配置文件所在位置
executor.global.properties=/home/hadoop/apps/azkaban/azkaban-executor-2.5.0/conf/global.properties 
azkaban.project.dir=projects
#数据库类型
database.type=mysql
#端口号
mysql.port=3306
#数据库连接IP
mysql.host=hadoop01
#数据库实例名
mysql.database=azkaban
#数据库用户名
mysql.user=root
#数据库密码
mysql.password=root
#最大连接数
mysql.numconnections=100

#Velocity dev mode velocity.dev.mode=false
#Jetty 服务器属性
#最大线程数
jetty.maxThreads=25
#Jetty SSL 端口
jetty.ssl.port=8443
#Jetty 端口
jetty.port=8081
#SSL 文件名
jetty.keystore=/home/hadoop/apps/azkaban/azkaban-web-2.5.0/keystore
#SSL 文件密码
jetty.password=hadoop
#Jetty 主密码 与 keystore 文件相同
jetty.keypassword=hadoop
#SSL 文件名
jetty.truststore=/home/hadoop/apps/azkaban/azkaban-web-2.5.0/keystore
#SSL 文件密码
jetty.trustpassword=hadoop

#执行服务器属性
executor.port=12321 #执行服务器端口 

#邮件设置(可选项) 
mail.sender=xxxxxxxx@lyafei.com   #发送邮箱
mail.host=smtp.lyafei.com         #发送邮箱 smtp 地址
mail.user=xxxxxxxx                #发送邮件时显示的名称 
mail.password=**********          #邮箱密码
job.failure.email=xxxxxxxx@lyafei.com   #任务失败时发送邮件的地址 
job.success.email=xxxxxxxx@lyafei.com   #任务成功时发送邮件的地址 
lockdown.create.projects=false
#cache.directory=cache           #缓存目录

进入 azkaban web 服务器 conf 目录,修改 azkaban-users.xml 用户配置

<azkaban-users>
    <user username="azkaban" password="azkaban" roles="admin" groups="azkaban" />
    <user username="metrics" password="metrics" roles="metrics"/>
    <user username="admin" password="admin" roles="admin,metrics" />
    <role name="admin" permissions="ADMIN" />
    <role name="metrics" permissions="METRICS"/>
</azkaban-users>

azkaban 执行服务器 executor 配置,进入执行服务器安装目录 conf,修改 azkaban.properties

#
#Azkaban
default.timezone.id=Asia/Shanghai   #时区

#Azkaban JobTypes 插件配置,插件所在位置
azkaban.jobtype.plugin.dir=/home/hadoop/apps/azkaban/azkaban-executor-2.5.0/plugins/jobtypes

#Loader for projects 
executor.global.properties=/home/hadoop/apps/azkaban/azkaban-executor-2.5.0/conf/global.properties azkaban.project.dir=projects

#数据库设置
#数据库类型(目前只支持 mysql)
database.type=mysql  
#数据库端口号
mysql.port=3306
#数据库 IP 地址
mysql.host=hadoop01
#数据库实例名
mysql.database=azkaban
#数据库用户名
mysql.user=root
#数据库密码
mysql.password=root
#最大连接数
mysql.numconnections=100

#执行服务器配置
#最大线程数
executor.maxThreads=50
#端口号(如修改,请与 web 服务中一致)
executor.port=12321
#线程数
executor.flow.threads=30

配置环境变量

[hadoop@hadoop01 ~]$ vim /etc/profile

#/etc/profile
export AZKABAN_WEB_HOME=/home/hadoop/apps/azkaban/azkaban-web-2.5.0 
export AZKABAN_EXE_HOME=/home/hadoop/apps/azkaban/azkaban-executor-2.5.0 
export PATH=$PATH:$AZKABAN_WEB_HOME/bin:$AZKABAN_EXE_HOME/bin 

启动

启动 web 服务器

nohup azkaban-web-start.sh 1>/home/hadoop/azwebstd.out 2>/home/hadoop/azweberr.out &

启动执行服务器

nohup azkaban-executor-start.sh 1>/home/hadoop/azexstd.out 2>/home/hadoop/azexerr.out &

在浏览器中输入:https://hadoop01:8443/
login
看到以上界面表示安装成功!!!

安装注意事项

绝对路径

web.resource.dir 项的值要使用绝对路径,否则 web 页面因为加载不到css样式,会没有美丽的界面
user.manager.xml.file 项的值要使用绝对路径,否则启动的时候会报找不到文件的错误

邮箱预警

mail.sender、mail.host、mail.user、mail.password 这四项每一项配置都不能少,端口可以不配置,而且 mail.sender 和 mail.user 的值是一样的,少一项或者配错一项都会报出错误,错误信息如下:

ERROR [EmailMessage] [Azkaban] Connecting to SMTP server failed, attempt: 0 
javax.mail.AuthenticationFailedException: 500 Error: bad syntax
    at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:823)
    at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:756)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:673)
    at javax.mail.Service.connect(Service.java:295)
    at azkaban.utils.JavaxMailSender.connect(JavaxMailSender.java:34)
    at azkaban.utils.EmailMessage.connectToSMTPServer(EmailMessage.java:220)
    at azkaban.utils.EmailMessage.retryConnectToSMTPServer(EmailMessage.java:230)
    at azkaban.utils.EmailMessage.sendEmail(EmailMessage.java:213)
    at azkaban.utils.Emailer.sendEmail(Emailer.java:220)
    at azkaban.utils.Emailer.alertOnSuccess(Emailer.java:153)
    at azkaban.executor.selector.ExecutionControllerUtils.alertUser(ExecutionControllerUtils.java:123)
    at azkaban.executor.ExecutionFinalizer.finalizeFlow(ExecutionFinalizer.java:98)
    at azkaban.executor.RunningExecutionsUpdater.updateExecutions(RunningExecutionsUpdater.java:131)
    at azkaban.executor.RunningExecutionsUpdaterThread.run(RunningExecutionsUpdaterThread.java:54)

plugins/jobtypes配置

azkaban.jobtype.plugin.dir=plugins/jobtypes 这一项一定要配置,并且创建文件夹,不然会报错,错误信息如下:

ERROR [FlowTriggerScheduler] [Azkaban] unable to get scheduled flow triggers 
java.lang.NullPointerException
    at azkaban.flowtrigger.quartz.FlowTriggerScheduler.getScheduledFlowTriggerJobs(FlowTriggerScheduler.java:132)
    at azkaban.webapp.servlet.FlowTriggerServlet.handlePage(FlowTriggerServlet.java:140)
    at azkaban.webapp.servlet.FlowTriggerServlet.handleGet(FlowTriggerServlet.java:55)
    at azkaban.webapp.servlet.LoginAbstractAzkabanServlet.doGet(LoginAbstractAzkabanServlet.java:123)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:770)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:401)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:928)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)
    at org.mortbay.jetty.security.SslSocketConnector$SslConnection.run(SslSocketConnector.java:713)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.j

或者报 native executor not 存在。

Multiple Executor

Multiple Executor的几项必须配置,不然的话会报出以下错误:

ERROR [StdOutErrRedirect] [Azkaban] Exception in thread "main"
ERROR [StdOutErrRedirect] [Azkaban] java.lang.IllegalArgumentException: azkaban.use.multiple.executors must be true. Single executor mode is not supported any more.
ERROR [StdOutErrRedirect] [Azkaban] at azkaban.executor.ExecutorManager.checkMultiExecutorMode(ExecutorManager.java:240)
ERROR [StdOutErrRedirect] [Azkaban] at azkaban.executor.ExecutorManager.setupExecutors(ExecutorManager.java:229)
ERROR [StdOutErrRedirect] [Azkaban] at azkaban.executor.ExecutorManager.initialize(ExecutorManager.java:155)
ERROR [StdOutErrRedirect] [Azkaban] at azkaban.executor.ExecutorManager.start(ExecutorManager.java:168)
ERROR [StdOutErrRedirect] [Azkaban] at azkaban.webapp.AzkabanWebServer.launch(AzkabanWebServer.java:235)
ERROR [StdOutErrRedirect] [Azkaban] at azkaban.webapp.AzkabanWebServer.main(AzkabanWebServer.java:226)

executor

如果web启动报错,没有活跃得executor,那么需要去数据库中手动修改native状态为1。

Mysql权限

咱们使用MySQL都会有特殊的权限限制,能通过特定的用户,但是经过几次的安装集群后发现,最初hadoop平台搭建的时候,这个MySQL的授权操作还得自己来。
只有拥有特定权限的用户才能执行特定的操作。

GRANT SELECT,INSERT,UPDATE,DELETE ON <database>.* to '<username>'@'%' WITH GRANT OPTION;
#privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL
#databasename:数据库名
#tablename:表名,如果要授予该用户对所有数据库和表的相应操作权限则可用*表示,如 *.*

#授权之后一般都会刷新该操作:
flush privileges;

#撤销授权:
REVOKE privilege ON databasename.tablename FROM 'username'@'host';

derby

如果出现以下报错:

java.lang.NoClassDefFoundError: Could not initialize class org.apache.derby.jdbc.AutoloadedDriver40

原因是:在 azkaban 的 server 和 executor 中缺少一个叫 derby.jar 的包,解决办法如下:

cp $JAVA_HOME/db/lib/derby.jar $AZKABAN_WEB_HOME/extlib
cp $JAVA_HOME/db/lib/derby.jar $AZKABAN_EXE_HOME/extlib
最后修改:2020 年 04 月 15 日 04 : 01 PM
如果觉得我的文章对你有用,请随意赞赏