精华内容
参与话题
问答
  • 工作流调度

    2018-09-29 09:07:12
    【郑州校区】大数据离线阶段Day7之模块开发----工作流调度整个项目的数据按照处理过程,从数据采集到数据分析,再到结果数据的导出,一系列的任务可以分割成若干个azkaban的job单元,然后由工作流调度器调度执行。...

    【郑州校区】大数据离线阶段Day7之模块开发----工作流调度
    整个项目的数据按照处理过程,从数据采集到数据分析,再到结果数据的导出,一系列的任务可以分割成若干个azkaban的job单元,然后由工作流调度器调度执行。
    调度脚本的编写难点在于shell脚本。但是一般都是有固定编写模式。大家可以参考资料中的脚本进行编写。大体框架如下:
    #!/bin/bash
    #set java env
    #set hadoop env
    #设置一些主类、目录等常量
    #获取时间信息
    #shell主程序、结合流程控制(if....else)去分别执行shell命令。
    更多工作流及hql脚本定义见参考资料。

    转载于:https://blog.51cto.com/13587708/2287400

    展开全文
  • 工作流调度器azkaban(以及各种工作流调度器比对) 1:工作流调度系统的作用: (1):一个完整的数据分析系统通常都是由大量任务单元组成:比如,shell脚本程序,java程序,mapreduce程序、hive...

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

    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;


    具体安装过程如下所示:

     1 <!--创建文件夹相应的文件夹-->
     2 [root@master hadoop]# mkdir azkabantools
     3 [root@master hadoop]# mkdir azkaban
     4 [root@master hadoop]# cd package/
     5 
     6 <!--解压缩的操作-->
     7 [root@master package]# tar -zxvf azkaban-web-server-2.5.0.tar.gz -C /home/hadoop/azkabantools/
     8 [root@master package]# ll /home/hadoop/azkabantools/
     9 [root@master package]# tar -zxvf azkaban-executor-server-2.5.0.tar.gz -C /home/hadoop/azkabantools/
    10 [root@master package]# ll /home/hadoop/azkabantools/
    11 [root@master package]# tar -zxvf azkaban-sql-script-2.5.0.tar.gz -C /home/hadoop/azkabantools/
    12 [root@master package]# ll /home/hadoop/azkabantools/
    13 [root@master package]# cd /home/hadoop/azkabantools/
    14 [root@master azkabantools]# ls
    15 [root@master azkabantools]# ll
    16 
    17 <!--修改azkaban的名称以及查看等等操作-->
    18 [root@master azkabantools]# mv azkaban-web-2.5.0 server
    19 [root@master azkabantools]# mv azkaban-executor-2.5.0 executor
    20 [root@master azkabantools]# ll
    21 
    22 <!--手动执行mysql脚本创建数据表-->
    23 [root@master hadoop]# mysql -uroot -p123456
    24 mysql> create database azkaban;
    25 mysql> use azkaban;
    26 mysql> source /home/hadoop/azkabantools/azkaban-2.5.0/create-all-sql-2.5.0.sql

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

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

    此命令生成证书:keytool -keystore keystore -alias jetty -genkey -keyalg RSA
     1 [root@master azkabantools]# keytool -keystore keystore -alias jetty -genkey -keyalg RSA
     2 Enter keystore password:输入密码  
     3 Re-enter new password:输入确认密码 
     4 What is your first and last name?
     5   [Unknown]:回车  
     6 What is the name of your organizational unit?
     7   [Unknown]:回车  
     8 What is the name of your organization?
     9   [Unknown]:回车  
    10 What is the name of your City or Locality?
    11   [Unknown]:回车  
    12 What is the name of your State or Province?
    13   [Unknown]:回车  
    14 What is the two-letter country code for this unit?
    15   [Unknown]:  CN      
    16 Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN correct?
    17   [no]:  y
    18 
    19 Enter key password for <jetty>
    20     (RETURN if same as keystore password):回车(密码是否和上面的一样)  
    21 [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

     1 #Azkaban Personalization Settings
     2 azkaban.name=Test                           #服务器UI名称,用于服务器上方显示的名字
     3 azkaban.label=My Local Azkaban                               #描述
     4 azkaban.color=#FF3601                                                 #UI颜色
     5 azkaban.default.servlet.path=/index                         #
     6 web.resource.dir=web/                                                 #默认根web目录
     7 default.timezone.id=Asia/Shanghai                           #默认时区,已改为亚洲/上海 默认为美国
     8  
     9 #Azkaban UserManager class
    10 user.manager.class=azkaban.user.XmlUserManager   #用户权限管理默认类
    11 user.manager.xml.file=conf/azkaban-users.xml              #用户配置,具体配置参加下文
    12  
    13 #Loader for projects
    14 executor.global.properties=conf/global.properties    # global配置文件所在位置
    15 azkaban.project.dir=projects                                                #
    16  
    17 database.type=mysql                                                              #数据库类型
    18 mysql.port=3306                                                                       #端口号
    19 mysql.host=192.168.3.129                                                      #数据库连接IP
    20 mysql.database=azkaban                                                       #数据库实例名
    21 mysql.user=root                                                                 #数据库用户名
    22 mysql.password=123456                                                         #数据库密码
    23 mysql.numconnections=100                                                  #最大连接数
    24  
    25 # Velocity dev mode
    26 velocity.dev.mode=false
    27 # Jetty服务器属性.
    28 jetty.maxThreads=25                                                               #最大线程数
    29 jetty.ssl.port=8443                                                                   #Jetty SSL端口
    30 jetty.port=8081                                                                         #Jetty端口
    31 jetty.keystore=keystore                                                          #SSL文件名
    32 jetty.password=123456                                                             #SSL文件密码
    33 jetty.keypassword=123456                                                      #Jetty主密码 与 keystore文件相同
    34 jetty.truststore=keystore                                                                #SSL文件名
    35 jetty.trustpassword=123456                                                   # SSL文件密码
    36  
    37 # 执行服务器属性
    38 executor.port=12321                                                               #执行服务器端口
    39  
    40 # 邮件设置
    41 mail.sender=xxxxxxxx@163.com                                       #发送邮箱
    42 mail.host=smtp.163.com                                                       #发送邮箱smtp地址
    43 mail.user=xxxxxxxx                                       #发送邮件时显示的名称
    44 mail.password=**********                                                 #邮箱密码
    45 job.failure.email=xxxxxxxx@163.com                              #任务失败时发送邮件的地址
    46 job.success.email=xxxxxxxx@163.com                            #任务成功时发送邮件的地址
    47 lockdown.create.projects=false                                           #
    48 cache.directory=cache                                                            #缓存目录

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

     1 #Azkaban
     2 default.timezone.id=Asia/Shanghai                                              #时区
     3  
     4 # Azkaban JobTypes 插件配置
     5 azkaban.jobtype.plugin.dir=plugins/jobtypes                   #jobtype 插件所在位置
     6  
     7 #Loader for projects
     8 executor.global.properties=conf/global.properties
     9 azkaban.project.dir=projects
    10  
    11 #数据库设置
    12 database.type=mysql                                                                       #数据库类型(目前只支持mysql)
    13 mysql.port=3306                                                                                #数据库端口号
    14 mysql.host=192.168.3.129                                                           #数据库IP地址
    15 mysql.database=azkaban                                                                #数据库实例名
    16 mysql.user=root                                                                       #数据库用户名
    17 mysql.password=123456                                  #数据库密码
    18 mysql.numconnections=100                                                           #最大连接数
    19  
    20 # 执行服务器配置
    21 executor.maxThreads=50                                                                #最大线程数
    22 executor.port=12321                                                               #端口号(如修改,请与web服务中一致)
    23 executor.flow.threads=30                                                                #线程数

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

    [root@master conf]# vim /home/hadoop/azkabantools/server/conf/azkaban-users.xml

    1 <azkaban-users>
    2         <user username="azkaban" password="azkaban" roles="admin" groups="azkaban" />
    3         <user username="metrics" password="metrics" roles="metrics"/>
    4         <user username="admin" password="admin" roles="admin,metrics" />
    5         <role name="admin" permissions="ADMIN" />
    6         <role name="metrics" permissions="METRICS"/>
    7 </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 &

     

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

    1 [root@master server]# bin/azkaban-web-start.sh 
    2 Using Hadoop from /home/hadoop/hadoop-2.4.1
    3 Using Hive from 
    4 bin/..
    5 :bin/../lib/azkaban-2.5.0.jar:bin/../lib/commons-collections-3.2.1.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.1.jar:bin/../lib/commons-io-2.4.jar:bin/../lib/commons-jexl-2.1.1.jar:bin/../lib/commons-lang-2.6.jar:bin/../lib/commons-logging-1.1.1.jar:bin/../lib/commons-pool-1.6.jar:bin/../lib/guava-13.0.1.jar:bin/../lib/h2-1.3.170.jar:bin/../lib/httpclient-4.2.1.jar:bin/../lib/httpcore-4.2.1.jar:bin/../lib/jackson-core-asl-1.9.5.jar:bin/../lib/jackson-mapper-asl-1.9.5.jar:bin/../lib/jetty-6.1.26.jar:bin/../lib/jetty-util-6.1.26.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.16.jar:bin/../lib/mail-1.4.5.jar:bin/../lib/mysql-connector-java-5.1.28.jar:bin/../lib/servlet-api-2.5.jar:bin/../lib/slf4j-api-1.6.1.jar:bin/../lib/slf4j-log4j12-1.6.4.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.1/conf:/home/hadoop/hadoop-2.4.1/*:/conf:/lib/*
    6 [root@master server]# Invalid maximum heap size: -Xmx4G
    7 The specified size exceeds the maximum representable size.
    8 Error: Could not create the Java Virtual Machine.
    9 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进行查看进程):

     1 [root@master server]# bin/azkaban-web-start.sh 
     2 Using Hadoop from /home/hadoop/hadoop-2.4.1
     3 Using Hive from 
     4 bin/..
     5 :bin/../lib/azkaban-2.5.0.jar:bin/../lib/commons-collections-3.2.1.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.1.jar:bin/../lib/commons-io-2.4.jar:bin/../lib/commons-jexl-2.1.1.jar:bin/../lib/commons-lang-2.6.jar:bin/../lib/commons-logging-1.1.1.jar:bin/../lib/commons-pool-1.6.jar:bin/../lib/guava-13.0.1.jar:bin/../lib/h2-1.3.170.jar:bin/../lib/httpclient-4.2.1.jar:bin/../lib/httpcore-4.2.1.jar:bin/../lib/jackson-core-asl-1.9.5.jar:bin/../lib/jackson-mapper-asl-1.9.5.jar:bin/../lib/jetty-6.1.26.jar:bin/../lib/jetty-util-6.1.26.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.16.jar:bin/../lib/mail-1.4.5.jar:bin/../lib/mysql-connector-java-5.1.28.jar:bin/../lib/servlet-api-2.5.jar:bin/../lib/slf4j-api-1.6.1.jar:bin/../lib/slf4j-log4j12-1.6.4.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.1/conf:/home/hadoop/hadoop-2.4.1/*:/conf:/lib/*
     6 [root@master server]# 2017/12/14 14:43:46.276 +0800 ERROR [AzkabanWebServer] [Azkaban] Starting Jetty Azkaban Executor...
     7 2017/12/14 14:43:46.292 +0800 INFO [AzkabanServer] [Azkaban] Loading azkaban settings file from bin/../conf
     8 2017/12/14 14:43:46.292 +0800 INFO [AzkabanServer] [Azkaban] Loading azkaban properties file
     9 2017/12/14 14:43:46.306 +0800 INFO [AzkabanWebServer] [Azkaban] Setting up Jetty Https Server with port:8443 and numThreads:25
    10 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
    11 2017/12/14 14:43:46.357 +0800 INFO [AzkabanWebServer] [Azkaban] Loading user manager class azkaban.user.XmlUserManager
    12 2017/12/14 14:43:46.384 +0800 INFO [XmlUserManager] [Azkaban] Loading user azkaban
    13 2017/12/14 14:43:46.386 +0800 INFO [XmlUserManager] [Azkaban] Loading user metrics
    14 2017/12/14 14:43:46.386 +0800 INFO [XmlUserManager] [Azkaban] Loading user admin
    15 2017/12/14 14:43:46.811 +0800 INFO [AzkabanWebServer] [Azkaban] Loading JDBC for project management
    16 2017/12/14 14:43:46.815 +0800 INFO [ProjectManager] [Azkaban] Project version retention is set to 3
    17 2017/12/14 14:43:46.816 +0800 INFO [ExecutorManager] [Azkaban] Cleaning old logs from execution_logs
    18 2017/12/14 14:43:47.013 +0800 INFO [ExecutorManager] [Azkaban] Cleaning old log files before 2017-09-21T14:43:46.853+08:00
    19 2017/12/14 14:43:47.019 +0800 INFO [ExecutorManager] [Azkaban] Cleaned up 0 log entries.
    20 2017/12/14 14:43:47.056 +0800 INFO [TriggerManager] [Azkaban] TriggerManager loaded.
    21 2017/12/14 14:43:47.057 +0800 INFO [AzkabanWebServer] [Azkaban] Loading built-in checker and action types
    22 2017/12/14 14:43:47.064 +0800 INFO [CheckerTypeLoader] [Azkaban] Registering checker BasicTimeChecker
    23 2017/12/14 14:43:47.064 +0800 INFO [CheckerTypeLoader] [Azkaban] Registering checker SlaChecker
    24 2017/12/14 14:43:47.064 +0800 INFO [CheckerTypeLoader] [Azkaban] Registering checker ExecutionChecker
    25 2017/12/14 14:43:47.064 +0800 INFO [ActionTypeLoader] [Azkaban] Registering action ExecuteFlowAction
    26 2017/12/14 14:43:47.065 +0800 INFO [ActionTypeLoader] [Azkaban] Registering action KillExecutionAction
    27 2017/12/14 14:43:47.065 +0800 INFO [ActionTypeLoader] [Azkaban] Registering action AlertAction
    28 2017/12/14 14:43:47.065 +0800 INFO [ActionTypeLoader] [Azkaban] Registering action CreateTriggerAction
    29 2017/12/14 14:43:47.065 +0800 INFO [AzkabanWebServer] [Azkaban] Loading trigger based scheduler
    30 2017/12/14 14:43:47.069 +0800 INFO [AzkabanWebServer] [Azkaban] Loading plug-in checker and action types
    31 2017/12/14 14:43:47.069 +0800 ERROR [AzkabanWebServer] [Azkaban] plugin path plugins/triggers doesn't exist!
    32 2017/12/14 14:43:47.069 +0800 INFO [AzkabanWebServer] [Azkaban] Setting timezone to Asia/Shanghai
    33 2017/12/14 14:43:47.069 +0800 INFO [AzkabanWebServer] [Azkaban] Registering MBeans...
    34 2017/12/14 14:43:47.157 +0800 INFO [AzkabanWebServer] [Azkaban] Bean azkaban.jmx.JmxJettyServer registered.
    35 2017/12/14 14:43:47.163 +0800 INFO [AzkabanWebServer] [Azkaban] Bean azkaban.jmx.JmxTriggerManager registered.
    36 2017/12/14 14:43:47.172 +0800 INFO [AzkabanWebServer] [Azkaban] Bean azkaban.jmx.JmxExecutorManager registered.
    37 2017/12/14 14:43:47.175 +0800 INFO [AzkabanWebServer] [Azkaban] Setting up web resource dir web/
    38 2017/12/14 14:43:47.249 +0800 INFO [JdbcTriggerLoader] [Azkaban] Loading all triggers from db.
    39 2017/12/14 14:43:47.308 +0800 INFO [JdbcTriggerLoader] [Azkaban] Loaded 0 triggers.
    40 2017/12/14 14:43:47.308 +0800 INFO [log] [Azkaban] jetty-6.1.26
    41 2017/12/14 14:43:47.991 +0800 INFO [log] [Azkaban] Started SslSocketConnector@0.0.0.0:8443
    42 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

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

     1 [root@master executor]# bin/azkaban-executor-start.sh 
     2 Using Hadoop from /home/hadoop/hadoop-2.4.1
     3 Using Hive from 
     4 bin/..
     5 :bin/../lib/azkaban-2.5.0.jar:bin/../lib/commons-collections-3.2.1.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.1.jar:bin/../lib/commons-io-2.4.jar:bin/../lib/commons-jexl-2.1.1.jar:bin/../lib/commons-lang-2.6.jar:bin/../lib/commons-logging-1.1.1.jar:bin/../lib/commons-pool-1.6.jar:bin/../lib/guava-13.0.1.jar:bin/../lib/h2-1.3.170.jar:bin/../lib/httpclient-4.2.1.jar:bin/../lib/httpcore-4.2.1.jar:bin/../lib/jackson-core-asl-1.9.5.jar:bin/../lib/jackson-mapper-asl-1.9.5.jar:bin/../lib/jetty-6.1.26.jar:bin/../lib/jetty-util-6.1.26.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.16.jar:bin/../lib/mail-1.4.5.jar:bin/../lib/mysql-connector-java-5.1.28.jar:bin/../lib/servlet-api-2.5.jar:bin/../lib/slf4j-api-1.6.1.jar:bin/../lib/slf4j-log4j12-1.6.4.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.1/conf:/home/hadoop/hadoop-2.4.1/*:/conf:/lib/*
     6 Starting AzkabanExecutorServer on port 12321 ...
     7 [root@master executor]# 2017/12/14 14:52:31.724 +0800 ERROR [AzkabanExecutorServer] [Azkaban] Starting Jetty Azkaban Executor...
     8 2017/12/14 14:52:31.751 +0800 INFO [AzkabanServer] [Azkaban] Loading azkaban settings file from bin/../conf
     9 2017/12/14 14:52:31.752 +0800 INFO [AzkabanServer] [Azkaban] Loading azkaban private properties file
    10 2017/12/14 14:52:31.753 +0800 INFO [AzkabanServer] [Azkaban] Loading azkaban properties file
    11 2017/12/14 14:52:31.776 +0800 INFO [AzkabanExecutorServer] [Azkaban] Setting timezone to Asia/Shanghai
    12 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
    13 2017/12/14 14:52:31.882 +0800 INFO [FlowRunnerManager] [Azkaban] Execution dir retention set to 86400000 ms
    14 2017/12/14 14:52:31.894 +0800 INFO [FlowRunnerManager] [Azkaban] Cleaning recently finished
    15 2017/12/14 14:52:31.895 +0800 INFO [FlowRunnerManager] [Azkaban] Cleaning old projects
    16 2017/12/14 14:52:31.896 +0800 INFO [FlowRunnerManager] [Azkaban] Cleaning old execution dirs
    17 2017/12/14 14:52:31.922 +0800 INFO [AzkabanExecutorServer] [Azkaban] Registering MBeans...
    18 2017/12/14 14:52:31.993 +0800 INFO [AzkabanExecutorServer] [Azkaban] Bean azkaban.jmx.JmxJettyServer registered.
    19 2017/12/14 14:52:32.003 +0800 INFO [AzkabanExecutorServer] [Azkaban] Bean azkaban.jmx.JmxFlowRunnerManager registered.
    20 2017/12/14 14:52:32.003 +0800 INFO [log] [Azkaban] jetty-6.1.26
    21 2017/12/14 14:52:32.108 +0800 INFO [log] [Azkaban] Started SocketConnector@0.0.0.0:12321
    22 2017/12/14 14:52:32.108 +0800 INFO [AzkabanExecutorServer] [Azkaban] Azkaban Executor Server started on port 12321

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

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

     

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

    Command类型单一job示例:

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

    1 #command.job
    2 type=command                                                    
    3 command=echo 'hello world !'

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

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

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

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

     1 azkaban.project.ProjectManagerException: Error unzipping file.
     2     at azkaban.project.ProjectManager.uploadProject(ProjectManager.java:318)
     3     at azkaban.webapp.servlet.ProjectManagerServlet.ajaxHandleUpload(ProjectManagerServlet.java:1389)
     4     at azkaban.webapp.servlet.ProjectManagerServlet.handleUpload(ProjectManagerServlet.java:1414)
     5     at azkaban.webapp.servlet.ProjectManagerServlet.handleMultiformPost(ProjectManagerServlet.java:163)
     6     at azkaban.webapp.servlet.LoginAbstractAzkabanServlet.doPost(LoginAbstractAzkabanServlet.java:240)
     7     at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
     8     at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
     9     at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    10     at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:401)
    11     at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    12     at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
    13     at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    14     at org.mortbay.jetty.Server.handle(Server.java:326)
    15     at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    16     at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:945)
    17     at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
    18     at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
    19     at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    20     at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)
    21     at org.mortbay.jetty.security.SslSocketConnector$SslConnection.run(SslSocketConnector.java:713)
    22     at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
    23 Caused by: java.util.zip.ZipException: error in opening zip file
    24     at java.util.zip.ZipFile.open(Native Method)
    25     at java.util.zip.ZipFile.<init>(ZipFile.java:215)
    26     at java.util.zip.ZipFile.<init>(ZipFile.java:145)
    27     at java.util.zip.ZipFile.<init>(ZipFile.java:159)
    28     at azkaban.project.ProjectManager.unzipFile(ProjectManager.java:402)
    29     at azkaban.project.ProjectManager.uploadProject(ProjectManager.java:312)
    30     ... 20 more

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

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

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

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

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

    然后出现下面界面:

    最后如下所示:

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


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

     1 2017/12/14 17:40:55.147 +0800 WARN [log] [Azkaban] EXCEPTION 
     2 javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
     3     at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:946)
     4     at sun.security.ssl.SSLSocketImpl.waitForClose(SSLSocketImpl.java:1705)
     5     at sun.security.ssl.HandshakeOutStream.flush(HandshakeOutStream.java:122)
     6     at sun.security.ssl.Handshaker.sendChangeCipherSpec(Handshaker.java:972)
     7     at sun.security.ssl.ServerHandshaker.sendChangeCipherAndFinish(ServerHandshaker.java:1532)
     8     at sun.security.ssl.ServerHandshaker.clientHello(ServerHandshaker.java:671)
     9     at sun.security.ssl.ServerHandshaker.processMessage(ServerHandshaker.java:167)
    10     at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
    11     at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
    12     at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
    13     at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
    14     at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
    15     at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
    16     at org.mortbay.jetty.security.SslSocketConnector$SslConnection.run(SslSocketConnector.java:708)
    17     at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
    18 Caused by: java.io.EOFException: SSL peer shut down incorrectly
    19     at sun.security.ssl.InputRecord.read(InputRecord.java:482)
    20     at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927)
    21     ... 14 more
    22 2017/12/14 17:40:55.153 +0800 WARN [log] [Azkaban] EXCEPTION 
    23 javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
    24     at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:946)
    25     at sun.security.ssl.SSLSocketImpl.waitForClose(SSLSocketImpl.java:1705)
    26     at sun.security.ssl.HandshakeOutStream.flush(HandshakeOutStream.java:122)
    27     at sun.security.ssl.Handshaker.sendChangeCipherSpec(Handshaker.java:972)
    28     at sun.security.ssl.ServerHandshaker.sendChangeCipherAndFinish(ServerHandshaker.java:1532)
    29     at sun.security.ssl.ServerHandshaker.clientHello(ServerHandshaker.java:671)
    30     at sun.security.ssl.ServerHandshaker.processMessage(ServerHandshaker.java:167)
    31     at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
    32     at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
    33     at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
    34     at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
    35     at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
    36     at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
    37     at org.mortbay.jetty.security.SslSocketConnector$SslConnection.run(SslSocketConnector.java:708)
    38     at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
    39 Caused by: java.io.EOFException: SSL peer shut down incorrectly
    40     at sun.security.ssl.InputRecord.read(InputRecord.java:482)
    41     at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927)
    42     ... 14 more
    43 2017/12/14 17:41:06.377 +0800 WARN [log] [Azkaban] EXCEPTION 
    44 javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
    45     at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:946)
    46     at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
    47     at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
    48     at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
    49     at org.mortbay.jetty.security.SslSocketConnector$SslConnection.run(SslSocketConnector.java:708)
    50     at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
    51 Caused by: java.io.EOFException: SSL peer shut down incorrectly
    52     at sun.security.ssl.InputRecord.read(InputRecord.java:482)
    53     at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927)
    54     ... 5 more

     

    posted @ 2017-12-14 15:09 别先生 阅读(...) 评论(...) 编辑 收藏
    展开全文
  • 工作流调度

    2018-02-06 12:21:38
    工作流调度器1. 工作流调度系统产生背景一个完整的数据分析系统通常都是由大量任务单元组成: shell 脚本程序,java 程序,mapreduce 程序、hive 脚本等。 各个任务单元之间存在时间先后依赖关系。 为了很好地...

    工作流调度器

    1. 工作流调度系统产生背景

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

    2. 工作流调度实现方式

    • 简单的任务调度:
      直接使用 linux 的 crontab 来定义,但是缺点也是比较明显,无法设置依赖。

    • 复杂的任务调度:
      自主开发调度平台
      使用开源调度系统,比如 azkaban、ooize、Zeus 等。
      其中知名度比较高的是 Apache Oozie,但是其配置工作流的过程是编写大量的 XML配置,而且代码复杂度比较高,不易于二次开发。开发中用的较多的是azkaban。

    喜欢就点赞评论+关注吧

    这里写图片描述

    感谢阅读,希望能帮助到大家,谢谢大家的支持!

    展开全文
  • Azkaban工作流调度

    2019-08-20 16:21:36
    1. 工作流调度实现方式 简单的任务调度:直接使用linux的crontab来定义,但是缺点也是比较明显,无法设置依赖。 复杂的任务调度:自主开发调度平台,使用开源调度系统,比如azkaban、Apache Oozie、Cascading、...
    1. 工作流调度实现方式
    

    简单的任务调度:直接使用linux的crontab来定义,但是缺点也是比较明显,无法设置依赖。
    复杂的任务调度:自主开发调度平台,使用开源调度系统,比如azkaban、Apache Oozie、Cascading、Hamake等。
    其中知名度比较高的是Apache Oozie,但是其配置工作流的过程是编写大量的XML配置,而且代码复杂度比较高,不易于二次开发。
    Azkaban调度器

    1. Azkaban介绍
    

    Azkaban是由linkedin(领英)公司推出的一个批量工作流任务调度器,用于在一个工作流内以一个特定的顺序运行一组工作和流程。Azkaban使用job配置文件建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流

    Azkaban功能特点:

    * 
    	* 提供功能清晰,简单易用的Web UI界面
    	* 提供job配置文件快速建立任务和任务之间的依赖关系
    	* 提供模块化和可插拔的插件机制,原生支持command、Java、Hive、Pig、Hadoop
    	* 基于Java开发,代码结构清晰,易于二次开发
    
    
    
    
    1. Azkaban原理架构
    

    在这里插入图片描述
    mysql服务器: 存储元数据,如项目名称、项目描述、项目权限、任务状态、SLA规则等
    AzkabanWebServer:对外提供web服务,使用户可以通过web页面管理。职责包括项目管理、权限授权、任务调度、监控executor。
    AzkabanExecutorServer:负责具体的工作流的提交、执行。

    展开全文
  • 工作流调度器azkaban

    2018-11-15 10:56:02
    2.1.1为什么需要工作流调度系统 2.1.2 工作流调度实现方式 2.1.3 常见工作流调度系统 2.1.4 各种调度工具特性对比 2.1.5 Azkaban与Oozie对比 2.2 Azkaban介绍 2. 3 Azkaban安装部署 准备工作 安装 azkaban...
  • Azkaban工作流调度

    2019-10-02 10:30:12
    Azkaban工作流调度器 在Hadoop领域常用的工作流调度系统 Oozie,Azkaban,Cascading,Hamake等等。性能对比:安装:创建ssl配置keytool -keystore keystore -alias jetty...
  • 工作流调度oozie

    2020-05-08 12:58:28
    工作流调度oozie1.什么是oozie2.oozie的架构3.安装oozie3.1 修改core-site.xml3.2 上传oozie的安装包并解压3.3 解压hadooplibs到与oozie平行的目录3.4 创建libext目录3.5 拷贝依赖包到libext3.6 添加ext-2.2.zip...
  • 为您提供Schedulis金融级工作流调度方案下载,Schedulis是微众银行基于LinkedIn的开源项目Azkaban开发的一款工作流任务调度系统,用于解决金融级场景下,大量批量作业任务的复杂依赖、灵活调度。Schedulis系统具备高...
  • Azkaban 工作流调度

    2017-12-18 16:01:00
    Azkaban 工作流调度器 1 概述  1.1 为什么需要工作流调度系统  a)一个完整的数据分析系统通常都是由大量任务单元组成,shell脚本程序,java程序,mapreduce程序、hive脚本等。  b)各任务单元之间存在时间先后...
  • 工作流调度框架

    2018-01-02 16:55:00
    为什么需要工作流调度系统 1.一个完整的数据分析系统通常都是由大量任务单元组成:shell脚本程序,java程序,mapreduce程序、hive脚本等,各任务单元之间存在时间先后及前后依赖关系 为了很好地组织起这样的复杂...
  • 工作流调度器Azkaban

    2019-02-20 17:45:18
    概述1.1 为什么要是用工作流调度系统1.2 工作流的实现方式以及常见的工作流调度系统2. Azkaban介绍3. Azkaban安装3.1 准备工作3.2 安装3.2.1 azkaban web服务器安装3.2.2 azkaban 执行服器安装3.2.3 创建数据库和...
  • azkaban工作流调度

    2019-09-23 09:16:20
    Azkaban工作流调度器 一、课前准备 安装好对应版本的mysql 安装好对应版本的hadoop集群 安装好对应版本的hive 二、课堂主题 本堂课主要围绕Azkaban的知识点进行讲解。主要包括以下几个方面 Azkaban的核心概念 ...
  • 1. 为什么需要工作流调度系统 一个完整的数据分析系统通常都是由大量任务单元组成; shell脚本程序、java程序、mapreduce程序、hive脚本等 各任务单元之间存在时间先后及前后依赖关系 为了很好...
  • 工作流调度器 azkaban

    千次阅读 2018-07-10 10:24:03
    为什么需要工作流调度系统一个完整的数据分析系统通常都是由大量任务单元组成:shell脚本程序,java程序,mapreduce程序、hive脚本等各任务单元之间存在时间先后及前后依赖关系为了很好地组织起这样的复杂执行计划,...
  • Oozie由Cloudera公司贡献给Apache的基于工作流引擎的开源框架,用于Hadoop平台的工作流调度。由Oozie Client和Oozie Server两个组件构成,Oozie Server运行于Java Servlet(Tomcat)容器中的web程序。 1、组件特性 ...

空空如也

1 2 3 4 5 ... 20
收藏数 2,496
精华内容 998
关键字:

工作流调度