工作流调度器azkaban(以及各种工作流调度器比对)

时间:2021-10-13 10:31:36

1:工作流调度系统的作用:

(1):一个完整的数据分析系统通常都是由大量任务单元组成:比如,shell脚本程序,java程序,mapreduce程序、hive脚本等;
(2):各任务单元之间存在时间先后及前后依赖关系;
(3):为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行;

(4):举例说明工作流调度系统的具体作用:

  我们可能有这样一个需求,某个业务系统每天产生20G原始数据,我们每天都要对其进行处理,处理步骤如下所示:
    a、通过Hadoop先将原始数据同步到HDFS上;
    b、借助MapReduce计算框架对原始数据进行转换,生成的数据以分区表的形式存储到多张Hive表中;
    c、需要对Hive中多个表的数据进行JOIN处理,得到一个明细数据Hive大表;
    d、将明细数据进行复杂的统计分析,得到结果报表信息;
    e、需要将统计分析得到的结果数据同步到业务系统中,供业务调用使用。

(5):工作流调度实现方式:

  a:简单的任务调度:直接使用linux的crontab来定义;
  b:复杂的任务调度:开发调度平台,或使用现成的开源调度系统,比如ooize、azkaban等

(6):常见工作流调度系统:

  市面上目前有许多工作流调度器:
    在hadoop领域,常见的工作流调度器有Oozie, Azkaban,Cascading,Hamake等

2:各种调度工具特性对比:

  下面的表格对上述四种hadoop工作流调度器的关键特性进行了比较,尽管这些工作流调度器能够解决的需求场景基本一致,但在设计理念,目标用户,应用场景等方面还是存在显著的区别,在做技术选型的时候,可以提供参考:

特性

Hamake Oozie Azkaban Cascading
 工作流描述语言  XML  XML (xPDL based)  text file with key/value pairs  Java API
 依赖机制  data-driven  explicit  explicit  explicit
 是否要web容器  No  Yes  Yes  No
 进度跟踪  console/log messages  web page  web page  Java API
 Hadoop job调度支持  no  yes  yes  yes
 运行模式  command line utility  daemon  daemon  API
 Pig支持  yes  yes  yes  yes
 事件通知  no  no  no  yes
 需要安装  no  yes  yes  no
 支持的hadoop版本  0.18+  0.20+  currently unknown  0.18+
 重试支持  no  workflownode evel  yes  yes
 运行任意命令  yes  yes  yes  yes
 Amazon EMR支持  yes  no  currently unknown  yes

3:Azkaban与Oozie对比:

(1):对市面上最流行的两种调度器,给出以下详细对比,以供技术选型参考。总体来说,ooize相比azkaban是一个重量级的任务调度系统,功能全面,但配置使用也更复杂。如果可以不在意某些功能的缺失,轻量级调度器azkaban是很不错的候选对象。

(2):功能:
  两者均可以调度mapreduce,pig,java,脚本工作流任务;
  两者均可以定时执行工作流任务;

(3):工作流定义:
  Azkaban使用Properties文件定义工作流;
  Oozie使用XML文件定义工作流;

(4):工作流传参:
  Azkaban支持直接传参,例如${input};
  Oozie支持参数和EL表达式,例如${fs:dirSize(myInputDir)};

(5):定时执行:
  Azkaban的定时执行任务是基于时间的;
  Oozie的定时执行任务基于时间和输入数据;

(6):资源管理:
  Azkaban有较严格的权限控制,如用户对工作流进行读/写/执行等操作;
  Oozie暂无严格的权限控制;

(7):工作流执行:
  Azkaban有两种运行模式,分别是solo server mode(executor server和web server部署在同一台节点)和multi server mode(executor server和web server可以部署在不同节点);
  Oozie作为工作流服务器运行,支持多用户和多工作流;

(8):工作流管理:
  Azkaban支持浏览器以及ajax方式操作工作流;
  Oozie支持命令行、HTTP REST、Java API、浏览器操作工作流;

4:Azkaban介绍:

  Azkaban是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。Azkaban定义了一种KV文件格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。
  它有如下功能特点:
     Web用户界面,方便上传工作流,方便设置任务之间的关系,调度工作流,认证/授权(权限的工作),能够杀死并重新启动工作流,模块化和可插拔的插件机制,项目工作区,工作流和任务的日志记录和审计。

