Azkaban源码阅读之AzkabanApplication

本文详细解析了Azkaban批处理调度系统的初始化流程,包括关键组件的配置、工作流缓存的设置以及邮件通知等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Azkaban是一个Hadoop批处理调度器,可以通过访问其前台展示页面来进行部署、运行job等操作。


  1. //IndexServlet.java  
  2.    
  3.    @Override  
  4.     protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
  5.             throws ServletException, IOException {  
  6.   
  7.         /* set runtime properties from request and response */  
  8.         super.setRuntimeProperties(req, resp);  
  9.   
  10.         AzkabanApplication app = getApplication();  
  11.         String action = getParam(req, "action");  
  12.         if ("loadjobs".equals(action)) {  
  13.             resp.setContentType("application/json");  
  14.             String folder = getParam(req, "folder");  
  15.             resp.getWriter().print(getJSONJobsForFolder(app.getAllFlows(), folder));  
  16.             resp.getWriter().flush();  
  17.             return;  
  18.         }  
  19.         else if("unschedule".equals(action)) {  
  20.             String jobid = getParam(req, "job");  
  21.             app.getScheduleManager().removeScheduledJob(jobid);  
  22.         } else if("cancel".equals(action)) {  
  23.             cancelJob(app, req);  
  24.         } else if("schedule".equals(action)) {  
  25.             String redirect = scheduleJobs(app, req, resp);  
  26.             if (!redirect.isEmpty()) {  
  27.                 resp.sendRedirect(redirect);  
  28.                 return;  
  29.             }  
  30.         } else {  
  31.             throw new ServletException("Unknown action: " + action);  
  32.         }  
  33.         resp.sendRedirect(req.getContextPath());  
  34.     }  

看文件名就可以看出了这个是整个系统运行的源头,一切从这里开始. . . . . . .


-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


AzkabanApplication中是一系列用于整个系统初始化的代码,接下来就来看一下吧~


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


  1. public AzkabanApplication(List<File> jobDirs, File logDir, File tempDir, boolean enableDevMode) throws IOException {  
  2.     this._jobDirs = Utils.nonNull(jobDirs);  
  3.     this._logsDir = Utils.nonNull(logDir);  
  4.     this._tempDir = Utils.nonNull(tempDir);  
  5.   
  6.     if(!this._logsDir.exists())  
  7.         this._logsDir.mkdirs();  
  8.   
  9.     if(!this._tempDir.exists())  
  10.         this._tempDir.mkdirs();  
  11.   
  12.     for(File jobDir: _jobDirs) {  
  13.         if(!jobDir.exists()) {  
  14.             logger.warn("Job directory " + jobDir + " does not exist. Creating.");  
  15.             jobDir.mkdirs();  
  16.         }  
  17.     }  
  18.   
  19.     if(jobDirs.size() < 1)  
  20.         throw new IllegalArgumentException("No job directory given.");  
  21.     /** 
  22.      * 加载默认的属性文件 
  23.      * 实际上只用.properties为后缀的文件 
  24.      */  
  25.     Props defaultProps = PropsUtils.loadPropsInDirs(_jobDirs, ".properties"".schema");  
  26.   
  27.     /** 
  28.      * 主要功能就是加载HADOOP_HOME 
  29.      */  
  30.     _baseClassLoader = getBaseClassloader();  
  31.   
  32.     String defaultTimezoneID = defaultProps.getString(DEFAULT_TIMEZONE_ID, null);  
  33.     if (defaultTimezoneID != null) {  
  34.         DateTimeZone.setDefault(DateTimeZone.forID(defaultTimezoneID));  
  35.         TimeZone.setDefault(TimeZone.getTimeZone(defaultTimezoneID));  
  36.     }  
  37.       
  38.     /** 
  39.      * 由于Azkaban支持锁shezhi,在这里进行锁管理的初始化 
  40.      */  
  41.     NamedPermitManager permitManager = getNamedPermitManager(defaultProps);  
  42.     /** 
  43.      * 初始化Azkaban支持的job类型 
  44.      */  
  45.     JobWrappingFactory factory = new JobWrappingFactory(  
  46.             permitManager,  
  47.             new ReadWriteLockManager(),  
  48.             _logsDir.getAbsolutePath(),  
  49.             "java",  
  50.             new ImmutableMap.Builder<String, Class<? extends Job>>()  
  51.              .put("java", JavaJob.class)  
  52.              .put("command", ProcessJob.class)  
  53.              .put("javaprocess", JavaProcessJob.class)  
  54.              .put("pig", PigProcessJob.class)  
  55.              .put("propertyPusher", NoopJob.class)  
  56.              .put("python", PythonJob.class)  
  57.              .put("ruby", RubyJob.class)  
  58.              .put("script", ScriptJob.class).build());  
  59.   
  60.     _hdfsUrl = defaultProps.getString("hdfs.instance.url"null);  
  61.     _jobManager = new JobManager(factory,  
  62.                                  _logsDir.getAbsolutePath(),  
  63.                                  defaultProps,  
  64.                                  _jobDirs,  
  65.                                  _baseClassLoader);  
  66.   
  67.     _mailer = new Mailman(defaultProps.getString("mail.host""localhost"),  
  68.                           defaultProps.getString("mail.user"""),  
  69.                           defaultProps.getString("mail.password"""));  
  70.   
  71.     String failureEmail = defaultProps.getString("job.failure.email"null);  
  72.     String successEmail = defaultProps.getString("job.success.email"null);  
  73.     int schedulerThreads = defaultProps.getInt("scheduler.threads"50);  
  74.     _instanceName = defaultProps.getString(INSTANCE_NAME, "");  
  75.       
  76.     final File initialJobDir = _jobDirs.get(0);  
  77.     File schedule = getScheduleFile(defaultProps, initialJobDir);  
  78.     File backup = getBackupFile(defaultProps, initialJobDir);  
  79.     File executionsStorageDir = new File(  
  80.             defaultProps.getString("azkaban.executions.storage.dir", initialJobDir.getAbsolutePath() + "/executions")  
  81.     );  
  82.     if (! executionsStorageDir.exists()) executionsStorageDir.mkdirs();  
  83.     /** 
  84.      * 获得上次启动Azkaban时执行的最大jobId 
  85.      */  
  86.     long lastExecutionId = getLastExecutionId(executionsStorageDir);  
  87.     logger.info(String.format("Using path[%s] for storing executions.", executionsStorageDir));  
  88.     logger.info(String.format("Last known execution id was [%s]", lastExecutionId));  
  89.   
  90.     final ExecutableFlowSerializer flowSerializer = new DefaultExecutableFlowSerializer();  
  91.     final ExecutableFlowDeserializer flowDeserializer = new DefaultExecutableFlowDeserializer(_jobManager, factory);  
  92.   
  93.     FlowExecutionSerializer flowExecutionSerializer = new FlowExecutionSerializer(flowSerializer);  
  94.     FlowExecutionDeserializer flowExecutionDeserializer = new FlowExecutionDeserializer(flowDeserializer);  
  95.   
  96.     /** 
  97.      * 初始化管理工作流的缓存,默认将cache大小设置为1000 
  98.      * <span style="color:#ff0000;">这里是整个初始化过程中的重点!!!</span> 
  99.      */  
  100.     _allFlows = new CachingFlowManager(  
  101.             new RefreshableFlowManager(  
  102.                     _jobManager,  
  103.                     flowExecutionSerializer,  
  104.                     flowExecutionDeserializer,   
  105.                     executionsStorageDir,  
  106.                     lastExecutionId  
  107.             ),  
  108.             defaultProps.getInt("azkaban.flow.cache.size"1000)  
  109.     );  
  110.     _jobManager.setFlowManager(_allFlows);  
  111.   
  112.     _jobExecutorManager = new JobExecutorManager(  
  113.                 _allFlows,   
  114.                 _jobManager,   
  115.                 _mailer,   
  116.                 failureEmail,   
  117.                 successEmail,  
  118.                 schedulerThreads  
  119.             );  
  120.       
  121.     this._schedulerManager = new ScheduleManager(_jobExecutorManager, new LocalFileScheduleLoader(schedule, backup));  
  122.   
  123.     /* set predefined log url prefix  
  124.     */  
  125.     String server_url = defaultProps.getString("server.url"null) ;  
  126.     if (server_url != null) {  
  127.         if (server_url.endsWith("/"))  
  128.             _jobExecutorManager.setRuntimeProperty(AppCommon.DEFAULT_LOG_URL_PREFIX, server_url + "logs?file=" );  
  129.         else   
  130.             _jobExecutorManager.setRuntimeProperty(AppCommon.DEFAULT_LOG_URL_PREFIX, server_url + "/logs?file=" );  
  131.     }  
  132.   
  133.     this._velocityEngine = configureVelocityEngine(enableDevMode);  
  134. }  

这部分将系统所需的各个部分,各个属性都进行了初始化的操作。


注: 本文是由本人原创,如需引用请注明出处:     http://blog.youkuaiyun.com/zhang__bing/article/details/8721834
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值