自动化定时调度之Azkaban部署及使用

来源:互联网 发布:c语言在线编译 输入 编辑:程序博客网 时间:2024/06/06 09:55
 azkaban的部署使用及如何结合项目的使用思考
1  部署azkaban
1.1 准备工作,下载相关安装包,这里我使用的是2.5版本的
官方:http://azkaban.github.io/downloads.html
还需要一个jdbc的连接jar包:
链接:http://pan.baidu.com/s/1dFe8avJ 密码:0pjh
我参考了这两篇文章进行部署:
http://www.cnblogs.com/whtydn/p/4353695.html
http://blog.javachen.com/2014/08/25/install-azkaban.html
1.2 设置数据库相关配置:
  • 安装Mysql 具体安装过程可参考相关资料,比如http://ifalone.me/305.html ,http://dev.mysql.com/doc/index.html
  • 为Azkaban创建数据库,其中数据库名字不一定是azkaban
    mysql> CREATE DATABASE azkaban;
  • 创建Azkaban数据库的用户,其中用户名字不一定是azkaban
    mysql> CREATE USER 'azkaban'@'%' IDENTIFIED BY '123456';
  • 增加azkaban用户对azkaban数据库的增删改查权限 
    mysql> GRANT ALL  ON  azkaban.* to 'azkaban'@'%' WITH GRANT OPTION;
  • 配置完重启MYSQL
  • 创建Azkaba需要的数据库表,将azkaban-sql-script-2.5.tar.gz解压,执行create-all-sql脚本即可
  • 获取JDBC连接器mysql-connector-java-5.1.25.tar.gz, mysql-connector-java-5.1.25.tar.gz需要在webserver和excutorserver安装完后,分别拷入 Azkaban-web/extlib和azkaban-excutorserver/extlib    
 上面我配置了一个数据库azkaban,配置了这个数据库的操作用户
  azkaban 密码 123456 下面继续安装1.3 安装 web server

将azkaban-web-server-2.5.tar.gz解压到合适目录,如azkaban-web
解压完应该有如下文件目录
Folder    Description
bin       运行 Azkaban jetty server的脚本
conf      Azkaban web server的配置文件
lib       Azkaban依赖的jar包
extlib    放入到这个目录的jar包会被添加Azkaban的classpath
plugins   插件安装在此目录
web       Azkaban web server的相关css,html等文件
我的截图



进入到 azkban-web目录:

获取SSL需要的keystore。此处尤其注意要用java的keytool工具
执行:
keytool -keystore keystore -alias jetty -genkey -keyalg RSA





得到keystore即可:
这里我的密码都是输入的password(系统默认密码就是这个,省的修改了)

修改conf下的 azkaban.properties 配置文件:

a. 修改时区和首页名称:

# Azkaban Personalization Settingsazkaban.name=Solr Taskazkaban.label=By Sageazkaban.color=#FF3601azkaban.default.servlet.path=/indexweb.resource.dir=web/default.timezone.id=Asia/Shanghai

b. 修改 MySql 数据库配置

database.type=mysqlmysql.port=3306mysql.host=localhostmysql.database=azkabanmysql.user=azkabanmysql.password=123456mysql.numconnections=100

c. 修改 Jetty 服务器属性,包括 keystore 的相关配置

# Azkaban Jetty server properties.jetty.hostname=0.0.0.0jetty.maxThreads=25jetty.ssl.port=8443jetty.port=8443jetty.keystore=keystorejetty.password=passwordjetty.keypassword=passwordjetty.truststore=keystorejetty.trustpassword=password

d. 修改邮件设置(可选)

# mail settingsmail.sender=admin@javachen.commail.host=javachen.commail.user=adminmail.password=admin





进入 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-web的服务已经配置完毕了1.4 安装  azkaban-executor-server

进入 azkaban-executor 的conf目录下,配置文件azkaban.properties,包括:

a. 修改时区为:default.timezone.id=Asia/Shanghai

b. 修改 MySql 数据库配置

database.type=mysqlmysql.port=3306mysql.host=localhostmysql.database=azkabanmysql.user=azkabanmysql.password=azkabanmysql.numconnections=100

最后将数据库驱动放入两个服务的extlib下:
cp mysql-connector-java-5.1.25.jar azkaban-web/extlib/
cp mysql-connector-java-5.1.25.jar azkaban-executor/extlib/
配置完成:
1.5 启动服务,访问服务和终止服务
启动服务:
进入 azkaban-web目录
bin/azkaban-web-start.sh
进入 azkaban-executor目录
bin/azkaban-executor-start.sh
启动后 访问地址:
https://ip:host
界面如下:


关闭服务:
进入 azkaban-web目录
bin/azkaban-web-shutdown.sh
进入 azkaban-executor目录
bin/azkaban-executor-shutdown.sh
1.6  执行简单的定时任务脚本
先创建一个工程:



上传 要执行的定时任务脚本(有格式要求):
链接:http://pan.baidu.com/s/1cqj1CU 密码:yqx5


具体使用:
http://blog.csdn.net/xiaolang85/article/details/23171303
1.7  azkaban结合项目中索引的全量导入功能

思考:azkaban目前是单节点(3.0还没发布,有集群) 可能处在故障问题
原有的项目自带的定时导入功能要保留,留作备用方案,当azkaban定时调度服务器宕机时
启用项目自身的定时导入索引任务,当机器恢复服务时,关闭系统自身的定时任务.

代码:
package cn.com.mx.gome.suggest.schedule.socket;

import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;

import javax.mail.Address;

import org.apache.log4j.net.SocketAppender;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.com.mx.gome.search.core.util.prop.PropUtils;
import cn.com.mx.gome.suggest.constant.Const;

/**
 * 判断azkaban服务是否存活着
 * @author songqinghu
 *
 */
public class TimerSocketUtils {

    private static Logger logger  = LoggerFactory.getLogger(TimerSocketUtils.class);

    private static String ADDRESS = null;//地址

    private static Integer PORT = null;//端口

    public static boolean reload = true;//是否重新加载  动态加载使用


    private static boolean isContinue = true;


    private static void init(){
        if(reload){

            ADDRESS = PropUtils.getInstance().getString(Const.SOLR_AZKABAN_ADDRESS,"false");
            PORT = PropUtils.getInstance().getInt(Const.SOLR_AZKABAN_PORT, 0);
            if("false".equals(ADDRESS) || 0 == PORT){
                ADDRESS =null;
                PORT =null;
                isContinue = false;
            }
            reload = false;
        }
    }

    //判断azkaban服务的存活状况
    public static boolean  isLive(){
        init();
        if(isContinue){
            Socket socket;
           try {
               socket = new Socket();
               InetSocketAddress socketAddress = new InetSocketAddress(ADDRESS, PORT);
               socket.connect(socketAddress, 1000);
               boolean result = socket.isConnected();
               logger.info("the socket connection result is :  {} ", result);
               socket.close();
               return result;
           } catch (Exception e) {
               logger.error(" the socket connection occur error is {} , use project own timer task ",e);
               socket =null;
           } 
        }
        return false;
    }


}

脚本:
type=command
command.1= echo "suggest full index import start"
command= curl http://api.search.ic.dev.gomeplus.com/suggest/full/import.json?clear=true
command.2= echo "suggest full index import end"
0 0