5:Azkaban安装部署:

  (1) 请提前将,Azkaban Web服务器,azkaban-web-server-2.5.0.tar.gz;Azkaban执行服务器 ,azkaban-executor-server-2.5.0.tar.gz上传到自己的机器,过程省略。由于目前azkaban只支持 mysql(azkaban提交的任务提交到mysql里面,因为是提交的任务是定时执行的,具有时间调度的,azkaban重启以后任务还存在),需安装mysql服务器,之前写过安装linux下面安装mysql,这里不叙述:

Azkaban的下载官网网址:https://azkaban.github.io/downloads.html

  (2)安装建议:将安装文件上传到集群,最好上传到安装 hive、sqoop的机器上,方便命令的执行,在当前用户目录下新建 azkabantools目录,用于存放源安装文件.新建azkaban目录,用于存放azkaban运行程序;

  (3)azkaban web服务器安装(提供web服务器的)如下所示:

      第一步:解压azkaban-web-server-2.5.0.tar.gz
        命令: tar –zxvf azkaban-web-server-2.5.0.tar.gz
      第二步:将解压后的azkaban-web-server-2.5.0 移动到 azkaban目录中,并重新命名 webserver
        命令: mv azkaban-web-server-2.5.0 ../azkaban
                 cd ../azkaban
                mv azkaban-web-server-2.5.0  server

    azkaban 执行服器(调用job执行的)安装:

      第一步:解压azkaban-executor-server-2.5.0.tar.gz
        命令:tar –zxvf azkaban-executor-server-2.5.0.tar.gz
      第二步:将解压后的azkaban-executor-server-2.5.0 移动到 azkaban目录中,并重新命名 executor
        命令:mv azkaban-executor-server-2.5.0  ../azkaban
          cd ../azkaban
          mv azkaban-executor-server-2.5.0  executor

    azkaban脚本导入:

      azkaban 在mysql里面创建表具有表结构,不像hive会自动执行创建mysql表结构,所以azkaban 需要手动执行azkaban脚本导入,创建mysql的表结构。
      第一步:解压: azkaban-sql-script-2.5.0.tar.gz
        命令:tar –zxvf azkaban-sql-script-2.5.0.tar.gz
        将解压后的mysql 脚本,导入到mysql中:
        进入mysql
        mysql> create database azkaban;
          mysql> use azkaban;
          Database changed
          mysql> source /home/hadoop/azkaban-2.5.0/create-all-sql-2.5.0.sql;


具体安装过程如下所示:

 <!--创建文件夹相应的文件夹-->
[root@master hadoop]# mkdir azkabantools
[root@master hadoop]# mkdir azkaban
[root@master hadoop]# cd package/ <!--解压缩的操作-->
[root@master package]# tar -zxvf azkaban-web-server-2.5..tar.gz -C /home/hadoop/azkabantools/
[root@master package]# ll /home/hadoop/azkabantools/
[root@master package]# tar -zxvf azkaban-executor-server-2.5..tar.gz -C /home/hadoop/azkabantools/
[root@master package]# ll /home/hadoop/azkabantools/
[root@master package]# tar -zxvf azkaban-sql-script-2.5..tar.gz -C /home/hadoop/azkabantools/
[root@master package]# ll /home/hadoop/azkabantools/
[root@master package]# cd /home/hadoop/azkabantools/
[root@master azkabantools]# ls
[root@master azkabantools]# ll <!--修改azkaban的名称以及查看等等操作-->
[root@master azkabantools]# mv azkaban-web-2.5. server
[root@master azkabantools]# mv azkaban-executor-2.5. executor
[root@master azkabantools]# ll <!--手动执行mysql脚本创建数据表-->
[root@master hadoop]# mysql -uroot -p123456
mysql> create database azkaban;
mysql> use azkaban;
mysql> source /home/hadoop/azkabantools/azkaban-2.5./create-all-sql-2.5..sql

6:完成以上操作以后,开始配置配置文件,因为azkaban的web页面是https访问的,所以服务端需要一个证书的。所以使用SSL来生成这个证书,下面创建SSL的配置:

脑补一下:安装java,安装目录下就有keytool,如果输入的时候输错了,不要慌,按住ctrl+Backspace键即可清楚错误操作命令。

此命令生成证书:keytool -keystore keystore -alias jetty -genkey -keyalg RSA
 [root@master azkabantools]# keytool -keystore keystore -alias jetty -genkey -keyalg RSA
Enter keystore password:输入密码
Re-enter new password:输入确认密码
What is your first and last name?
[Unknown]:回车
What is the name of your organizational unit?
[Unknown]:回车
What is the name of your organization?
[Unknown]:回车
What is the name of your City or Locality?
[Unknown]:回车
What is the name of your State or Province?
[Unknown]:回车
What is the two-letter country code for this unit?
[Unknown]: CN
Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN correct?
[no]: y Enter key password for <jetty>
(RETURN if same as keystore password):回车(密码是否和上面的一样)
[root@master azkabantools]#

完成上述工作后,将在当前目录生成 keystore 证书文件,将keystore 考贝到 azkaban web服务器根目录中.如:cp keystore azkaban/server,即完成生成证书操作;

[root@master azkabantools]# cp keystore /home/hadoop/azkabantools/server/

7:接下来配置azkaban的配置文件:

注:先配置好服务器节点上的时区,由于是定时执行的,如果时区时间不对,azkaban将不会执行。
  1、先生成时区配置文件Asia/Shanghai,如果没有这个时区Asia/Shanghai,使用交互式命令 tzselect生成 即可,根据提示进行选择,这里省略。
  2、拷贝该时区文件,覆盖系统本地时区配置:
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

  3:修改自己的时间,然后写到硬件里面,不然只在本次生效:

    sudo date -s 'yyyy-dd-MM hh:mm:ss'
    hwclock -w  

azkaban web服务器配置,进入azkaban web服务器安装目录 conf目录,修改azkaban.properties文件:

[root@master azkabantools]# cd server/conf

[root@master conf]# vim azkaban.properties

 #Azkaban Personalization Settings
azkaban.name=Test                           #服务器UI名称,用于服务器上方显示的名字
azkaban.label=My Local Azkaban                               #描述
azkaban.color=#FF3601                                                 #UI颜色
azkaban.default.servlet.path=/index                         #
web.resource.dir=web/                                                 #默认根web目录
default.timezone.id=Asia/Shanghai                           #默认时区,已改为亚洲/上海 默认为美国
 
#Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager   #用户权限管理默认类
user.manager.xml.file=conf/azkaban-users.xml              #用户配置,具体配置参加下文
 
#Loader for projects
executor.global.properties=conf/global.properties    # global配置文件所在位置
azkaban.project.dir=projects                                                #
 
database.type=mysql                                                              #数据库类型
18 mysql.port=3306                                                                       #端口号
mysql.host=192.168.3.129                                                   #数据库连接IP
mysql.database=azkaban                                                       #数据库实例名
mysql.user=root                                                                 #数据库用户名
mysql.password=123456                                                         #数据库密码
mysql.numconnections=100                                                  #最大连接数
 
# Velocity dev mode
velocity.dev.mode=false
# Jetty服务器属性.
jetty.maxThreads=                                                               #最大线程数
jetty.ssl.port=                                                                   #Jetty SSL端口
jetty.port=                                                                         #Jetty端口
jetty.keystore=keystore                                                          #SSL文件名
jetty.password=123456                                                             #SSL文件密码
jetty.keypassword=123456                                                      #Jetty主密码 与 keystore文件相同
jetty.truststore=keystore                                                                #SSL文件名
jetty.trustpassword=123456                                                   # SSL文件密码
 
# 执行服务器属性
executor.port=                                                               #执行服务器端口
 
# 邮件设置
mail.sender=xxxxxxxx@.com                                       #发送邮箱
mail.host=smtp..com                                                       #发送邮箱smtp地址
mail.user=xxxxxxxx                                       #发送邮件时显示的名称
mail.password=**********                                                 #邮箱密码
job.failure.email=xxxxxxxx@.com                              #任务失败时发送邮件的地址
job.success.email=xxxxxxxx@.com                            #任务成功时发送邮件的地址
lockdown.create.projects=false                                           #
cache.directory=cache                                                            #缓存目录

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

 #Azkaban
default.timezone.id=Asia/Shanghai                                              #时区
 
# Azkaban JobTypes 插件配置
azkaban.jobtype.plugin.dir=plugins/jobtypes                   #jobtype 插件所在位置
 
#Loader for projects
executor.global.properties=conf/global.properties
azkaban.project.dir=projects
 
#数据库设置
database.type=mysql                                                                       #数据库类型(目前只支持mysql)
mysql.port=                                                                                #数据库端口号
mysql.host=192.168.3.129                                                           #数据库IP地址
mysql.database=azkaban                                                                #数据库实例名
mysql.user=root                                                                       #数据库用户名
mysql.password=123456 #数据库密码
mysql.numconnections=                                                           #最大连接数
 
