@ -1,11 +0,0 @@
|
||||
(function() { |
||||
var newEl = document.createElement('script'), |
||||
firstScriptTag = document.getElementsByTagName('script')[0]; |
||||
|
||||
if (firstScriptTag) { |
||||
newEl.async = 1; |
||||
newEl.src = '//' + window.location.hostname + ':35729/livereload.js'; |
||||
firstScriptTag.parentNode.insertBefore(newEl, firstScriptTag); |
||||
} |
||||
|
||||
})(); |
Before Width: | Height: | Size: 234 KiB |
Before Width: | Height: | Size: 227 KiB |
Before Width: | Height: | Size: 111 KiB |
Before Width: | Height: | Size: 126 KiB |
Before Width: | Height: | Size: 6.6 KiB |
Before Width: | Height: | Size: 66 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 75 KiB |
Before Width: | Height: | Size: 929 B |
Before Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 43 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 45 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 53 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 78 KiB |
Before Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 45 KiB |
Before Width: | Height: | Size: 67 KiB |
Before Width: | Height: | Size: 71 KiB |
Before Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 58 KiB |
Before Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 77 KiB |
Before Width: | Height: | Size: 448 KiB |
@ -1,902 +0,0 @@
|
||||
|
||||
<!DOCTYPE HTML> |
||||
<html lang="zh-hans" > |
||||
<head> |
||||
<meta charset="UTF-8"> |
||||
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"> |
||||
<title>Easyscheduler简介 · 调度系统-EasyScheduler</title> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
||||
<meta name="description" content=""> |
||||
<meta name="generator" content="GitBook 3.2.3"> |
||||
<meta name="author" content="YIGUAN"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/style.css"> |
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/gitbook-plugin-expandable-chapters/expandable-chapters.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/gitbook-plugin-insert-logo-link/plugin.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/gitbook-plugin-highlight/website.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="styles/website.css"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<meta name="HandheldFriendly" content="true"/> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> |
||||
<meta name="apple-mobile-web-app-capable" content="yes"> |
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black"> |
||||
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png"> |
||||
<link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon"> |
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
<body> |
||||
|
||||
<div class="book"> |
||||
<div class="book-summary"> |
||||
|
||||
|
||||
<div id="book-search-input" role="search"> |
||||
<input type="text" placeholder="输入并搜索" /> |
||||
</div> |
||||
|
||||
|
||||
<nav role="navigation"> |
||||
|
||||
|
||||
|
||||
<ul class="summary"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="chapter active" data-level="1.1" data-path="./"> |
||||
|
||||
<a href="./"> |
||||
|
||||
|
||||
Easyscheduler简介 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2" > |
||||
|
||||
<span> |
||||
|
||||
|
||||
导读指南 |
||||
|
||||
</span> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.2.1" data-path="pages/guide-architecture.html"> |
||||
|
||||
<a href="pages/guide-architecture.html"> |
||||
|
||||
|
||||
系统架构分析 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.2.1.1" data-path="pages/guide-architecture.html"> |
||||
|
||||
<a href="pages/guide-architecture.html#导语"> |
||||
|
||||
|
||||
导语 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.2" data-path="pages/guide-architecture.html"> |
||||
|
||||
<a href="pages/guide-architecture.html#背景"> |
||||
|
||||
|
||||
背景 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.3" data-path="pages/guide-architecture.html"> |
||||
|
||||
<a href="pages/guide-architecture.html#总架构设计"> |
||||
|
||||
|
||||
总架构设计 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.4" data-path="pages/guide-architecture.html"> |
||||
|
||||
<a href="pages/guide-architecture.html#中心化思想"> |
||||
|
||||
|
||||
中心化思想 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.5" data-path="pages/guide-architecture.html"> |
||||
|
||||
<a href="pages/guide-architecture.html#分布式锁实践"> |
||||
|
||||
|
||||
分布式锁实践 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.6" data-path="pages/guide-architecture.html"> |
||||
|
||||
<a href="pages/guide-architecture.html#线程不足循环等待问题"> |
||||
|
||||
|
||||
线程不足循环等待问题 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.7" data-path="pages/guide-architecture.html"> |
||||
|
||||
<a href="pages/guide-architecture.html#容错设计"> |
||||
|
||||
|
||||
容错设计 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.8" data-path="pages/guide-architecture.html"> |
||||
|
||||
<a href="pages/guide-architecture.html#日志访问"> |
||||
|
||||
|
||||
Logback和gRPC实现日志访问 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.9" data-path="pages/guide-architecture.html"> |
||||
|
||||
<a href="pages/guide-architecture.html#总结"> |
||||
|
||||
|
||||
总结 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2" data-path="pages/guide-manual.html"> |
||||
|
||||
<a href="pages/guide-manual.html"> |
||||
|
||||
|
||||
使用手册 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.2.2.1" data-path="pages/guide-manual.html"> |
||||
|
||||
<a href="pages/guide-manual.html#登录"> |
||||
|
||||
|
||||
登录 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2.2" data-path="pages/guide-manual.html"> |
||||
|
||||
<a href="pages/guide-manual.html#安全中心"> |
||||
|
||||
|
||||
安全中心 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2.3" data-path="pages/guide-manual.html"> |
||||
|
||||
<a href="pages/guide-manual.html#资源中心"> |
||||
|
||||
|
||||
资源中心 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2.4" data-path="pages/guide-manual.html"> |
||||
|
||||
<a href="pages/guide-manual.html#数据源中心"> |
||||
|
||||
|
||||
数据源中心 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2.5" data-path="pages/guide-manual.html"> |
||||
|
||||
<a href="pages/guide-manual.html#项目管理"> |
||||
|
||||
|
||||
项目管理 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2.6" data-path="pages/guide-manual.html"> |
||||
|
||||
<a href="pages/guide-manual.html#首页"> |
||||
|
||||
|
||||
站点首页 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2.7" data-path="pages/guide-manual.html"> |
||||
|
||||
<a href="pages/guide-manual.html#任务依赖"> |
||||
|
||||
|
||||
任务依赖 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2.8" data-path="pages/guide-manual.html"> |
||||
|
||||
<a href="pages/guide-manual.html#系统参数"> |
||||
|
||||
|
||||
系统参数 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3" > |
||||
|
||||
<span> |
||||
|
||||
|
||||
项目部署文档 |
||||
|
||||
</span> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.3.1" data-path="pages/deploy-foreground.html"> |
||||
|
||||
<a href="pages/deploy-foreground.html"> |
||||
|
||||
|
||||
前端部署 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.3.1.1" data-path="pages/deploy-foreground.html"> |
||||
|
||||
<a href="pages/deploy-foreground.html#前端项目环境构建及编译"> |
||||
|
||||
|
||||
前端项目环境构建及编译 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.1.2" data-path="pages/deploy-foreground.html"> |
||||
|
||||
<a href="pages/deploy-foreground.html#安装及配置"> |
||||
|
||||
|
||||
安装及配置 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.1.3" data-path="pages/deploy-foreground.html"> |
||||
|
||||
<a href="pages/deploy-foreground.html#项目生产环境配置"> |
||||
|
||||
|
||||
项目生产环境Nginx配置 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.1.4" data-path="pages/deploy-foreground.html"> |
||||
|
||||
<a href="pages/deploy-foreground.html#前端项目发布"> |
||||
|
||||
|
||||
前端项目发布 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.1.5" data-path="pages/deploy-foreground.html"> |
||||
|
||||
<a href="pages/deploy-foreground.html#问题"> |
||||
|
||||
|
||||
问题 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2" data-path="pages/deploy-background.html"> |
||||
|
||||
<a href="pages/deploy-background.html"> |
||||
|
||||
|
||||
后端部署 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.3.2.1" data-path="pages/deploy-background.html"> |
||||
|
||||
<a href="pages/deploy-background.html#基础软件安装"> |
||||
|
||||
|
||||
基础软件安装 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.2" data-path="pages/deploy-background.html"> |
||||
|
||||
<a href="pages/deploy-background.html#项目编译"> |
||||
|
||||
|
||||
项目编译 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.3" data-path="pages/deploy-background.html"> |
||||
|
||||
<a href="pages/deploy-background.html#数据库初始化"> |
||||
|
||||
|
||||
数据库初始化 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.4" data-path="pages/deploy-background.html"> |
||||
|
||||
<a href="pages/deploy-background.html#创建部署用户"> |
||||
|
||||
|
||||
创建部署用户 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.5" data-path="pages/deploy-background.html"> |
||||
|
||||
<a href="pages/deploy-background.html#配置文件"> |
||||
|
||||
|
||||
配置文件 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.3.2.5.1" data-path="pages/deploy-background.html"> |
||||
|
||||
<a href="pages/deploy-background.html#escheduler-alert"> |
||||
|
||||
|
||||
escheduler-alert |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.5.2" data-path="pages/deploy-background.html"> |
||||
|
||||
<a href="pages/deploy-background.html#escheduler-common"> |
||||
|
||||
|
||||
escheduler-common |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.5.3" data-path="pages/deploy-background.html"> |
||||
|
||||
<a href="pages/deploy-background.html#escheduler-dao"> |
||||
|
||||
|
||||
escheduler-dao |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.5.4" data-path="pages/deploy-background.html"> |
||||
|
||||
<a href="pages/deploy-background.html#escheduler-server"> |
||||
|
||||
|
||||
escheduler-server |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.5.5" data-path="pages/deploy-background.html"> |
||||
|
||||
<a href="pages/deploy-background.html#escheduler-web"> |
||||
|
||||
|
||||
escheduler-web |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.6" data-path="pages/deploy-background.html"> |
||||
|
||||
<a href="pages/deploy-background.html#启动停止命令"> |
||||
|
||||
|
||||
启动停止命令 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.7" data-path="pages/deploy-background.html"> |
||||
|
||||
<a href="pages/deploy-background.html#一键启停脚本"> |
||||
|
||||
|
||||
一键启停脚本 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.8" data-path="pages/deploy-background.html"> |
||||
|
||||
<a href="pages/deploy-background.html#监控服务"> |
||||
|
||||
|
||||
监控服务 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.9" data-path="pages/deploy-background.html"> |
||||
|
||||
<a href="pages/deploy-background.html#日志查看"> |
||||
|
||||
|
||||
日志查看 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.4" > |
||||
|
||||
<span> |
||||
|
||||
|
||||
前端开发文档 |
||||
|
||||
</span> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.4.1" data-path="pages/foreground-2.html"> |
||||
|
||||
<a href="pages/foreground-2.html"> |
||||
|
||||
|
||||
安装 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.5" > |
||||
|
||||
<span> |
||||
|
||||
|
||||
后端开发文档 |
||||
|
||||
</span> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.5.1" data-path="pages/background-2.html"> |
||||
|
||||
<a href="pages/background-2.html"> |
||||
|
||||
|
||||
后端说明2 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
|
||||
|
||||
|
||||
<li class="divider"></li> |
||||
|
||||
<li> |
||||
<a href="https://www.gitbook.com" target="blank" class="gitbook-link"> |
||||
本书使用 GitBook 发布 |
||||
</a> |
||||
</li> |
||||
</ul> |
||||
|
||||
|
||||
</nav> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<div class="book-body"> |
||||
|
||||
<div class="body-inner"> |
||||
|
||||
|
||||
|
||||
<div class="book-header" role="navigation"> |
||||
|
||||
|
||||
<!-- Title --> |
||||
<h1> |
||||
<i class="fa fa-circle-o-notch fa-spin"></i> |
||||
<a href="." >Easyscheduler简介</a> |
||||
</h1> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
<div class="page-wrapper" tabindex="-1" role="main"> |
||||
<div class="page-inner"> |
||||
|
||||
<div id="book-search-results"> |
||||
<div class="search-noresults"> |
||||
|
||||
<section class="normal markdown-section"> |
||||
|
||||
<h1 id="简介">简介</h1> |
||||
<h2 id="导语">导语</h2> |
||||
<blockquote> |
||||
<h5 id="easyscheduler是易观研发的大数据分布式工作流调度系统。主要解决数据研发etl错综复杂的依赖关系,而不能直观监控任务健康状态等问题。easyscheduler通过可视化拖拽任务节点的方式形成dag有向无环图流程图,在运行过程中可实时监控任务的运行状态,同时支持重试、从指定节点恢复失败、暂停及kill任务、任务运行历史查看等等操作。">EasyScheduler是易观研发的大数据分布式工作流调度系统。主要解决数据研发ETL错综复杂的依赖关系,而不能直观监控任务健康状态等问题。EasyScheduler通过可视化拖拽任务节点的方式形成DAG(有向无环图)流程图,在运行过程中可实时监控任务的运行状态,同时支持重试、从指定节点恢复失败、暂停及Kill任务、任务运行历史查看等等操作。</h5> |
||||
</blockquote> |
||||
<h2 id="背景">背景</h2> |
||||
<p> 工作流调度系统在大数据平台中是一个核心的基础设施,是大数据开发必不可少的重要组成部分。由于数据处理流程常常具有很长的依赖链条,因此依赖单机的crontab等单纯依赖时间调度的方式,往往存在很大的弊端,如依赖不清晰,出错难以查找等问题。因此,我们调研了市面上流行的调度系统。 |
||||
并和azkaban、airflow做了一些对比:</p> |
||||
<blockquote> |
||||
<h4 id=""> </h4> |
||||
</blockquote> |
||||
<p> <img src="images/vs_scheduler.jpg" alt="JPG"> </p> |
||||
<blockquote> |
||||
<h4 id="       鉴于易观日处理数据30tb,复杂的etl依赖关系,我们开发了easyscheduler。">       鉴于易观日处理数据30TB,复杂的ETL依赖关系,我们开发了EasyScheduler。</h4> |
||||
</blockquote> |
||||
<p>EasyScheduler由在工作流调度方面工作多年的几位小伙伴研发而成,致力于成为大数据平台的中流砥柱,使调度变得更加容易,更可以从其中文名“易调度”看出我们的初衷,如果你对目前市面上的调度不够满意,非常欢迎试用易调度,欢迎大家加入进来,提出需求,也欢迎贡献代码, 感兴趣的伙伴们可以加我们微信:510570367,一起加入EasyScheduler吧,多多交流!</p> |
||||
<h1 id="系统部分截图:">系统部分截图:</h1> |
||||
<p><img src="http://geek.analysys.cn/static/upload/47/2019-03-06/76db3013-8e3b-4d17-b167-2aa1e6a6b0ad.jpeg" alt="工作流实例"></p> |
||||
<p><img src="http://geek.analysys.cn/static/upload/47/2019-03-06/d2bef23a-cead-4bc9-a007-bc15c22ce7d2.jpeg" alt="工作流DAG设计"></p> |
||||
<p><img src="http://geek.analysys.cn/static/upload/47/2019-03-06/08b79a19-4aa0-4a73-a71b-81ad210513fb.jpeg" alt="工作流DAG任务节点设计"></p> |
||||
<p><img src="http://geek.analysys.cn/static/upload/47/2019-03-06/384dd8a3-4cf8-4e3e-944d-1185ba198f75.jpeg" alt="工作流运行情况"></p> |
||||
|
||||
|
||||
</section> |
||||
|
||||
</div> |
||||
<div class="search-results"> |
||||
<div class="has-results"> |
||||
|
||||
<h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1> |
||||
<ul class="search-results-list"></ul> |
||||
|
||||
</div> |
||||
<div class="no-results"> |
||||
|
||||
<h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1> |
||||
|
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
</div> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
<script> |
||||
var gitbook = gitbook || []; |
||||
gitbook.push(function() { |
||||
gitbook.page.hasChanged({"page":{"title":"Easyscheduler简介","level":"1.1","depth":1,"next":{"title":"导读指南","level":"1.2","depth":1,"ref":"","articles":[{"title":"系统架构分析","level":"1.2.1","depth":2,"path":"pages/guide-architecture.md","ref":"pages/guide-architecture.md","articles":[{"title":"导语","level":"1.2.1.1","depth":3,"anchor":"#导语","path":"pages/guide-architecture.md","ref":"pages/guide-architecture.md#导语","articles":[]},{"title":"背景","level":"1.2.1.2","depth":3,"anchor":"#背景","path":"pages/guide-architecture.md","ref":"pages/guide-architecture.md#背景","articles":[]},{"title":"总架构设计","level":"1.2.1.3","depth":3,"anchor":"#总架构设计","path":"pages/guide-architecture.md","ref":"pages/guide-architecture.md#总架构设计","articles":[]},{"title":"中心化思想","level":"1.2.1.4","depth":3,"anchor":"#中心化思想","path":"pages/guide-architecture.md","ref":"pages/guide-architecture.md#中心化思想","articles":[]},{"title":"分布式锁实践","level":"1.2.1.5","depth":3,"anchor":"#分布式锁实践","path":"pages/guide-architecture.md","ref":"pages/guide-architecture.md#分布式锁实践","articles":[]},{"title":"线程不足循环等待问题","level":"1.2.1.6","depth":3,"anchor":"#线程不足循环等待问题","path":"pages/guide-architecture.md","ref":"pages/guide-architecture.md#线程不足循环等待问题","articles":[]},{"title":"容错设计","level":"1.2.1.7","depth":3,"anchor":"#容错设计","path":"pages/guide-architecture.md","ref":"pages/guide-architecture.md#容错设计","articles":[]},{"title":"Logback和gRPC实现日志访问","level":"1.2.1.8","depth":3,"anchor":"#日志访问","path":"pages/guide-architecture.md","ref":"pages/guide-architecture.md#日志访问","articles":[]},{"title":"总结","level":"1.2.1.9","depth":3,"anchor":"#总结","path":"pages/guide-architecture.md","ref":"pages/guide-architecture.md#总结","articles":[]}]},{"title":"使用手册","level":"1.2.2","depth":2,"path":"pages/guide-manual.md","ref":"pages/guide-manual.md","articles":[{"title":"登录","level":"1.2.2.1","depth":3,"anchor":"#登录","path":"pages/guide-manual.md","ref":"pages/guide-manual.md#登录","articles":[]},{"title":"安全中心","level":"1.2.2.2","depth":3,"anchor":"#安全中心","path":"pages/guide-manual.md","ref":"pages/guide-manual.md#安全中心","articles":[]},{"title":"资源中心","level":"1.2.2.3","depth":3,"anchor":"#资源中心","path":"pages/guide-manual.md","ref":"pages/guide-manual.md#资源中心","articles":[]},{"title":"数据源中心","level":"1.2.2.4","depth":3,"anchor":"#数据源中心","path":"pages/guide-manual.md","ref":"pages/guide-manual.md#数据源中心","articles":[]},{"title":"项目管理","level":"1.2.2.5","depth":3,"anchor":"#项目管理","path":"pages/guide-manual.md","ref":"pages/guide-manual.md#项目管理","articles":[]},{"title":"站点首页","level":"1.2.2.6","depth":3,"anchor":"#首页","path":"pages/guide-manual.md","ref":"pages/guide-manual.md#首页","articles":[]},{"title":"任务依赖","level":"1.2.2.7","depth":3,"anchor":"#任务依赖","path":"pages/guide-manual.md","ref":"pages/guide-manual.md#任务依赖","articles":[]},{"title":"系统参数","level":"1.2.2.8","depth":3,"anchor":"#系统参数","path":"pages/guide-manual.md","ref":"pages/guide-manual.md#系统参数","articles":[]}]}]},"dir":"ltr"},"config":{"plugins":["expandable-chapters","insert-logo-link","livereload"],"styles":{"website":"./styles/website.css"},"pluginsConfig":{"livereload":{},"insert-logo-link":{"src":"images/logo.png","url":"/"},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"fontsettings":{"theme":"white","family":"sans","size":2},"highlight":{},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false},"expandable-chapters":{}},"theme":"default","author":"YIGUAN","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{},"title":"调度系统-EasyScheduler","language":"zh-hans","gitbook":"3.2.3","description":"调度系统"},"file":{"path":"README.md","mtime":"2019-03-07T09:03:43.002Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2019-03-07T11:30:18.635Z"},"basePath":".","book":{"language":""}}); |
||||
}); |
||||
</script> |
||||
</div> |
||||
|
||||
|
||||
<script src="gitbook/gitbook.js"></script> |
||||
<script src="gitbook/theme.js"></script> |
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-expandable-chapters/expandable-chapters.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-insert-logo-link/plugin.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-livereload/plugin.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-search/search-engine.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-search/search.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-lunr/lunr.min.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-lunr/search-lunr.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-sharing/buttons.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script> |
||||
|
||||
|
||||
|
||||
</body> |
||||
</html> |
||||
|
@ -1,882 +0,0 @@
|
||||
|
||||
<!DOCTYPE HTML> |
||||
<html lang="zh-hans" > |
||||
<head> |
||||
<meta charset="UTF-8"> |
||||
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"> |
||||
<title>后端说明2 · 调度系统-EasyScheduler</title> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
||||
<meta name="description" content=""> |
||||
<meta name="generator" content="GitBook 3.2.3"> |
||||
<meta name="author" content="YIGUAN"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../gitbook/style.css"> |
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../gitbook/gitbook-plugin-expandable-chapters/expandable-chapters.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../gitbook/gitbook-plugin-insert-logo-link/plugin.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../gitbook/gitbook-plugin-highlight/website.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../gitbook/gitbook-plugin-search/search.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../gitbook/gitbook-plugin-fontsettings/website.css"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../styles/website.css"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<meta name="HandheldFriendly" content="true"/> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> |
||||
<meta name="apple-mobile-web-app-capable" content="yes"> |
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black"> |
||||
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="../gitbook/images/apple-touch-icon-precomposed-152.png"> |
||||
<link rel="shortcut icon" href="../gitbook/images/favicon.ico" type="image/x-icon"> |
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
<body> |
||||
|
||||
<div class="book"> |
||||
<div class="book-summary"> |
||||
|
||||
|
||||
<div id="book-search-input" role="search"> |
||||
<input type="text" placeholder="输入并搜索" /> |
||||
</div> |
||||
|
||||
|
||||
<nav role="navigation"> |
||||
|
||||
|
||||
|
||||
<ul class="summary"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="chapter " data-level="1.1" data-path="../"> |
||||
|
||||
<a href="../"> |
||||
|
||||
|
||||
Easyscheduler简介 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2" > |
||||
|
||||
<span> |
||||
|
||||
|
||||
导读指南 |
||||
|
||||
</span> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.2.1" data-path="guide-architecture.html"> |
||||
|
||||
<a href="guide-architecture.html"> |
||||
|
||||
|
||||
系统架构分析 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.2.1.1" data-path="guide-architecture.html"> |
||||
|
||||
<a href="guide-architecture.html#导语"> |
||||
|
||||
|
||||
导语 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.2" data-path="guide-architecture.html"> |
||||
|
||||
<a href="guide-architecture.html#背景"> |
||||
|
||||
|
||||
背景 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.3" data-path="guide-architecture.html"> |
||||
|
||||
<a href="guide-architecture.html#总架构设计"> |
||||
|
||||
|
||||
总架构设计 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.4" data-path="guide-architecture.html"> |
||||
|
||||
<a href="guide-architecture.html#中心化思想"> |
||||
|
||||
|
||||
中心化思想 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.5" data-path="guide-architecture.html"> |
||||
|
||||
<a href="guide-architecture.html#分布式锁实践"> |
||||
|
||||
|
||||
分布式锁实践 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.6" data-path="guide-architecture.html"> |
||||
|
||||
<a href="guide-architecture.html#线程不足循环等待问题"> |
||||
|
||||
|
||||
线程不足循环等待问题 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.7" data-path="guide-architecture.html"> |
||||
|
||||
<a href="guide-architecture.html#容错设计"> |
||||
|
||||
|
||||
容错设计 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.8" data-path="guide-architecture.html"> |
||||
|
||||
<a href="guide-architecture.html#日志访问"> |
||||
|
||||
|
||||
Logback和gRPC实现日志访问 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.9" data-path="guide-architecture.html"> |
||||
|
||||
<a href="guide-architecture.html#总结"> |
||||
|
||||
|
||||
总结 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2" data-path="guide-manual.html"> |
||||
|
||||
<a href="guide-manual.html"> |
||||
|
||||
|
||||
使用手册 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.2.2.1" data-path="guide-manual.html"> |
||||
|
||||
<a href="guide-manual.html#登录"> |
||||
|
||||
|
||||
登录 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2.2" data-path="guide-manual.html"> |
||||
|
||||
<a href="guide-manual.html#安全中心"> |
||||
|
||||
|
||||
安全中心 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2.3" data-path="guide-manual.html"> |
||||
|
||||
<a href="guide-manual.html#资源中心"> |
||||
|
||||
|
||||
资源中心 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2.4" data-path="guide-manual.html"> |
||||
|
||||
<a href="guide-manual.html#数据源中心"> |
||||
|
||||
|
||||
数据源中心 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2.5" data-path="guide-manual.html"> |
||||
|
||||
<a href="guide-manual.html#项目管理"> |
||||
|
||||
|
||||
项目管理 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2.6" data-path="guide-manual.html"> |
||||
|
||||
<a href="guide-manual.html#首页"> |
||||
|
||||
|
||||
站点首页 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2.7" data-path="guide-manual.html"> |
||||
|
||||
<a href="guide-manual.html#任务依赖"> |
||||
|
||||
|
||||
任务依赖 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2.8" data-path="guide-manual.html"> |
||||
|
||||
<a href="guide-manual.html#系统参数"> |
||||
|
||||
|
||||
系统参数 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3" > |
||||
|
||||
<span> |
||||
|
||||
|
||||
项目部署文档 |
||||
|
||||
</span> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.3.1" data-path="deploy-foreground.html"> |
||||
|
||||
<a href="deploy-foreground.html"> |
||||
|
||||
|
||||
前端部署 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.3.1.1" data-path="deploy-foreground.html"> |
||||
|
||||
<a href="deploy-foreground.html#前端项目环境构建及编译"> |
||||
|
||||
|
||||
前端项目环境构建及编译 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.1.2" data-path="deploy-foreground.html"> |
||||
|
||||
<a href="deploy-foreground.html#安装及配置"> |
||||
|
||||
|
||||
安装及配置 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.1.3" data-path="deploy-foreground.html"> |
||||
|
||||
<a href="deploy-foreground.html#项目生产环境配置"> |
||||
|
||||
|
||||
项目生产环境Nginx配置 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.1.4" data-path="deploy-foreground.html"> |
||||
|
||||
<a href="deploy-foreground.html#前端项目发布"> |
||||
|
||||
|
||||
前端项目发布 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.1.5" data-path="deploy-foreground.html"> |
||||
|
||||
<a href="deploy-foreground.html#问题"> |
||||
|
||||
|
||||
问题 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html"> |
||||
|
||||
|
||||
后端部署 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.3.2.1" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#基础软件安装"> |
||||
|
||||
|
||||
基础软件安装 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.2" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#项目编译"> |
||||
|
||||
|
||||
项目编译 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.3" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#数据库初始化"> |
||||
|
||||
|
||||
数据库初始化 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.4" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#创建部署用户"> |
||||
|
||||
|
||||
创建部署用户 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.5" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#配置文件"> |
||||
|
||||
|
||||
配置文件 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.3.2.5.1" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#escheduler-alert"> |
||||
|
||||
|
||||
escheduler-alert |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.5.2" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#escheduler-common"> |
||||
|
||||
|
||||
escheduler-common |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.5.3" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#escheduler-dao"> |
||||
|
||||
|
||||
escheduler-dao |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.5.4" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#escheduler-server"> |
||||
|
||||
|
||||
escheduler-server |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.5.5" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#escheduler-web"> |
||||
|
||||
|
||||
escheduler-web |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.6" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#启动停止命令"> |
||||
|
||||
|
||||
启动停止命令 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.7" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#一键启停脚本"> |
||||
|
||||
|
||||
一键启停脚本 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.8" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#监控服务"> |
||||
|
||||
|
||||
监控服务 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.9" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#日志查看"> |
||||
|
||||
|
||||
日志查看 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.4" > |
||||
|
||||
<span> |
||||
|
||||
|
||||
前端开发文档 |
||||
|
||||
</span> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.4.1" data-path="foreground-2.html"> |
||||
|
||||
<a href="foreground-2.html"> |
||||
|
||||
|
||||
安装 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.5" > |
||||
|
||||
<span> |
||||
|
||||
|
||||
后端开发文档 |
||||
|
||||
</span> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter active" data-level="1.5.1" data-path="background-2.html"> |
||||
|
||||
<a href="background-2.html"> |
||||
|
||||
|
||||
后端说明2 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
|
||||
|
||||
|
||||
<li class="divider"></li> |
||||
|
||||
<li> |
||||
<a href="https://www.gitbook.com" target="blank" class="gitbook-link"> |
||||
本书使用 GitBook 发布 |
||||
</a> |
||||
</li> |
||||
</ul> |
||||
|
||||
|
||||
</nav> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<div class="book-body"> |
||||
|
||||
<div class="body-inner"> |
||||
|
||||
|
||||
|
||||
<div class="book-header" role="navigation"> |
||||
|
||||
|
||||
<!-- Title --> |
||||
<h1> |
||||
<i class="fa fa-circle-o-notch fa-spin"></i> |
||||
<a href=".." >后端说明2</a> |
||||
</h1> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
<div class="page-wrapper" tabindex="-1" role="main"> |
||||
<div class="page-inner"> |
||||
|
||||
<div id="book-search-results"> |
||||
<div class="search-noresults"> |
||||
|
||||
<section class="normal markdown-section"> |
||||
|
||||
<h1 id="trailingend">trailingEnd</h1> |
||||
|
||||
|
||||
</section> |
||||
|
||||
</div> |
||||
<div class="search-results"> |
||||
<div class="has-results"> |
||||
|
||||
<h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1> |
||||
<ul class="search-results-list"></ul> |
||||
|
||||
</div> |
||||
<div class="no-results"> |
||||
|
||||
<h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1> |
||||
|
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
</div> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
<script> |
||||
var gitbook = gitbook || []; |
||||
gitbook.push(function() { |
||||
gitbook.page.hasChanged({"page":{"title":"后端说明2","level":"1.5.1","depth":2,"previous":{"title":"后端开发文档","level":"1.5","depth":1,"ref":"","articles":[{"title":"后端说明2","level":"1.5.1","depth":2,"path":"pages/background-2.md","ref":"pages/background-2.md","articles":[]}]},"dir":"ltr"},"config":{"plugins":["expandable-chapters","insert-logo-link","livereload"],"styles":{"website":"./styles/website.css"},"pluginsConfig":{"livereload":{},"insert-logo-link":{"src":"../images/logo.png","url":"/"},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"fontsettings":{"theme":"white","family":"sans","size":2},"highlight":{},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false},"expandable-chapters":{}},"theme":"default","author":"YIGUAN","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{},"title":"调度系统-EasyScheduler","language":"zh-hans","gitbook":"3.2.3","description":"调度系统"},"file":{"path":"pages/background-2.md","mtime":"2019-03-07T08:53:26.018Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2019-03-07T11:30:18.635Z"},"basePath":"..","book":{"language":""}}); |
||||
}); |
||||
</script> |
||||
</div> |
||||
|
||||
|
||||
<script src="../gitbook/gitbook.js"></script> |
||||
<script src="../gitbook/theme.js"></script> |
||||
|
||||
|
||||
<script src="../gitbook/gitbook-plugin-expandable-chapters/expandable-chapters.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="../gitbook/gitbook-plugin-insert-logo-link/plugin.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="../gitbook/gitbook-plugin-livereload/plugin.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="../gitbook/gitbook-plugin-search/search-engine.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="../gitbook/gitbook-plugin-search/search.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="../gitbook/gitbook-plugin-lunr/lunr.min.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="../gitbook/gitbook-plugin-lunr/search-lunr.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="../gitbook/gitbook-plugin-sharing/buttons.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="../gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script> |
||||
|
||||
|
||||
|
||||
</body> |
||||
</html> |
||||
|
@ -1,882 +0,0 @@
|
||||
|
||||
<!DOCTYPE HTML> |
||||
<html lang="zh-hans" > |
||||
<head> |
||||
<meta charset="UTF-8"> |
||||
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"> |
||||
<title>安装 · 调度系统-EasyScheduler</title> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
||||
<meta name="description" content=""> |
||||
<meta name="generator" content="GitBook 3.2.3"> |
||||
<meta name="author" content="YIGUAN"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../gitbook/style.css"> |
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../gitbook/gitbook-plugin-expandable-chapters/expandable-chapters.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../gitbook/gitbook-plugin-insert-logo-link/plugin.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../gitbook/gitbook-plugin-highlight/website.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../gitbook/gitbook-plugin-search/search.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../gitbook/gitbook-plugin-fontsettings/website.css"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../styles/website.css"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<meta name="HandheldFriendly" content="true"/> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> |
||||
<meta name="apple-mobile-web-app-capable" content="yes"> |
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black"> |
||||
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="../gitbook/images/apple-touch-icon-precomposed-152.png"> |
||||
<link rel="shortcut icon" href="../gitbook/images/favicon.ico" type="image/x-icon"> |
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
<body> |
||||
|
||||
<div class="book"> |
||||
<div class="book-summary"> |
||||
|
||||
|
||||
<div id="book-search-input" role="search"> |
||||
<input type="text" placeholder="输入并搜索" /> |
||||
</div> |
||||
|
||||
|
||||
<nav role="navigation"> |
||||
|
||||
|
||||
|
||||
<ul class="summary"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="chapter " data-level="1.1" data-path="../"> |
||||
|
||||
<a href="../"> |
||||
|
||||
|
||||
Easyscheduler简介 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2" > |
||||
|
||||
<span> |
||||
|
||||
|
||||
导读指南 |
||||
|
||||
</span> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.2.1" data-path="guide-architecture.html"> |
||||
|
||||
<a href="guide-architecture.html"> |
||||
|
||||
|
||||
系统架构分析 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.2.1.1" data-path="guide-architecture.html"> |
||||
|
||||
<a href="guide-architecture.html#导语"> |
||||
|
||||
|
||||
导语 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.2" data-path="guide-architecture.html"> |
||||
|
||||
<a href="guide-architecture.html#背景"> |
||||
|
||||
|
||||
背景 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.3" data-path="guide-architecture.html"> |
||||
|
||||
<a href="guide-architecture.html#总架构设计"> |
||||
|
||||
|
||||
总架构设计 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.4" data-path="guide-architecture.html"> |
||||
|
||||
<a href="guide-architecture.html#中心化思想"> |
||||
|
||||
|
||||
中心化思想 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.5" data-path="guide-architecture.html"> |
||||
|
||||
<a href="guide-architecture.html#分布式锁实践"> |
||||
|
||||
|
||||
分布式锁实践 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.6" data-path="guide-architecture.html"> |
||||
|
||||
<a href="guide-architecture.html#线程不足循环等待问题"> |
||||
|
||||
|
||||
线程不足循环等待问题 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.7" data-path="guide-architecture.html"> |
||||
|
||||
<a href="guide-architecture.html#容错设计"> |
||||
|
||||
|
||||
容错设计 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.8" data-path="guide-architecture.html"> |
||||
|
||||
<a href="guide-architecture.html#日志访问"> |
||||
|
||||
|
||||
Logback和gRPC实现日志访问 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.1.9" data-path="guide-architecture.html"> |
||||
|
||||
<a href="guide-architecture.html#总结"> |
||||
|
||||
|
||||
总结 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2" data-path="guide-manual.html"> |
||||
|
||||
<a href="guide-manual.html"> |
||||
|
||||
|
||||
使用手册 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.2.2.1" data-path="guide-manual.html"> |
||||
|
||||
<a href="guide-manual.html#登录"> |
||||
|
||||
|
||||
登录 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2.2" data-path="guide-manual.html"> |
||||
|
||||
<a href="guide-manual.html#安全中心"> |
||||
|
||||
|
||||
安全中心 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2.3" data-path="guide-manual.html"> |
||||
|
||||
<a href="guide-manual.html#资源中心"> |
||||
|
||||
|
||||
资源中心 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2.4" data-path="guide-manual.html"> |
||||
|
||||
<a href="guide-manual.html#数据源中心"> |
||||
|
||||
|
||||
数据源中心 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2.5" data-path="guide-manual.html"> |
||||
|
||||
<a href="guide-manual.html#项目管理"> |
||||
|
||||
|
||||
项目管理 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2.6" data-path="guide-manual.html"> |
||||
|
||||
<a href="guide-manual.html#首页"> |
||||
|
||||
|
||||
站点首页 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2.7" data-path="guide-manual.html"> |
||||
|
||||
<a href="guide-manual.html#任务依赖"> |
||||
|
||||
|
||||
任务依赖 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2.8" data-path="guide-manual.html"> |
||||
|
||||
<a href="guide-manual.html#系统参数"> |
||||
|
||||
|
||||
系统参数 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3" > |
||||
|
||||
<span> |
||||
|
||||
|
||||
项目部署文档 |
||||
|
||||
</span> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.3.1" data-path="deploy-foreground.html"> |
||||
|
||||
<a href="deploy-foreground.html"> |
||||
|
||||
|
||||
前端部署 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.3.1.1" data-path="deploy-foreground.html"> |
||||
|
||||
<a href="deploy-foreground.html#前端项目环境构建及编译"> |
||||
|
||||
|
||||
前端项目环境构建及编译 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.1.2" data-path="deploy-foreground.html"> |
||||
|
||||
<a href="deploy-foreground.html#安装及配置"> |
||||
|
||||
|
||||
安装及配置 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.1.3" data-path="deploy-foreground.html"> |
||||
|
||||
<a href="deploy-foreground.html#项目生产环境配置"> |
||||
|
||||
|
||||
项目生产环境Nginx配置 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.1.4" data-path="deploy-foreground.html"> |
||||
|
||||
<a href="deploy-foreground.html#前端项目发布"> |
||||
|
||||
|
||||
前端项目发布 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.1.5" data-path="deploy-foreground.html"> |
||||
|
||||
<a href="deploy-foreground.html#问题"> |
||||
|
||||
|
||||
问题 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html"> |
||||
|
||||
|
||||
后端部署 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.3.2.1" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#基础软件安装"> |
||||
|
||||
|
||||
基础软件安装 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.2" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#项目编译"> |
||||
|
||||
|
||||
项目编译 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.3" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#数据库初始化"> |
||||
|
||||
|
||||
数据库初始化 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.4" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#创建部署用户"> |
||||
|
||||
|
||||
创建部署用户 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.5" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#配置文件"> |
||||
|
||||
|
||||
配置文件 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.3.2.5.1" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#escheduler-alert"> |
||||
|
||||
|
||||
escheduler-alert |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.5.2" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#escheduler-common"> |
||||
|
||||
|
||||
escheduler-common |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.5.3" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#escheduler-dao"> |
||||
|
||||
|
||||
escheduler-dao |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.5.4" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#escheduler-server"> |
||||
|
||||
|
||||
escheduler-server |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.5.5" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#escheduler-web"> |
||||
|
||||
|
||||
escheduler-web |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.6" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#启动停止命令"> |
||||
|
||||
|
||||
启动停止命令 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.7" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#一键启停脚本"> |
||||
|
||||
|
||||
一键启停脚本 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.8" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#监控服务"> |
||||
|
||||
|
||||
监控服务 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2.9" data-path="deploy-background.html"> |
||||
|
||||
<a href="deploy-background.html#日志查看"> |
||||
|
||||
|
||||
日志查看 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.4" > |
||||
|
||||
<span> |
||||
|
||||
|
||||
前端开发文档 |
||||
|
||||
</span> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter active" data-level="1.4.1" data-path="foreground-2.html"> |
||||
|
||||
<a href="foreground-2.html"> |
||||
|
||||
|
||||
安装 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.5" > |
||||
|
||||
<span> |
||||
|
||||
|
||||
后端开发文档 |
||||
|
||||
</span> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.5.1" data-path="background-2.html"> |
||||
|
||||
<a href="background-2.html"> |
||||
|
||||
|
||||
后端说明2 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
|
||||
|
||||
|
||||
<li class="divider"></li> |
||||
|
||||
<li> |
||||
<a href="https://www.gitbook.com" target="blank" class="gitbook-link"> |
||||
本书使用 GitBook 发布 |
||||
</a> |
||||
</li> |
||||
</ul> |
||||
|
||||
|
||||
</nav> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<div class="book-body"> |
||||
|
||||
<div class="body-inner"> |
||||
|
||||
|
||||
|
||||
<div class="book-header" role="navigation"> |
||||
|
||||
|
||||
<!-- Title --> |
||||
<h1> |
||||
<i class="fa fa-circle-o-notch fa-spin"></i> |
||||
<a href=".." >安装</a> |
||||
</h1> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
<div class="page-wrapper" tabindex="-1" role="main"> |
||||
<div class="page-inner"> |
||||
|
||||
<div id="book-search-results"> |
||||
<div class="search-noresults"> |
||||
|
||||
<section class="normal markdown-section"> |
||||
|
||||
<h1 id="frontend">frontEnd</h1> |
||||
|
||||
|
||||
</section> |
||||
|
||||
</div> |
||||
<div class="search-results"> |
||||
<div class="has-results"> |
||||
|
||||
<h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1> |
||||
<ul class="search-results-list"></ul> |
||||
|
||||
</div> |
||||
<div class="no-results"> |
||||
|
||||
<h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1> |
||||
|
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
</div> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
<script> |
||||
var gitbook = gitbook || []; |
||||
gitbook.push(function() { |
||||
gitbook.page.hasChanged({"page":{"title":"安装","level":"1.4.1","depth":2,"next":{"title":"后端开发文档","level":"1.5","depth":1,"ref":"","articles":[{"title":"后端说明2","level":"1.5.1","depth":2,"path":"pages/background-2.md","ref":"pages/background-2.md","articles":[]}]},"previous":{"title":"前端开发文档","level":"1.4","depth":1,"ref":"","articles":[{"title":"安装","level":"1.4.1","depth":2,"path":"pages/foreground-2.md","ref":"pages/foreground-2.md","articles":[]}]},"dir":"ltr"},"config":{"plugins":["expandable-chapters","insert-logo-link","livereload"],"styles":{"website":"./styles/website.css"},"pluginsConfig":{"livereload":{},"insert-logo-link":{"src":"../images/logo.png","url":"/"},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"fontsettings":{"theme":"white","family":"sans","size":2},"highlight":{},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false},"expandable-chapters":{}},"theme":"default","author":"YIGUAN","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{},"title":"调度系统-EasyScheduler","language":"zh-hans","gitbook":"3.2.3","description":"调度系统"},"file":{"path":"pages/foreground-2.md","mtime":"2019-03-07T08:53:26.019Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2019-03-07T11:30:18.635Z"},"basePath":"..","book":{"language":""}}); |
||||
}); |
||||
</script> |
||||
</div> |
||||
|
||||
|
||||
<script src="../gitbook/gitbook.js"></script> |
||||
<script src="../gitbook/theme.js"></script> |
||||
|
||||
|
||||
<script src="../gitbook/gitbook-plugin-expandable-chapters/expandable-chapters.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="../gitbook/gitbook-plugin-insert-logo-link/plugin.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="../gitbook/gitbook-plugin-livereload/plugin.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="../gitbook/gitbook-plugin-search/search-engine.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="../gitbook/gitbook-plugin-search/search.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="../gitbook/gitbook-plugin-lunr/lunr.min.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="../gitbook/gitbook-plugin-lunr/search-lunr.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="../gitbook/gitbook-plugin-sharing/buttons.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="../gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script> |
||||
|
||||
|
||||
|
||||
</body> |
||||
</html> |
||||
|
@ -0,0 +1,71 @@
|
||||
### Easy Scheduler |
||||
|
||||
[![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) |
||||
|
||||
> Easy Scheduler for Big Data |
||||
|
||||
**设计特点:** 一个分布式易扩展的可视化DAG工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中`开箱即用`。 |
||||
其主要目标如下: |
||||
- 以DAG图的方式将Task按照任务的依赖关系关联起来,可实时可视化监控任务的运行状态 |
||||
- 支持丰富的任务类型:Shell、MR、Spark、SQL(mysql、postgresql、hive、sparksql),Python,Sub_Process、Procedure等 |
||||
- 支持工作流定时调度、依赖调度、手动调度、手动暂停/停止/恢复,同时支持失败重试/告警、从指定节点恢复失败、Kill任务等操作 |
||||
- 支持工作流优先级、任务优先级及任务的故障转移及任务超时告警/失败 |
||||
- 支持工作流全局参数及节点自定义参数设置 |
||||
- 支持资源文件的在线上传/下载,管理等,支持在线文件创建、编辑 |
||||
- 支持任务日志在线查看及滚动、在线下载日志等 |
||||
- 实现集群HA,通过Zookeeper实现Master集群和Worker集群去中心化 |
||||
- 支持对`Master/Worker` cpu load,memory,cpu在线查看 |
||||
- 支持工作流运行历史树形/甘特图展示、支持任务状态统计、流程状态统计 |
||||
- 支持补数 |
||||
- 支持多租户 |
||||
- 支持国际化 |
||||
- 还有更多等待伙伴们探索 |
||||
|
||||
### 与同类调度系统的对比 |
||||
<style> |
||||
table th:first-of-type { |
||||
width: 200px; |
||||
} |
||||
</style> |
||||
|
||||
| | EasyScheduler | Azkaban | Airflow | |
||||
| :---------------------- | :------------------------------------------------------------ | :------------------------------------------------------------ | :------------------------------------------------------------ | |
||||
| <h6>稳定性 | | | | |
||||
| 单点故障 | 去中心化的多Master和多Worker | 是 <br> 单个Web和调度程序组合 | 是<br> 单一调度程序 | |
||||
| HA额外要求 | 不需要(本身就支持HA) | DB | Celery / Dask / Mesos + Load Balancer + DB | |
||||
| 过载处理 | 任务队列机制,单个机器上可调度的任务数量可以灵活配置,当任务过多时会缓存在任务队列中,不会造成机器卡死 | 任务太多时会卡死服务器 | 任务太多时会卡死服务器 | |
||||
| <h6>易用性 | | | | |
||||
| DAG监控界面 | 任务状态、任务类型、重试次数、任务运行机器、可视化变量等关键信息一目了然 | 只能看到任务状态 | 不能直观区分任务类型 | |
||||
| 可视化流程定义 | 是 <br> 所有流程定义操作都是可视化的,通过拖拽任务来绘制DAG,配置数据源及资源。同时对于第三方系统,提供api方式的操作。 | 否 <br> 通过自定义DSL绘制DAG并打包上传 | 否 <br> 通过python代码来绘制DAG,使用不便,特别是对不会写代码的业务人员基本无法使用。 | |
||||
| 快速部署 | 一键部署 | 集群化部署复杂 | 集群化部署复杂 | |
||||
| <h6>功能 | | | | |
||||
| 是否能暂停和恢复 | 支持暂停,恢复操作 | 否 <br> 需将工作流杀死再运行 | 否 <br> 需将工作流杀死再运行 | |
||||
| 是否支持多租户 | 支持 <br> easyscheduler上的用户可以通过租户和hadoop用户实现多对一或一对一的映射关系,这对大数据作业的调度是非常重要的。 | 否 | 否 | |
||||
| 任务类型 | 支持传统的shell任务,同时支持大数据平台任务调度: MR、Spark、SQL(mysql、postgresql、hive、sparksql)、Python、Procedure、Sub_Process | shell、gobblin、hadoopJava、java、hive、pig、spark、hdfsToTeradata、teradataToHdfs | BashOperator、DummyOperator、MySqlOperator、HiveOperator、EmailOperator、HTTPOperator、SqlOperator | |
||||
| 契合度 | 支持大数据作业spark,hive,mr的调度,同时由于支持多租户,与大数据业务更加契合 | 由于不支持多租户,在大数据平台业务使用不够灵活 | 由于不支持多租户,在大数据平台业务使用不够灵活 | |
||||
| <h6>扩展性 | | | | |
||||
| <center>是否支持自定义任务类型 | 是 | 是 | 是 | |
||||
| 是否支持集群扩展 | 是 <br> 调度器使用分布式调度,整体的调度能力会随便集群的规模线性增长,Master和Worker支持动态上下线 | 是,但是复杂 <br> Executor水平扩展 | 是,但是复杂 <br> Executor水平扩展 | |
||||
|
||||
|
||||
### 系统部分截图 |
||||
|
||||
![](http://geek.analysys.cn/static/upload/47/2019-03-06/76db3013-8e3b-4d17-b167-2aa1e6a6b0ad.jpeg) |
||||
|
||||
![](http://geek.analysys.cn/static/upload/47/2019-03-06/08b79a19-4aa0-4a73-a71b-81ad210513fb.jpeg) |
||||
|
||||
![](http://geek.analysys.cn/static/upload/47/2019-03-06/384dd8a3-4cf8-4e3e-944d-1185ba198f75.jpeg) |
||||
|
||||
### 文档 |
||||
- 部署文档 |
||||
<a href="https://analysys.github.io/EasyScheduler/pages/deploy-background.html" target="_blank">后端部署文档</a> |
||||
|
||||
<a href="https://analysys.github.io/EasyScheduler/pages/deploy-foreground.html" target="_blank">前端部署文档</a> |
||||
|
||||
[**使用手册**](https://analysys.github.io/EasyScheduler/pages/guide-manual.html?_blank "使用手册") |
||||
|
||||
更多文档请参考 XXX |
||||
|
||||
### 帮助 |
||||
The fastest way to get response from our developers is to submit issues, or add our wechat : 510570367 |
||||
|
@ -0,0 +1,21 @@
|
||||
# Summary |
||||
|
||||
* [Easyscheduler简介](README.md) |
||||
* 前端文档 |
||||
* [环境搭建](frontend-deploy.md#前端项目环境构建及编译) |
||||
* [安装及配置](frontend-deploy.md#安装及配置) |
||||
* [项目生产环境Nginx配置](frontend-deploy.md#项目生产环境配置) |
||||
* [前端项目发布](frontend-deploy.md#前端项目发布) |
||||
* [问题](frontend-deploy.md#问题) |
||||
* [项目目录结构](frontend-development.md#项目目录结构) |
||||
* [系统功能模块](frontend-development.md#系统功能模块) |
||||
* [路由和状态管理](frontend-development.md#路由和状态管理) |
||||
* [规范](frontend-development.md#规范) |
||||
* [接口](frontend-development.md#接口) |
||||
* [扩展开发](frontend-development.md#扩展开发) |
||||
* 后端文档 |
||||
* [系统架构设计](architecture-design.md#调度系统架构设计) |
||||
* [部署文档](backend-deploy.md#部署文档) |
||||
* [自定义任务插件文档](task-plugin-development.md#任务插件开发) |
||||
* [使用说明文档](user-manual.md#使用手册) |
||||
|
@ -0,0 +1,749 @@
|
||||
|
||||
<!DOCTYPE HTML> |
||||
<html lang="zh-hans" > |
||||
<head> |
||||
<meta charset="UTF-8"> |
||||
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"> |
||||
<title>系统架构设计 · 调度系统-EasyScheduler</title> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
||||
<meta name="description" content=""> |
||||
<meta name="generator" content="GitBook 3.2.3"> |
||||
<meta name="author" content="YIGUAN"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/style.css"> |
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/gitbook-plugin-expandable-chapters/expandable-chapters.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/gitbook-plugin-insert-logo-link/plugin.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/gitbook-plugin-highlight/website.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="styles/website.css"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<meta name="HandheldFriendly" content="true"/> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> |
||||
<meta name="apple-mobile-web-app-capable" content="yes"> |
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black"> |
||||
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png"> |
||||
<link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon"> |
||||
|
||||
|
||||
<link rel="next" href="backend-deploy.html" /> |
||||
|
||||
|
||||
|
||||
</head> |
||||
<body> |
||||
|
||||
<div class="book"> |
||||
<div class="book-summary"> |
||||
|
||||
|
||||
<div id="book-search-input" role="search"> |
||||
<input type="text" placeholder="输入并搜索" /> |
||||
</div> |
||||
|
||||
|
||||
<nav role="navigation"> |
||||
|
||||
|
||||
|
||||
<ul class="summary"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="chapter " data-level="1.1" data-path="./"> |
||||
|
||||
<a href="./"> |
||||
|
||||
|
||||
Easyscheduler简介 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2" > |
||||
|
||||
<span> |
||||
|
||||
|
||||
前端文档 |
||||
|
||||
</span> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.2.1" data-path="frontend-deploy.html"> |
||||
|
||||
<a href="frontend-deploy.html#前端项目环境构建及编译"> |
||||
|
||||
|
||||
环境搭建 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2" data-path="frontend-deploy.html"> |
||||
|
||||
<a href="frontend-deploy.html#安装及配置"> |
||||
|
||||
|
||||
安装及配置 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.3" data-path="frontend-deploy.html"> |
||||
|
||||
<a href="frontend-deploy.html#项目生产环境配置"> |
||||
|
||||
|
||||
项目生产环境Nginx配置 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.4" data-path="frontend-deploy.html"> |
||||
|
||||
<a href="frontend-deploy.html#前端项目发布"> |
||||
|
||||
|
||||
前端项目发布 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.5" data-path="frontend-deploy.html"> |
||||
|
||||
<a href="frontend-deploy.html#问题"> |
||||
|
||||
|
||||
问题 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.6" data-path="frontend-development.html"> |
||||
|
||||
<a href="frontend-development.html#项目目录结构"> |
||||
|
||||
|
||||
项目目录结构 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.7" data-path="frontend-development.html"> |
||||
|
||||
<a href="frontend-development.html#系统功能模块"> |
||||
|
||||
|
||||
系统功能模块 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.8" data-path="frontend-development.html"> |
||||
|
||||
<a href="frontend-development.html#路由和状态管理"> |
||||
|
||||
|
||||
路由和状态管理 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.9" data-path="frontend-development.html"> |
||||
|
||||
<a href="frontend-development.html#规范"> |
||||
|
||||
|
||||
规范 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.10" data-path="frontend-development.html"> |
||||
|
||||
<a href="frontend-development.html#接口"> |
||||
|
||||
|
||||
接口 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.11" data-path="frontend-development.html"> |
||||
|
||||
<a href="frontend-development.html#扩展开发"> |
||||
|
||||
|
||||
扩展开发 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3" > |
||||
|
||||
<span> |
||||
|
||||
|
||||
后端文档 |
||||
|
||||
</span> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.3.1" data-path="architecture-design.html"> |
||||
|
||||
<a href="architecture-design.html#调度系统架构设计"> |
||||
|
||||
|
||||
系统架构设计 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2" data-path="backend-deploy.html"> |
||||
|
||||
<a href="backend-deploy.html#部署文档"> |
||||
|
||||
|
||||
部署文档 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.3" data-path="task-plugin-development.html"> |
||||
|
||||
<a href="task-plugin-development.html#任务插件开发"> |
||||
|
||||
|
||||
自定义任务插件文档 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.4" data-path="user-manual.md"> |
||||
|
||||
<span> |
||||
|
||||
|
||||
使用说明文档 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
|
||||
|
||||
<li class="divider"></li> |
||||
|
||||
<li> |
||||
<a href="https://www.gitbook.com" target="blank" class="gitbook-link"> |
||||
本书使用 GitBook 发布 |
||||
</a> |
||||
</li> |
||||
</ul> |
||||
|
||||
|
||||
</nav> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<div class="book-body"> |
||||
|
||||
<div class="body-inner"> |
||||
|
||||
|
||||
|
||||
<div class="book-header" role="navigation"> |
||||
|
||||
|
||||
<!-- Title --> |
||||
<h1> |
||||
<i class="fa fa-circle-o-notch fa-spin"></i> |
||||
<a href="." >系统架构设计</a> |
||||
</h1> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
<div class="page-wrapper" tabindex="-1" role="main"> |
||||
<div class="page-inner"> |
||||
|
||||
<div id="book-search-results"> |
||||
<div class="search-noresults"> |
||||
|
||||
<section class="normal markdown-section"> |
||||
|
||||
<h2 id="调度系统架构设计">调度系统架构设计</h2> |
||||
<p>在对系统架构说明之前,我们先来认识一下调度系统常用的名词</p> |
||||
<h3 id="1名词解释">1.名词解释</h3> |
||||
<p><strong>DAG:</strong> 全称Directed Acyclic Graph,简称DAG。工作流中的Task任务以有向无环图的形式组装起来,从入度为零的节点进行拓扑遍历,直到无后继节点为止。举例如下图:</p> |
||||
<p align="center"> |
||||
<img src="https://analysys.github.io/EasyScheduler/zh_CN/images/dag_examples_cn.jpg" alt="dag示例" width="60%"> |
||||
</p><p align="center"> |
||||
<em>dag示例</em> |
||||
</p> |
||||
<p></p> |
||||
**流程定义**:通过拖拽任务节点并建立任务节点的关联所形成的可视化**DAG** |
||||
|
||||
**流程实例**:流程实例是流程定义的实例化,可以通过手动启动或定时调度生成 |
||||
|
||||
**任务实例**:任务实例是流程定义中任务节点的实例化,标识着具体的任务执行状态 |
||||
|
||||
**任务类型**: 目前支持有SHELL、SQL、SUB_PROCESS、PROCEDURE、MR、SPARK、PYTHON、DEPENDENT,同时计划支持动态插件扩展,注意:其中子 **SUB_PROCESS** 也是一个单独的流程定义,是可以单独启动执行的 |
||||
|
||||
**调度方式:** 系统支持基于cron表达式的定时调度和手动调度。命令类型支持:启动工作流、从当前节点开始执行、恢复被容错的工作流、恢复暂停流程、从失败节点开始执行、补数、调度、重跑、暂停、停止、恢复等待线程。其中 **恢复被容错的工作流** 和 **恢复等待线程 **两种命令类型是由调度内部控制使用,外部无法调用 |
||||
|
||||
**定时调度**:系统采用 **quartz** 分布式调度器,并同时支持cron表达式可视化的生成 |
||||
|
||||
**依赖**:系统不单单支持 **DAG** 简单的前驱和后继节点之间的依赖,同时还提供**任务依赖**节点,支持**流程间的自定义任务依赖** |
||||
|
||||
**优先级** :支持流程实例和任务实例的优先级,如果流程实例和任务实例的优先级不设置,则默认是先进先出 |
||||
|
||||
**邮件告警**:支持 **SQL任务** 查询结果邮件发送,流程实例运行结果邮件告警及容错告警通知 |
||||
|
||||
**失败策略**:对于并行运行的任务,如果有任务失败,提供两种失败策略处理方式,**继续**是指不管并行运行任务的状态,直到流程失败结束。**结束**是指一旦发现失败任务,则同时Kill掉正在运行的并行任务,流程失败结束 |
||||
|
||||
**补数**:补历史数据,支持**区间并行和串行**两种补数方式 |
||||
|
||||
### 2.系统架构 |
||||
|
||||
#### 2.1 系统架构图 |
||||
<p align="center"> |
||||
<img src="https://analysys.github.io/EasyScheduler/zh_CN/images/architecture.jpg" alt="系统架构图" width="70%"> |
||||
</p><p align="center"> |
||||
<em>系统架构图</em> |
||||
</p> |
||||
<p></p> |
||||
|
||||
<h4 id="22-架构说明">2.2 架构说明</h4> |
||||
<ul> |
||||
<li><p><strong>MasterServer</strong> </p> |
||||
<p> MasterServer采用分布式无中心设计理念,MasterServer主要负责 DAG 任务切分、任务提交监控,并同时监听其它MasterServer和WorkerServer的健康状态。 |
||||
MasterServer服务启动时向Zookeeper注册临时节点,通过监听Zookeeper临时节点变化来进行容错处理。</p> |
||||
<h5 id="该服务内主要包含">该服务内主要包含:</h5> |
||||
<ul> |
||||
<li><p><strong>Distributed Quartz</strong>分布式调度组件,主要负责定时任务的启停操作,当quartz调起任务后,Master内部会有线程池具体负责处理任务的后续操作</p> |
||||
</li> |
||||
<li><p><strong>MasterSchedulerThread</strong>是一个扫描线程,定时扫描数据库中的 <strong>command</strong> 表,根据不同的<strong>命令类型</strong>进行不同的业务操作</p> |
||||
</li> |
||||
<li><p><strong>MasterExecThread</strong>主要是负责DAG任务切分、任务提交监控、各种不同命令类型的逻辑处理</p> |
||||
</li> |
||||
<li><p><strong>MasterTaskExecThread</strong>主要负责任务的持久化</p> |
||||
</li> |
||||
</ul> |
||||
</li> |
||||
<li><p><strong>WorkerServer</strong> </p> |
||||
<p> WorkerServer也采用分布式无中心设计理念,WorkerServer主要负责任务的执行和提供日志服务。WorkerServer服务启动时向Zookeeper注册临时节点,并维持心跳。</p> |
||||
<h5 id="该服务包含:">该服务包含:</h5> |
||||
<ul> |
||||
<li><p><strong>FetchTaskThread</strong>主要负责不断从<strong>Task Queue</strong>中领取任务,并根据不同任务类型调用<strong>TaskScheduleThread</strong>对应执行器。</p> |
||||
</li> |
||||
<li><p><strong>LoggerServer</strong>是一个RPC服务,提供日志分片查看、刷新和下载等功能</p> |
||||
</li> |
||||
</ul> |
||||
</li> |
||||
<li><p><strong>ZooKeeper</strong> </p> |
||||
<p> ZooKeeper服务,系统中的MasterServer和WorkerServer节点都通过ZooKeeper来进行集群管理和容错。另外系统还基于ZooKeeper进行事件监听和分布式锁。 |
||||
我们也曾经基于Redis实现过队列,不过我们希望EasyScheduler依赖到的组件尽量地少,所以最后还是去掉了Redis实现。</p> |
||||
</li> |
||||
<li><p><strong>Task Queue</strong> </p> |
||||
<p> 提供任务队列的操作,目前队列也是基于Zookeeper来实现。由于队列中存的信息较少,不必担心队列里数据过多的情况,实际上我们压测过百万级数据存队列,对系统稳定性和性能没影响。</p> |
||||
</li> |
||||
<li><p><strong>Alert</strong> </p> |
||||
<p> 提供告警相关接口,接口主要包括<strong>告警</strong>两种类型的告警数据的存储、查询和通知功能。其中通知功能又有<strong>邮件通知</strong>和<strong>SNMP(暂未实现)</strong>两种。</p> |
||||
</li> |
||||
<li><p><strong>API</strong> </p> |
||||
<p> API接口层,主要负责处理前端UI层的请求。该服务统一提供RESTful api向外部提供请求服务。 |
||||
接口包括工作流的创建、定义、查询、修改、发布、下线、手工启动、停止、暂停、恢复、从该节点开始执行等等。</p> |
||||
</li> |
||||
<li><p><strong>UI</strong> </p> |
||||
<p> 系统的前端页面,提供系统的各种可视化操作界面,详见<strong><a href="">使用手册</a></strong>部分。</p> |
||||
</li> |
||||
</ul> |
||||
<h4 id="23-架构设计思想">2.3 架构设计思想</h4> |
||||
<h5 id="一、去中心化vs中心化">一、去中心化vs中心化</h5> |
||||
<h6 id="中心化思想">中心化思想</h6> |
||||
<p>中心化的设计理念比较简单,分布式集群中的节点按照角色分工,大体上分为两种角色:</p> |
||||
<p align="center"> |
||||
<img src="https://analysys.github.io/EasyScheduler/zh_CN/images/master_slave.png" alt="master-slave角色" width="50%"> |
||||
</p> |
||||
- Master的角色主要负责任务分发并监督Slave的健康状态,可以动态的将任务均衡到Slave上,以致Slave节点不至于“忙死”或”闲死”的状态。 |
||||
- Worker的角色主要负责任务的执行工作并维护和Master的心跳,以便Master可以分配任务给Slave。 |
||||
|
||||
|
||||
|
||||
中心化思想设计存在的问题: |
||||
|
||||
- 一旦Master出现了问题,则群龙无首,整个集群就会崩溃。为了解决这个问题,大多数Master/Slave架构模式都采用了主备Master的设计方案,可以是热备或者冷备,也可以是自动切换或手动切换,而且越来越多的新系统都开始具备自动选举切换Master的能力,以提升系统的可用性。 |
||||
- 另外一个问题是如果Scheduler在Master上,虽然可以支持一个DAG中不同的任务运行在不同的机器上,但是会产生Master的过负载。如果Scheduler在Slave上,则一个DAG中所有的任务都只能在某一台机器上进行作业提交,则并行任务比较多的时候,Slave的压力可能会比较大。 |
||||
|
||||
|
||||
|
||||
###### 去中心化 |
||||
<p align="center" <img="" src="https://analysys.github.io/EasyScheduler/zh_CN/images/decentralization.png" alt="去中心化" width="50%"> |
||||
</p> |
||||
- 在去中心化设计里,通常没有Master/Slave的概念,所有的角色都是一样的,地位是平等的,全球互联网就是一个典型的去中心化的分布式系统,联网的任意节点设备down机,都只会影响很小范围的功能。 |
||||
- 去中心化设计的核心设计在于整个分布式系统中不存在一个区别于其他节点的”管理者”,因此不存在单点故障问题。但由于不存在” 管理者”节点所以每个节点都需要跟其他节点通信才得到必须要的机器信息,而分布式系统通信的不可靠行,则大大增加了上述功能的实现难度。 |
||||
- 实际上,真正去中心化的分布式系统并不多见。反而动态中心化分布式系统正在不断涌出。在这种架构下,集群中的管理者是被动态选择出来的,而不是预置的,并且集群在发生故障的时候,集群的节点会自发的举行"会议"来选举新的"管理者"去主持工作。最典型的案例就是ZooKeeper及Go语言实现的Etcd。 |
||||
|
||||
|
||||
|
||||
- EasyScheduler的去中心化是Master/Worker注册到Zookeeper中,实现Master集群和Worker集群无中心,并使用Zookeeper分布式锁来选举其中的一台Master或Worker为“管理者”来执行任务。 |
||||
|
||||
##### 二、分布式锁实践 |
||||
|
||||
EasyScheduler使用ZooKeeper分布式锁来实现同一时刻只有一台Master执行Scheduler,或者只有一台Worker执行任务的提交。 |
||||
1. 获取分布式锁的核心流程算法如下 |
||||
<p align="center"> |
||||
<img src="https://analysys.github.io/EasyScheduler/zh_CN/images/distributed_lock.png" alt="获取分布式锁流程" width="50%"> |
||||
</p> |
||||
|
||||
<ol> |
||||
<li>EasyScheduler中Scheduler线程分布式锁实现流程图:<p align="center"> |
||||
<img src="https://analysys.github.io/EasyScheduler/zh_CN/images/distributed_lock_procss.png" alt="获取分布式锁流程" width="50%"> |
||||
</p> |
||||
|
||||
|
||||
</li> |
||||
</ol> |
||||
<h5 id="三、线程不足循环等待问题">三、线程不足循环等待问题</h5> |
||||
<ul> |
||||
<li>如果一个DAG中没有子流程,则如果Command中的数据条数大于线程池设置的阈值,则直接流程等待或失败。</li> |
||||
<li><p>如果一个大的DAG中嵌套了很多子流程,如下图则会产生“死等”状态:</p> |
||||
<p></p><p align="center"> |
||||
<img src="https://analysys.github.io/EasyScheduler/zh_CN/images/lack_thread.png" alt="线程不足循环等待问题" width="50%"> |
||||
</p> |
||||
上图中MainFlowThread等待SubFlowThread1结束,SubFlowThread1等待SubFlowThread2结束, SubFlowThread2等待SubFlowThread3结束,而SubFlowThread3等待线程池有新线程,则整个DAG流程不能结束,从而其中的线程也不能释放。这样就形成的子父流程循环等待的状态。此时除非启动新的Master来增加线程来打破这样的”僵局”,否则调度集群将不能再使用。<p></p> |
||||
</li> |
||||
</ul> |
||||
<p>对于启动新Master来打破僵局,似乎有点差强人意,于是我们提出了以下三种方案来降低这种风险:</p> |
||||
<ol> |
||||
<li>计算所有Master的线程总和,然后对每一个DAG需要计算其需要的线程数,也就是在DAG流程执行之前做预计算。因为是多Master线程池,所以总线程数不太可能实时获取。 </li> |
||||
<li>对单Master线程池进行判断,如果线程池已经满了,则让线程直接失败。</li> |
||||
<li>增加一种资源不足的Command类型,如果线程池不足,则将主流程挂起。这样线程池就有了新的线程,可以让资源不足挂起的流程重新唤醒执行。</li> |
||||
</ol> |
||||
<p>注意:Master Scheduler线程在获取Command的时候是FIFO的方式执行的。</p> |
||||
<p>于是我们选择了第三种方式来解决线程不足的问题。</p> |
||||
<h5 id="四、容错设计">四、容错设计</h5> |
||||
<p>容错分为服务宕机容错和任务重试,服务宕机容错又分为Master容错和Worker容错两种情况</p> |
||||
<h6 id="1-宕机容错">1. 宕机容错</h6> |
||||
<p>服务容错设计依赖于ZooKeeper的Watcher机制,实现原理如图:</p> |
||||
<p align="center"> |
||||
<img src="https://analysys.github.io/EasyScheduler/zh_CN/images/fault-tolerant.png" alt="EasyScheduler容错设计" width="40%"> |
||||
</p> |
||||
其中Master监控其他Master和Worker的目录,如果监听到remove事件,则会根据具体的业务逻辑进行流程实例容错或者任务实例容错。 |
||||
|
||||
|
||||
|
||||
- Master容错流程图: |
||||
|
||||
<p align="center"> |
||||
<img src="https://analysys.github.io/EasyScheduler/zh_CN/images/fault-tolerant_master.png" alt="Master容错流程图" width="40%"> |
||||
</p> |
||||
ZooKeeper Master容错完成之后则重新由EasyScheduler中Scheduler线程调度,遍历 DAG 找到”正在运行”和“提交成功”的任务,对”正在运行”的任务监控其任务实例的状态,对”提交成功”的任务需要判断Task Queue中是否已经存在,如果存在则同样监控任务实例的状态,如果不存在则重新提交任务实例。 |
||||
|
||||
|
||||
|
||||
- Worker容错流程图: |
||||
|
||||
<p align="center"> |
||||
<img src="https://analysys.github.io/EasyScheduler/zh_CN/images/fault-tolerant_worker.png" alt="Worker容错流程图" width="40%"> |
||||
</p> |
||||
Master Scheduler线程一旦发现任务实例为” 需要容错”状态,则接管任务并进行重新提交。 |
||||
|
||||
注意:由于” 网络抖动”可能会使得节点短时间内失去和ZooKeeper的心跳,从而发生节点的remove事件。对于这种情况,我们使用最简单的方式,那就是节点一旦和ZooKeeper发生超时连接,则直接将Master或Worker服务停掉。 |
||||
|
||||
###### 2.任务失败重试 |
||||
|
||||
这里首先要区分任务失败重试、流程失败恢复、流程失败重跑的概念: |
||||
|
||||
- 任务失败重试是任务级别的,是调度系统自动进行的,比如一个Shell任务设置重试次数为3次,那么在Shell任务运行失败后会自己再最多尝试运行3次 |
||||
- 流程失败恢复是流程级别的,是手动进行的,恢复是从只能**从失败的节点开始执行**或**从当前节点开始执行** |
||||
- 流程失败重跑也是流程级别的,是手动进行的,重跑是从开始节点进行 |
||||
|
||||
|
||||
|
||||
接下来说正题,我们将工作流中的任务节点分了两种类型。 |
||||
|
||||
- 一种是业务节点,这种节点都对应一个实际的脚本或者处理语句,比如Shell节点,MR节点、Spark节点、依赖节点等。 |
||||
|
||||
- 还有一种是逻辑节点,这种节点不做实际的脚本或语句处理,只是整个流程流转的逻辑处理,比如子流程节等。 |
||||
|
||||
每一个**业务节点**都可以配置失败重试的次数,当该任务节点失败,会自动重试,直到成功或者超过配置的重试次数。**逻辑节点**不支持失败重试。但是逻辑节点里的任务支持重试。 |
||||
|
||||
如果工作流中有任务失败达到最大重试次数,工作流就会失败停止,失败的工作流可以手动进行重跑操作或者流程恢复操作 |
||||
|
||||
|
||||
|
||||
##### 五、任务优先级设计 |
||||
在早期调度设计中,如果没有优先级设计,采用公平调度设计的话,会遇到先行提交的任务可能会和后继提交的任务同时完成的情况,而不能做到设置流程或者任务的优先级,因此我们对此进行了重新设计,目前我们设计如下: |
||||
|
||||
- 按照**不同流程实例优先级**优先于**同一个流程实例优先级**优先于**同一流程内任务优先级**优先于**同一流程内任务**提交顺序依次从高到低进行任务处理。 |
||||
- 具体实现是根据任务实例的json解析优先级,然后把**流程实例优先级_流程实例id_任务优先级_任务id**信息保存在ZooKeeper任务队列中,当从任务队列获取的时候,通过字符串比较即可得出最需要优先执行的任务 |
||||
|
||||
- 其中流程定义的优先级是考虑到有些流程需要先于其他流程进行处理,这个可以在流程启动或者定时启动时配置,共有5级,依次为HIGHEST、HIGH、MEDIUM、LOW、LOWEST。如下图 |
||||
<p align="center"> |
||||
<img src="https://analysys.github.io/EasyScheduler/zh_CN/images/process_priority.png" alt="流程优先级配置" width="40%"> |
||||
</p> |
||||
|
||||
<pre><code> - 任务的优先级也分为5级,依次为HIGHEST、HIGH、MEDIUM、LOW、LOWEST。如下图 |
||||
<p align="center"> |
||||
<img src="https://analysys.github.io/EasyScheduler/zh_CN/images/task_priority.png" alt="任务优先级配置" width="35%" /> |
||||
</p> |
||||
</code></pre><h5 id="六、logback和grpc实现日志访问">六、Logback和gRPC实现日志访问</h5> |
||||
<ul> |
||||
<li><p>由于Web(UI)和Worker不一定在同一台机器上,所以查看日志不能像查询本地文件那样。有两种方案:</p> |
||||
<ul> |
||||
<li>将日志放到ES搜索引擎上</li> |
||||
<li>通过gRPC通信获取远程日志信息</li> |
||||
</ul> |
||||
</li> |
||||
<li><p>介于考虑到尽可能的EasyScheduler的轻量级性,所以选择了gRPC实现远程访问日志信息。</p> |
||||
<p align="center"> |
||||
<img src="https://analysys.github.io/EasyScheduler/zh_CN/images/grpc.png" alt="grpc远程访问" width="50%"> |
||||
</p> |
||||
|
||||
|
||||
</li> |
||||
</ul> |
||||
<ul> |
||||
<li>我们使用自定义Logback的FileAppender和Filter功能,实现每个任务实例生成一个日志文件。</li> |
||||
<li><p>FileAppender主要实现如下:</p> |
||||
<pre><code class="lang-java"><span class="hljs-comment">/** |
||||
* task log appender |
||||
*/</span> |
||||
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TaskLogAppender</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">FileAppender</span><<span class="hljs-title">ILoggingEvent</span> </span>{ |
||||
|
||||
... |
||||
|
||||
<span class="hljs-meta">@Override</span> |
||||
<span class="hljs-function"><span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">append</span><span class="hljs-params">(ILoggingEvent event)</span> </span>{ |
||||
|
||||
<span class="hljs-keyword">if</span> (currentlyActiveFile == <span class="hljs-keyword">null</span>){ |
||||
currentlyActiveFile = getFile(); |
||||
} |
||||
String activeFile = currentlyActiveFile; |
||||
<span class="hljs-comment">// thread name: taskThreadName-processDefineId_processInstanceId_taskInstanceId</span> |
||||
String threadName = event.getThreadName(); |
||||
String[] threadNameArr = threadName.split(<span class="hljs-string">"-"</span>); |
||||
<span class="hljs-comment">// logId = processDefineId_processInstanceId_taskInstanceId</span> |
||||
String logId = threadNameArr[<span class="hljs-number">1</span>]; |
||||
... |
||||
<span class="hljs-keyword">super</span>.subAppend(event); |
||||
} |
||||
} |
||||
</code></pre> |
||||
</li> |
||||
</ul> |
||||
<p>以/流程定义id/流程实例id/任务实例id.log的形式生成日志</p> |
||||
<ul> |
||||
<li><p>过滤匹配以TaskLogInfo开始的线程名称:</p> |
||||
</li> |
||||
<li><p>TaskLogFilter实现如下:</p> |
||||
<pre><code class="lang-java"><span class="hljs-comment">/** |
||||
* task log filter |
||||
*/</span> |
||||
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TaskLogFilter</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Filter</span><<span class="hljs-title">ILoggingEvent</span> </span>{ |
||||
|
||||
<span class="hljs-meta">@Override</span> |
||||
<span class="hljs-function"><span class="hljs-keyword">public</span> FilterReply <span class="hljs-title">decide</span><span class="hljs-params">(ILoggingEvent event)</span> </span>{ |
||||
<span class="hljs-keyword">if</span> (event.getThreadName().startsWith(<span class="hljs-string">"TaskLogInfo-"</span>)){ |
||||
<span class="hljs-keyword">return</span> FilterReply.ACCEPT; |
||||
} |
||||
<span class="hljs-keyword">return</span> FilterReply.DENY; |
||||
} |
||||
} |
||||
</code></pre> |
||||
</li> |
||||
</ul> |
||||
<h3 id="总结">总结</h3> |
||||
<p>本文从调度出发,初步介绍了大数据分布式工作流调度系统--EasyScheduler的架构原理及实现思路。后续会补充</p> |
||||
|
||||
|
||||
</section> |
||||
|
||||
</div> |
||||
<div class="search-results"> |
||||
<div class="has-results"> |
||||
|
||||
<h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1> |
||||
<ul class="search-results-list"></ul> |
||||
|
||||
</div> |
||||
<div class="no-results"> |
||||
|
||||
<h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1> |
||||
|
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
</div> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
<a href="backend-deploy.html#部署文档" class="navigation navigation-next navigation-unique" aria-label="Next page: 部署文档"> |
||||
<i class="fa fa-angle-right"></i> |
||||
</a> |
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
<script> |
||||
var gitbook = gitbook || []; |
||||
gitbook.push(function() { |
||||
gitbook.page.hasChanged({"page":{"title":"系统架构设计","level":"1.3.1","depth":2,"next":{"title":"部署文档","level":"1.3.2","depth":2,"anchor":"#部署文档","path":"backend-deploy.md","ref":"backend-deploy.md#部署文档","articles":[]},"previous":{"title":"后端文档","level":"1.3","depth":1,"ref":"","articles":[{"title":"系统架构设计","level":"1.3.1","depth":2,"anchor":"#调度系统架构设计","path":"architecture-design.md","ref":"architecture-design.md#调度系统架构设计","articles":[]},{"title":"部署文档","level":"1.3.2","depth":2,"anchor":"#部署文档","path":"backend-deploy.md","ref":"backend-deploy.md#部署文档","articles":[]},{"title":"自定义任务插件文档","level":"1.3.3","depth":2,"anchor":"#任务插件开发","path":"task-plugin-development.md","ref":"task-plugin-development.md#任务插件开发","articles":[]}]},"dir":"ltr"},"config":{"plugins":["expandable-chapters","insert-logo-link"],"styles":{"website":"./styles/website.css"},"pluginsConfig":{"insert-logo-link":{"src":"../images/logo.png","url":"/"},"expandable-chapters":{},"highlight":{},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"theme":"default","author":"YIGUAN","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{},"title":"调度系统-EasyScheduler","language":"zh-hans","gitbook":"3.2.3","description":"调度系统"},"file":{"path":"architecture-design.md","mtime":"2019-03-28T10:39:45.015Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2019-03-28T11:15:13.750Z"},"basePath":".","book":{"language":""}}); |
||||
}); |
||||
</script> |
||||
</div> |
||||
|
||||
|
||||
<script src="gitbook/gitbook.js"></script> |
||||
<script src="gitbook/theme.js"></script> |
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-expandable-chapters/expandable-chapters.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-insert-logo-link/plugin.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-search/search-engine.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-search/search.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-lunr/lunr.min.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-lunr/search-lunr.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-sharing/buttons.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script> |
||||
|
||||
|
||||
|
||||
</body> |
||||
</html> |
||||
|
@ -0,0 +1,886 @@
|
||||
|
||||
<!DOCTYPE HTML> |
||||
<html lang="zh-hans" > |
||||
<head> |
||||
<meta charset="UTF-8"> |
||||
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"> |
||||
<title>部署文档 · 调度系统-EasyScheduler</title> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
||||
<meta name="description" content=""> |
||||
<meta name="generator" content="GitBook 3.2.3"> |
||||
<meta name="author" content="YIGUAN"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/style.css"> |
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/gitbook-plugin-expandable-chapters/expandable-chapters.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/gitbook-plugin-insert-logo-link/plugin.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/gitbook-plugin-highlight/website.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="styles/website.css"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<meta name="HandheldFriendly" content="true"/> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> |
||||
<meta name="apple-mobile-web-app-capable" content="yes"> |
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black"> |
||||
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png"> |
||||
<link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon"> |
||||
|
||||
|
||||
<link rel="next" href="task-plugin-development.html" /> |
||||
|
||||
|
||||
<link rel="prev" href="architecture-design.html" /> |
||||
|
||||
|
||||
</head> |
||||
<body> |
||||
|
||||
<div class="book"> |
||||
<div class="book-summary"> |
||||
|
||||
|
||||
<div id="book-search-input" role="search"> |
||||
<input type="text" placeholder="输入并搜索" /> |
||||
</div> |
||||
|
||||
|
||||
<nav role="navigation"> |
||||
|
||||
|
||||
|
||||
<ul class="summary"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="chapter " data-level="1.1" data-path="./"> |
||||
|
||||
<a href="./"> |
||||
|
||||
|
||||
Easyscheduler简介 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2" > |
||||
|
||||
<span> |
||||
|
||||
|
||||
前端文档 |
||||
|
||||
</span> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.2.1" data-path="frontend-deploy.html"> |
||||
|
||||
<a href="frontend-deploy.html#前端项目环境构建及编译"> |
||||
|
||||
|
||||
环境搭建 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2" data-path="frontend-deploy.html"> |
||||
|
||||
<a href="frontend-deploy.html#安装及配置"> |
||||
|
||||
|
||||
安装及配置 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.3" data-path="frontend-deploy.html"> |
||||
|
||||
<a href="frontend-deploy.html#项目生产环境配置"> |
||||
|
||||
|
||||
项目生产环境Nginx配置 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.4" data-path="frontend-deploy.html"> |
||||
|
||||
<a href="frontend-deploy.html#前端项目发布"> |
||||
|
||||
|
||||
前端项目发布 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.5" data-path="frontend-deploy.html"> |
||||
|
||||
<a href="frontend-deploy.html#问题"> |
||||
|
||||
|
||||
问题 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.6" data-path="frontend-development.html"> |
||||
|
||||
<a href="frontend-development.html#项目目录结构"> |
||||
|
||||
|
||||
项目目录结构 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.7" data-path="frontend-development.html"> |
||||
|
||||
<a href="frontend-development.html#系统功能模块"> |
||||
|
||||
|
||||
系统功能模块 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.8" data-path="frontend-development.html"> |
||||
|
||||
<a href="frontend-development.html#路由和状态管理"> |
||||
|
||||
|
||||
路由和状态管理 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.9" data-path="frontend-development.html"> |
||||
|
||||
<a href="frontend-development.html#规范"> |
||||
|
||||
|
||||
规范 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.10" data-path="frontend-development.html"> |
||||
|
||||
<a href="frontend-development.html#接口"> |
||||
|
||||
|
||||
接口 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.11" data-path="frontend-development.html"> |
||||
|
||||
<a href="frontend-development.html#扩展开发"> |
||||
|
||||
|
||||
扩展开发 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3" > |
||||
|
||||
<span> |
||||
|
||||
|
||||
后端文档 |
||||
|
||||
</span> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.3.1" data-path="architecture-design.html"> |
||||
|
||||
<a href="architecture-design.html#调度系统架构设计"> |
||||
|
||||
|
||||
系统架构设计 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2" data-path="backend-deploy.html"> |
||||
|
||||
<a href="backend-deploy.html#部署文档"> |
||||
|
||||
|
||||
部署文档 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.3" data-path="task-plugin-development.html"> |
||||
|
||||
<a href="task-plugin-development.html#任务插件开发"> |
||||
|
||||
|
||||
自定义任务插件文档 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.4" data-path="user-manual.md"> |
||||
|
||||
<span> |
||||
|
||||
|
||||
使用说明文档 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
|
||||
|
||||
<li class="divider"></li> |
||||
|
||||
<li> |
||||
<a href="https://www.gitbook.com" target="blank" class="gitbook-link"> |
||||
本书使用 GitBook 发布 |
||||
</a> |
||||
</li> |
||||
</ul> |
||||
|
||||
|
||||
</nav> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<div class="book-body"> |
||||
|
||||
<div class="body-inner"> |
||||
|
||||
|
||||
|
||||
<div class="book-header" role="navigation"> |
||||
|
||||
|
||||
<!-- Title --> |
||||
<h1> |
||||
<i class="fa fa-circle-o-notch fa-spin"></i> |
||||
<a href="." >部署文档</a> |
||||
</h1> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
<div class="page-wrapper" tabindex="-1" role="main"> |
||||
<div class="page-inner"> |
||||
|
||||
<div id="book-search-results"> |
||||
<div class="search-noresults"> |
||||
|
||||
<section class="normal markdown-section"> |
||||
|
||||
<h1 id="部署文档">部署文档</h1> |
||||
<h2 id="基础软件安装">基础软件安装</h2> |
||||
<ul> |
||||
<li><a href="https://blog.csdn.net/u011886447/article/details/79796802" target="_blank">mysql</a> (5.5+) : 必装</li> |
||||
<li><a href="https://www.jianshu.com/p/de90172ea680" target="_blank">zookeeper</a>(3.4.6) :必装 </li> |
||||
<li><a href="https://blog.csdn.net/Evankaka/article/details/51612437" target="_blank">hadoop</a>(2.7.3) :选装,资源上传,MR任务提交需要安装</li> |
||||
<li><a href="https://staroon.pro/2017/12/09/HiveInstall/" target="_blank">hive</a>(1.2.1) : 选装,hive任务提交需要安装</li> |
||||
<li>spark(1.x,2.x) : 选装,spark任务提交需要安装</li> |
||||
<li>postgresql(8.2.15+) : 选装,postgresql sql任务和postgresql 存储过程需要安装</li> |
||||
</ul> |
||||
<h2 id="项目编译">项目编译</h2> |
||||
<ul> |
||||
<li>执行编译命令:</li> |
||||
</ul> |
||||
<pre><code> mvn -U clean package assembly:assembly -Dmaven.test.skip=true |
||||
</code></pre><ul> |
||||
<li>查看目录</li> |
||||
</ul> |
||||
<p>正常编译完后,会在当前目录生成 target/escheduler-{version}/</p> |
||||
<pre><code> bin |
||||
conf |
||||
lib |
||||
script |
||||
sql |
||||
install.sh |
||||
</code></pre><ul> |
||||
<li>说明</li> |
||||
</ul> |
||||
<pre><code>bin : 基础服务启动脚本 |
||||
conf : 项目配置文件 |
||||
lib : 项目依赖jar包,包括各个模块jar和第三方jar |
||||
script : 集群启动、停止和服务监控启停脚本 |
||||
sql : 项目依赖sql文件 |
||||
install.sh : 一键部署脚本 |
||||
</code></pre><h2 id="数据库初始化">数据库初始化</h2> |
||||
<ul> |
||||
<li>创建db和账号</li> |
||||
</ul> |
||||
<pre><code>mysql -h {host} -u {user} -p{password} |
||||
mysql> CREATE DATABASE escheduler DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; |
||||
mysql> GRANT ALL PRIVILEGES ON escheduler.* TO '{user}'@'%' IDENTIFIED BY '{password}'; |
||||
mysql> GRANT ALL PRIVILEGES ON escheduler.* TO '{user}'@'localhost' IDENTIFIED BY '{password}'; |
||||
mysql> flush privileges; |
||||
</code></pre><ul> |
||||
<li>创建表</li> |
||||
</ul> |
||||
<pre><code>说明:在 target/escheduler-{version}/sql/escheduler.sql和quartz.sql |
||||
|
||||
mysql -h {host} -u {user} -p{password} -D {db} < escheduler.sql |
||||
|
||||
mysql -h {host} -u {user} -p{password} -D {db} < quartz.sql |
||||
</code></pre><h2 id="创建部署用户">创建部署用户</h2> |
||||
<p>因为escheduler worker 都是以 sudo -u {linux-user} 方式来执行作业,所以部署用户需要有 sudo 权限,而且是免密的。</p> |
||||
<pre><code class="lang-部署账号">vi /etc/sudoers |
||||
|
||||
# 部署用户是 escheduler 账号 |
||||
escheduler ALL=(ALL) NOPASSWD: NOPASSWD: ALL |
||||
|
||||
# 并且需要注释掉 Default requiretty 一行 |
||||
#Default requiretty |
||||
</code></pre> |
||||
<h2 id="配置文件说明">配置文件说明</h2> |
||||
<pre><code>说明:配置文件位于 target/escheduler-{version}/conf 下面 |
||||
</code></pre><h3 id="escheduler-alert">escheduler-alert</h3> |
||||
<p>配置邮件告警信息</p> |
||||
<ul> |
||||
<li>alert.properties </li> |
||||
</ul> |
||||
<pre><code>#alert type is EMAIL/SMS |
||||
alert.type=EMAIL |
||||
|
||||
# mail server configuration |
||||
mail.protocol=SMTP |
||||
mail.server.host=smtp.exmail.qq.com |
||||
mail.server.port=25 |
||||
mail.sender=xxxxxxx |
||||
mail.passwd=xxxxxxx |
||||
|
||||
# xls file path,need create if not exist |
||||
xls.file.path=/opt/xls |
||||
</code></pre><h3 id="escheduler-common">escheduler-common</h3> |
||||
<p>通用配置文件配置,队列选择及地址配置,通用文件目录配置</p> |
||||
<ul> |
||||
<li>common/common.properties</li> |
||||
</ul> |
||||
<pre><code>#task queue implementation, default "zookeeper" |
||||
escheduler.queue.impl=zookeeper |
||||
|
||||
# user data directory path, self configuration, please make sure the directory exists and have read write permissions |
||||
data.basedir.path=/tmp/escheduler |
||||
|
||||
# directory path for user data download. self configuration, please make sure the directory exists and have read write permissions |
||||
data.download.basedir.path=/tmp/escheduler/download |
||||
|
||||
# process execute directory. self configuration, please make sure the directory exists and have read write permissions |
||||
process.exec.basepath=/tmp/escheduler/exec |
||||
|
||||
# data base dir, resource file will store to this hadoop hdfs path, self configuration, please make sure the directory exists on hdfs and have read write permissions。"/escheduler" is recommended |
||||
data.store2hdfs.basepath=/escheduler |
||||
|
||||
# whether hdfs starts |
||||
hdfs.startup.state=true |
||||
|
||||
# system env path. self configuration, please make sure the directory and file exists and have read write execute permissions |
||||
escheduler.env.path=/opt/.escheduler_env.sh |
||||
escheduler.env.py=/opt/escheduler_env.py |
||||
|
||||
#resource.view.suffixs |
||||
resource.view.suffixs=txt,log,sh,conf,cfg,py,java,sql,hql,xml |
||||
|
||||
# is development state? default "false" |
||||
development.state=false |
||||
</code></pre><p>SHELL任务 环境变量配置</p> |
||||
<pre><code>说明:配置文件位于 target/escheduler-{version}/conf/env 下面 |
||||
</code></pre><p>.escheduler_env.sh </p> |
||||
<pre><code>export HADOOP_HOME=/opt/soft/hadoop |
||||
export HADOOP_CONF_DIR=/opt/soft/hadoop/etc/hadoop |
||||
export SPARK_HOME1=/opt/soft/spark1 |
||||
export SPARK_HOME2=/opt/soft/spark2 |
||||
export PYTHON_HOME=/opt/soft/python |
||||
export JAVA_HOME=/opt/soft/java |
||||
export HIVE_HOME=/opt/soft/hive |
||||
|
||||
export PATH=$HADOOP_HOME/bin:$SPARK_HOME1/bin:$SPARK_HOME2/bin:$PYTHON_HOME/bin:$JAVA_HOME/bin:$HIVE_HOME/bin:$PATH |
||||
</code></pre><p>​ </p> |
||||
<p>Python任务 环境变量配置</p> |
||||
<pre><code>说明:配置文件位于 target/escheduler-{version}/conf/env 下面 |
||||
</code></pre><p>escheduler_env.py</p> |
||||
<pre><code>import os |
||||
|
||||
HADOOP_HOME="/opt/soft/hadoop" |
||||
SPARK_HOME1="/opt/soft/spark1" |
||||
SPARK_HOME2="/opt/soft/spark2" |
||||
PYTHON_HOME="/opt/soft/python" |
||||
JAVA_HOME="/opt/soft/java" |
||||
HIVE_HOME="/opt/soft/hive" |
||||
PATH=os.environ['PATH'] |
||||
PATH="%s/bin:%s/bin:%s/bin:%s/bin:%s/bin:%s/bin:%s"%(HIVE_HOME,HADOOP_HOME,SPARK_HOME1,SPARK_HOME2,JAVA_HOME,PYTHON_HOME,PATH) |
||||
|
||||
os.putenv('PATH','%s'%PATH) |
||||
</code></pre><p>hadoop 配置文件</p> |
||||
<ul> |
||||
<li>common/hadoop/hadoop.properties</li> |
||||
</ul> |
||||
<pre><code># ha or single namenode,If namenode ha needs to copy core-site.xml and hdfs-site.xml to the conf directory |
||||
fs.defaultFS=hdfs://mycluster:8020 |
||||
|
||||
#resourcemanager ha note this need ips , this empty if single |
||||
yarn.resourcemanager.ha.rm.ids=192.168.xx.xx,192.168.xx.xx |
||||
|
||||
# If it is a single resourcemanager, you only need to configure one host name. If it is resourcemanager HA, the default configuration is fine |
||||
yarn.application.status.address=http://ark1:8088/ws/v1/cluster/apps/%s |
||||
</code></pre><p>定时器配置文件</p> |
||||
<ul> |
||||
<li>quartz.properties</li> |
||||
</ul> |
||||
<pre><code>#============================================================================ |
||||
# Configure Main Scheduler Properties |
||||
#============================================================================ |
||||
org.quartz.scheduler.instanceName = EasyScheduler |
||||
org.quartz.scheduler.instanceId = AUTO |
||||
org.quartz.scheduler.makeSchedulerThreadDaemon = true |
||||
org.quartz.jobStore.useProperties = false |
||||
|
||||
#============================================================================ |
||||
# Configure ThreadPool |
||||
#============================================================================ |
||||
|
||||
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool |
||||
org.quartz.threadPool.makeThreadsDaemons = true |
||||
org.quartz.threadPool.threadCount = 25 |
||||
org.quartz.threadPool.threadPriority = 5 |
||||
|
||||
#============================================================================ |
||||
# Configure JobStore |
||||
#============================================================================ |
||||
|
||||
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX |
||||
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate |
||||
org.quartz.jobStore.tablePrefix = QRTZ_ |
||||
org.quartz.jobStore.isClustered = true |
||||
org.quartz.jobStore.misfireThreshold = 60000 |
||||
org.quartz.jobStore.clusterCheckinInterval = 5000 |
||||
org.quartz.jobStore.dataSource = myDs |
||||
|
||||
#============================================================================ |
||||
# Configure Datasources |
||||
#============================================================================ |
||||
|
||||
org.quartz.dataSource.myDs.driver = com.mysql.jdbc.Driver |
||||
org.quartz.dataSource.myDs.URL = jdbc:mysql://192.168.xx.xx:3306/escheduler?characterEncoding=utf8&useSSL=false |
||||
org.quartz.dataSource.myDs.user = xx |
||||
org.quartz.dataSource.myDs.password = xx |
||||
org.quartz.dataSource.myDs.maxConnections = 10 |
||||
org.quartz.dataSource.myDs.validationQuery = select 1 |
||||
</code></pre><p>zookeeper 配置文件</p> |
||||
<ul> |
||||
<li>zookeeper.properties</li> |
||||
</ul> |
||||
<pre><code>#zookeeper cluster |
||||
zookeeper.quorum=192.168.xx.xx:2181,192.168.xx.xx:2181,192.168.xx.xx:2181 |
||||
|
||||
#escheduler root directory |
||||
zookeeper.escheduler.root=/escheduler |
||||
|
||||
#zookeeper server dirctory |
||||
zookeeper.escheduler.dead.servers=/escheduler/dead-servers |
||||
zookeeper.escheduler.masters=/escheduler/masters |
||||
zookeeper.escheduler.workers=/escheduler/workers |
||||
|
||||
#zookeeper lock dirctory |
||||
zookeeper.escheduler.lock.masters=/escheduler/lock/masters |
||||
zookeeper.escheduler.lock.workers=/escheduler/lock/workers |
||||
|
||||
#escheduler failover directory |
||||
zookeeper.escheduler.lock.masters.failover=/escheduler/lock/failover/masters |
||||
zookeeper.escheduler.lock.workers.failover=/escheduler/lock/failover/workers |
||||
|
||||
#escheduler failover directory |
||||
zookeeper.session.timeout=300 |
||||
zookeeper.connection.timeout=300 |
||||
zookeeper.retry.sleep=1000 |
||||
zookeeper.retry.maxtime=5 |
||||
</code></pre><h3 id="escheduler-dao">escheduler-dao</h3> |
||||
<p>dao数据源配置</p> |
||||
<ul> |
||||
<li>dao/data_source.properties</li> |
||||
</ul> |
||||
<pre><code># base spring data source configuration |
||||
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource |
||||
spring.datasource.driver-class-name=com.mysql.jdbc.Driver |
||||
spring.datasource.url=jdbc:mysql://192.168.xx.xx:3306/escheduler?characterEncoding=UTF-8 |
||||
spring.datasource.username=xx |
||||
spring.datasource.password=xx |
||||
|
||||
# connection configuration |
||||
spring.datasource.initialSize=5 |
||||
# min connection number |
||||
spring.datasource.minIdle=5 |
||||
# max connection number |
||||
spring.datasource.maxActive=50 |
||||
|
||||
# max wait time for get a connection in milliseconds. if configuring maxWait, fair locks are enabled by default and concurrency efficiency decreases. |
||||
# If necessary, unfair locks can be used by configuring the useUnfairLock attribute to true. |
||||
spring.datasource.maxWait=60000 |
||||
|
||||
# milliseconds for check to close free connections |
||||
spring.datasource.timeBetweenEvictionRunsMillis=60000 |
||||
|
||||
# the Destroy thread detects the connection interval and closes the physical connection in milliseconds if the connection idle time is greater than or equal to minEvictableIdleTimeMillis. |
||||
spring.datasource.timeBetweenConnectErrorMillis=60000 |
||||
|
||||
# the longest time a connection remains idle without being evicted, in milliseconds |
||||
spring.datasource.minEvictableIdleTimeMillis=300000 |
||||
|
||||
#the SQL used to check whether the connection is valid requires a query statement. If validation Query is null, testOnBorrow, testOnReturn, and testWhileIdle will not work. |
||||
spring.datasource.validationQuery=SELECT 1 |
||||
#check whether the connection is valid for timeout, in seconds |
||||
spring.datasource.validationQueryTimeout=3 |
||||
|
||||
# when applying for a connection, if it is detected that the connection is idle longer than time Between Eviction Runs Millis, |
||||
# validation Query is performed to check whether the connection is valid |
||||
spring.datasource.testWhileIdle=true |
||||
|
||||
#execute validation to check if the connection is valid when applying for a connection |
||||
spring.datasource.testOnBorrow=true |
||||
#execute validation to check if the connection is valid when the connection is returned |
||||
spring.datasource.testOnReturn=false |
||||
spring.datasource.defaultAutoCommit=true |
||||
spring.datasource.keepAlive=true |
||||
|
||||
# open PSCache, specify count PSCache for every connection |
||||
spring.datasource.poolPreparedStatements=true |
||||
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20 |
||||
</code></pre><h3 id="escheduler-server">escheduler-server</h3> |
||||
<p>master配置文件</p> |
||||
<ul> |
||||
<li>master.properties</li> |
||||
</ul> |
||||
<pre><code># master execute thread num |
||||
master.exec.threads=100 |
||||
|
||||
# master execute task number in parallel |
||||
master.exec.task.number=20 |
||||
|
||||
# master heartbeat interval |
||||
master.heartbeat.interval=10 |
||||
|
||||
# master commit task retry times |
||||
master.task.commit.retryTimes=5 |
||||
|
||||
# master commit task interval |
||||
master.task.commit.interval=100 |
||||
|
||||
|
||||
# only less than cpu avg load, master server can work. default value : the number of cpu cores * 2 |
||||
master.max.cpuload.avg=10 |
||||
|
||||
# only larger than reserved memory, master server can work. default value : physical memory * 1/10, unit is G. |
||||
master.reserved.memory=1 |
||||
</code></pre><p>worker配置文件</p> |
||||
<ul> |
||||
<li>worker.properties</li> |
||||
</ul> |
||||
<pre><code># worker execute thread num |
||||
worker.exec.threads=100 |
||||
|
||||
# worker heartbeat interval |
||||
worker.heartbeat.interval=10 |
||||
|
||||
# submit the number of tasks at a time |
||||
worker.fetch.task.num = 10 |
||||
|
||||
|
||||
# only less than cpu avg load, worker server can work. default value : the number of cpu cores * 2 |
||||
worker.max.cpuload.avg=10 |
||||
|
||||
# only larger than reserved memory, worker server can work. default value : physical memory * 1/6, unit is G. |
||||
worker.reserved.memory=1 |
||||
</code></pre><h3 id="escheduler-api">escheduler-api</h3> |
||||
<p>web配置文件</p> |
||||
<ul> |
||||
<li>application.properties</li> |
||||
</ul> |
||||
<pre><code># server port |
||||
server.port=12345 |
||||
|
||||
# session config |
||||
server.session.timeout=7200 |
||||
|
||||
|
||||
server.context-path=/escheduler/ |
||||
|
||||
# file size limit for upload |
||||
spring.http.multipart.max-file-size=1024MB |
||||
spring.http.multipart.max-request-size=1024MB |
||||
|
||||
# post content |
||||
server.max-http-post-size=5000000 |
||||
</code></pre><h2 id="伪分布式部署">伪分布式部署</h2> |
||||
<h3 id="1,创建部署用户">1,创建部署用户</h3> |
||||
<p>​ 如上 <strong>创建部署用户</strong></p> |
||||
<h3 id="2,根据实际需求来创建hdfs根路径">2,根据实际需求来创建HDFS根路径</h3> |
||||
<p>​ 根据 <strong>common/common.properties</strong> 中 <strong>hdfs.startup.state</strong> 的配置来判断是否启动HDFS,如果启动,则需要创建HDFS根路径,并将 <strong>owner</strong> 修改为<strong>部署用户</strong>,否则忽略此步骤</p> |
||||
<h3 id="3,项目编译">3,项目编译</h3> |
||||
<p>​ 如上进行 <strong>项目编译</strong></p> |
||||
<h3 id="4,修改配置文件">4,修改配置文件</h3> |
||||
<p>​ 根据 <strong>配置文件说明</strong> 修改配置文件和 <strong>环境变量</strong> 文件</p> |
||||
<h3 id="5,创建目录并将环境变量文件复制到指定目录">5,创建目录并将环境变量文件复制到指定目录</h3> |
||||
<ul> |
||||
<li><p>创建 <strong>common/common.properties</strong> 下的data.basedir.path、data.download.basedir.path和process.exec.basepath路径</p> |
||||
</li> |
||||
<li><p>将<strong>.escheduler_env.sh</strong> 和 <strong>escheduler_env.py</strong> 两个环境变量文件复制到 <strong>common/common.properties</strong>配置的<strong>escheduler.env.path</strong> 和 <strong>escheduler.env.py</strong> 的目录下,并将 <strong>owner</strong> 修改为<strong>部署用户</strong></p> |
||||
</li> |
||||
</ul> |
||||
<h3 id="6,启停服务">6,启停服务</h3> |
||||
<ul> |
||||
<li>启停Master</li> |
||||
</ul> |
||||
<pre><code class="lang-启动master">sh ./bin/arklifter-daemon.sh start master-server |
||||
sh ./bin/arklifter-daemon.sh stop master-server |
||||
</code></pre> |
||||
<ul> |
||||
<li>启停Worker</li> |
||||
</ul> |
||||
<pre><code>sh ./bin/arklifter-daemon.sh start worker-server |
||||
sh ./bin/arklifter-daemon.sh stop worker-server |
||||
</code></pre><ul> |
||||
<li>启停Api</li> |
||||
</ul> |
||||
<pre><code>sh ./bin/arklifter-daemon.sh start api-server |
||||
sh ./bin/arklifter-daemon.sh stop api-server |
||||
</code></pre><ul> |
||||
<li>启停Logger</li> |
||||
</ul> |
||||
<pre><code>sh ./bin/arklifter-daemon.sh start logger-server |
||||
sh ./bin/arklifter-daemon.sh stop logger-server |
||||
</code></pre><ul> |
||||
<li>启停Alert</li> |
||||
</ul> |
||||
<pre><code>sh ./bin/arklifter-daemon.sh start alert-server |
||||
sh ./bin/arklifter-daemon.sh stop alert-server |
||||
</code></pre><h2 id="分布式部署">分布式部署</h2> |
||||
<h3 id="1,创建部署用户">1,创建部署用户</h3> |
||||
<ul> |
||||
<li>在需要部署调度的机器上如上 <strong>创建部署用户</strong></li> |
||||
<li><a href="https://blog.csdn.net/thinkmore1314/article/details/22489203" target="_blank">将 <strong>主机器</strong> 和各个其它机器SSH打通</a></li> |
||||
</ul> |
||||
<h3 id="2,根据实际需求来创建hdfs根路径">2,根据实际需求来创建HDFS根路径</h3> |
||||
<p>​ 根据 <strong>common/common.properties</strong> 中 <strong>hdfs.startup.state</strong> 的配置来判断是否启动HDFS,如果启动,则需要创建HDFS根路径,并将 <strong>owner</strong> 修改为<strong>部署用户</strong>,否则忽略此步骤</p> |
||||
<h3 id="3,项目编译">3,项目编译</h3> |
||||
<p>​ 如上进行 <strong>项目编译</strong></p> |
||||
<h3 id="4,将环境变量文件复制到指定目录">4,将环境变量文件复制到指定目录</h3> |
||||
<p>​ 将<strong>.escheduler_env.sh</strong> 和 <strong>escheduler_env.py</strong> 两个环境变量文件复制到 <strong>common/common.properties</strong>配置的<strong>escheduler.env.path</strong> 和 <strong>escheduler.env.py</strong> 的目录下,并将 <strong>owner</strong> 修改为<strong>部署用户</strong></p> |
||||
<h3 id="5,修改-installsh">5,修改 install.sh</h3> |
||||
<p>​ 修改 install.sh 中变量的值,替换成自身业务所需的值</p> |
||||
<h3 id="6,一键部署">6,一键部署</h3> |
||||
<ul> |
||||
<li><p>安装 pip install kazoo</p> |
||||
</li> |
||||
<li><p>使用部署用户 sh install.sh 一键部署</p> |
||||
</li> |
||||
</ul> |
||||
<h2 id="服务监控">服务监控</h2> |
||||
<p>monitor_server.py 脚本是监听,master和worker服务挂掉重启的脚本</p> |
||||
<p>注意:在全部服务都启动之后启动</p> |
||||
<p>nohup python -u monitor_server.py > nohup.out 2>&1 &</p> |
||||
<h2 id="日志查看">日志查看</h2> |
||||
<p>日志统一存放于指定文件夹内</p> |
||||
<pre><code class="lang-日志路径"> logs/ |
||||
├── escheduler-alert-server.log |
||||
├── escheduler-master-server.log |
||||
|—— escheduler-worker-server.log |
||||
|—— escheduler-api-server.log |
||||
|—— escheduler-logger-server.log |
||||
</code></pre> |
||||
|
||||
|
||||
</section> |
||||
|
||||
</div> |
||||
<div class="search-results"> |
||||
<div class="has-results"> |
||||
|
||||
<h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1> |
||||
<ul class="search-results-list"></ul> |
||||
|
||||
</div> |
||||
<div class="no-results"> |
||||
|
||||
<h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1> |
||||
|
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
</div> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
<a href="architecture-design.html#调度系统架构设计" class="navigation navigation-prev " aria-label="Previous page: 系统架构设计"> |
||||
<i class="fa fa-angle-left"></i> |
||||
</a> |
||||
|
||||
|
||||
<a href="task-plugin-development.html#任务插件开发" class="navigation navigation-next " aria-label="Next page: 自定义任务插件文档"> |
||||
<i class="fa fa-angle-right"></i> |
||||
</a> |
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
<script> |
||||
var gitbook = gitbook || []; |
||||
gitbook.push(function() { |
||||
gitbook.page.hasChanged({"page":{"title":"部署文档","level":"1.3.2","depth":2,"next":{"title":"自定义任务插件文档","level":"1.3.3","depth":2,"anchor":"#任务插件开发","path":"task-plugin-development.md","ref":"task-plugin-development.md#任务插件开发","articles":[]},"previous":{"title":"系统架构设计","level":"1.3.1","depth":2,"anchor":"#调度系统架构设计","path":"architecture-design.md","ref":"architecture-design.md#调度系统架构设计","articles":[]},"dir":"ltr"},"config":{"plugins":["expandable-chapters","insert-logo-link"],"styles":{"website":"./styles/website.css"},"pluginsConfig":{"insert-logo-link":{"src":"../images/logo.png","url":"/"},"expandable-chapters":{},"highlight":{},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"theme":"default","author":"YIGUAN","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{},"title":"调度系统-EasyScheduler","language":"zh-hans","gitbook":"3.2.3","description":"调度系统"},"file":{"path":"backend-deploy.md","mtime":"2019-03-28T11:14:39.609Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2019-03-28T11:15:13.750Z"},"basePath":".","book":{"language":""}}); |
||||
}); |
||||
</script> |
||||
</div> |
||||
|
||||
|
||||
<script src="gitbook/gitbook.js"></script> |
||||
<script src="gitbook/theme.js"></script> |
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-expandable-chapters/expandable-chapters.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-insert-logo-link/plugin.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-search/search-engine.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-search/search.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-lunr/lunr.min.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-lunr/search-lunr.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-sharing/buttons.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script> |
||||
|
||||
|
||||
|
||||
</body> |
||||
</html> |
||||
|
@ -0,0 +1,852 @@
|
||||
|
||||
<!DOCTYPE HTML> |
||||
<html lang="zh-hans" > |
||||
<head> |
||||
<meta charset="UTF-8"> |
||||
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"> |
||||
<title>项目目录结构 · 调度系统-EasyScheduler</title> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
||||
<meta name="description" content=""> |
||||
<meta name="generator" content="GitBook 3.2.3"> |
||||
<meta name="author" content="YIGUAN"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/style.css"> |
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/gitbook-plugin-expandable-chapters/expandable-chapters.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/gitbook-plugin-insert-logo-link/plugin.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/gitbook-plugin-highlight/website.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css"> |
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="styles/website.css"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<meta name="HandheldFriendly" content="true"/> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> |
||||
<meta name="apple-mobile-web-app-capable" content="yes"> |
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black"> |
||||
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png"> |
||||
<link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon"> |
||||
|
||||
|
||||
<link rel="next" href="frontend-development.html" /> |
||||
|
||||
|
||||
<link rel="prev" href="frontend-deploy.html" /> |
||||
|
||||
|
||||
</head> |
||||
<body> |
||||
|
||||
<div class="book"> |
||||
<div class="book-summary"> |
||||
|
||||
|
||||
<div id="book-search-input" role="search"> |
||||
<input type="text" placeholder="输入并搜索" /> |
||||
</div> |
||||
|
||||
|
||||
<nav role="navigation"> |
||||
|
||||
|
||||
|
||||
<ul class="summary"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="chapter " data-level="1.1" data-path="./"> |
||||
|
||||
<a href="./"> |
||||
|
||||
|
||||
Easyscheduler简介 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2" > |
||||
|
||||
<span> |
||||
|
||||
|
||||
前端文档 |
||||
|
||||
</span> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.2.1" data-path="frontend-deploy.html"> |
||||
|
||||
<a href="frontend-deploy.html#前端项目环境构建及编译"> |
||||
|
||||
|
||||
环境搭建 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.2" data-path="frontend-deploy.html"> |
||||
|
||||
<a href="frontend-deploy.html#安装及配置"> |
||||
|
||||
|
||||
安装及配置 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.3" data-path="frontend-deploy.html"> |
||||
|
||||
<a href="frontend-deploy.html#项目生产环境配置"> |
||||
|
||||
|
||||
项目生产环境Nginx配置 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.4" data-path="frontend-deploy.html"> |
||||
|
||||
<a href="frontend-deploy.html#前端项目发布"> |
||||
|
||||
|
||||
前端项目发布 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.5" data-path="frontend-deploy.html"> |
||||
|
||||
<a href="frontend-deploy.html#问题"> |
||||
|
||||
|
||||
问题 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.6" data-path="frontend-development.html"> |
||||
|
||||
<a href="frontend-development.html#项目目录结构"> |
||||
|
||||
|
||||
项目目录结构 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.7" data-path="frontend-development.html"> |
||||
|
||||
<a href="frontend-development.html#系统功能模块"> |
||||
|
||||
|
||||
系统功能模块 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.8" data-path="frontend-development.html"> |
||||
|
||||
<a href="frontend-development.html#路由和状态管理"> |
||||
|
||||
|
||||
路由和状态管理 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.9" data-path="frontend-development.html"> |
||||
|
||||
<a href="frontend-development.html#规范"> |
||||
|
||||
|
||||
规范 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.10" data-path="frontend-development.html"> |
||||
|
||||
<a href="frontend-development.html#接口"> |
||||
|
||||
|
||||
接口 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.2.11" data-path="frontend-development.html"> |
||||
|
||||
<a href="frontend-development.html#扩展开发"> |
||||
|
||||
|
||||
扩展开发 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3" > |
||||
|
||||
<span> |
||||
|
||||
|
||||
后端文档 |
||||
|
||||
</span> |
||||
|
||||
|
||||
|
||||
<ul class="articles"> |
||||
|
||||
|
||||
<li class="chapter " data-level="1.3.1" data-path="architecture-design.html"> |
||||
|
||||
<a href="architecture-design.html#调度系统架构设计"> |
||||
|
||||
|
||||
系统架构设计 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.2" data-path="backend-deploy.html"> |
||||
|
||||
<a href="backend-deploy.html#部署文档"> |
||||
|
||||
|
||||
部署文档 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.3.3" data-path="task-plugin-development.html"> |
||||
|
||||
<a href="task-plugin-development.html#任务插件开发"> |
||||
|
||||
|
||||
自定义任务插件文档 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
</ul> |
||||
|
||||
</li> |
||||
|
||||
<li class="chapter " data-level="1.4" data-path="user-manual.md"> |
||||
|
||||
<span> |
||||
|
||||
|
||||
使用说明文档 |
||||
|
||||
</a> |
||||
|
||||
|
||||
|
||||
</li> |
||||
|
||||
|
||||
|
||||
|
||||
<li class="divider"></li> |
||||
|
||||
<li> |
||||
<a href="https://www.gitbook.com" target="blank" class="gitbook-link"> |
||||
本书使用 GitBook 发布 |
||||
</a> |
||||
</li> |
||||
</ul> |
||||
|
||||
|
||||
</nav> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<div class="book-body"> |
||||
|
||||
<div class="body-inner"> |
||||
|
||||
|
||||
|
||||
<div class="book-header" role="navigation"> |
||||
|
||||
|
||||
<!-- Title --> |
||||
<h1> |
||||
<i class="fa fa-circle-o-notch fa-spin"></i> |
||||
<a href="." >项目目录结构</a> |
||||
</h1> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
<div class="page-wrapper" tabindex="-1" role="main"> |
||||
<div class="page-inner"> |
||||
|
||||
<div id="book-search-results"> |
||||
<div class="search-noresults"> |
||||
|
||||
<section class="normal markdown-section"> |
||||
|
||||
<h1 id="前端开发文档">前端开发文档</h1> |
||||
<h3 id="技术选型">技术选型</h3> |
||||
<pre><code>Vue mvvm框架 |
||||
|
||||
Es6 ECMAScript 6.0 |
||||
|
||||
Ans-ui Analysys-ui |
||||
|
||||
D3 可视化库图表库 |
||||
|
||||
Jsplumb 连线插件库 |
||||
|
||||
Lodash 高性能的 JavaScript 实用工具库 |
||||
</code></pre><h3 id="项目目录结构">项目目录结构</h3> |
||||
<p><code>build</code> 打包及开发环境项目的一些webpack配置</p> |
||||
<p><code>node_modules</code> 开发环境node依赖包</p> |
||||
<p><code>src</code> 项目所需文件</p> |
||||
<p><code>src => combo</code> 项目第三方资源本地化 <code>npm run combo</code>具体查看<code>build/combo.js</code></p> |
||||
<p><code>src => font</code> 字体图标库可访问 <a href="https://www.iconfont.cn" target="_blank">https://www.iconfont.cn</a> 进行添加 注意:字体库用的自己的 二次开发需要重新引入自己的库 <code>src/sass/common/_font.scss</code></p> |
||||
<p><code>src => images</code> 公共图片存放</p> |
||||
<p><code>src => js</code> js/vue</p> |
||||
<p><code>src => lib</code> 公司内部组件(公司组件库开源后可删掉)</p> |
||||
<p><code>src => sass</code> sass文件 一个页面对应一个sass文件</p> |
||||
<p><code>src => view</code> 页面文件 一个页面对应一个html文件</p> |
||||
<pre><code>> 项目采用vue单页面应用(SPA)开发 |
||||
- 所有页面入口文件在 `src/js/conf/${对应页面文件名 => home}` 的 `index.js` 入口文件 |
||||
- 对应的sass文件则在 `src/sass/conf/${对应页面文件名 => home}/index.scss` |
||||
- 对应的html文件则在 `src/view/${对应页面文件名 => home}/index.html` |
||||
</code></pre><p>公共模块及util <code>src/js/module</code></p> |
||||
<p><code>components</code> => 内部项目公共组件</p> |
||||
<p><code>download</code> => 下载组件</p> |
||||
<p><code>echarts</code> => 图表组件</p> |
||||
<p><code>filter</code> => 过滤器和vue管道</p> |
||||
<p><code>i18n</code> => 国际化</p> |
||||
<p><code>io</code> => io请求封装 基于axios</p> |
||||
<p><code>mixin</code> => vue mixin 公共部分 用于disabled操作</p> |
||||
<p><code>permissions</code> => 权限操作</p> |
||||
<p><code>util</code> => 工具</p> |
||||
<h3 id="系统功能模块">系统功能模块</h3> |
||||
<p>首页 => <code>http://localhost:8888/#/home</code></p> |
||||
<p>项目管理 => <code>http://localhost:8888/#/projects/list</code></p> |
||||
<pre><code>| 项目首页 |
||||
| 工作流 |
||||
- 工作流定义 |
||||
- 工作流实例 |
||||
- 任务实例 |
||||
</code></pre><p>资源管理 => <code>http://localhost:8888/#/resource/file</code></p> |
||||
<pre><code>| 文件管理 |
||||
| UDF管理 |
||||
- 资源管理 |
||||
- 函数管理 |
||||
</code></pre><p>数据源管理 => <code>http://localhost:8888/#/datasource/list</code></p> |
||||
<p>安全中心 => <code>http://localhost:8888/#/security/tenant</code></p> |
||||
<pre><code>| 租户管理 |
||||
| 用户管理 |
||||
| 告警组管理 |
||||
- master |
||||
- worker |
||||
</code></pre><p>用户中心 => <code>http://localhost:8888/#/user/account</code></p> |
||||
<h2 id="路由和状态管理">路由和状态管理</h2> |
||||
<p>项目 <code>src/js/conf/home</code> 下分为</p> |
||||
<p><code>pages</code> => 路由指向页面目录</p> |
||||
<pre><code> 路由地址对应的页面文件 |
||||
</code></pre><p><code>router</code> => 路由管理</p> |
||||
<pre><code>vue的路由器,在每个页面的入口文件index.js 都会注册进来 具体操作:https://router.vuejs.org/zh/ |
||||
</code></pre><p><code>store</code> => 状态管理</p> |
||||
<pre><code>每个路由对应的页面都有一个状态管理的文件 分为: |
||||
|
||||
actions => mapActions => 详情:https://vuex.vuejs.org/zh/guide/actions.html |
||||
|
||||
getters => mapGetters => 详情:https://vuex.vuejs.org/zh/guide/getters.html |
||||
|
||||
index => 入口 |
||||
|
||||
mutations => mapMutations => 详情:https://vuex.vuejs.org/zh/guide/mutations.html |
||||
|
||||
state => mapState => 详情:https://vuex.vuejs.org/zh/guide/state.html |
||||
|
||||
具体操作:https://vuex.vuejs.org/zh/ |
||||
</code></pre><h2 id="规范">规范</h2> |
||||
<h2 id="vue规范">Vue规范</h2> |
||||
<h5 id="1组件名">1.组件名</h5> |
||||
<p>组件名为多个单词,并且用连接线(-)连接,避免与 HTML 标签冲突,并且结构更加清晰。</p> |
||||
<pre><code>// 正例 |
||||
export default { |
||||
name: 'page-article-item' |
||||
} |
||||
</code></pre><h5 id="2组件文件">2.组件文件</h5> |
||||
<p><code>src/js/module/components</code>项目内部公共组件书写文件夹名与文件名同名,公共组件内部所拆分的子组件与util工具都放置组件内部 <code>_source</code>文件夹里。</p> |
||||
<pre><code>└── components |
||||
├── header |
||||
├── header.vue |
||||
└── _source |
||||
└── nav.vue |
||||
└── util.js |
||||
├── conditions |
||||
├── conditions.vue |
||||
└── _source |
||||
└── serach.vue |
||||
└── util.js |
||||
</code></pre><h5 id="3prop">3.Prop</h5> |
||||
<p>定义 Prop 的时候应该始终以驼峰格式(camelCase)命名,在父组件赋值的时候使用连接线(-)。 |
||||
这里遵循每个语言的特性,因为在 HTML 标记中对大小写是不敏感的,使用连接线更加友好;而在 JavaScript 中更自然的是驼峰命名。</p> |
||||
<pre><code>// Vue |
||||
props: { |
||||
articleStatus: Boolean |
||||
} |
||||
// HTML |
||||
<article-item :article-status="true"></article-item> |
||||
</code></pre><p>Prop 的定义应该尽量详细的指定其类型、默认值和验证。</p> |
||||
<p>示例:</p> |
||||
<pre><code>props: { |
||||
attrM: Number, |
||||
attrA: { |
||||
type: String, |
||||
required: true |
||||
}, |
||||
attrZ: { |
||||
type: Object, |
||||
// 数组/对象的默认值应该由一个工厂函数返回 |
||||
default: function () { |
||||
return { |
||||
msg: '成就你我' |
||||
} |
||||
} |
||||
}, |
||||
attrE: { |
||||
type: String, |
||||
validator: function (v) { |
||||
return !(['success', 'fail'].indexOf(v) === -1) |
||||
} |
||||
} |
||||
} |
||||
</code></pre><h5 id="4v-for">4.v-for</h5> |
||||
<p>在执行 v-for 遍历的时候,总是应该带上 key 值使更新 DOM 时渲染效率更高。</p> |
||||
<pre><code><ul> |
||||
<li v-for="item in list" :key="item.id"> |
||||
{{ item.title }} |
||||
</li> |
||||
</ul> |
||||
</code></pre><p>v-for 应该避免与 v-if 在同一个元素(<code>例如:<li></code>)上使用,因为 v-for 的优先级比 v-if 更高,为了避免无效计算和渲染,应该尽量将 v-if 放到容器的父元素之上。</p> |
||||
<pre><code><ul v-if="showList"> |
||||
<li v-for="item in list" :key="item.id"> |
||||
{{ item.title }} |
||||
</li> |
||||
</ul> |
||||
</code></pre><h5 id="5v-if--v-else-if--v-else">5.v-if / v-else-if / v-else</h5> |
||||
<p>若同一组 v-if 逻辑控制中的元素逻辑相同,Vue 为了更高效的元素切换,会复用相同的部分,<code>例如:value</code>。为了避免复用带来的不合理效果,应该在同种元素上加上 key 做标识。</p> |
||||
<pre><code><div v-if="hasData" key="mazey-data"> |
||||
<span>{{ mazeyData }}</span> |
||||
</div> |
||||
<div v-else key="mazey-none"> |
||||
<span>无数据</span> |
||||
</div> |
||||
</code></pre><h5 id="6指令缩写">6.指令缩写</h5> |
||||
<p>为了统一规范始终使用指令缩写,使用<code>v-bind</code>,<code>v-on</code>并没有什么不好,这里仅为了统一规范。</p> |
||||
<pre><code><input :value="mazeyUser" @click="verifyUser"> |
||||
</code></pre><h5 id="7单文件组件的顶级元素顺序">7.单文件组件的顶级元素顺序</h5> |
||||
<p>样式后续都是打包在一个文件里,所有在单个vue文件中定义的样式,在别的文件里同类名的样式也是会生效的所有在创建一个组件前都会有个顶级类名 |
||||
注意:项目内已经增加了sass插件,单个vue文件里可以直接书写sass语法 |
||||
为了统一和便于阅读,应该按 <code><template></code>、<code><script></code>、<code><style></code>的顺序放置。</p> |
||||
<pre><code><template> |
||||
<div class="test-model"> |
||||
test |
||||
</div> |
||||
</template> |
||||
<script> |
||||
export default { |
||||
name: "test", |
||||
data() { |
||||
return {} |
||||
}, |
||||
props: {}, |
||||
methods: {}, |
||||
watch: {}, |
||||
beforeCreate() { |
||||
}, |
||||
created() { |
||||
}, |
||||
beforeMount() { |
||||
}, |
||||
mounted() { |
||||
}, |
||||
beforeUpdate() { |
||||
}, |
||||
updated() { |
||||
}, |
||||
beforeDestroy() { |
||||
}, |
||||
destroyed() { |
||||
}, |
||||
computed: {}, |
||||
components: {}, |
||||
} |
||||
</script> |
||||
|
||||
<style lang="scss" rel="stylesheet/scss"> |
||||
.test-model { |
||||
|
||||
} |
||||
</style> |
||||
</code></pre><h2 id="javascript规范">JavaScript规范</h2> |
||||
<h5 id="1var--let--const">1.var / let / const</h5> |
||||
<p>建议不再使用 var,而使用 let / const,优先使用 const。任何一个变量的使用都要提前申明,除了 function 定义的函数可以随便放在任何位置。</p> |
||||
<h5 id="2引号">2.引号</h5> |
||||
<pre><code>const foo = '后除' |
||||
const bar = `${foo},前端工程师` |
||||
</code></pre><h5 id="3函数">3.函数</h5> |
||||
<p>匿名函数统一使用箭头函数,多个参数/返回值时优先使用对象的结构赋值。</p> |
||||
<pre><code>function getPersonInfo ({name, sex}) { |
||||
// ... |
||||
return {name, gender} |
||||
} |
||||
</code></pre><p>函数名统一使用驼峰命名,以大写字母开头申明的都是构造函数,使用小写字母开头的都是普通函数,也不该使用 new 操作符去操作普通函数。</p> |
||||
<h5 id="4对象">4.对象</h5> |
||||
<pre><code>const foo = {a: 0, b: 1} |
||||
const bar = JSON.parse(JSON.stringify(foo)) |
||||
|
||||
const foo = {a: 0, b: 1} |
||||
const bar = {...foo, c: 2} |
||||
|
||||
const foo = {a: 3} |
||||
Object.assign(foo, {b: 4}) |
||||
|
||||
const myMap = new Map([]) |
||||
for (let [key, value] of myMap.entries()) { |
||||
// ... |
||||
} |
||||
</code></pre><h5 id="5模块">5.模块</h5> |
||||
<p>统一使用 import / export 的方式管理项目的模块。</p> |
||||
<pre><code>// lib.js |
||||
export default {} |
||||
|
||||
// app.js |
||||
import app from './lib' |
||||
</code></pre><p>import 统一放在文件顶部。</p> |
||||
<p>如果模块只有一个输出值,使用 <code>export default</code>,否则不用。</p> |
||||
<h2 id="html--css">HTML / CSS</h2> |
||||
<h6 id="1标签">1.标签</h6> |
||||
<p>在引用外部 CSS 或 JavaScript 时不写 type 属性。HTML5 默认 type 为 <code>text/css</code> 和 <code>text/javascript</code> 属性,所以没必要指定。</p> |
||||
<pre><code><link rel="stylesheet" href="//www.test.com/css/test.css"> |
||||
<script src="//www.test.com/js/test.js"></script> |
||||
</code></pre><h5 id="2命名">2.命名</h5> |
||||
<p>Class 和 ID 的命名应该语义化,通过看名字就知道是干嘛的;多个单词用连接线 - 连接。</p> |
||||
<pre><code>// 正例 |
||||
.test-header{ |
||||
font-size: 20px; |
||||
} |
||||
</code></pre><h5 id="3属性缩写">3.属性缩写</h5> |
||||
<p>CSS 属性尽量使用缩写,提高代码的效率和方便理解。</p> |
||||
<pre><code>// 反例 |
||||
border-width: 1px; |
||||
border-style: solid; |
||||
border-color: #ccc; |
||||
|
||||
// 正例 |
||||
border: 1px solid #ccc; |
||||
</code></pre><h5 id="4文档类型">4.文档类型</h5> |
||||
<p>应该总是使用 HTML5 标准。</p> |
||||
<pre><code><!DOCTYPE html> |
||||
</code></pre><h5 id="5注释">5.注释</h5> |
||||
<p>应该给一个模块文件写一个区块注释。</p> |
||||
<pre><code>/** |
||||
* @module mazey/api |
||||
* @author Mazey <mazey@mazey.net> |
||||
* @description test. |
||||
* */ |
||||
</code></pre><h2 id="接口">接口</h2> |
||||
<h5 id="所有的接口都以-promise-形式返回">所有的接口都以 Promise 形式返回</h5> |
||||
<p>注意非0都为错误走catch</p> |
||||
<pre><code>const test = () => { |
||||
return new Promise((resolve, reject) => { |
||||
resolve({ |
||||
a:1 |
||||
}) |
||||
}) |
||||
} |
||||
|
||||
// 调用 |
||||
test.then(res => { |
||||
console.log(res) |
||||
// {a:1} |
||||
}) |
||||
</code></pre><p>正常返回</p> |
||||
<pre><code>{ |
||||
code:0, |
||||
data:{} |
||||
msg:'成功' |
||||
} |
||||
</code></pre><p>错误返回</p> |
||||
<pre><code>{ |
||||
code:10000, |
||||
data:{} |
||||
msg:'失败' |
||||
} |
||||
</code></pre><h5 id="相关接口路径">相关接口路径</h5> |
||||
<p>dag 相关接口 <code>src/js/conf/home/store/dag/actions.js</code></p> |
||||
<p>数据源中心 相关接口 <code>src/js/conf/home/store/datasource/actions.js</code></p> |
||||
<p>项目管理 相关接口 <code>src/js/conf/home/store/projects/actions.js</code></p> |
||||
<p>资源中心 相关接口 <code>src/js/conf/home/store/resource/actions.js</code></p> |
||||
<p>安全中心 相关接口 <code>src/js/conf/home/store/security/actions.js</code></p> |
||||
<p>用户中心 相关接口 <code>src/js/conf/home/store/user/actions.js</code></p> |
||||
<h2 id="扩展开发">扩展开发</h2> |
||||
<h5 id="1增加节点">1.增加节点</h5> |
||||
<p>(1) 先将节点的icon小图标放置<code>src/js/conf/home/pages/dag/img</code>文件夹内,注意 <code>toolbar_${后台定义的节点的英文名称 例如:SHELL}.png</code> |
||||
(2) 找到 <code>src/js/conf/home/pages/dag/_source/config.js</code> 里的 <code>tasksType</code> 对象,往里增加</p> |
||||
<pre><code>'DEPENDENT': { // 后台定义节点类型英文名称用作key值 |
||||
desc: 'DEPENDENT', // tooltip desc |
||||
color: '#2FBFD8' // 代表的颜色主要用于 tree和gantt 两张图 |
||||
} |
||||
</code></pre><p>(3) 在 <code>src/js/conf/home/pages/dag/_source/formModel/tasks</code> 增加一个 <code>${节点类型(小写)}</code>.vue 文件,跟当前节点相关的组件内容都在这里写。 属于节点组件内的必须拥有一个函数 <code>_verification()</code> 验证成功后讲当前组件的相关数据往父组件抛。</p> |
||||
<pre><code>/** |
||||
* 验证 |
||||
*/ |
||||
_verification () { |
||||
// datasource 子组件验证 |
||||
if (!this.$refs.refDs._verifDatasource()) { |
||||
return false |
||||
} |
||||
|
||||
// 验证函数 |
||||
if (!this.method) { |
||||
this.$message.warning(`${i18n.$t('请输入方法')}`) |
||||
return false |
||||
} |
||||
|
||||
// localParams 子组件验证 |
||||
if (!this.$refs.refLocalParams._verifProp()) { |
||||
return false |
||||
} |
||||
// 存储 |
||||
this.$emit('on-params', { |
||||
type: this.type, |
||||
datasource: this.datasource, |
||||
method: this.method, |
||||
localParams: this.localParams |
||||
}) |
||||
return true |
||||
} |
||||
</code></pre><p>(4) 节点组件内部所用到公共的组件都在<code>_source</code>下,<code>commcon.js</code>用与配置公共数据</p> |
||||
<h5 id="2增加状态类型">2.增加状态类型</h5> |
||||
<p>(1) 找到 <code>src/js/conf/home/pages/dag/_source/config.js</code> 里的 <code>tasksState</code> 对象,往里增加</p> |
||||
<pre><code>'WAITTING_DEPEND': { //后端定义状态类型 前端用作key值 |
||||
id: 11, // 前端定义id 后续用作排序 |
||||
desc: `${i18n.$t('等待依赖')}`, // tooltip desc |
||||
color: '#5101be', // 代表的颜色主要用于 tree和gantt 两张图 |
||||
icoUnicode: '&#xe68c;', // 字体图标 |
||||
isSpin: false // 是否旋转(需代码判断) |
||||
} |
||||
</code></pre><h5 id="3增加操作栏工具">3.增加操作栏工具</h5> |
||||
<p>(1) 找到 <code>src/js/conf/home/pages/dag/_source/config.js</code> 里的 <code>toolOper</code> 对象,往里增加</p> |
||||
<pre><code>{ |
||||
code: 'pointer', // 工具标识 |
||||
icon: '&#xe781;', // 工具图标 |
||||
disable: disable, // 是否禁用 |
||||
desc: `${i18n.$t('拖动节点和选中项')}` // tooltip desc |
||||
} |
||||
</code></pre><p>(2) 工具类都以一个构造函数返回 <code>src/js/conf/home/pages/dag/_source/plugIn</code></p> |
||||
<p><code>downChart.js</code> => dag 图片下载处理 </p> |
||||
<p><code>dragZoom.js</code> => 鼠标缩放效果处理 </p> |
||||
<p><code>jsPlumbHandle.js</code> => 拖拽线条处理 </p> |
||||
<p><code>util.js</code> => 属于 <code>plugIn</code> 工具类</p> |
||||
<p>操作则在 <code>src/js/conf/home/pages/dag/_source/dag.js</code> => <code>toolbarEvent</code> 事件中处理。</p> |
||||
<h5 id="3增加一个路由页面">3.增加一个路由页面</h5> |
||||
<p>(1) 首先在路由管理增加一个路由地址<code>src/js/conf/home/router/index.js</code></p> |
||||
<pre><code>{ |
||||
path: '/test', // 路由地址 |
||||
name: 'test', // 别名 |
||||
component: resolve => require(['../pages/test/index'], resolve), // 路由对应组件入口文件 |
||||
meta: { |
||||
title: `${i18n.$t('test')} - EasyScheduler` // title 显示 |
||||
} |
||||
}, |
||||
</code></pre><p>(2) 在<code>src/js/conf/home/pages</code> 建一个 <code>test</code> 文件夹,在文件夹里建一个<code>index.vue</code>入口文件。</p> |
||||
<pre><code>这样就可以直接访问 `http://localhost:8888/#/test` |
||||
</code></pre><h5 id="4增加预置邮箱">4.增加预置邮箱</h5> |
||||
<p>找到<code>src/lib/localData/email.js</code>启动和定时邮箱地址输入可以自动下拉匹配。</p> |
||||
<pre><code>export default ["test@analysys.com.cn","test1@analysys.com.cn","test3@analysys.com.cn"] |
||||
</code></pre><h5 id="5权限管理及disabled状态处理">5.权限管理及disabled状态处理</h5> |
||||
<p>权限根据后端接口<code>getUserInfo</code>接口给出<code>userType: "ADMIN_USER/GENERAL_USER"</code>权限控制页面操作按钮是否<code>disabled</code></p> |
||||
<p>具体操作:<code>src/js/module/permissions/index.js</code></p> |
||||
<p>disabled处理:<code>src/js/module/mixin/disabledState.js</code></p> |
||||
|
||||
|
||||
</section> |
||||
|
||||
</div> |
||||
<div class="search-results"> |
||||
<div class="has-results"> |
||||
|
||||
<h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1> |
||||
<ul class="search-results-list"></ul> |
||||
|
||||
</div> |
||||
<div class="no-results"> |
||||
|
||||
<h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1> |
||||
|
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
</div> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
<a href="frontend-deploy.html#问题" class="navigation navigation-prev " aria-label="Previous page: 问题"> |
||||
<i class="fa fa-angle-left"></i> |
||||
</a> |
||||
|
||||
|
||||
<a href="frontend-development.html#系统功能模块" class="navigation navigation-next " aria-label="Next page: 系统功能模块"> |
||||
<i class="fa fa-angle-right"></i> |
||||
</a> |
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
<script> |
||||
var gitbook = gitbook || []; |
||||
gitbook.push(function() { |
||||
gitbook.page.hasChanged({"page":{"title":"项目目录结构","level":"1.2.6","depth":2,"next":{"title":"系统功能模块","level":"1.2.7","depth":2,"anchor":"#系统功能模块","path":"frontend-development.md","ref":"frontend-development.md#系统功能模块","articles":[]},"previous":{"title":"问题","level":"1.2.5","depth":2,"anchor":"#问题","path":"frontend-deploy.md","ref":"frontend-deploy.md#问题","articles":[]},"dir":"ltr"},"config":{"plugins":["expandable-chapters","insert-logo-link"],"styles":{"website":"./styles/website.css"},"pluginsConfig":{"insert-logo-link":{"src":"../images/logo.png","url":"/"},"expandable-chapters":{},"highlight":{},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"theme":"default","author":"YIGUAN","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{},"title":"调度系统-EasyScheduler","language":"zh-hans","gitbook":"3.2.3","description":"调度系统"},"file":{"path":"frontend-development.md","mtime":"2019-03-27T10:41:58.990Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2019-03-28T11:15:13.750Z"},"basePath":".","book":{"language":""}}); |
||||
}); |
||||
</script> |
||||
</div> |
||||
|
||||
|
||||
<script src="gitbook/gitbook.js"></script> |
||||
<script src="gitbook/theme.js"></script> |
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-expandable-chapters/expandable-chapters.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-insert-logo-link/plugin.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-search/search-engine.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-search/search.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-lunr/lunr.min.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-lunr/search-lunr.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-sharing/buttons.js"></script> |
||||
|
||||
|
||||
|
||||
<script src="gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script> |
||||
|
||||
|
||||
|
||||
</body> |
||||
</html> |
||||
|
Before Width: | Height: | Size: 382 KiB After Width: | Height: | Size: 382 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 264 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 51 KiB |
After Width: | Height: | Size: 81 KiB |
After Width: | Height: | Size: 202 KiB |
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 96 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 100 KiB |
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 53 KiB |
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 51 KiB |
After Width: | Height: | Size: 64 KiB |
After Width: | Height: | Size: 100 KiB |
After Width: | Height: | Size: 77 KiB |
After Width: | Height: | Size: 90 KiB |
After Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 81 KiB |
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB |
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 84 KiB |
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |