目录
修改 commonprivate.properties 文件
在浏览器里面数据IP地址:8081(192.168.174.173:8081)
拷贝安装包
把需要用到的安装包拷贝到虚拟机里面
解压
[root@hadoop3 install]# tar -zxf azkaban-db-3.84.4.tar.gz -C ../soft/
[root@hadoop3 install]# tar -zxf azkaban-exec-server-3.84.4.tar.gz -C ../soft/
[root@hadoop3 install]# tar -zxf azkaban-web-server-3.84.4.tar.gz -C ../soft/
改名
切换目录
cd ../soft
[root@hadoop3 soft]# mv azkaban-db-0.1.0-SNAPSHOT/ azkaban-db
[root@hadoop3 soft]# mv azkaban-exec-server-0.1.0-SNAPSHOT/ azkaban-exec
[root@hadoop3 soft]# mv azkaban-web-server-0.1.0-SNAPSHOT/ azkaban-web
修改MySQL配置文件
切换到MySQL下面
cd /opt/soft/mysql8/
vim ./my.cnf
修改里面的max_allowed_packet
创建数据库
create database if not exists azkaban;
use azkaban;
导入数据表
CREATE TABLE active_executing_flows (
exec_id INT,
update_time BIGINT,
PRIMARY KEY (exec_id)
);
CREATE TABLE active_sla (
exec_id INT NOT NULL,
job_name VARCHAR(128) NOT NULL,
check_time BIGINT NOT NULL,
rule TINYINT NOT NULL,
enc_type TINYINT,
options LONGBLOB NOT NULL,
PRIMARY KEY (exec_id, job_name)
);
CREATE TABLE execution_dependencies(
trigger_instance_id varchar(64),
dep_name varchar(128),
starttime bigint(20) not null,
endtime bigint(20),
dep_status tinyint not null,
cancelleation_cause tinyint not null,
project_id INT not null,
project_version INT not null,
flow_id varchar(128) not null,
flow_version INT not null,
flow_exec_id INT not null,
primary key(trigger_instance_id, dep_name)
);
CREATE INDEX ex_end_time
ON execution_dependencies (endtime);
CREATE TABLE execution_flows (
exec_id INT NOT NULL AUTO_INCREMENT,
project_id INT NOT NULL,
version INT NOT NULL,
flow_id VARCHAR(128) NOT NULL,
status TINYINT,
submit_user VARCHAR(64),
submit_time BIGINT,
update_time BIGINT,
start_time BIGINT,
end_time BIGINT,
enc_type TINYINT,
flow_data LONGBLOB,
executor_id INT DEFAULT NULL,
use_executor INT DEFAULT NULL,
flow_priority TINYINT NOT NULL DEFAULT 5,
PRIMARY KEY (exec_id)
);
CREATE INDEX ex_flows_start_time
ON execution_flows (start_time);
CREATE INDEX ex_flows_end_time
ON execution_flows (end_time);
CREATE INDEX ex_flows_time_range
ON execution_flows (start_time, end_time);
CREATE INDEX ex_flows_flows
ON execution_flows (project_id, flow_id);
CREATE INDEX executor_id
ON execution_flows (executor_id);
CREATE INDEX ex_flows_staus
ON execution_flows (status);
CREATE TABLE execution_jobs (
exec_id INT NOT NULL,
project_id INT NOT NULL,
version INT NOT NULL,
flow_id VARCHAR(128) NOT NULL,
job_id VARCHAR(512) NOT NULL,
attempt INT,
start_time BIGINT,
end_time BIGINT,
status TINYINT,
input_params LONGBLOB,
output_params LONGBLOB,
attachments LONGBLOB,
PRIMARY KEY (exec_id, job_id, flow_id, attempt)
);
CREATE INDEX ex_job_id
ON execution_jobs (project_id, job_id);
-- In table execution_logs, name is the combination of flow_id and job_id
--
-- prefix support and lengths of prefixes (where supported) are storage engine dependent.
-- By default, the index key prefix length limit is 767 bytes for innoDB.
-- from: https://dev.mysql.com/doc/refman/5.7/en/create-index.html
CREATE TABLE execution_logs (
exec_id INT NOT NULL,
name VARCHAR(640),
attempt INT,
enc_type TINYINT,
start_byte INT,
end_byte INT,
log LONGBLOB,
upload_time BIGINT,
PRIMARY KEY (exec_id, name, attempt, start_byte)
);
CREATE INDEX ex_log_attempt
ON execution_logs (exec_id, name, attempt);
CREATE INDEX ex_log_index
ON execution_logs (exec_id, name);
CREATE INDEX ex_log_upload_time
ON execution_logs (upload_time);
CREATE TABLE executor_events (
executor_id INT NOT NULL,
event_type TINYINT NOT NULL,
event_time DATETIME NOT NULL,
username VARCHAR(64),
message VARCHAR(512)
);
CREATE INDEX executor_log
ON executor_events (executor_id, event_time);
CREATE TABLE executors (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
host VARCHAR(64) NOT NULL,
port INT NOT NULL,
active BOOLEAN DEFAULT FALSE,
UNIQUE (host, port)
);
CREATE INDEX executor_connection
ON executors (host, port);
CREATE TABLE project_events (
project_id INT NOT NULL,
event_type TINYINT NOT NULL,
event_time BIGINT NOT NULL,
username VARCHAR(64),
message VARCHAR(512)
);
CREATE INDEX log
ON project_events (project_id, event_time);
CREATE TABLE project_files (
project_id INT NOT NULL,
version INT NOT NULL,
chunk INT,
size INT,
file LONGBLOB,
PRIMARY KEY (project_id, version, chunk)
);
CREATE INDEX file_version
ON project_files (project_id, version);
CREATE TABLE project_flow_files (
project_id INT NOT NULL,
project_version INT NOT NULL,
flow_name VARCHAR(128) NOT NULL,
flow_version INT NOT NULL,
modified_time BIGINT NOT NULL,
flow_file LONGBLOB,
PRIMARY KEY (project_id, project_version, flow_name, flow_version)
);
CREATE TABLE project_flows (
project_id INT NOT NULL,
version INT NOT NULL,
flow_id VARCHAR(128),
modified_time BIGINT NOT NULL,
encoding_type TINYINT,
json MEDIUMBLOB,
PRIMARY KEY (project_id, version, flow_id)
);
CREATE INDEX flow_index
ON project_flows (project_id, version);
CREATE TABLE project_permissions (
project_id VARCHAR(64) NOT NULL,
modified_time BIGINT NOT NULL,
name VARCHAR(64) NOT NULL,
permissions INT NOT NULL,
isGroup BOOLEAN NOT NULL,
PRIMARY KEY (project_id, name, isGroup)
);
CREATE INDEX permission_index
ON project_permissions (project_id);
CREATE TABLE project_properties (
project_id INT NOT NULL,
version INT NOT NULL,
name VARCHAR(255),
modified_time BIGINT NOT NULL,
encoding_type TINYINT,
property BLOB,
PRIMARY KEY (project_id, version, name)
);
CREATE INDEX properties_index
ON project_properties (project_id, version);
CREATE TABLE project_versions (
project_id INT NOT NULL,
version INT NOT NULL,
upload_time BIGINT NOT NULL,
uploader VARCHAR(64) NOT NULL,
file_type VARCHAR(16),
file_name VARCHAR(128),
md5 BINARY(16),
num_chunks INT,
resource_id VARCHAR(512) DEFAULT NULL,
startup_dependencies MEDIUMBLOB DEFAULT NULL,
uploader_ip_addr VARCHAR(50) DEFAULT NULL,
PRIMARY KEY (project_id, version)
);
CREATE INDEX version_index
ON project_versions (project_id);
CREATE TABLE projects (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(64) NOT NULL,
active BOOLEAN,
modified_time BIGINT NOT NULL,
create_time BIGINT NOT NULL,
version INT,
last_modified_by VARCHAR(64) NOT NULL,
description VARCHAR(2048),
enc_type TINYINT,
settings_blob LONGBLOB
);
CREATE INDEX project_name
ON projects (name);
CREATE TABLE properties (
name VARCHAR(64) NOT NULL,
type INT NOT NULL,
modified_time BIGINT NOT NULL,
value VARCHAR(256),
PRIMARY KEY (name, type)
);
-- This file collects all quartz table create statement required for quartz 2.2.1
--
-- We are using Quartz 2.2.1 tables, the original place of which can be found at
-- https://github.com/quartz-scheduler/quartz/blob/quartz-2.2.1/distribution/src/main/assembly/root/docs/dbTables/tables_mysql.sql
DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
DROP TABLE IF EXISTS QRTZ_LOCKS;
DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
DROP TABLE IF EXISTS QRTZ_CALENDARS;
CREATE TABLE QRTZ_JOB_DETAILS
(
SCHED_NAME VARCHAR(120) NOT NULL,
JOB_NAME VARCHAR(200) NOT NULL,
JOB_GROUP VARCHAR(200) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
JOB_CLASS_NAME VARCHAR(250) NOT NULL,
IS_DURABLE VARCHAR(1) NOT NULL,
IS_NONCONCURRENT VARCHAR(1) NOT NULL,
IS_UPDATE_DATA VARCHAR(1) NOT NULL,
REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
);
CREATE TABLE QRTZ_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
JOB_NAME VARCHAR(200) NOT NULL,
JOB_GROUP VARCHAR(200) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
NEXT_FIRE_TIME BIGINT(13) NULL,
PREV_FIRE_TIME BIGINT(13) NULL,
PRIORITY INTEGER NULL,
TRIGGER_STATE VARCHAR(16) NOT NULL,
TRIGGER_TYPE VARCHAR(8) NOT NULL,
START_TIME BIGINT(13) NOT NULL,
END_TIME BIGINT(13) NULL,
CALENDAR_NAME VARCHAR(200) NULL,
MISFIRE_INSTR SMALLINT(2) NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)
);
CREATE TABLE QRTZ_SIMPLE_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
REPEAT_COUNT BIGINT(7) NOT NULL,
REPEAT_INTERVAL BIGINT(12) NOT NULL,
TIMES_TRIGGERED BIGINT(10) NOT NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);
CREATE TABLE QRTZ_CRON_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
CRON_EXPRESSION VARCHAR(200) NOT NULL,
TIME_ZONE_ID VARCHAR(80),
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);
CREATE TABLE QRTZ_SIMPROP_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
STR_PROP_1 VARCHAR(512) NULL,
STR_PROP_2 VARCHAR(512) NULL,
STR_PROP_3 VARCHAR(512) NULL,
INT_PROP_1 INT NULL,
INT_PROP_2 INT NULL,
LONG_PROP_1 BIGINT NULL,
LONG_PROP_2 BIGINT NULL,
DEC_PROP_1 NUMERIC(13,4) NULL,
DEC_PROP_2 NUMERIC(13,4) NULL,
BOOL_PROP_1 VARCHAR(1) NULL,
BOOL_PROP_2 VARCHAR(1) NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);
CREATE TABLE QRTZ_BLOB_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
BLOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);
CREATE TABLE QRTZ_CALENDARS
(
SCHED_NAME VARCHAR(120) NOT NULL,
CALENDAR_NAME VARCHAR(200) NOT NULL,
CALENDAR BLOB NOT NULL,
PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
);
CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
);
CREATE TABLE QRTZ_FIRED_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
ENTRY_ID VARCHAR(95) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
INSTANCE_NAME VARCHAR(200) NOT NULL,
FIRED_TIME BIGINT(13) NOT NULL,
SCHED_TIME BIGINT(13) NOT NULL,
PRIORITY INTEGER NOT NULL,
STATE VARCHAR(16) NOT NULL,
JOB_NAME VARCHAR(200) NULL,
JOB_GROUP VARCHAR(200) NULL,
IS_NONCONCURRENT VARCHAR(1) NULL,
REQUESTS_RECOVERY VARCHAR(1) NULL,
PRIMARY KEY (SCHED_NAME,ENTRY_ID)
);
CREATE TABLE QRTZ_SCHEDULER_STATE
(
SCHED_NAME VARCHAR(120) NOT NULL,
INSTANCE_NAME VARCHAR(200) NOT NULL,
LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
CHECKIN_INTERVAL BIGINT(13) NOT NULL,
PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)
);
CREATE TABLE QRTZ_LOCKS
(
SCHED_NAME VARCHAR(120) NOT NULL,
LOCK_NAME VARCHAR(40) NOT NULL,
PRIMARY KEY (SCHED_NAME,LOCK_NAME)
);
commit;
CREATE TABLE ramp (
rampId VARCHAR(45) NOT NULL,
rampPolicy VARCHAR(45) NOT NULL,
maxFailureToPause INT NOT NULL DEFAULT 0,
maxFailureToRampDown INT NOT NULL DEFAULT 0,
isPercentageScaleForMaxFailure TINYINT NOT NULL DEFAULT 0,
startTime BIGINT NOT NULL DEFAULT 0,
endTime BIGINT NOT NULL DEFAULT 0,
lastUpdatedTime BIGINT NOT NULL DEFAULT 0,
numOfTrail INT NOT NULL DEFAULT 0,
numOfFailure INT NOT NULL DEFAULT 0,
numOfSuccess INT NOT NULL DEFAULT 0,
numOfIgnored INT NOT NULL DEFAULT 0,
isPaused TINYINT NOT NULL DEFAULT 0,
rampStage TINYINT NOT NULL DEFAULT 0,
isActive TINYINT NOT NULL DEFAULT 0,
PRIMARY KEY (rampId)
);
CREATE INDEX idx_ramp
ON ramp (rampId);
CREATE TABLE ramp_dependency (
dependency VARCHAR(45) NOT NULL,
defaultValue VARCHAR (500),
jobtypes VARCHAR (1000),
PRIMARY KEY (dependency)
);
CREATE INDEX idx_ramp_dependency
ON ramp_dependency(dependency);
CREATE TABLE ramp_exceptional_flow_items (
rampId VARCHAR(45) NOT NULL,
flowId VARCHAR(128) NOT NULL,
treatment VARCHAR(1) NOT NULL,
timestamp BIGINT NULL,
PRIMARY KEY (rampId, flowId)
);
CREATE INDEX idx_ramp_exceptional_flow_items
ON ramp_exceptional_flow_items (rampId, flowId);
CREATE TABLE ramp_exceptional_job_items (
rampId VARCHAR(45) NOT NULL,
flowId VARCHAR(128) NOT NULL,
jobId VARCHAR(128) NOT NULL,
treatment VARCHAR(1) NOT NULL,
timestamp BIGINT NULL,
PRIMARY KEY (rampId, flowId, jobId)
);
CREATE INDEX idx_ramp_exceptional_job_items
ON ramp_exceptional_job_items (rampId, flowId, jobId);
CREATE TABLE ramp_items (
rampId VARCHAR(45) NOT NULL,
dependency VARCHAR(45) NOT NULL,
rampValue VARCHAR (500) NOT NULL,
PRIMARY KEY (rampId, dependency)
);
CREATE INDEX idx_ramp_items
ON ramp_items (rampId, dependency);
CREATE TABLE triggers (
trigger_id INT NOT NULL AUTO_INCREMENT,
trigger_source VARCHAR(128),
modify_time BIGINT NOT NULL,
enc_type TINYINT,
data LONGBLOB,
PRIMARY KEY (trigger_id)
);
CREATE TABLE validated_dependencies (
file_name VARCHAR(128),
file_sha1 CHAR(40),
validation_key CHAR(40),
validation_status INT,
PRIMARY KEY (validation_key, file_name, file_sha1)
);
修改配置文件
修改azkaban-exec下面文件
修改azkaban.properties文件
azkaban-exec
[root@hadoop3 soft]# cd ./azkaban-exec/
[root@hadoop3 azkaban-exec]# cd ./conf/
[root@hadoop3 conf]# ls
azkaban.properties global.properties log4j.properties
[root@hadoop3 conf]# vim azkaban.properties第七行修改时区
第二十一行修改azkaban-web的IP地址
第四十四行修改MySQL数据库的IP地址
第四十六行修改MySQL用户名
第四十七行修改虚拟机密码
在最后一行加上 executor.port=12321
7 default.timezone.id=Asia/Shanghai
21 azkaban.webserver.url=http://192.168.174.173:8081
44 mysql.host=192.168.174.172
46 mysql.user=root
47 mysql.password=123456
52 executor.port=12321
修改 commonprivate.properties 文件
[root@hadoop3 conf]# cd ../plugins/jobtypes/
[root@hadoop3 jobtypes]# ls
commonprivate.properties[root@hadoop3 jobtypes]# vim ./commonprivate.properties
在下面加入一行 azkaban.native.lib=false
这个是防止找不到本地的数据库报错azkaban.native.lib=false
修改MySQL的jar包
这里使用的MySQL的jar8.0.25,安装包里面的jar包是5.1.28,所以要把他替换掉
[root@hadoop3 lib]# cp /opt/soft/hive312/lib/mysql-connector-java-8.0.25.jar ./
[root@hadoop3 lib]# rm -rf ./mysql-connector-java-5.1.28.jar
替换完成之后要把5.1.28删掉
启动 azkaban-exec
[root@hadoop3 lib]# cd ../..
[root@hadoop3 soft]# cd ./azkaban-exec/
[root@hadoop3 azkaban-exec]# cd ./bin/
[root@hadoop3 bin]# ./start-exec.sh
[root@hadoop3 bin]# jps
86570 Jps
86077 AzkabanExecutorServer
启动完成之后去MySQL数据库里面看一下启动情况mysql> select * from executors;
active为0,因为还没有激活
激活
[root@hadoop3 bin]# curl -G "192.168.174.173:12321/executor?action=activate" && echo
{"status":"success"}
出现success则为激活成功,再去MySQL里面看一下激活情况
修改azkaban-web下面文件
修改azkaban.properties文件
[root@hadoop3 soft]# cd ./azkaban-web/
[root@hadoop3 azkaban-web]# cd ./conf/
[root@hadoop3 conf]# ls
azkaban.properties azkaban-users.xml global.properties log4j.properties
[root@hadoop3 conf]# vim ./azkaban.properties第七行修改时区
第四十一行修改MySQL的IP地址
第四十三行修改MySQL的用户名
第四十四行修改MySQL的密码
第四十八行把MinimumFreeMemory删掉
因为:MinimumFreeMemory默认6G,服务器内存如果小于此值不启动
7 default.timezone.id=Asia/Shanghai
41 mysql.host=192.168.174.172
43 mysql.user=root
44 mysql.password=123456
48 azkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatus
修改azkaban-users.xml 文件
[root@hadoop3 conf]# vim azkaban-users.xml
创建一个用户角色为admin,用户名为test,密码为123456
4 <user password="123456" roles="admin" username="test"/>
修改MySQL的jar包
[root@hadoop3 lib]# cp /opt/soft/hive312/lib/mysql-connector-java-8.0.25.jar ./
[root@hadoop3 lib]# rm -rf ./mysql-connector-java-5.1.28.jar
启动 azkaban-web
[root@hadoop3 conf]# cd ..
[root@hadoop3 azkaban-web]# ./bin/start-web.sh
[root@hadoop3 azkaban-web]# jps
111121 Jps
111060 AzkabanWebServer
86077 AzkabanExecutorServer
启动需要在azkaban-web目录下启动,不然会报错,因为
使用
在浏览器里面数据IP地址:8081(192.168.174.173:8081)
出现下面页面则为安装成功
用刚才设置的用户名和密码登录
创建项目
给项目名称命名和添加项目描述
两个都必须添加,内容随意写
案例:
1)在windows环境,新建azkaban.project文件,编辑内容如下
azkaban-flow-version: 2.0
注意:该文件作用,是采用新的Flow-API方式解析flow文件。
2)新建one.flow文件,内容如下
nodes: - name: JobOne type: command config: command: echo "Hello World"
(1)Name:job名称
(2)Type:job类型。command表示你要执行作业的方式为命令
(3)Config:job配置
文件格式十分严格,"-“和”:"后面必须加一个空格,并且前面只能用空格,不允许用"TAB"键
3)将azkaban.project、one.flow文件压缩到一个zip文件(Azkaban只支持zip格式),文件名称必须是英文。
上传文件![](https://i-blog.csdnimg.cn/blog_migrate/0b934719b74ab3614bbf6f55b4343865.png)
这里如果文件不行的话则会直接报错
执行流![](https://i-blog.csdnimg.cn/blog_migrate/e98dc2ac63e8d2683cc532d7e53cee8d.png)
执行 ![](https://i-blog.csdnimg.cn/blog_migrate/a9970e6af3ae0f812613cd07f12c373c.png)
执行成功
设置固定的执行时间