# 执行服务器配置
executor.maxThreads=                                                                #最大线程数
executor.port=                                                               #端口号(如修改,请与web服务中一致)
executor.flow.threads=                                                                #线程数

然后进行用户配置,进入azkaban web服务器conf目录,修改azkaban-users.xml,vi azkaban-users.xml 增加 管理员用户:

[root@master conf]# vim /home/hadoop/azkabantools/server/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>

8:配置完成以后可以启动azkaban,可以先启动azkaban web服务器:

在azkaban web服务器目录下执行启动命令:bin/azkaban-web-start.sh

在azkaban web服务器目录下执行关闭命令:[root@master server]# bin/azkaban-web-shutdown.sh

  注意:在web服务器根目录运行或者启动到后台运行:
        nohup  bin/azkaban-web-start.sh  1>/tmp/azstd.out  2>/tmp/azerr.out &

工作流调度器azkaban(以及各种工作流调度器比对)

然后就报下面的错,出错了,就解决呗,错误和解决方法如下所示:

 [root@master server]# bin/azkaban-web-start.sh
Using Hadoop from /home/hadoop/hadoop-2.4.
Using Hive from
bin/..
:bin/../lib/azkaban-2.5..jar:bin/../lib/commons-collections-3.2..jar:bin/../lib/commons-configuration-1.8.jar:bin/../lib/commons-dbcp-1.4.jar:bin/../lib/commons-dbutils-1.5.jar:bin/../lib/commons-email-1.2.jar:bin/../lib/commons-fileupload-1.2..jar:bin/../lib/commons-io-2.4.jar:bin/../lib/commons-jexl-2.1..jar:bin/../lib/commons-lang-2.6.jar:bin/../lib/commons-logging-1.1..jar:bin/../lib/commons-pool-1.6.jar:bin/../lib/guava-13.0..jar:bin/../lib/h2-1.3..jar:bin/../lib/httpclient-4.2..jar:bin/../lib/httpcore-4.2..jar:bin/../lib/jackson-core-asl-1.9..jar:bin/../lib/jackson-mapper-asl-1.9..jar:bin/../lib/jetty-6.1..jar:bin/../lib/jetty-util-6.1..jar:bin/../lib/joda-time-2.0.jar:bin/../lib/jopt-simple-4.3.jar:bin/../lib/junit-4.8.jar:bin/../lib/log4j-1.2..jar:bin/../lib/mail-1.4..jar:bin/../lib/mysql-connector-java-5.1..jar:bin/../lib/servlet-api-2.5.jar:bin/../lib/slf4j-api-1.6..jar:bin/../lib/slf4j-log4j12-1.6..jar:bin/../lib/velocity-1.7.jar:bin/../lib/velocity-tools-2.0.jar:bin/../extlib/*.jar:bin/../plugins/*/*.jar:/home/hadoop/hadoop-2.4./conf:/home/hadoop/hadoop-2.4./*:/conf:/lib/*
[root@master server]# Invalid maximum heap size: -Xmx4G
The specified size exceeds the maximum representable size.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

解决方法:
请修改文件如:vim azkaban\azkaban-web-2.5.0\bin\azkaban-web-start.sh

打开文件使用命令搜索,在命令行模式下,按shift+:键打出冒号,然后输入/,然后输入想要搜索的内容,如:/-Xmx4G找到以后进行替换;

将文件中的  AZKABAN_OPTS="-Xmx4G" 修改为  AZKABAN_OPTS="-Xmx512M"

报错原因如:设置的大小按照机器的存储而定,如果设置太大可能无法启动,设置太小会内存溢出。否则启动报错。


启动过程如下即启动成功(按Enter键,即可继续输入linux命令进行操作executor,因为这只是打印一下启动日志,azkaban已经启动起来了,可以使用jps进行查看进程):

 [root@master server]# bin/azkaban-web-start.sh
Using Hadoop from /home/hadoop/hadoop-2.4.
Using Hive from
bin/..
:bin/../lib/azkaban-2.5..jar:bin/../lib/commons-collections-3.2..jar:bin/../lib/commons-configuration-1.8.jar:bin/../lib/commons-dbcp-1.4.jar:bin/../lib/commons-dbutils-1.5.jar:bin/../lib/commons-email-1.2.jar:bin/../lib/commons-fileupload-1.2..jar:bin/../lib/commons-io-2.4.jar:bin/../lib/commons-jexl-2.1..jar:bin/../lib/commons-lang-2.6.jar:bin/../lib/commons-logging-1.1..jar:bin/../lib/commons-pool-1.6.jar:bin/../lib/guava-13.0..jar:bin/../lib/h2-1.3..jar:bin/../lib/httpclient-4.2..jar:bin/../lib/httpcore-4.2..jar:bin/../lib/jackson-core-asl-1.9..jar:bin/../lib/jackson-mapper-asl-1.9..jar:bin/../lib/jetty-6.1..jar:bin/../lib/jetty-util-6.1..jar:bin/../lib/joda-time-2.0.jar:bin/../lib/jopt-simple-4.3.jar:bin/../lib/junit-4.8.jar:bin/../lib/log4j-1.2..jar:bin/../lib/mail-1.4..jar:bin/../lib/mysql-connector-java-5.1..jar:bin/../lib/servlet-api-2.5.jar:bin/../lib/slf4j-api-1.6..jar:bin/../lib/slf4j-log4j12-1.6..jar:bin/../lib/velocity-1.7.jar:bin/../lib/velocity-tools-2.0.jar:bin/../extlib/*.jar:bin/../plugins/*/*.jar:/home/hadoop/hadoop-2.4./conf:/home/hadoop/hadoop-2.4./*:/conf:/lib/*
[root@master server]# 2017/12/14 14:43:46.276 +0800 ERROR [AzkabanWebServer] [Azkaban] Starting Jetty Azkaban Executor...
2017/12/14 14:43:46.292 +0800 INFO [AzkabanServer] [Azkaban] Loading azkaban settings file from bin/../conf
2017/12/14 14:43:46.292 +0800 INFO [AzkabanServer] [Azkaban] Loading azkaban properties file
2017/12/14 14:43:46.306 +0800 INFO [AzkabanWebServer] [Azkaban] Setting up Jetty Https Server with port:8443 and numThreads:25
2017/12/14 14:43:46.327 +0800 INFO [log] [Azkaban] Logging to org.slf4j.impl.Log4jLoggerAdapter(org.mortbay.log) via org.mortbay.log.Slf4jLog
2017/12/14 14:43:46.357 +0800 INFO [AzkabanWebServer] [Azkaban] Loading user manager class azkaban.user.XmlUserManager
2017/12/14 14:43:46.384 +0800 INFO [XmlUserManager] [Azkaban] Loading user azkaban
2017/12/14 14:43:46.386 +0800 INFO [XmlUserManager] [Azkaban] Loading user metrics
2017/12/14 14:43:46.386 +0800 INFO [XmlUserManager] [Azkaban] Loading user admin
2017/12/14 14:43:46.811 +0800 INFO [AzkabanWebServer] [Azkaban] Loading JDBC for project management
2017/12/14 14:43:46.815 +0800 INFO [ProjectManager] [Azkaban] Project version retention is set to 3
2017/12/14 14:43:46.816 +0800 INFO [ExecutorManager] [Azkaban] Cleaning old logs from execution_logs
2017/12/14 14:43:47.013 +0800 INFO [ExecutorManager] [Azkaban] Cleaning old log files before 2017-09-21T14:43:46.853+08:00
2017/12/14 14:43:47.019 +0800 INFO [ExecutorManager] [Azkaban] Cleaned up 0 log entries.
2017/12/14 14:43:47.056 +0800 INFO [TriggerManager] [Azkaban] TriggerManager loaded.
2017/12/14 14:43:47.057 +0800 INFO [AzkabanWebServer] [Azkaban] Loading built-in checker and action types
2017/12/14 14:43:47.064 +0800 INFO [CheckerTypeLoader] [Azkaban] Registering checker BasicTimeChecker
2017/12/14 14:43:47.064 +0800 INFO [CheckerTypeLoader] [Azkaban] Registering checker SlaChecker
2017/12/14 14:43:47.064 +0800 INFO [CheckerTypeLoader] [Azkaban] Registering checker ExecutionChecker
2017/12/14 14:43:47.064 +0800 INFO [ActionTypeLoader] [Azkaban] Registering action ExecuteFlowAction
2017/12/14 14:43:47.065 +0800 INFO [ActionTypeLoader] [Azkaban] Registering action KillExecutionAction
2017/12/14 14:43:47.065 +0800 INFO [ActionTypeLoader] [Azkaban] Registering action AlertAction
2017/12/14 14:43:47.065 +0800 INFO [ActionTypeLoader] [Azkaban] Registering action CreateTriggerAction
2017/12/14 14:43:47.065 +0800 INFO [AzkabanWebServer] [Azkaban] Loading trigger based scheduler
2017/12/14 14:43:47.069 +0800 INFO [AzkabanWebServer] [Azkaban] Loading plug-in checker and action types
2017/12/14 14:43:47.069 +0800 ERROR [AzkabanWebServer] [Azkaban] plugin path plugins/triggers doesn't exist!
2017/12/14 14:43:47.069 +0800 INFO [AzkabanWebServer] [Azkaban] Setting timezone to Asia/Shanghai
2017/12/14 14:43:47.069 +0800 INFO [AzkabanWebServer] [Azkaban] Registering MBeans...
2017/12/14 14:43:47.157 +0800 INFO [AzkabanWebServer] [Azkaban] Bean azkaban.jmx.JmxJettyServer registered.
2017/12/14 14:43:47.163 +0800 INFO [AzkabanWebServer] [Azkaban] Bean azkaban.jmx.JmxTriggerManager registered.
2017/12/14 14:43:47.172 +0800 INFO [AzkabanWebServer] [Azkaban] Bean azkaban.jmx.JmxExecutorManager registered.
2017/12/14 14:43:47.175 +0800 INFO [AzkabanWebServer] [Azkaban] Setting up web resource dir web/
2017/12/14 14:43:47.249 +0800 INFO [JdbcTriggerLoader] [Azkaban] Loading all triggers from db.
2017/12/14 14:43:47.308 +0800 INFO [JdbcTriggerLoader] [Azkaban] Loaded 0 triggers.
2017/12/14 14:43:47.308 +0800 INFO [log] [Azkaban] jetty-6.1.26
2017/12/14 14:43:47.991 +0800 INFO [log] [Azkaban] Started SslSocketConnector@0.0.0.0:8443
2017/12/14 14:43:47.993 +0800 INFO [AzkabanWebServer] [Azkaban] Server running on ssl port 8443.

然后启动执行服务器,在执行服务器目录下执行启动命令:bin/azkaban-executor-start.sh,关闭命令:[root@master executor]# bin/azkaban-executor-shutdown.sh注:只能要执行服务器根目录运行;

启动完成后,在浏览器(建议使用谷歌浏览器)中输入https://服务器IP地址:8443 ,即可访问azkaban服务了.在登录中输入刚才新的户用名及密码,点击 login.

[root@master executor]# bin/azkaban-executor-start.sh

出现和启动web一样的错误,这里自己解决一下即可:

[root@master executor]# vim bin/azkaban-executor-start.sh

解决完错误以后接着启动即可:

 [root@master executor]# bin/azkaban-executor-start.sh
Using Hadoop from /home/hadoop/hadoop-2.4.
Using Hive from
bin/..
:bin/../lib/azkaban-2.5..jar:bin/../lib/commons-collections-3.2..jar:bin/../lib/commons-configuration-1.8.jar:bin/../lib/commons-dbcp-1.4.jar:bin/../lib/commons-dbutils-1.5.jar:bin/../lib/commons-email-1.2.jar:bin/../lib/commons-fileupload-1.2..jar:bin/../lib/commons-io-2.4.jar:bin/../lib/commons-jexl-2.1..jar:bin/../lib/commons-lang-2.6.jar:bin/../lib/commons-logging-1.1..jar:bin/../lib/commons-pool-1.6.jar:bin/../lib/guava-13.0..jar:bin/../lib/h2-1.3..jar:bin/../lib/httpclient-4.2..jar:bin/../lib/httpcore-4.2..jar:bin/../lib/jackson-core-asl-1.9..jar:bin/../lib/jackson-mapper-asl-1.9..jar:bin/../lib/jetty-6.1..jar:bin/../lib/jetty-util-6.1..jar:bin/../lib/joda-time-2.0.jar:bin/../lib/jopt-simple-4.3.jar:bin/../lib/junit-4.8.jar:bin/../lib/log4j-1.2..jar:bin/../lib/mail-1.4..jar:bin/../lib/mysql-connector-java-5.1..jar:bin/../lib/servlet-api-2.5.jar:bin/../lib/slf4j-api-1.6..jar:bin/../lib/slf4j-log4j12-1.6..jar:bin/../lib/velocity-1.7.jar:bin/../lib/velocity-tools-2.0.jar:bin/../extlib/*.jar:bin/../plugins/*/*.jar:/home/hadoop/hadoop-2.4./conf:/home/hadoop/hadoop-2.4./*:/conf:/lib/*
Starting AzkabanExecutorServer on port 12321 ...
[root@master executor]# 2017/12/14 14:52:31.724 +0800 ERROR [AzkabanExecutorServer] [Azkaban] Starting Jetty Azkaban Executor...
2017/12/14 14:52:31.751 +0800 INFO [AzkabanServer] [Azkaban] Loading azkaban settings file from bin/../conf
2017/12/14 14:52:31.752 +0800 INFO [AzkabanServer] [Azkaban] Loading azkaban private properties file
2017/12/14 14:52:31.753 +0800 INFO [AzkabanServer] [Azkaban] Loading azkaban properties file
2017/12/14 14:52:31.776 +0800 INFO [AzkabanExecutorServer] [Azkaban] Setting timezone to Asia/Shanghai
2017/12/14 14:52:31.805 +0800 INFO [log] [Azkaban] Logging to org.slf4j.impl.Log4jLoggerAdapter(org.mortbay.log) via org.mortbay.log.Slf4jLog
2017/12/14 14:52:31.882 +0800 INFO [FlowRunnerManager] [Azkaban] Execution dir retention set to 86400000 ms
2017/12/14 14:52:31.894 +0800 INFO [FlowRunnerManager] [Azkaban] Cleaning recently finished
2017/12/14 14:52:31.895 +0800 INFO [FlowRunnerManager] [Azkaban] Cleaning old projects
2017/12/14 14:52:31.896 +0800 INFO [FlowRunnerManager] [Azkaban] Cleaning old execution dirs
2017/12/14 14:52:31.922 +0800 INFO [AzkabanExecutorServer] [Azkaban] Registering MBeans...
2017/12/14 14:52:31.993 +0800 INFO [AzkabanExecutorServer] [Azkaban] Bean azkaban.jmx.JmxJettyServer registered.
2017/12/14 14:52:32.003 +0800 INFO [AzkabanExecutorServer] [Azkaban] Bean azkaban.jmx.JmxFlowRunnerManager registered.
2017/12/14 14:52:32.003 +0800 INFO [log] [Azkaban] jetty-6.1.26
2017/12/14 14:52:32.108 +0800 INFO [log] [Azkaban] Started SocketConnector@0.0.0.0:12321
2017/12/14 14:52:32.108 +0800 INFO [AzkabanExecutorServer] [Azkaban] Azkaban Executor Server started on port 12321

最后可以进行浏览器访问查看,如下所示(账号密码是azkaban-users.xml配置文件里面配置的):

由于访问https,浏览器会拦截,这里添加可信任即可:

工作流调度器azkaban(以及各种工作流调度器比对)

工作流调度器azkaban(以及各种工作流调度器比对)

9:Azkaban的简单实用,Azkaba内置的任务类型支持command、java;

Command类型单一job示例:

第一步:创建job描述文件:

 #command.job
type=command
command=echo 'hello world !'

第二步:将job资源文件打包成zip文件(在window打包):

第三步:通过azkaban的web管理平台创建project并上传job压缩包,首先呢,需要创建project:

工作流调度器azkaban(以及各种工作流调度器比对)

然后上传你的zip包,必须是zip包,如果是rar包会报如下的错误,如下所示:

页面也提示如下错误:Installation Failed. Error unzipping file.

 azkaban.project.ProjectManagerException: Error unzipping file.
at azkaban.project.ProjectManager.uploadProject(ProjectManager.java:)
at azkaban.webapp.servlet.ProjectManagerServlet.ajaxHandleUpload(ProjectManagerServlet.java:)
at azkaban.webapp.servlet.ProjectManagerServlet.handleUpload(ProjectManagerServlet.java:)
at azkaban.webapp.servlet.ProjectManagerServlet.handleMultiformPost(ProjectManagerServlet.java:)
at azkaban.webapp.servlet.LoginAbstractAzkabanServlet.doPost(LoginAbstractAzkabanServlet.java:)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:)
at org.mortbay.jetty.Server.handle(Server.java:)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:)
at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:)
at org.mortbay.jetty.security.SslSocketConnector$SslConnection.run(SslSocketConnector.java:)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:)
Caused by: java.util.zip.ZipException: error in opening zip file
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:)
at java.util.zip.ZipFile.<init>(ZipFile.java:)
at java.util.zip.ZipFile.<init>(ZipFile.java:)
at azkaban.project.ProjectManager.unzipFile(ProjectManager.java:)
at azkaban.project.ProjectManager.uploadProject(ProjectManager.java:)
... more

如果Mysql的图形化工具无法查看自己的创建的hive或者azkaban数据表,应该是没有权限的问题,赋予一下权限即可:

如果出现没有权限的问题,在mysql授权(在安装mysql的机器上执行)
    mysql -uroot -p123456
    #(执行下面的语句  *.*:所有库下的所有表   %:任何IP地址或主机都可以连接)
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
    FLUSH PRIVILEGES;

工作流调度器azkaban(以及各种工作流调度器比对)

红色区域内本应该存在上传的文件的,可是这里死活不出来,不知道什么问题。百度好像也没有说怎么解决,这里先记一下,看看日后解决的时候再贴一下。好难受。

此时此刻,离上句的好难受已经过去大约30分钟了,突然想到一件事情,然后就解决这个问题了,开始呢,我搞了一个txt文件,写上上面的命令,然后打成zip包,不是rar包,然后提交死活,页面不显示,感觉学习新东西,自己脑残一样,最后发现文件格式必须是.job格式的,然后打成的.zip包的。(azkaban上传的zip包页面不显示,No FlowsNo flows have been uploaded to this project yet.如果你搜索这些关键字的话,看到这些话,希望可以帮助到你,最后注意文件的格式必须为UTF-8);

工作流调度器azkaban(以及各种工作流调度器比对)

然后呢,可以看看summary可以看看最后一次运行状态,正在运行的状态等等。看看Graph工作流图;可以点击Execute Flow进行任务调度,如下所示:

工作流调度器azkaban(以及各种工作流调度器比对)

然后出现下面界面:

工作流调度器azkaban(以及各种工作流调度器比对)

最后如下所示:

工作流调度器azkaban(以及各种工作流调度器比对)

到此结束,复杂案例,以后有机会再脑补吧。


azkaban后台启动,偶尔会报这个错误,这里先不解决了,以后真正实在不行再来解决它,网上好多方法,没去测试是否可行。先留一下吧。

 // ::55.147 + WARN [log] [Azkaban] EXCEPTION
javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:)
at sun.security.ssl.SSLSocketImpl.waitForClose(SSLSocketImpl.java:)
at sun.security.ssl.HandshakeOutStream.flush(HandshakeOutStream.java:)
at sun.security.ssl.Handshaker.sendChangeCipherSpec(Handshaker.java:)
at sun.security.ssl.ServerHandshaker.sendChangeCipherAndFinish(ServerHandshaker.java:)
at sun.security.ssl.ServerHandshaker.clientHello(ServerHandshaker.java:)
at sun.security.ssl.ServerHandshaker.processMessage(ServerHandshaker.java:)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:)
at org.mortbay.jetty.security.SslSocketConnector$SslConnection.run(SslSocketConnector.java:)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:)
Caused by: java.io.EOFException: SSL peer shut down incorrectly
at sun.security.ssl.InputRecord.read(InputRecord.java:)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:)
... more
// ::55.153 + WARN [log] [Azkaban] EXCEPTION
javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:)
at sun.security.ssl.SSLSocketImpl.waitForClose(SSLSocketImpl.java:)
at sun.security.ssl.HandshakeOutStream.flush(HandshakeOutStream.java:)
at sun.security.ssl.Handshaker.sendChangeCipherSpec(Handshaker.java:)
at sun.security.ssl.ServerHandshaker.sendChangeCipherAndFinish(ServerHandshaker.java:)
at sun.security.ssl.ServerHandshaker.clientHello(ServerHandshaker.java:)
at sun.security.ssl.ServerHandshaker.processMessage(ServerHandshaker.java:)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:)
at org.mortbay.jetty.security.SslSocketConnector$SslConnection.run(SslSocketConnector.java:)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:)
Caused by: java.io.EOFException: SSL peer shut down incorrectly
at sun.security.ssl.InputRecord.read(InputRecord.java:)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:)
... more
// ::06.377 + WARN [log] [Azkaban] EXCEPTION
javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:)
at org.mortbay.jetty.security.SslSocketConnector$SslConnection.run(SslSocketConnector.java:)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:)
Caused by: java.io.EOFException: SSL peer shut down incorrectly
at sun.security.ssl.InputRecord.read(InputRecord.java:)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:)
... more