Compare commits

...

246 Commits

Author SHA1 Message Date
Jay Chung 7fdc309812 doc: Add hyperlink for pydolphinscheduler 2023-04-11 12:04:32 +08:00
zhuangchong daabcdaa01 [maven-release-plugin] prepare for next development iteration 2023-04-03 18:18:31 +08:00
zhuangchong 9e5b0a1cc3 [maven-release-plugin] prepare release 3.1.5 2023-04-03 18:18:30 +08:00
Jay Chung b547024baf fix: python gateway tenant code query
part of related: #13042
2023-04-03 17:40:29 +08:00
zhuangchong 51999267b7 [maven-release-plugin] prepare for next development iteration 2023-03-31 15:23:14 +08:00
zhuangchong c759675312 [maven-release-plugin] prepare release 3.1.5 2023-03-31 15:23:13 +08:00
Kerwin 45b07a3f5d
add release 3.1.5 version (#13839) 2023-03-31 12:16:06 +08:00
HomminLee c5a5ff7a74 [Fix-13657][Master]NPE caused by the execution of workflow with startNode and forbidden task (#13668)
Co-authored-by: HomminLee <lihongmin@ysstech.com>
2023-03-31 10:44:59 +08:00
ititdog 68c8d5502f Update WorkflowExecuteRunnable.java (#13155) 2023-03-31 10:43:39 +08:00
jackfanwan 96601fef4c fix when the task details are not modified, the predecessor node cannot be modified (#13422)
* fix when the task details are not modified, the predecessor node cannot be modified

* deleted useless code

Co-authored-by: fanwanlong <fanwanlong@kezaihui.com>
2023-03-31 10:41:20 +08:00
Wenjun Ruan 7b24efb715 cherry-pick Fix when update scheduler will execute workflow #13285 2023-03-31 10:37:32 +08:00
lxorc eae10c9287 cherry-pick [Fix-11583][UI] Fix the API usage of gantt graph #13778 2023-03-31 10:34:54 +08:00
旺阳 eea397a0dd cherry-pick [Fix][Alert] Fix when auth is false and user || pwd null can't send email excection #13761 2023-03-31 10:30:02 +08:00
zhuangchong cdb70824c4 fix log error in the PythonGateway 2023-03-30 17:45:54 +08:00
Jrebel-i 3eeff662bc Fix Bug [Athena Datasource] datasource other params illegal (#13032) 2023-03-30 16:18:40 +08:00
陈家名 ecfdebebae cherry-pick [fix][sql] Add unique key to process_definition_log avoid TooManyResultExpection
#12503
2023-03-30 16:08:38 +08:00
旺阳 76a1a6dfcb cherry-pick [Fix][Data Quality]Dataquality Spark Get Datasource Password Error When Password Has $ #13643 2023-03-30 15:50:36 +08:00
kezhenxu94 e84a80f6d4 cherry-pick Publish Docker images to docker hub when released #13631 2023-03-30 15:45:00 +08:00
Aaron Wang 6898c149a8 [BUG][UI] Flink task display right version and deploy mode (#13628) 2023-03-30 15:34:58 +08:00
Aaron Wang 43a3fdf90b cherry-pick [Bug-13666] remove WORKER_GROUP in values.yaml #13718 2023-03-30 15:31:56 +08:00
旺阳 3f94c3cb32 Fix webex teams alert plugin null exception error (#13591) 2023-03-30 15:28:00 +08:00
Jay Chung bf8480b247 feat: Python return datasource object and allow filter by type (#13616)
related: https://github.com/apache/dolphinscheduler-sdk-python/pull/75
2023-03-23 20:29:12 +08:00
Jay Chung 9d2140a651 feat: Python add online_schedule for workflow control schedule state (#13551)
related: apache/dolphinscheduler-sdk-python#73
2023-03-23 20:28:45 +08:00
Jay Chung c41154642f [fix] Remove tenant arg in workflow definition (#13212)
current tenant in workflow only work when the first time
user do not exist, when user change the tenant in workflow
but tenant exist, it will be ignore, so we try to remove it
from workflow, and in #40 we try to create both user and tenant
vis cli instead of auto create
2023-03-23 20:26:47 +08:00
fuchanghai 71a2d38a7f
[improve-#13678] add filter in method of ``` setMainJarName ``` (#13748)
Co-authored-by: fuchanghai <‘2875334588@qq.com’>
2023-03-16 17:26:07 +08:00
zhuangchong d2b0b34cb0 [maven-release-plugin] prepare for next development iteration 2023-02-21 15:32:46 +08:00
zhuangchong 2d6393d722 [maven-release-plugin] prepare release 3.1.4 2023-02-21 15:32:44 +08:00
Kerwin 20e98691b6
Updated documentation and code to version 3.1.4 (#13589) 2023-02-21 14:53:13 +08:00
Wenjun Ruan 36284f9b9c cherry-pick Fix task wake up failed will block the event processing 2023-02-21 12:56:09 +08:00
Wenjun Ruan 3fedc8c8b8 cherry-pick Fix task instance will generate multiple times when retry interval is 0/s 2023-02-21 12:30:55 +08:00
fuchanghai bfb36b8eb6 [fix-13492]add single quotes (#13534)
* [fix-13492]add single quotes

* [improve-#13201] fix test error

---------

Co-authored-by: fuchanghai <‘2875334588@qq.com’>
2023-02-21 12:25:17 +08:00
Stalary da937b42bd FIX: qrtz table use uppercase (#13494)
* FIX: use uppercase
2023-02-21 12:23:48 +08:00
Wenjun Ruan ece9e77edb Fix serial wait will go into block when there is no task need to submit (#13486) 2023-02-21 12:22:44 +08:00
Aaron Wang 899402ac6a [Fix-13418][UI] Remove move-task-definition code (#13441)
* remove move task definition

* remove unused DragOutlined
2023-02-21 11:46:43 +08:00
v-wx-v 84d33a1b0f [fix][data quality] fix when running data quality task with Error "No main class set in JAR" (#13360) 2023-02-21 11:40:54 +08:00
v-wx-v 4013b0679d [improvement][install.sh] fix the install Error "Command not found rmr" & su… (#13163)
* [BUG][install.sh] fix the install Error "Command not found rmr"  & support ZooKeeper (3.4.6+)

* [BUG][install.sh] fix the install Error "Command not found rmr"  & support ZooKeeper (3.4.6+)

* [BUG][install.sh] fix the install Error "Command not found rmr"  & support ZooKeeper (3.4.6+)

* [docs] add documentation for building with different ZK versions
* support both 3.4 and 3.8

* [docs] add documentation for building with different ZK versions
* support both 3.4 and 3.8

* [improvement][install.sh] fix the install Error "Command not found rmr" &  support ZooKeeper (3.4.6+)
* update known-dependencies.txt

* [improvement][install.sh] fix the install Error "Command not found rmr"
* support ZooKeeper (3.4.6+) by activating zk-3.4 profile
* make zk-3.8 as default option in pom.xml
* update defalut ZK version in docs
* update known-dependencies.txt

Co-authored-by: wangxx <wangxx@kcwl.com>
2023-02-21 11:35:53 +08:00
Donald Yang 1d04aefb74 [Fix-13287][doc]Fix Chinese workflow-definition.md duplication description in execution-type (#13361) 2023-02-21 11:24:35 +08:00
caishunfeng 05f3417ea4 fix k8s task run fail (#13348) 2023-02-21 11:23:23 +08:00
Wenjun Ruan 299619c511 cherry-pick Fix MessageSender may be null due to class initialize late #13446 2023-01-29 14:28:55 +08:00
旺阳 5d3f9f2a01
[Fix][Worker] alert email in sql task in K8S (#13387) 2023-01-12 16:14:29 +08:00
zhuangchong 172ebdf04e [maven-release-plugin] prepare for next development iteration 2023-01-04 23:18:59 +08:00
zhuangchong 4a3299ac8c [maven-release-plugin] prepare release 3.1.3 2023-01-04 23:18:57 +08:00
Kerwin 98a8abee40
[3.1.3-release][SQL] Fix t_ds_fav table does not exist when rolling upgrade (#13337)
* Fix t_ds_fav table does not exist when rolling upgrade
2023-01-04 23:08:38 +08:00
zhuangchong 0691d6a887 [maven-release-plugin] prepare for next development iteration 2023-01-04 15:50:57 +08:00
zhuangchong 3d605ded03 [maven-release-plugin] prepare release 3.1.3 2023-01-04 15:50:55 +08:00
Tq 4993ef0344
fix mapper table name t_ds_fav_task (#13334) 2023-01-04 15:39:16 +08:00
Tq 4d29460959
rename h2 and postgreSQL table t_ds_fav to t_ds_fav_task (#13333) 2023-01-04 14:59:47 +08:00
zhuangchong f83b08ac01 [maven-release-plugin] prepare for next development iteration 2023-01-04 12:51:57 +08:00
zhuangchong 450e8ee1b6 [maven-release-plugin] prepare release 3.1.3 2023-01-04 12:51:55 +08:00
Wenjun Ruan a12058609f Fix hive datasource connection leak (#12226) 2023-01-04 11:37:17 +08:00
zhuangchong ba4a1deb6b fix ProcessDefinitionServiceTest test error 2023-01-04 11:35:15 +08:00
zhuangchong e1e36f5aa4 fix OpenmldbTaskTest test class error 2023-01-04 09:25:37 +08:00
zhuangchong b75f241d97 code clean 2023-01-03 19:36:48 +08:00
Kerwin b973272f15
[3.1.3-prepare][doc]3.1.3 Preparations before release (#13329) 2023-01-03 19:33:15 +08:00
hokie-chan d27d27f7d7 [fix][worker][bug] master/worker crash when registry recover from SUSPENDED to RECONNECTED (#13328) 2023-01-03 19:31:55 +08:00
zhuangchong 664b17ae96 update code clean 2023-01-03 19:03:06 +08:00
Jay Chung afeadbe16b [fix][doc] Dead link for python api (#12848)
* [fix][doc] Dead link for python api

ref: apache/dolphinscheduler#12779 and
apache/dolphinscheduler-sdk-python#1

* fix dead link
2023-01-03 18:25:04 +08:00
Jay Chung a645cb1c2a cherry-pick [chore] Separate Python API into another repository
#12779
2023-01-03 18:18:25 +08:00
calvin 7fa8454906 cherry-pick [Fix-13260][API] Ironed out the issue with lacking the value of user's name when querying the list of workflow definitions. #13261 2023-01-03 17:57:14 +08:00
calvin 89f84ed166 cherry-pick [Fix-13248][UI] Ironed out the issue with failing to query task instances by some state of task.
#13251
2023-01-03 17:47:39 +08:00
calvin b46ced7af6 cherry-pick [Bug][DAO] Worked out the issue with throwing the sql exception. 2023-01-03 17:22:24 +08:00
jackfanwan 47c06ae041 cherry-pick when delete workflow, delete related task #12681 2023-01-03 16:58:15 +08:00
Jay Chung 543626aa7a [fix][python] schedule unexpect offline each time update from api #13301 2023-01-03 16:28:45 +08:00
Wenjun Ruan 9564bdeefb cherry-pick Fix task group cannot release when kill task #13314 2023-01-03 16:08:53 +08:00
JieguangZhou aa18878122 fix sagemaker sync status (#13264) 2023-01-03 16:00:15 +08:00
XCL 5f888c4c1f [Improvement][api]Start the downstream workflow when it is online (#13257)
Start the downstream workflow when it is online
2023-01-03 15:46:24 +08:00
Aaron Wang ce5fda89ca [Bug][Worker] Fix duplicated key bug when have out parameters of same name (#12930) 2023-01-03 15:44:25 +08:00
calvin fbbfbda9ed [Fix-13144][UI] Worked out the issue with failing to query workflow instances by the incorrect workflow status.
#13243
2023-01-03 15:40:25 +08:00
HuangWei 32a76ee419 cherry-pick [Fix-13187] refactor OpenmldbParameters #13190 2023-01-03 15:23:05 +08:00
calvin 6b7bcda380 fix the issue with failing to save the settings of timeout alarm (#13234) 2023-01-03 15:17:56 +08:00
Wenjun Ruan fa78b95a76 cherry-pick Use bigint represent term in mysql registry to avoid time inaccurate #13082 2023-01-03 15:14:26 +08:00
Kerwin 84b1f6dcd2
fix resource data authorization does not take effect. (#13318) 2023-01-03 14:57:00 +08:00
Wenjun Ruan 1796577b53 Fix task group might be rob by multiple task #13115 2022-12-14 10:22:25 +08:00
jackfanwan f71b864eee [Bug] [dolphinscheduler-api] in the task define list, when edit task, should show pre node list (#12695)
* backend : add pre node list

* resolve workflow error

Co-authored-by: fanwanlong <fanwanlong@kezaihui.com>
2022-12-14 10:13:50 +08:00
calvin dc0d46f1aa [Fix-13160][UI] Ironed out the issue with failing to save the correct settings of dependent tasks. (#13179) 2022-12-14 09:59:16 +08:00
JieguangZhou 83e2c14be1 fix retry task failure (#13077) 2022-12-14 09:53:59 +08:00
zhuangchong a3a9cb9d46 [maven-release-plugin] prepare for next development iteration 2022-12-07 17:23:58 +08:00
zhuangchong f1aefae5e2 [maven-release-plugin] prepare release 3.1.2 2022-12-07 17:23:57 +08:00
Kerwin 116eff6663
[3.1.2-prepare][version] Modify the version to 3.1.2 (#13121) 2022-12-07 17:09:48 +08:00
Tq ccc3a61301 [fix][doc] Fix sql-hive and hive-cli doc (#12765) 2022-12-07 10:28:59 +08:00
旺阳 6e520fe8f7 [Bug] [Alert] Ignore alert not write info to db (#12867)
* add alert not match return info
2022-12-07 10:25:55 +08:00
旺阳 87c0a1141a change alert start.sh (#13100) 2022-12-07 10:21:40 +08:00
Jay Chung 56ca041182 [fix] python api upload resource center failed
branch dev already exists in apache/dolphinscheduler#13042
2022-11-29 20:19:12 +08:00
Lyle Shaw 1bfd8f5327 [Feature] Add CURD to the project/tenant/user section of the python-DS (#11162)
- Add CURD in project
- Add CURD in tenant
- Add CURD in user
- Add test in user

Co-authored-by: Jiajie Zhong <zhongjiajie955@gmail.com>

(cherry picked from commit cc492c3e13)
2022-11-28 21:06:13 +08:00
Jay Chung 6ed1605680 [chore][python] Change name from process definition to workflow (#12918)
only change its name in python gateway server code, incluing

* Function name: all related to process definition
* Parameter name and comment related

ref: apache/dolphinscheduler-sdk-python#22

(cherry picked from commit f20c9b3102)
2022-11-28 18:54:46 +08:00
Jay Chung 416c41465d [fix] Add token as authentication for python gateway (#12893)
separate from #6407. Authentication, add secret to ensure only trusted people could connect to gateway.

fix: #8255

(cherry picked from commit 6d8befa075)
2022-11-28 18:52:01 +08:00
Jay Chung 696d8ae7f1 [feat] Support set execute type to pydolphinscheduler (#12871)
Up to now, we can only submit workflow with parallel mode. this patch give users ability specific execute type to workflow

(cherry picked from commit 87a88e3662)
2022-11-28 18:48:54 +08:00
Chris 682829e4ea [improve][python] Validate version of Python API at launch (#11626)
(cherry picked from commit 7ed52c3ecb)
2022-11-28 18:46:41 +08:00
Kerwin a87206228a [Bug-13010] [Task] The Flink SQL task page selects the pre-job deployment mode, but the task executed by the worker is the Flink local mode 2022-11-28 10:14:16 +08:00
Kerwin 9e262a8771 [Bug-12997][API] Fix that the end time is not reset when the workflow instance reruns. (#12998)
* Fix that the end time is not reset when the workflow instance reruns.
2022-11-27 15:44:58 +08:00
Kerwin b7c994041e The task instance list is sorted by submission time (#12974) 2022-11-27 14:31:47 +08:00
Kerwin f27db04a8b [Bug-12994] [Worker] Fix kill process does not take effect (#12995) 2022-11-27 14:29:38 +08:00
Wenjun Ruan 00cb3f85ec cherry-pick Fix sql task will send alert if we don't choose the send email
#12984
2022-11-27 14:20:56 +08:00
Kerwin 99b86d112b [Bug-13008] [UI] When using the complement function, turn on the dependent mode to generate multiple unrelated workflow instances (#13009)
* Fix dirty data generated by dependent nodes.
2022-11-27 12:08:54 +08:00
moonkop 3579008c45 Update use-dependent.ts typo (#12462) 2022-11-27 12:08:54 +08:00
Jay Chung 5221428340 [fix][doc] python api release link 2022-11-26 15:24:29 +08:00
Jay Chung 6551112700 [hotfix] Correct python doc link 2022-11-25 17:34:50 +08:00
JieguangZhou 3802599279 [fix] Python task can not pass the parameters to downstream task. (#12961) 2022-11-24 19:27:57 +08:00
旺阳 a8f86de597 [Fix] Fix Java path in Kubernetes Helm Chart (#12987) 2022-11-24 19:04:56 +08:00
Kerwin d4c6ec4fa1 [Bug-12963] [Master] Fix dependent task node null pointer exception (#12965)
* Fix that there are both manual and scheduled workflow instances in dependent nodes, and one of them will report a null pointer exception during execution.
2022-11-24 19:03:49 +08:00
Kerwin 3afc6e2480 cherry-pick [Bug-12954] [Schedule] Fix that workflow-level configuration information does not take effect when timing triggers execution 2022-11-22 17:11:28 +08:00
Kerwin 937d636613 Fix execute shell task exception no dolphinscheduler_env.sh file execute permission (#12909) 2022-11-17 21:44:55 +08:00
simsicon fc67fab006 cherry-pick Upgrade clickhouse jdbc driver #12639 2022-11-16 12:33:39 +08:00
Tq 1e816cc757 add spring-context to alert api (#12892) 2022-11-16 11:08:40 +08:00
Kerwin 018e9219ed cherry-pick [Upgrade][SQL]Modify the table t_ds_worker_group to add a description field in the postgresql upgrade script #12883 2022-11-16 11:07:26 +08:00
Kerwin 6ffac27dbc fix NPE while retry task (#12903) 2022-11-16 11:05:13 +08:00
Kerwin c592bcfbb6 cherry-pick Fix-12832][API] Fix update worker group exception group name already exists. #12874 2022-11-14 11:33:39 +08:00
Kerwin 0a88528deb
cherry-pick [Doc][Bug] Fix dead link caused by markdown cross-files anchor #12357 (#12877)
Co-authored-by: Eric Gao <ericgao.apache@gmail.com>
2022-11-13 09:39:31 +08:00
旺阳 5fe9b5c316 fix and enhance helm db config (#12707) 2022-11-11 23:06:07 +08:00
Kerwin 0512e7696f cherry-pick [doc] Add skip spotless check during ASF release
#12835
2022-11-11 23:04:56 +08:00
zhuangchong 48ad9ff412 [maven-release-plugin] prepare for next development iteration 2022-11-08 11:18:29 +08:00
zhuangchong efc0367999 [maven-release-plugin] prepare release 3.1.1 2022-11-08 11:18:28 +08:00
Wenjun Ruan fe3e93861f
Add switch for checkOwn (#197) (#12803) 2022-11-08 10:44:17 +08:00
zhuangchong 145c5ac8cb [maven-release-plugin] prepare for next development iteration 2022-11-07 20:43:01 +08:00
zhuangchong 525a6846ac [maven-release-plugin] prepare release 3.1.1 2022-11-07 20:43:00 +08:00
Kerwin 0fcbc5e401
[3.1.1][release] Update version to 3.1.1 before release (#12755) 2022-11-07 19:32:39 +08:00
Kerwin 251756f410
[3.1.1][release] test ut (#12757) 2022-11-07 18:07:37 +08:00
calvin 0156a64000 adjust the args of router in the dag (#12759) 2022-11-07 14:27:32 +08:00
Kerwin b446b260f4 Modify shell env to bash (#12742) 2022-11-07 11:22:17 +08:00
Kerwin 9126e1d1fc
[3.1.1-prepare][Test] test ut (#12729) 2022-11-07 10:57:48 +08:00
Wenjun Ruan a8113f05ee cherry-pick Change command file permission to 755 2022-11-07 10:39:47 +08:00
jackfanwan c7f990791e cherry-pick [fix-12675]edit workflow related task, workflow's task version change 2022-11-07 10:28:45 +08:00
JiPeng Wang 4fcdba2c0c cherry-pick [Bug] Resource default auth function disabled false. 2022-11-06 21:17:19 +08:00
calvin cb3a38332f beautify the dag (#12728) 2022-11-06 20:05:10 +08:00
Kerwin 7f3193643a
[3.1.1][API]Fix updating workflow definition causing task definition data to be duplicated. (#12712) 2022-11-05 21:39:35 +08:00
Wenjun Ruan 215c571c8d Fix flink sql cannot run due to missing main jar (#12705) 2022-11-05 10:05:11 +08:00
zhuangchong e8edebc9d9 Fix ProcessDefinitionController interface missing import class. 2022-11-04 18:51:20 +08:00
旺阳 43650bf721 Add pythonNodePort in config file (#12685) 2022-11-03 18:24:37 +08:00
rickchengx 2481e68a19 [Fix-12109]Fix the errors when starting 2 times with dolphinscheduler-daemon.sh (#12118) 2022-11-03 18:20:22 +08:00
Wenjun Ruan 9957df1c41 Fix the waiting strategy cannot recovery if the serverstate is already in running (#12651) 2022-11-02 21:50:59 +08:00
calvin 135d70da09 support to use the clearable button of components to search (#12668) 2022-11-02 21:47:50 +08:00
Wenjun Ruan 0c3ab4335e cherry-pick Add worker-group-refresh-interval in master config #12601 2022-10-31 13:51:52 +08:00
Kerwin 64360e5b69
[Improvement][UI] Support to view the process variables on the page of DAG. (#12609) (#12616)
Co-authored-by: calvin <jianghuachinacom@163.com>
2022-10-31 12:22:29 +08:00
旺阳 5eaf105290 cherry-pick Fix alert status spelling error
#12592
2022-10-29 21:56:09 +08:00
Kerwin 2c93dc6041
cherry-pick (#12608)
[improvement-#12416] Use CollectionUtils.isEmpty judge the collection isEmpty to avoid NPE
#12449

Co-authored-by: fuchanghai <33984497+fuchanghai@users.noreply.github.com>
2022-10-29 21:48:37 +08:00
Kerwin 94ef02e9de
cherry-pick [Improvement] Merge spi.utils into common.utils (#12607)
#12502

Co-authored-by: caishunfeng <caishunfeng2021@gmail.com>
2022-10-29 21:30:28 +08:00
kezhenxu94 cff3df1c45 Add configmap resource permissions so config hot reload can work (#12572) 2022-10-29 13:48:23 +08:00
hushuang 7e5a983f00 [Fix][UI] download resource return 401 (#12566)
resource download with form action, without header: sessionId: xxxx, set sessionId after login,support download resource success
2022-10-29 11:37:39 +08:00
houshitao c3a7af2d6e cherry-pick [Bug] [API] Before deleting a worker group, check whether there is environment that reference the worker group. #12534 2022-10-28 22:37:10 +08:00
Kerwin eb449cdd44
cherry-pick [Fix-12518][Swagger]Fill up missing i18 properties (#12599)
#12532

Co-authored-by: Yann Ann <xiaoqiang.yann@gmail.com>
2022-10-28 22:25:52 +08:00
Wenjun Ruan 75f6c416fb Add task executor threads full policy config in worker (#12510) 2022-10-27 14:52:15 +08:00
kezhenxu94 af031ef9f8 Add mysql support to helm chart (#12517) 2022-10-27 14:48:52 +08:00
liqiquan 826ca39a31 [Bug][Master] Add the aws-java-sdk-s3 jar package to the master module (#12259) (#12512)
Co-authored-by: qiquan.li <qiquan.li@linkflowtech.com>
2022-10-27 14:47:12 +08:00
Wenjun Ruan 5598ab01e9 cherry-pick Remove equals in User to fix UT
#12487
2022-10-27 14:07:14 +08:00
Wenjun Ruan a5a849f615 cherry-pick [Bug] Set tenantDir permission
#12486
2022-10-27 14:02:57 +08:00
rickchengx 6309b78d37 [Fix-12451][k8s] Read the kubeconfig from cluster conf (#12452) 2022-10-27 13:56:46 +08:00
rickchengx 1e62855fa9 [Fix-12356][k8s] fix the null exception when submitting k8s task plugin (#12358) 2022-10-27 13:56:13 +08:00
kezhenxu94 eb7b48596c cherry-pick Reorganize some classes in common module, remove duplicate classes
#12321
2022-10-27 13:53:41 +08:00
sgw d742994e62 [DS-12131][master] Optimize the log printing of the master module acc… (#12152)
* [DS-12131][master] Optimize the log printing of the master module according to the log specification.
2022-10-27 13:22:48 +08:00
Wenjun Ruan a17d0cc5d2 cherry-pick [Improvement][WorkerGroup]Remove workerGroup in registry #12217 2022-10-27 13:21:24 +08:00
zhuangchong 7ca4438682 Resolve AbstractTask code conflicts 2022-10-27 13:03:33 +08:00
Kerwin 58ef3cccd7
[3.1.1-prepare]cherry-pick [Improvement] remove log-server and server module #12206 (#12562) 2022-10-27 12:54:38 +08:00
Kerwin 541105a358 Optimized complement documentation (#12550) 2022-10-27 12:11:43 +08:00
caishunfeng 36ba5a39c5 fix import (#12529) 2022-10-26 16:36:47 +08:00
pandong a30f2ae8df cherry-pick [fix#12439] [Alert] fix send script alert NPE
#12495
2022-10-26 16:34:24 +08:00
Kerwin f3277277f0
cherry-pick Refactor LogServiceClient Singleton to avoid repeat creation of NettyClient #11777 (#12542)
Co-authored-by: Wenjun Ruan <wenjun@apache.org>
2022-10-26 16:20:13 +08:00
houshitao ab675dcf4b [Bug] [API] The workflow definition and the tenant in the workflow instance are inconsistent. (#12533)
* [Bug] [API] The workflow definition and the tenant in the workflow instance are inconsistent

* fix  NPE.

Co-authored-by: houshitao <shitaohou@163.com>
2022-10-26 16:15:05 +08:00
Kerwin 344293102d
[3.1.1-prepare][cherry-pick][Improvement] Add remote task model #11767 (#12541) 2022-10-26 15:44:13 +08:00
Hengdong Gong 149553c52b [fix](dolphinscheduler-dao) fix upgrade to 3.1.0 sql missing field (#12314) (#12315) 2022-10-26 12:42:32 +08:00
Yann Ann 88094f914c cherry-pick [Fix-12425][API] Add rollbackFor setting. 2022-10-22 22:16:44 +08:00
Kerwin eeb11eedfb cherry-pick [Bug-12410] [API]Fix the worker list result in workflow definition only has default 2022-10-21 14:50:36 +08:00
Kerwin a92f766843 [BUG-12306][UI]Fix the password item always is disabled (#12437)
* Fix the password item always is disabled
2022-10-21 09:33:03 +08:00
fuchanghai e04750b81d [doc] Correct descriptions in glossary.md (#12282) 2022-10-19 13:26:10 +08:00
TyrantLucifer dbd747951d cherry-pick [Hotfix][Docs] Fix 404 dead link 2022-10-19 13:25:10 +08:00
Chris-Arith 2b32c7b441 update english oracle.md (#12332) 2022-10-19 13:21:32 +08:00
insist777 3a14fd07b3 [Fix][Task] Fix dependent task can not predicate the status of the corresponding task correctly (#12253)
* [Fix][Task] dependent task can not predicate the status of the corresponding task correctly
2022-10-19 11:44:39 +08:00
Yann Ann 35608becac make sure all failed task will save in errorTaskMap (#12424) 2022-10-19 10:49:47 +08:00
Kerwin c79115c8d8 Fix timing scheduling trigger master service report to get command parameter null pointer exception (#12419) 2022-10-19 10:34:56 +08:00
Kerwin 2402b8a6ef
Use temurin Java docker images instead of deprecated ones (#12334) (#12421)
Co-authored-by: kezhenxu94 <kezhenxu94@apache.org>
2022-10-18 18:51:14 +08:00
Kerwin d2e56af838
[Bug] [spark-sql] In spark-sql, select both SPARK1 and SPARK2 versions and execute ${SPARK_HOME2}/bin/spark-sql (#11721) (#12420)
select different versions of spark-sql to execute different versions of spark-sql

Co-authored-by: limaiwang <limaiwang@163.com>
2022-10-18 18:45:54 +08:00
Kerwin 2a2802c938
fix hdfs defaultFs not working (#11823) (#12418)
Co-authored-by: xiangzihao <460888207@qq.com>
2022-10-18 16:39:00 +08:00
Kerwin f0ad67f992
cherry-pick source is not available in sh (#12413)
Co-authored-by: simsicon <simsicon@gmail.com>
2022-10-18 13:24:57 +08:00
sgw 703f9991b4 [DS-12154][worker] Optimize the log printing of the worker module (#12183)
* [DS-12154][worker] Optimize the log printing of the worker module according to the log specification.
2022-10-18 09:28:07 +08:00
rickchengx 5cfe6a96b4 [Improvement-12372][k8s] Update the deprecated k8s api (#12373) 2022-10-18 09:21:38 +08:00
FlechazoW 39c1144fab [Improvement][Task Plugin] Modify the comment of 'deployMode'. (#12163) 2022-10-18 09:15:37 +08:00
zhuangchong b4f59af9d9 Remove the DataxTaskTest class because there is no junit5 package. 2022-10-18 09:15:06 +08:00
Kerwin b559d033d3
fix datax NPE issue (#12388) (#12407) 2022-10-18 09:08:15 +08:00
Kerwin 10b7d24c2e cherry-pick [BUG-12396][Schedule] Fixed that the workflow definition scheduling that has been online after the version upgrade does not execute 2022-10-17 19:47:57 +08:00
zhuangchong 056176afc0 [Improvement][API] When the workflow definition is copied, the operation user of the timed instance is changed to the current user 2022-10-17 17:26:39 +08:00
Kerwin 771dd67b2e cherry-pick [Improvement-12391][API] Workflow definitions that contain logical task nodes support the copy function 2022-10-17 10:34:04 +08:00
caishunfeng 7e39396a76 [maven-release-plugin] prepare for next development iteration 2022-09-26 21:50:03 +08:00
caishunfeng ae33ba5947 [maven-release-plugin] prepare release 3.1.0 2022-09-26 21:49:27 +08:00
Devosend beebc5e0ad fix env config space bug (#12147) 2022-09-26 19:06:46 +08:00
caishunfeng f982e1d2a2
[3.1.0-prepare] Update version to 310 (#12146)
Co-authored-by: Jiajie Zhong <zhongjiajie955@gmail.com>
2022-09-26 18:26:30 +08:00
Tq 3efe4bc308 [BUG][BE-12113]fix htrace dependency conflicts (#12126)
* fix htrace dependency conflicts

* replace htrace-core with hbase-noop-htrace
2022-09-26 13:49:11 +08:00
陈家名 399f62cba2 [bug][k8s] Change the config file keys in K8s to be the same as those in common.properties (#11812) 2022-09-26 12:05:46 +08:00
陈家名 7a85b930d7 [k8s] Delete unnecessary configurations. (#11808) 2022-09-26 12:05:17 +08:00
caishunfeng a5a941e079
fix upgrade for 310 (#12137) 2022-09-26 10:16:12 +08:00
Yann Ann 3e899bee06 [fix#12000]Cannot remove the WorkerGroup from the master service (#12050)
* [Bug] [Master] Cannot remove the WorkerGroup from the master service. #12000

* remove unnecessary locks

* Update dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/registry/ServerNodeManager.java

Co-authored-by: caishunfeng <caishunfeng2021@gmail.com>

Co-authored-by: caishunfeng <caishunfeng2021@gmail.com>
2022-09-25 23:18:09 +08:00
Eric Gao 42d8308940 [Doc][Improvement] Add instructions for process execution type and data complement (#12121)
* Add instructions for process execution type and data complement

* Fix and polish the docs
2022-09-25 22:58:32 +08:00
Jiajie Zhong b0b29ed8e1 [fix][python] Task switch branch not show in webui (#12120)
when create task switch in python api, switch branch not show correctly,
due to we add some unnecessary attribute to switch task, this patch we
add `_task_ignore_attr` in class `Task` to ignore those unnecessary
attribute from `_task_default_attr`

(cherry picked from commit a86f4e2693)
2022-09-23 19:46:38 +08:00
Jiajie Zhong 71c51c3c3d [Fix] Also auto formatter workflow instance if location is null (#12080)
* [fix] Also auto formatter workflow instance if location is null

In #11535(096fae77) and #11681(4dca488c), we already formatter
workflow definition, but I find out we forget formatter workflow
instance with definition's location is null, this patch also
formatter workflow instance.

* remove console log

(cherry picked from commit 2531c222de)
2022-09-23 19:44:20 +08:00
JieguangZhou f871a4a41f fix python home conflict (#12112)
(cherry picked from commit 6eb1eb722a)
2022-09-23 19:43:56 +08:00
Amy0104 c47e088b73
[Fix][UI] Fix workflow name overlaps bug (#11862) (#12125)
Co-authored-by: Devosend <devosend@gmail.com>
2022-09-23 17:40:13 +08:00
jackfanwan 1e59250055 [BUG]Delete Setting ID (#12096)
* Delete Setting ID

* modify id

Co-authored-by: jackfanwan <fanwanlong@kezaihui.com>
2022-09-22 15:21:24 +08:00
Wenjun Ruan 1a63f8672a
Fix insert command error due to the id is not null (#12092) (#12098)
(cherry picked from commit fba5a8eaa0)
2022-09-22 15:21:07 +08:00
Eric Gao e7b12bf205
[Cherry-Pick][3.1.0-prepare] Cherry-Pick OssOperator for Resource Center to 3.1.0 (#12094)
* Cherry OssOperator for Resource Center to 3.1.0

* Fix doc dead link
2022-09-22 15:00:25 +08:00
Eric Gao 0d16d7b323
[Cherry-Pick][3.1.0-Prepare] Cherry pick docs format fix for 3.1.0 (#12095)
* Cherry pick docs format fix for 3.1.0

* Fix doc dead link

* Fix sphinx dead link
2022-09-22 14:11:43 +08:00
JieguangZhou a2b3659fe9 [improve] Optimize MLFlow task plugin for easy of use (#12071)
optimize code

(cherry picked from commit cf522e2f)
2022-09-21 13:50:48 +08:00
limaiwang f0fda2a9aa add(dependent node's add unprivileged project list): dependent node's add unprivileged project list (#12073) 2022-09-21 10:40:12 +08:00
jackfanwan 280b7c8545 [Improvement] Add Set cluster name (#12074) 2022-09-21 10:17:04 +08:00
jackfanwan cda3110409 [improvement]Add Set cluster name (#12058)
* Add Set cluster name

* add unit test

Co-authored-by: fanwanlong <fanwanlong@kezaihui.com>
2022-09-21 10:16:39 +08:00
Wenjun Ruan c286c5567a
Script cannot contains ''' in params (#12068)
(cherry picked from commit f40a831453)
2022-09-21 08:51:44 +08:00
Wenjun Ruan f4babb773e
Fix update TaskDefinition error (#12064)
(cherry picked from commit 96c12f9592)
2022-09-20 22:24:11 +08:00
rickchengx 806ad1d98c [Improvement-11291][sql] Improvement the log output while executing multiple sql statements (#11292) 2022-09-20 10:47:18 +08:00
songjianet 23d77f8a2a [Feat][UI] Update package. (#12046)
* [Feat][UI] Update package.

* [Feat][UI] Update package.
2022-09-20 10:46:10 +08:00
juzimao 34950d3c09 and task instance date range search (#11963) 2022-09-20 10:45:00 +08:00
caishunfeng 780a509f67 fix workflow keep running when task fail (#11930) 2022-09-19 17:39:18 +08:00
Wenjun Ruan 1513363eed Fix cannot save processDefinition (#11931) 2022-09-19 17:38:46 +08:00
caishunfeng 704043f229 fix import error 2022-09-19 17:07:02 +08:00
Stalary d7f40b19b5 [Bug](dependent) Dependent downstream trigger error when schedule cycle not day. (#11734)
* FIX: dependent

* FIX: version

* MOD: for review
2022-09-19 17:01:14 +08:00
kezhenxu94 775ef98b64 Add validations of possible malicious keys (#11966) 2022-09-19 16:32:15 +08:00
Wenjun Ruan 6f7ba2c634 Add debug logs for properties read from `common.properties` (#11910) 2022-09-19 16:17:10 +08:00
Stalary 714e258be6 [Bug][Dependent]: Id also clone due to duplicate when use dependent mode. (#11929) 2022-09-19 16:14:23 +08:00
juzimao 8c6658e3f9 Optimize date range condition (#11911) 2022-09-19 16:12:34 +08:00
Daniel Y 2a437607ae [Improvement-11834] Upgrade docker base image to support python3.9 (#11835)
* use openjdk:8-jre-slim-bullseye instead of buster to support python3.9

* use openjdk:8-jre-slim-bullseye instead of buster across all components
2022-09-19 15:50:25 +08:00
Wenjun Ruan 7ab4412b5e Fix listing processDefinition the schedulerReleaseState will never be null (#11888) 2022-09-19 15:39:10 +08:00
W.XING 9ad6a049c5 Add chunjun in dolphinscheduler-task-all/pom.xml (#11375) 2022-09-19 15:34:54 +08:00
ouyangyewei 7b58737e22 Add default constructor (#11858) 2022-09-19 15:32:07 +08:00
LiuBodong 0f3b42925f [Fix][Monitor]Monitor UI not show DisakAvailable and MemoryUsage correctly (#11870) 2022-09-19 15:30:49 +08:00
kezhenxu94 89b4192d3d Remove htrace dependencies (#11881)
* Remove htrace dependencies

* Update pom.xml
2022-09-19 15:27:41 +08:00
Kengo Seki 216ceea641 [Improve] Upgrade Hadoop to 3.2.4 (#11832) 2022-09-19 15:26:58 +08:00
Yann Ann c11ec05d61 [Improvement-#11768][Monitor] Support monitor h2 database in monitor page (#11813) 2022-09-19 15:23:11 +08:00
kezhenxu94 fcc75ef1c6 Bump up dependencies to fix cves (#11765) 2022-09-19 15:10:56 +08:00
Wenjun Ruan 1aba077fb8 Remove `not use web service` comment in alert server (#11819) 2022-09-19 14:50:16 +08:00
Kengo Seki 52b79b017e [Improvement] Replace commons-lang 2 function invocations with commons-lang3 (#11810)
* [Improvement] Replace commons-lang 2 function invocations with commons-lang3
2022-09-19 14:48:17 +08:00
Jiajie Zhong ed33066178 [python] Fix permission error when create related objects (#11783)
after we add permission to our codebase in dev branch, will got error
when create objects from pydolphinscheduler, because users with user_id
equal to `Integer.MAX_VALUE` is ordinary users which can not have access
to create unless we grant permission to the role manually. this patch
change dummyUser to admin user's user_id == 1 to fix it
2022-09-19 14:46:26 +08:00
fuchanghai f1de1707d5 Update dolphinscheduler_ddl.sql fix alert t_ds_user add time_zone is not correct (#11795) 2022-09-19 14:41:50 +08:00
caishunfeng 113dc4b5c5
[Feature-10273][Datasource] Add dataSource for AWS Athena (#11157) (#12039)
Co-authored-by: ZhaoGuodong <guodongym@163.com>
2022-09-19 13:45:19 +08:00
JieguangZhou dde6f63c31 [Feature][PyDolphinScheduler] Support DVC task in pyds #11922 (#11941)
* add dvc task in pyds

* add BaseDVC class

(cherry picked from commit bbc228e93f)
2022-09-18 16:49:34 +08:00
JieguangZhou cb063732d7 [feat][python] Support MLflow task in python api (#11962)
(cherry picked from commit ad683c3c42)
2022-09-18 16:46:45 +08:00
JieguangZhou f66dedc9da [feat][python] Support OpenMLDB task in python api (#11944)
Using the whole word zookeeper instead of short cut zk
Co-authored-by: Jiajie Zhong <zhongjiajie955@gmail.com>

(cherry picked from commit e50a32d9cc)
2022-09-18 16:43:36 +08:00
JieguangZhou 1ac2e4a8f3 [feat][python] Add sagemaker yaml example (#11925)
(cherry picked from commit e05f14ba23)
2022-09-18 16:43:24 +08:00
JieguangZhou 6f3b4c1624 [feat][python] Support Pytorch task in python api (#11975)
Co-authored-by: Jiajie Zhong <zhongjiajie955@gmail.com>
(cherry picked from commit 5202e5cfc6)
2022-09-18 16:43:08 +08:00
JieguangZhou e462918ac9
[Feat][python] Add parameter environment to task (#11763) (#11989)
(cherry picked from commit 8988492c43)
2022-09-17 10:24:07 +08:00
Wenjun Ruan 1ea2e848cd
[Feature][Registry] Support etcd as registry (#10981) (#11997)
(cherry picked from commit 2eb8b9f7f0)

Co-authored-by: wjf <jffwang@qq.com>
2022-09-17 09:01:24 +08:00
Wenjun Ruan 8eadf5e5aa
Fix insertOrUpdate plugin may failed due to concurrent operation (#11471) (#11996)
(cherry picked from commit 864a90820d)
2022-09-17 08:59:45 +08:00
JieguangZhou 5e42f52bdf
[3.1.0-prepare][cherry-pick][DSIP-11][python] create workflows from YAML configuration (#11988)
* [DSIP-11][python] create workflows from YAML configuration (#11611)

(cherry picked from commit 38ee91fb1e)

* fix pydolphin yaml doc link (#11817)

(cherry picked from commit c41fa5a8b1)
2022-09-17 08:56:37 +08:00
caishunfeng c4953e8660
Example Change the regular expression of the data source password (#11459) (#11990)
Co-authored-by: jackfanwan <61672564+jackfanwan@users.noreply.github.com>
2022-09-16 15:16:05 +08:00
caishunfeng 951f707b61
[fix][doc] Update the registry related configuration in values.yaml (#11444) (#11981)
Co-authored-by: rickchengx <38122586+rickchengx@users.noreply.github.com>
2022-09-16 11:17:33 +08:00
caishunfeng cd8f32d876
[Bug][Workflow Definition] fix ordinary users can not create depend task (#11961) (#11977) 2022-09-16 09:42:59 +08:00
caishunfeng f034a09d25
[Bug-11650][worker] #11650 fix SQL type task, stop task cause NPE (#11668) (#11958)
Co-authored-by: 冯剑 <35831367+fengjian1129@users.noreply.github.com>
2022-09-15 14:24:34 +08:00
caishunfeng 0647b3e10c
[Cherry-pick][Improvement] [Doc] Put default task parameters in a new file #11776 (#11957)
Co-authored-by: Eric Gao <ericgao.apache@gmail.com>
2022-09-15 14:21:05 +08:00
caishunfeng 27b69e608a
[Bug] [Master] WorkflowExecuteRunnable will face a infinite loop #11838 (#11864) (#11950)
* [Bug] [Master] WorkflowExecuteRunnable will face a infinite loop #11838

Co-authored-by: Yann Ann <2993643785@qq.com>
2022-09-15 10:39:00 +08:00
caishunfeng 0f6cc4fe33
[Fix][db] fix init&upgrade mysql-meta-schema bugs (#11887) (#11935)
Co-authored-by: wendongdi <49931055+wendongdi@users.noreply.github.com>
2022-09-14 18:49:49 +08:00
caishunfeng 8d1c2d3eeb
cherry-pick [Bug] Fix procedure task param pass #11919 (#11926) 2022-09-14 15:44:01 +08:00
1375 changed files with 29963 additions and 36146 deletions

View File

@ -19,15 +19,6 @@
max-line-length = 110 max-line-length = 110
exclude = exclude =
.git, .git,
__pycache__,
.pytest_cache,
*.egg-info,
docs/source/conf.py
old,
build,
dist,
htmlcov,
.tox,
dist, dist,
ignore = ignore =
# It's clear and not need to add docstring # It's clear and not need to add docstring
@ -35,6 +26,3 @@ ignore =
D105, # D105: Missing docstring in magic method D105, # D105: Missing docstring in magic method
# Conflict to Black # Conflict to Black
W503 # W503: Line breaks before binary operators W503 # W503: Line breaks before binary operators
per-file-ignores =
*/pydolphinscheduler/side/__init__.py:F401
*/pydolphinscheduler/tasks/__init__.py:F401

3
.github/CODEOWNERS vendored
View File

@ -26,21 +26,18 @@
/dolphinscheduler-dao/src/main/resources/sql/ @zhongjiajie /dolphinscheduler-dao/src/main/resources/sql/ @zhongjiajie
/dolphinscheduler-common/ @caishunfeng /dolphinscheduler-common/ @caishunfeng
/dolphinscheduler-standalone-server/ @kezhenxu94 @caishunfeng /dolphinscheduler-standalone-server/ @kezhenxu94 @caishunfeng
/dolphinscheduler-log-server/ @caishunfeng
/dolphinscheduler-datasource-plugin/ @caishunfeng /dolphinscheduler-datasource-plugin/ @caishunfeng
/dolphinscheduler-dist/ @kezhenxu94 @caishunfeng /dolphinscheduler-dist/ @kezhenxu94 @caishunfeng
/dolphinscheduler-meter/ @caishunfeng @kezhenxu94 @ruanwenjun @EricGao888 /dolphinscheduler-meter/ @caishunfeng @kezhenxu94 @ruanwenjun @EricGao888
/dolphinscheduler-scheduler-plugin/ @caishunfeng /dolphinscheduler-scheduler-plugin/ @caishunfeng
/dolphinscheduler-master/ @caishunfeng @SbloodyS @ruanwenjun /dolphinscheduler-master/ @caishunfeng @SbloodyS @ruanwenjun
/dolphinscheduler-worker/ @caishunfeng @SbloodyS @ruanwenjun /dolphinscheduler-worker/ @caishunfeng @SbloodyS @ruanwenjun
/dolphinscheduler-server/ @caishunfeng
/dolphinscheduler-service/ @caishunfeng /dolphinscheduler-service/ @caishunfeng
/dolphinscheduler-remote/ @caishunfeng /dolphinscheduler-remote/ @caishunfeng
/dolphinscheduler-spi/ @caishunfeng /dolphinscheduler-spi/ @caishunfeng
/dolphinscheduler-task-plugin/ @caishunfeng @SbloodyS @zhuangchong /dolphinscheduler-task-plugin/ @caishunfeng @SbloodyS @zhuangchong
/dolphinscheduler-tools/ @caishunfeng @SbloodyS @zhongjiajie @EricGao888 /dolphinscheduler-tools/ @caishunfeng @SbloodyS @zhongjiajie @EricGao888
/script/ @caishunfeng @SbloodyS @zhongjiajie @EricGao888 /script/ @caishunfeng @SbloodyS @zhongjiajie @EricGao888
/dolphinscheduler-python/ @zhongjiajie
/dolphinscheduler-ui/ @songjianet @Amy0104 /dolphinscheduler-ui/ @songjianet @Amy0104
/docs/ @zhongjiajie @Tianqi-Dotes @EricGao888 /docs/ @zhongjiajie @Tianqi-Dotes @EricGao888
/licenses/ @kezhenxu94 @zhongjiajie /licenses/ @kezhenxu94 @zhongjiajie

View File

@ -1,6 +1,5 @@
<!--Thanks very much for contributing to Apache DolphinScheduler. Please review https://dolphinscheduler.apache.org/en-us/community/development/pull-request.html before opening a pull request.--> <!--Thanks very much for contributing to Apache DolphinScheduler. Please review https://dolphinscheduler.apache.org/en-us/community/development/pull-request.html before opening a pull request.-->
## Purpose of the pull request ## Purpose of the pull request
<!--(For example: This pull request adds checkstyle plugin).--> <!--(For example: This pull request adds checkstyle plugin).-->
@ -8,8 +7,9 @@
## Brief change log ## Brief change log
<!--*(for example:)* <!--*(for example:)*
- *Add maven-checkstyle-plugin to root pom.xml* - *Add maven-checkstyle-plugin to root pom.xml*
--> -->
## Verify this pull request ## Verify this pull request
<!--*(Please pick either of the following options)*--> <!--*(Please pick either of the following options)*-->
@ -25,9 +25,9 @@ This pull request is already covered by existing tests, such as *(please describ
This change added tests and can be verified as follows: This change added tests and can be verified as follows:
<!--*(example:)* <!--*(example:)*
- *Added dolphinscheduler-dao tests for end-to-end.* - *Added dolphinscheduler-dao tests for end-to-end.*
- *Added CronUtilsTest to verify the change.* - *Added CronUtilsTest to verify the change.*
- *Manually verified the change by testing locally.* --> - *Manually verified the change by testing locally.* -->
(or) (or)

View File

@ -15,9 +15,6 @@
# limitations under the License. # limitations under the License.
# #
Python:
- any: ['dolphinscheduler-python/**/*']
backend: backend:
- 'dolphinscheduler-alert/**/*' - 'dolphinscheduler-alert/**/*'
- 'dolphinscheduler-api/**/*' - 'dolphinscheduler-api/**/*'
@ -26,12 +23,10 @@ backend:
- 'dolphinscheduler-data-quality/**/*' - 'dolphinscheduler-data-quality/**/*'
- 'dolphinscheduler-datasource-plugin/**/*' - 'dolphinscheduler-datasource-plugin/**/*'
- 'dolphinscheduler-dist/**/*' - 'dolphinscheduler-dist/**/*'
- 'dolphinscheduler-log-server/**/*'
- 'dolphinscheduler-master/**/*' - 'dolphinscheduler-master/**/*'
- 'dolphinscheduler-registry/**/*' - 'dolphinscheduler-registry/**/*'
- 'dolphinscheduler-remote/**/*' - 'dolphinscheduler-remote/**/*'
- 'dolphinscheduler-scheduler-plugin/**/*' - 'dolphinscheduler-scheduler-plugin/**/*'
- 'dolphinscheduler-server/**/*'
- 'dolphinscheduler-service/**/*' - 'dolphinscheduler-service/**/*'
- 'dolphinscheduler-spi/**/*' - 'dolphinscheduler-spi/**/*'
- 'dolphinscheduler-standalone-server/**/*' - 'dolphinscheduler-standalone-server/**/*'
@ -42,7 +37,6 @@ backend:
document: document:
- 'docs/**/*' - 'docs/**/*'
- 'dolphinscheduler-python/pydolphinscheduler/docs/**/*'
CI&CD: CI&CD:
- any: ['.github/**/*'] - any: ['.github/**/*']

View File

@ -30,7 +30,6 @@ on:
- 'dolphinscheduler-common/**' - 'dolphinscheduler-common/**'
- 'dolphinscheduler-dao/**' - 'dolphinscheduler-dao/**'
- 'dolphinscheduler-rpc/**' - 'dolphinscheduler-rpc/**'
- 'dolphinscheduler-server/**'
pull_request: pull_request:
concurrency: concurrency:

View File

@ -15,10 +15,10 @@
# limitations under the License. # limitations under the License.
# #
FROM openjdk:8-jre-slim-buster FROM eclipse-temurin:8-jre
RUN apt update ; \ RUN apt update ; \
apt install -y curl wget default-mysql-client sudo openssh-server netcat-traditional ; apt install -y wget default-mysql-client sudo openssh-server netcat-traditional ;
COPY ./apache-dolphinscheduler-*-SNAPSHOT-bin.tar.gz /root COPY ./apache-dolphinscheduler-*-SNAPSHOT-bin.tar.gz /root
RUN tar -zxvf /root/apache-dolphinscheduler-*-SNAPSHOT-bin.tar.gz -C ~ RUN tar -zxvf /root/apache-dolphinscheduler-*-SNAPSHOT-bin.tar.gz -C ~

View File

@ -16,7 +16,7 @@
# #
# JAVA_HOME, will use it to start DolphinScheduler server # JAVA_HOME, will use it to start DolphinScheduler server
export JAVA_HOME=${JAVA_HOME:-/usr/local/openjdk-8} export JAVA_HOME=${JAVA_HOME:-/opt/java/openjdk}
# Database related configuration, set database type, username and password # Database related configuration, set database type, username and password
export DATABASE=${DATABASE:-mysql} export DATABASE=${DATABASE:-mysql}

View File

@ -15,10 +15,10 @@
# limitations under the License. # limitations under the License.
# #
FROM openjdk:8-jre-slim-buster FROM eclipse-temurin:8-jre
RUN apt update ; \ RUN apt update ; \
apt install -y curl wget sudo openssh-server netcat-traditional ; apt install -y wget sudo openssh-server netcat-traditional ;
COPY ./apache-dolphinscheduler-*-SNAPSHOT-bin.tar.gz /root COPY ./apache-dolphinscheduler-*-SNAPSHOT-bin.tar.gz /root
RUN tar -zxvf /root/apache-dolphinscheduler-*-SNAPSHOT-bin.tar.gz -C ~ RUN tar -zxvf /root/apache-dolphinscheduler-*-SNAPSHOT-bin.tar.gz -C ~

View File

@ -16,7 +16,7 @@
# #
# JAVA_HOME, will use it to start DolphinScheduler server # JAVA_HOME, will use it to start DolphinScheduler server
export JAVA_HOME=${JAVA_HOME:-/usr/local/openjdk-8} export JAVA_HOME=${JAVA_HOME:-/opt/java/openjdk}
# Database related configuration, set database type, username and password # Database related configuration, set database type, username and password
export DATABASE=${DATABASE:-postgresql} export DATABASE=${DATABASE:-postgresql}

View File

@ -20,9 +20,9 @@ on:
push: push:
branches: branches:
- dev - dev
release:
env: types:
HUB: ghcr.io/apache/dolphinscheduler - released
jobs: jobs:
build: build:
@ -41,12 +41,25 @@ jobs:
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: | restore-keys: |
${{ runner.os }}-maven- ${{ runner.os }}-maven-
- name: Set environment variables
run: |
if [[ ${{ github.event_name }} == "release" ]]; then
echo "DOCKER_REGISTRY=docker.io" >> $GITHUB_ENV
echo "DOCKER_USERNAME=${{ secrets.DOCKERHUB_USER }}" >> $GITHUB_ENV
echo "DOCKER_PASSWORD=${{ secrets.DOCKERHUB_TOKEN }}" >> $GITHUB_ENV
echo "HUB=apache" >> $GITHUB_ENV
else
echo "DOCKER_REGISTRY=ghcr.io/apache/dolphinscheduler" >> $GITHUB_ENV
echo "DOCKER_USERNAME=${{ github.actor }}" >> $GITHUB_ENV
echo "DOCKER_PASSWORD=${{ secrets.GITHUB_TOKEN }}" >> $GITHUB_ENV
echo "HUB=ghcr.io/apache/dolphinscheduler" >> $GITHUB_ENV
fi
- name: Log in to the Container registry - name: Log in to the Container registry
uses: docker/login-action@v1.10.0 uses: docker/login-action@v2
with: with:
registry: ${{ env.HUB }} registry: ${{ env.DOCKER_REGISTRY }}
username: ${{ github.actor }} username: ${{ env.DOCKER_USERNAME }}
password: ${{ secrets.GITHUB_TOKEN }} password: ${{ env.DOCKER_PASSWORD }}
- name: Set up QEMU - name: Set up QEMU
uses: docker/setup-qemu-action@v2 uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx - name: Set up Docker Buildx

View File

@ -0,0 +1,69 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: publish-helm-chart
on:
push:
branches:
- dev
release:
types:
- released
env:
HUB: ghcr.io/apache/dolphinscheduler
jobs:
build:
if: github.repository == 'apache/dolphinscheduler'
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
timeout-minutes: 30
steps:
- uses: actions/checkout@v2
- name: Set environment variables
run: |
# TODO
if [[ ${{ github.event_name }} == "release" ]]; then
echo "HUB=registry-1.docker.io/apache" >> $GITHUB_ENV
echo "DOCKER_REGISTRY=docker.io" >> $GITHUB_ENV
echo "DOCKER_USERNAME=${{ secrets.DOCKERHUB_USER }}" >> $GITHUB_ENV
echo "DOCKER_PASSWORD=${{ secrets.DOCKERHUB_TOKEN }}" >> $GITHUB_ENV
else
echo "HUB=ghcr.io/apache/dolphinscheduler" >> $GITHUB_ENV
echo "DOCKER_REGISTRY=c" >> $GITHUB_ENV
echo "DOCKER_USERNAME=${{ github.actor }}" >> $GITHUB_ENV
echo "DOCKER_PASSWORD=${{ secrets.GITHUB_TOKEN }}" >> $GITHUB_ENV
fi
- name: Log in to the Container registry
uses: docker/login-action@v2
with:
registry: ${{ env.DOCKER_REGISTRY }}
username: ${{ env.DOCKER_USERNAME }}
password: ${{ env.DOCKER_PASSWORD }}
- name: Publish Helm Chart
working-directory: deploy/kubernetes
run: |
if [[ ${{ env.HUB }} == "ghcr.io/apache/dolphinscheduler" ]]; then
VERSION=0.0.0-$(git rev-parse --short HEAD)
sed -i "s/^version: .*/version: $VERSION/" dolphinscheduler/Chart.yaml
fi
helm dep up dolphinscheduler
helm package dolphinscheduler
helm push dolphinscheduler-helm-*.tgz oci://${{ env.HUB }}

View File

@ -1,205 +0,0 @@
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: Python API
on:
push:
branches:
- dev
paths:
- 'dolphinscheduler-python/**'
pull_request:
concurrency:
group: py-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
defaults:
run:
working-directory: dolphinscheduler-python/pydolphinscheduler
# We have to update setuptools wheel to package with package_data, LICENSE, NOTICE
env:
DEPENDENCES: pip setuptools wheel tox
jobs:
paths-filter:
name: Python-Path-Filter
runs-on: ubuntu-latest
outputs:
not-docs: ${{ steps.filter.outputs.not-docs }}
py-change: ${{ steps.filter.outputs.py-change }}
steps:
- uses: actions/checkout@v2
- uses: dorny/paths-filter@b2feaf19c27470162a626bd6fa8438ae5b263721
id: filter
with:
filters: |
not-docs:
- '!(docs/**)'
py-change:
- 'dolphinscheduler-python/pydolphinscheduler/**'
lint:
name: Lint
if: ${{ (needs.paths-filter.outputs.py-change == 'true') || (github.event_name == 'push') }}
timeout-minutes: 15
needs: paths-filter
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.7
uses: actions/setup-python@v4
with:
python-version: 3.7
- name: Install Dependences
run: |
python -m pip install --upgrade ${{ env.DEPENDENCES }}
- name: Run All Lint Check
run: |
python -m tox -vv -e lint
pytest:
name: Pytest
timeout-minutes: 15
needs: lint
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
# YAML parse `3.10` to `3.1`, so we have to add quotes for `'3.10'`, see also:
# https://github.com/actions/setup-python/issues/160#issuecomment-724485470
python-version: [3.6, 3.7, 3.8, 3.9, '3.10', 3.11-dev]
os: [ubuntu-latest, macOS-latest, windows-latest]
# Skip because dependence [py4j](https://pypi.org/project/py4j/) not work on those environments
exclude:
- os: windows-latest
python-version: '3.10'
- os: windows-latest
python-version: 3.11-dev
steps:
- uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Install Dependences
run: |
python -m pip install --upgrade ${{ env.DEPENDENCES }}
- name: Run All Tests
run: |
python -m tox -vv -e code-test
doc-build:
name: Docs Build Test
timeout-minutes: 15
needs: lint
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
env-list: [doc-build, doc-build-multi]
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.7
uses: actions/setup-python@v4
with:
python-version: 3.7
- name: Install Dependences
run: |
python -m pip install --upgrade ${{ env.DEPENDENCES }}
- name: Run Build Docs Tests ${{ matrix.env-list }}
run: |
python -m tox -vv -e ${{ matrix.env-list }}
local-ci:
name: Local CI
timeout-minutes: 15
needs:
- pytest
- doc-build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.7
uses: actions/setup-python@v4
with:
python-version: 3.7
- name: Install Dependences
run: |
python -m pip install --upgrade ${{ env.DEPENDENCES }}
- name: Run Tests Build Docs
run: |
python -m tox -vv -e local-ci
integrate-test:
name: Integrate Test
if: ${{ (needs.paths-filter.outputs.not-docs == 'true') || (github.event_name == 'push') }}
runs-on: ubuntu-latest
needs: paths-filter
timeout-minutes: 30
steps:
- uses: actions/checkout@v2
with:
submodules: true
- name: Sanity Check
uses: ./.github/actions/sanity-check
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Cache local Maven repository
uses: actions/cache@v3
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-maven-
# Switch to project root directory to run mvnw command
- name: Build Image
working-directory: ./
run: |
./mvnw -B clean install \
-Dmaven.test.skip \
-Dmaven.javadoc.skip \
-Dcheckstyle.skip=true \
-Pdocker,release -Ddocker.tag=ci \
-pl dolphinscheduler-standalone-server -am
- name: Set up Python 3.7
uses: actions/setup-python@v4
with:
python-version: 3.7
- name: Install Dependences
run: |
python -m pip install --upgrade ${{ env.DEPENDENCES }}
- name: Run Integrate Tests
run: |
python -m tox -vv -e integrate-test
result:
name: Python
runs-on: ubuntu-latest
timeout-minutes: 30
needs: [ paths-filter, local-ci, integrate-test ]
if: always()
steps:
- name: Status
# We need change CWD to current directory to avoid global default working directory not exists
working-directory: ./
run: |
if [[ ${{ needs.paths-filter.outputs.not-docs }} == 'false' && ${{ github.event_name }} == 'pull_request' ]]; then
echo "Only document change, skip both python unit and integrate test!"
exit 0
fi
if [[ ${{ needs.paths-filter.outputs.py-change }} == 'false' && ${{ needs.integrate-test.result }} == 'success' && ${{ github.event_name }} == 'pull_request' ]]; then
echo "No python code change, and integrate test pass!"
exit 0
fi
if [[ ${{ needs.integrate-test.result }} != 'success' || ${{ needs.local-ci.result }} != 'success' ]]; then
echo "py-ci Failed!"
exit -1
fi

View File

@ -23,7 +23,6 @@ on:
paths-ignore: paths-ignore:
- '**/*.md' - '**/*.md'
- 'dolphinscheduler-ui' - 'dolphinscheduler-ui'
- 'dolphinscheduler-python/pydolphinscheduler'
branches: branches:
- dev - dev

16
.gitignore vendored
View File

@ -43,7 +43,6 @@ dolphinscheduler-dao/src/main/resources/dao/data_source.properties
dolphinscheduler-alert/logs/ dolphinscheduler-alert/logs/
dolphinscheduler-alert/src/main/resources/alert.properties_bak dolphinscheduler-alert/src/main/resources/alert.properties_bak
dolphinscheduler-alert/src/main/resources/logback.xml dolphinscheduler-alert/src/main/resources/logback.xml
dolphinscheduler-server/src/main/resources/logback.xml
dolphinscheduler-ui/dist dolphinscheduler-ui/dist
dolphinscheduler-ui/node dolphinscheduler-ui/node
dolphinscheduler-common/sql dolphinscheduler-common/sql
@ -51,18 +50,3 @@ dolphinscheduler-common/test
dolphinscheduler-worker/logs dolphinscheduler-worker/logs
dolphinscheduler-master/logs dolphinscheduler-master/logs
dolphinscheduler-api/logs dolphinscheduler-api/logs
# ------------------
# pydolphinscheduler
# ------------------
# Cache
__pycache__/
.tox/
# Build
build/
*egg-info/
# Test coverage
.coverage
htmlcov/

View File

@ -6,11 +6,11 @@ Start by forking the dolphinscheduler GitHub repository, make changes in a branc
There are three branches in the remote repository currently: There are three branches in the remote repository currently:
- `master` : normal delivery branch. After the stable version is released, the code for the stable version branch is merged into the master branch. - `master` : normal delivery branch. After the stable version is released, the code for the stable version branch is merged into the master branch.
- `dev` : daily development branch. The daily development branch, the newly submitted code can pull requests to this branch. - `dev` : daily development branch. The daily development branch, the newly submitted code can pull requests to this branch.
- `x.x.x-release` : the stable release version. - `x.x.x-release` : the stable release version.
So, you should fork the `dev` branch. So, you should fork the `dev` branch.
@ -40,7 +40,6 @@ There will be two repositories at this time: origin (your own warehouse) and ups
Get/update remote repository code (already the latest code, skip it). Get/update remote repository code (already the latest code, skip it).
```sh ```sh
git fetch upstream git fetch upstream
``` ```
@ -91,7 +90,6 @@ After submitting changes to your remote repository, you should click on the new
<img src = "http://geek.analysys.cn/static/upload/221/2019-04-02/90f3abbf-70ef-4334-b8d6-9014c9cf4c7f.png" width ="60%"/> <img src = "http://geek.analysys.cn/static/upload/221/2019-04-02/90f3abbf-70ef-4334-b8d6-9014c9cf4c7f.png" width ="60%"/>
</p> </p>
Select the modified local branch and the branch to merge past to create a pull request. Select the modified local branch and the branch to merge past to create a pull request.
<p align = "center"> <p align = "center">

View File

@ -1,6 +1,6 @@
Dolphin Scheduler Official Website Dolphin Scheduler Official Website
[dolphinscheduler.apache.org](https://dolphinscheduler.apache.org) [dolphinscheduler.apache.org](https://dolphinscheduler.apache.org)
============ ==================================================================
[![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
[![codecov](https://codecov.io/gh/apache/dolphinscheduler/branch/dev/graph/badge.svg)](https://codecov.io/gh/apache/dolphinscheduler/branch/dev) [![codecov](https://codecov.io/gh/apache/dolphinscheduler/branch/dev/graph/badge.svg)](https://codecov.io/gh/apache/dolphinscheduler/branch/dev)
@ -8,9 +8,6 @@ Dolphin Scheduler Official Website
[![Twitter Follow](https://img.shields.io/twitter/follow/dolphinschedule.svg?style=social&label=Follow)](https://twitter.com/dolphinschedule) [![Twitter Follow](https://img.shields.io/twitter/follow/dolphinschedule.svg?style=social&label=Follow)](https://twitter.com/dolphinschedule)
[![Slack Status](https://img.shields.io/badge/slack-join_chat-white.svg?logo=slack&style=social)](https://s.apache.org/dolphinscheduler-slack) [![Slack Status](https://img.shields.io/badge/slack-join_chat-white.svg?logo=slack&style=social)](https://s.apache.org/dolphinscheduler-slack)
[![Stargazers over time](https://starchart.cc/apache/dolphinscheduler.svg)](https://starchart.cc/apache/dolphinscheduler) [![Stargazers over time](https://starchart.cc/apache/dolphinscheduler.svg)](https://starchart.cc/apache/dolphinscheduler)
[![EN doc](https://img.shields.io/badge/document-English-blue.svg)](README.md) [![EN doc](https://img.shields.io/badge/document-English-blue.svg)](README.md)
@ -20,36 +17,36 @@ Dolphin Scheduler Official Website
DolphinScheduler is a distributed and extensible workflow scheduler platform with powerful DAG visual interfaces, dedicated to solving complex job dependencies in the data pipeline and providing various types of jobs available `out of the box`. DolphinScheduler is a distributed and extensible workflow scheduler platform with powerful DAG visual interfaces, dedicated to solving complex job dependencies in the data pipeline and providing various types of jobs available `out of the box`.
Its main objectives are as follows: The key features for DolphinScheduler are as follows:
- Highly Reliable, - Easy to deploy, we provide 4 ways to deploy, such as Standalone deployment,Cluster deployment,Docker / Kubernetes deployment and Rainbond deployment
DolphinScheduler adopts a decentralized multi-master and multi-worker architecture design, which naturally supports easy expansion and high availability (not restricted by a single point of bottleneck), and its performance increases linearly with the increase of machines - Easy to use, there are four ways to create workflows:
- High performance, supporting tens of millions of tasks every day - Visually, create tasks by dragging and dropping tasks
- Support multi-tenant. - [PyDolphinScheduler](https://dolphinscheduler.apache.org/python/main/index.html), Creating workflows via Python API, aka workflow-as-code
- Cloud Native, DolphinScheduler supports multi-cloud/data center workflow management, also - Yaml definition, mapping yaml into workflow(have to install PyDolphinScheduler currently)
supports Kubernetes, Docker deployment and custom task types, distributed - Open API, Creating workflows
scheduling, with overall scheduling capability increased linearly with the
scale of the cluster
- Support various task types: Shell, MR, Spark, SQL (MySQL, PostgreSQL, hive, spark SQL), Python, Sub_Process, Procedure, etc.
- Support scheduling of workflows and dependencies, manual scheduling to pause/stop/recover task, support failure task retry/alarm, recover specified nodes from failure, kill task, etc.
- Associate the tasks according to the dependencies of the tasks in a DAG graph, which can visualize the running state of the task in real-time.
- WYSIWYG online editing tasks
- Support the priority of workflows & tasks, task failover, and task timeout alarm or failure.
- Support workflow global parameters and node customized parameter settings.
- Support online upload/download/management of resource files, etc. Support online file creation and editing.
- Support task log online viewing and scrolling and downloading, etc.
- Support the viewing of Master/Worker CPU load, memory, and CPU usage metrics.
- Support displaying workflow history in tree/Gantt chart, as well as statistical analysis on the task status & process status in each workflow.
- Support back-filling data.
- Support internationalization.
- More features waiting for partners to explore...
## What's in DolphinScheduler - Highly Reliable,
DolphinScheduler uses a decentralized multi-master and multi-worker architecture, which naturally supports horizontal scaling and high availability
- High performance, its performance is N times faster than other orchestration platform and it can support tens of millions of tasks per day
- Supports multi-tenancy
- Supports various task types: Shell, MR, Spark, SQL (MySQL, PostgreSQL, Hive, Spark SQL), Python, Procedure, Sub_Workflow,
Http, K8s, Jupyter, MLflow, SageMaker, DVC, Pytorch, Amazon EMR, etc
- Orchestrating workflows and dependencies, you can pause/stop/recover task any time, failed tasks can be set to automatically retry
- Visualizing the running state of the task in real-time and seeing the task runtime log
- What you see is what you get when you edit the task on the UI
- Backfill can be operated on the UI directly
- Perfect project, resource, data source-level permission control
- Displaying workflow history in tree/Gantt chart, as well as statistical analysis on the task status & process status in each workflow
- Supports internationalization
- Cloud Native, DolphinScheduler supports orchestrating multi-cloud/data center workflow, and
supports custom task type
- More features waiting for partners to explore
Stability | Accessibility | Features | Scalability | | Stability | Accessibility | Features | Scalability |
--------- | ------------- | -------- | ------------| |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
Decentralized multi-master and multi-worker | Visualization of workflow key information, such as task status, task type, retry times, task operation machine information, visual variables, and so on at a glance.  |  Support pause, recover operation | Support customized task types | Decentralized multi-master and multi-worker | Visualization of workflow key information, such as task status, task type, retry times, task operation machine information, visual variables, and so on at a glance.  |  Support pause, recover operation | Support customized task types |
support HA | Visualization of all workflow operations, dragging tasks to draw DAGs, configuring data sources and resources. At the same time, for third-party systems, provide API mode operations. | Users on DolphinScheduler can achieve many-to-one or one-to-one mapping relationship through tenants and Hadoop users, which is very important for scheduling large data jobs. | The scheduler supports distributed scheduling, and the overall scheduling capability will increase linearly with the scale of the cluster. Master and Worker support dynamic adjustment. | support HA | Visualization of all workflow operations, dragging tasks to draw DAGs, configuring data sources and resources. At the same time, for third-party systems, provide API mode operations. | Users on DolphinScheduler can achieve many-to-one or one-to-one mapping relationship through tenants and Hadoop users, which is very important for scheduling large data jobs. | The scheduler supports distributed scheduling, and the overall scheduling capability will increase linearly with the scale of the cluster. Master and Worker support dynamic adjustment. |
Overload processing: By using the task queue mechanism, the number of schedulable tasks on a single machine can be flexibly configured. Machine jam can be avoided with high tolerance to numbers of tasks cached in task queue. | One-click deployment | Support traditional shell tasks, and big data platform task scheduling: MR, Spark, SQL (MySQL, PostgreSQL, hive, spark SQL), Python, Procedure, Sub_Process | | | Overload processing: By using the task queue mechanism, the number of schedulable tasks on a single machine can be flexibly configured. Machine jam can be avoided with high tolerance to numbers of tasks cached in task queue. | One-click deployment | Support traditional shell tasks, and big data platform task scheduling: MR, Spark, SQL (MySQL, PostgreSQL, hive, spark SQL), Python, Procedure, Sub_Process | |
## User Interface Screenshots ## User Interface Screenshots
@ -61,11 +58,11 @@ Overload processing: By using the task queue mechanism, the number of schedulabl
## QuickStart in Docker ## QuickStart in Docker
Please refer the official website document: [QuickStart in Docker](https://dolphinscheduler.apache.org/en-us/docs/latest/user_doc/guide/start/docker.html) Please refer the official website document: [QuickStart in Docker](https://dolphinscheduler.apache.org/en-us/docs/3.1.2/guide/start/docker)
## QuickStart in Kubernetes ## QuickStart in Kubernetes
Please refer to the official website document: [QuickStart in Kubernetes](https://dolphinscheduler.apache.org/en-us/docs/latest/user_doc/guide/installation/kubernetes.html) Please refer to the official website document: [QuickStart in Kubernetes](https://dolphinscheduler.apache.org/en-us/docs/3.1.2/guide/installation/kubernetes)
## How to Build ## How to Build
@ -73,6 +70,16 @@ Please refer to the official website document: [QuickStart in Kubernetes](https:
./mvnw clean install -Prelease ./mvnw clean install -Prelease
``` ```
### Build with different Zookeeper versions
The default Zookeeper Server version supported is 3.8.0.
```bash
# Default Zookeeper 3.8.0
./mvnw clean install -Prelease
# Support to Zookeeper 3.4.6+
./mvnw clean install -Prelease -Dzk-3.4
```
Artifact: Artifact:
``` ```

View File

@ -1,12 +1,11 @@
Dolphin Scheduler Official Website Dolphin Scheduler Official Website
[dolphinscheduler.apache.org](https://dolphinscheduler.apache.org) [dolphinscheduler.apache.org](https://dolphinscheduler.apache.org)
============ ==================================================================
[![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
[![codecov](https://codecov.io/gh/apache/dolphinscheduler/branch/dev/graph/badge.svg)](https://codecov.io/gh/apache/dolphinscheduler/branch/dev) [![codecov](https://codecov.io/gh/apache/dolphinscheduler/branch/dev/graph/badge.svg)](https://codecov.io/gh/apache/dolphinscheduler/branch/dev)
[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=apache-dolphinscheduler&metric=alert_status)](https://sonarcloud.io/dashboard?id=apache-dolphinscheduler) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=apache-dolphinscheduler&metric=alert_status)](https://sonarcloud.io/dashboard?id=apache-dolphinscheduler)
[![Stargazers over time](https://starchart.cc/apache/dolphinscheduler.svg)](https://starchart.cc/apache/dolphinscheduler) [![Stargazers over time](https://starchart.cc/apache/dolphinscheduler.svg)](https://starchart.cc/apache/dolphinscheduler)
[![CN doc](https://img.shields.io/badge/文档-中文版-blue.svg)](README_zh_CN.md) [![CN doc](https://img.shields.io/badge/文档-中文版-blue.svg)](README_zh_CN.md)
@ -18,20 +17,20 @@ Dolphin Scheduler Official Website
其主要目标如下: 其主要目标如下:
- 以DAG图的方式将Task按照任务的依赖关系关联起来可实时可视化监控任务的运行状态 - 以DAG图的方式将Task按照任务的依赖关系关联起来可实时可视化监控任务的运行状态
- 支持丰富的任务类型Shell、MR、Spark、SQL(mysql、postgresql、hive、sparksql)、Python、Sub_Process、Procedure等 - 支持丰富的任务类型Shell、MR、Spark、SQL(mysql、postgresql、hive、sparksql)、Python、Sub_Process、Procedure等
- 支持工作流定时调度、依赖调度、手动调度、手动暂停/停止/恢复,同时支持失败重试/告警、从指定节点恢复失败、Kill任务等操作 - 支持工作流定时调度、依赖调度、手动调度、手动暂停/停止/恢复,同时支持失败重试/告警、从指定节点恢复失败、Kill任务等操作
- 支持工作流优先级、任务优先级及任务的故障转移及任务超时告警/失败 - 支持工作流优先级、任务优先级及任务的故障转移及任务超时告警/失败
- 支持工作流全局参数及节点自定义参数设置 - 支持工作流全局参数及节点自定义参数设置
- 支持资源文件的在线上传/下载,管理等,支持在线文件创建、编辑 - 支持资源文件的在线上传/下载,管理等,支持在线文件创建、编辑
- 支持任务日志在线查看及滚动、在线下载日志等 - 支持任务日志在线查看及滚动、在线下载日志等
- 实现集群HA通过Zookeeper实现Master集群和Worker集群去中心化 - 实现集群HA通过Zookeeper实现Master集群和Worker集群去中心化
- 支持对`Master/Worker` cpu loadmemorycpu在线查看 - 支持对`Master/Worker` cpu loadmemorycpu在线查看
- 支持工作流运行历史树形/甘特图展示、支持任务状态统计、流程状态统计 - 支持工作流运行历史树形/甘特图展示、支持任务状态统计、流程状态统计
- 支持补数 - 支持补数
- 支持多租户 - 支持多租户
- 支持国际化 - 支持国际化
- 还有更多等待伙伴们探索 - 还有更多等待伙伴们探索
## 系统部分截图 ## 系统部分截图
@ -64,6 +63,16 @@ DolphinScheduler的工作计划<a href="https://github.com/apache/dolphinsche
./mvnw clean install -Prelease ./mvnw clean install -Prelease
``` ```
### 构建不同版本的 Zookeeper 依赖
默认支持 Zookeeper Server 3.8.0。
```bash
# 默认 Zookeeper Client 3.8.0
./mvnw clean install -Prelease
# 构建支持 Zookeeper 3.4.6+
./mvnw clean install -Prelease -Dzk-3.4
```
制品: 制品:
``` ```

View File

@ -1,4 +1,5 @@
# DolphinScheduler for Docker and Kubernetes # DolphinScheduler for Docker and Kubernetes
* [Start Up DolphinScheduler with Docker](https://dolphinscheduler.apache.org/en-us/docs/latest/user_doc/guide/start/docker.html) * [Start Up DolphinScheduler with Docker](https://dolphinscheduler.apache.org/en-us/docs/3.1.2/guide/start/docker)
* [Start Up DolphinScheduler with Kubernetes](https://dolphinscheduler.apache.org/en-us/docs/latest/user_doc/guide/installation/kubernetes.html) * [Start Up DolphinScheduler with Kubernetes](https://dolphinscheduler.apache.org/en-us/docs/3.1.2/guide/installation/kubernetes)

View File

@ -15,8 +15,8 @@
# specific language governing permissions and limitations # specific language governing permissions and limitations
# under the License. # under the License.
# #
HUB=ghcr.io/apache/dolphinscheduler HUB=apache
TAG=latest TAG=3.1.5
TZ=Asia/Shanghai TZ=Asia/Shanghai
DATABASE=postgresql DATABASE=postgresql

View File

@ -35,11 +35,11 @@ type: application
# This is the chart version. This version number should be incremented each time you make changes # This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version. # to the chart and its templates, including the app version.
version: 2.0.0 version: 3.1.5
# This is the version number of the application being deployed. This version number should be # This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. # incremented each time you make changes to the application.
appVersion: dev-SNAPSHOT appVersion: 3.1.5
dependencies: dependencies:
- name: postgresql - name: postgresql
@ -56,3 +56,7 @@ dependencies:
# Same as above. # Same as above.
repository: https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami repository: https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami
condition: zookeeper.enabled condition: zookeeper.enabled
- name: mysql
version: 9.4.1
repository: https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami
condition: mysql.enabled

View File

@ -30,19 +30,19 @@ If release name contains chart name it will be used as a full name.
Create default docker images' fullname. Create default docker images' fullname.
*/}} */}}
{{- define "dolphinscheduler.image.fullname.master" -}} {{- define "dolphinscheduler.image.fullname.master" -}}
{{- .Values.image.registry }}/dolphinscheduler-master:{{ .Values.image.tag | default .Chart.AppVersion -}} {{- .Values.image.registry }}/{{ .Values.image.master }}:{{ .Values.image.tag | default .Chart.AppVersion -}}
{{- end -}} {{- end -}}
{{- define "dolphinscheduler.image.fullname.worker" -}} {{- define "dolphinscheduler.image.fullname.worker" -}}
{{- .Values.image.registry }}/dolphinscheduler-worker:{{ .Values.image.tag | default .Chart.AppVersion -}} {{- .Values.image.registry }}/{{ .Values.image.worker }}:{{ .Values.image.tag | default .Chart.AppVersion -}}
{{- end -}} {{- end -}}
{{- define "dolphinscheduler.image.fullname.api" -}} {{- define "dolphinscheduler.image.fullname.api" -}}
{{- .Values.image.registry }}/dolphinscheduler-api:{{ .Values.image.tag | default .Chart.AppVersion -}} {{- .Values.image.registry }}/{{ .Values.image.api }}:{{ .Values.image.tag | default .Chart.AppVersion -}}
{{- end -}} {{- end -}}
{{- define "dolphinscheduler.image.fullname.alert" -}} {{- define "dolphinscheduler.image.fullname.alert" -}}
{{- .Values.image.registry }}/dolphinscheduler-alert-server:{{ .Values.image.tag | default .Chart.AppVersion -}} {{- .Values.image.registry }}/{{ .Values.image.alert }}:{{ .Values.image.tag | default .Chart.AppVersion -}}
{{- end -}} {{- end -}}
{{- define "dolphinscheduler.image.fullname.tools" -}} {{- define "dolphinscheduler.image.fullname.tools" -}}
{{- .Values.image.registry }}/dolphinscheduler-tools:{{ .Values.image.tag | default .Chart.AppVersion -}} {{- .Values.image.registry }}/{{ .Values.image.tools }}:{{ .Values.image.tag | default .Chart.AppVersion -}}
{{- end -}} {{- end -}}
{{/* {{/*
@ -100,7 +100,16 @@ We truncate at 63 chars because some Kubernetes name fields are limited to this
{{- end -}} {{- end -}}
{{/* {{/*
Create a default fully qualified zookkeeper name. Create a default fully qualified mysql name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
*/}}
{{- define "dolphinscheduler.mysql.fullname" -}}
{{- $name := default "mysql" .Values.mysql.nameOverride -}}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{/*
Create a default fully qualified zookeeper name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
*/}} */}}
{{- define "dolphinscheduler.zookeeper.fullname" -}} {{- define "dolphinscheduler.zookeeper.fullname" -}}
@ -123,18 +132,24 @@ Create a database environment variables.
- name: DATABASE - name: DATABASE
{{- if .Values.postgresql.enabled }} {{- if .Values.postgresql.enabled }}
value: "postgresql" value: "postgresql"
{{- else if .Values.mysql.enabled }}
value: "mysql"
{{- else }} {{- else }}
value: {{ .Values.externalDatabase.type | quote }} value: {{ .Values.externalDatabase.type | quote }}
{{- end }} {{- end }}
- name: SPRING_DATASOURCE_URL - name: SPRING_DATASOURCE_URL
{{- if .Values.postgresql.enabled }} {{- if .Values.postgresql.enabled }}
value: jdbc:postgresql://{{ template "dolphinscheduler.postgresql.fullname" . }}:5432/{{ .Values.postgresql.postgresqlDatabase }}?characterEncoding=utf8 value: jdbc:postgresql://{{ template "dolphinscheduler.postgresql.fullname" . }}:5432/{{ .Values.postgresql.postgresqlDatabase }}?{{ .Values.postgresql.params }}
{{- else if .Values.mysql.enabled }}
value: jdbc:mysql://{{ template "dolphinscheduler.mysql.fullname" . }}:3306/{{ .Values.mysql.auth.database }}?{{ .Values.mysql.auth.params }}
{{- else }} {{- else }}
value: jdbc:{{ .Values.externalDatabase.type }}://{{ .Values.externalDatabase.host }}:{{ .Values.externalDatabase.port }}/{{ .Values.externalDatabase.database }}?{{ .Values.externalDatabase.params }} value: jdbc:{{ .Values.externalDatabase.type }}://{{ .Values.externalDatabase.host }}:{{ .Values.externalDatabase.port }}/{{ .Values.externalDatabase.database }}?{{ .Values.externalDatabase.params }}
{{- end }} {{- end }}
- name: SPRING_DATASOURCE_USERNAME - name: SPRING_DATASOURCE_USERNAME
{{- if .Values.postgresql.enabled }} {{- if .Values.postgresql.enabled }}
value: {{ .Values.postgresql.postgresqlUsername }} value: {{ .Values.postgresql.postgresqlUsername }}
{{- else if .Values.mysql.enabled }}
value: {{ .Values.mysql.auth.username }}
{{- else }} {{- else }}
value: {{ .Values.externalDatabase.username | quote }} value: {{ .Values.externalDatabase.username | quote }}
{{- end }} {{- end }}
@ -144,6 +159,9 @@ Create a database environment variables.
{{- if .Values.postgresql.enabled }} {{- if .Values.postgresql.enabled }}
name: {{ template "dolphinscheduler.postgresql.fullname" . }} name: {{ template "dolphinscheduler.postgresql.fullname" . }}
key: postgresql-password key: postgresql-password
{{- else if .Values.mysql.enabled }}
name: {{ template "dolphinscheduler.mysql.fullname" . }}
key: mysql-password
{{- else }} {{- else }}
name: {{ include "dolphinscheduler.fullname" . }}-externaldb name: {{ include "dolphinscheduler.fullname" . }}-externaldb
key: database-password key: database-password
@ -159,6 +177,8 @@ Wait for database to be ready.
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
{{- if .Values.postgresql.enabled }} {{- if .Values.postgresql.enabled }}
command: ['sh', '-xc', 'for i in $(seq 1 180); do nc -z -w3 {{ template "dolphinscheduler.postgresql.fullname" . }} 5432 && exit 0 || sleep 5; done; exit 1'] command: ['sh', '-xc', 'for i in $(seq 1 180); do nc -z -w3 {{ template "dolphinscheduler.postgresql.fullname" . }} 5432 && exit 0 || sleep 5; done; exit 1']
{{- else if .Values.mysql.enabled }}
command: ['sh', '-xc', 'for i in $(seq 1 180); do nc -z -w3 {{ template "dolphinscheduler.mysql.fullname" . }} 3306 && exit 0 || sleep 5; done; exit 1']
{{- else }} {{- else }}
command: ['sh', '-xc', 'for i in $(seq 1 180); do nc -z -w3 {{ .Values.externalDatabase.host }} {{ .Values.externalDatabase.port }} && exit 0 || sleep 5; done; exit 1'] command: ['sh', '-xc', 'for i in $(seq 1 180); do nc -z -w3 {{ .Values.externalDatabase.host }} {{ .Values.externalDatabase.port }} && exit 0 || sleep 5; done; exit 1']
{{- end }} {{- end }}
@ -182,19 +202,6 @@ Create a registry environment variables.
{{- end }} {{- end }}
{{- end -}} {{- end -}}
{{/*
Create a common fs_s3a environment variables.
*/}}
{{- define "dolphinscheduler.fs_s3a.env_vars" -}}
{{- if eq (default "HDFS" .Values.common.configmap.RESOURCE_STORAGE_TYPE) "S3" -}}
- name: FS_S3A_SECRET_KEY
valueFrom:
secretKeyRef:
key: fs-s3a-secret-key
name: {{ include "dolphinscheduler.fullname" . }}-fs-s3a
{{- end -}}
{{- end -}}
{{/* {{/*
Create a sharedStoragePersistence volume. Create a sharedStoragePersistence volume.
*/}} */}}

View File

@ -23,7 +23,7 @@ metadata:
app.kubernetes.io/name: {{ include "dolphinscheduler.fullname" . }}-common app.kubernetes.io/name: {{ include "dolphinscheduler.fullname" . }}-common
{{- include "dolphinscheduler.common.labels" . | nindent 4 }} {{- include "dolphinscheduler.common.labels" . | nindent 4 }}
data: data:
{{- range $key, $value := (omit .Values.common.configmap "FS_S3A_SECRET_KEY") }} {{- range $key, $value := .Values.common.configmap }}
{{ $key }}: {{ $value | quote }} {{ $key }}: {{ $value | quote }}
{{- end }} {{- end }}
{{- end }} {{- end }}

View File

@ -39,6 +39,7 @@ spec:
{{- toYaml .Values.alert.annotations | nindent 8 }} {{- toYaml .Values.alert.annotations | nindent 8 }}
{{- end }} {{- end }}
spec: spec:
serviceAccountName: {{ template "dolphinscheduler.fullname" . }}
{{- if .Values.alert.affinity }} {{- if .Values.alert.affinity }}
affinity: affinity:
{{- toYaml .Values.alert.affinity | nindent 8 }} {{- toYaml .Values.alert.affinity | nindent 8 }}
@ -70,6 +71,7 @@ spec:
- name: SPRING_JACKSON_TIME_ZONE - name: SPRING_JACKSON_TIME_ZONE
value: {{ .Values.timezone }} value: {{ .Values.timezone }}
{{- include "dolphinscheduler.database.env_vars" . | nindent 12 }} {{- include "dolphinscheduler.database.env_vars" . | nindent 12 }}
{{- include "dolphinscheduler.registry.env_vars" . | nindent 12 }}
{{ range $key, $value := .Values.alert.env }} {{ range $key, $value := .Values.alert.env }}
- name: {{ $key }} - name: {{ $key }}
value: {{ $value | quote }} value: {{ $value | quote }}
@ -117,4 +119,4 @@ spec:
{{- end }} {{- end }}
- name: config-volume - name: config-volume
configMap: configMap:
name: {{ include "dolphinscheduler.fullname" . }}-configs name: {{ include "dolphinscheduler.fullname" . }}-configs

View File

@ -39,6 +39,7 @@ spec:
{{- toYaml .Values.api.annotations | nindent 8 }} {{- toYaml .Values.api.annotations | nindent 8 }}
{{- end }} {{- end }}
spec: spec:
serviceAccountName: {{ template "dolphinscheduler.fullname" . }}
{{- if .Values.api.affinity }} {{- if .Values.api.affinity }}
affinity: affinity:
{{- toYaml .Values.api.affinity | nindent 8 }} {{- toYaml .Values.api.affinity | nindent 8 }}
@ -71,7 +72,6 @@ spec:
value: {{ .Values.timezone }} value: {{ .Values.timezone }}
{{- include "dolphinscheduler.database.env_vars" . | nindent 12 }} {{- include "dolphinscheduler.database.env_vars" . | nindent 12 }}
{{- include "dolphinscheduler.registry.env_vars" . | nindent 12 }} {{- include "dolphinscheduler.registry.env_vars" . | nindent 12 }}
{{- include "dolphinscheduler.fs_s3a.env_vars" . | nindent 12 }}
{{ range $key, $value := .Values.api.env }} {{ range $key, $value := .Values.api.env }}
- name: {{ $key }} - name: {{ $key }}
value: {{ $value | quote }} value: {{ $value | quote }}

View File

@ -34,7 +34,7 @@ metadata:
{{- end }} {{- end }}
spec: spec:
rules: rules:
- host: {{ .Values.ingress.host }} - host: "{{ .Values.ingress.host }}"
http: http:
paths: paths:
- path: {{ .Values.ingress.path }} - path: {{ .Values.ingress.path }}

View File

@ -46,7 +46,6 @@ spec:
value: {{ .Values.timezone }} value: {{ .Values.timezone }}
{{- include "dolphinscheduler.database.env_vars" . | nindent 12 }} {{- include "dolphinscheduler.database.env_vars" . | nindent 12 }}
{{- include "dolphinscheduler.registry.env_vars" . | nindent 12 }} {{- include "dolphinscheduler.registry.env_vars" . | nindent 12 }}
{{- include "dolphinscheduler.fs_s3a.env_vars" . | nindent 12 }}
envFrom: envFrom:
- configMapRef: - configMapRef:
name: {{ include "dolphinscheduler.fullname" . }}-common name: {{ include "dolphinscheduler.fullname" . }}-common

View File

@ -0,0 +1,53 @@
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app: {{ template "dolphinscheduler.fullname" . }}
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
release: {{ .Release.Name }}
name: {{ template "dolphinscheduler.fullname" . }}
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: {{ template "dolphinscheduler.fullname" . }}
labels:
app: {{ template "dolphinscheduler.fullname" . }}
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
release: "{{ .Release.Name }}"
rules:
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: {{ template "dolphinscheduler.fullname" . }}
labels:
app: {{ template "dolphinscheduler.fullname" . }}
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
release: "{{ .Release.Name }}"
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: {{ template "dolphinscheduler.fullname" . }}
subjects:
- kind: ServiceAccount
name: {{ template "dolphinscheduler.fullname" . }}
namespace: {{ .Release.Namespace }}

View File

@ -1,28 +0,0 @@
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
{{- if eq (default "HDFS" .Values.common.configmap.RESOURCE_STORAGE_TYPE) "S3" }}
apiVersion: v1
kind: Secret
metadata:
name: {{ include "dolphinscheduler.fullname" . }}-fs-s3a
labels:
app.kubernetes.io/name: {{ include "dolphinscheduler.fullname" . }}-fs-s3a
{{- include "dolphinscheduler.common.labels" . | nindent 4 }}
type: Opaque
data:
fs-s3a-secret-key: {{ .Values.common.configmap.FS_S3A_SECRET_KEY | b64enc | quote }}
{{- end }}

View File

@ -36,6 +36,7 @@ spec:
{{- toYaml .Values.master.annotations | nindent 8 }} {{- toYaml .Values.master.annotations | nindent 8 }}
{{- end }} {{- end }}
spec: spec:
serviceAccountName: {{ template "dolphinscheduler.fullname" . }}
{{- if .Values.master.affinity }} {{- if .Values.master.affinity }}
affinity: affinity:
{{- toYaml .Values.master.affinity | nindent 8 }} {{- toYaml .Values.master.affinity | nindent 8 }}
@ -66,7 +67,6 @@ spec:
value: {{ .Values.timezone }} value: {{ .Values.timezone }}
{{- include "dolphinscheduler.database.env_vars" . | nindent 12 }} {{- include "dolphinscheduler.database.env_vars" . | nindent 12 }}
{{- include "dolphinscheduler.registry.env_vars" . | nindent 12 }} {{- include "dolphinscheduler.registry.env_vars" . | nindent 12 }}
{{- include "dolphinscheduler.fs_s3a.env_vars" . | nindent 12 }}
{{ range $key, $value := .Values.master.env }} {{ range $key, $value := .Values.master.env }}
- name: {{ $key }} - name: {{ $key }}
value: {{ $value | quote }} value: {{ $value | quote }}

View File

@ -36,6 +36,7 @@ spec:
{{- toYaml .Values.worker.annotations | nindent 8 }} {{- toYaml .Values.worker.annotations | nindent 8 }}
{{- end }} {{- end }}
spec: spec:
serviceAccountName: {{ template "dolphinscheduler.fullname" . }}
{{- if .Values.worker.affinity }} {{- if .Values.worker.affinity }}
affinity: affinity:
{{- toYaml .Values.worker.affinity | nindent 8 }} {{- toYaml .Values.worker.affinity | nindent 8 }}
@ -64,11 +65,10 @@ spec:
value: {{ .Values.timezone }} value: {{ .Values.timezone }}
- name: SPRING_JACKSON_TIME_ZONE - name: SPRING_JACKSON_TIME_ZONE
value: {{ .Values.timezone }} value: {{ .Values.timezone }}
- name: ALERT_LISTEN_HOST - name: WORKER_ALERT_LISTEN_HOST
value: {{ include "dolphinscheduler.fullname" . }}-alert value: {{ include "dolphinscheduler.fullname" . }}-alert
{{- include "dolphinscheduler.database.env_vars" . | nindent 12 }} {{- include "dolphinscheduler.database.env_vars" . | nindent 12 }}
{{- include "dolphinscheduler.registry.env_vars" . | nindent 12 }} {{- include "dolphinscheduler.registry.env_vars" . | nindent 12 }}
{{- include "dolphinscheduler.fs_s3a.env_vars" . | nindent 12 }}
{{ range $key, $value := .Values.worker.env }} {{ range $key, $value := .Values.worker.env }}
- name: {{ $key }} - name: {{ $key }}
value: {{ $value | quote }} value: {{ $value | quote }}

View File

@ -42,8 +42,8 @@ spec:
name: api-port name: api-port
- port: 25333 - port: 25333
targetPort: python-api-port targetPort: python-api-port
{{- if and (eq .Values.api.service.type "NodePort") .Values.api.service.nodePort }} {{- if and (eq .Values.api.service.type "NodePort") .Values.api.service.pythonNodePort }}
nodePort: {{ .Values.api.service.nodePort }} nodePort: {{ .Values.api.service.pythonNodePort }}
{{- end }} {{- end }}
protocol: TCP protocol: TCP
name: python-api-port name: python-api-port
@ -58,4 +58,4 @@ spec:
loadBalancerIP: {{ .Values.api.service.loadBalancerIP }} loadBalancerIP: {{ .Values.api.service.loadBalancerIP }}
{{- end }} {{- end }}
selector: selector:
{{- include "dolphinscheduler.api.labels" . | nindent 4 }} {{- include "dolphinscheduler.api.labels" . | nindent 4 }}

View File

@ -23,9 +23,14 @@ timezone: "Asia/Shanghai"
image: image:
registry: "dolphinscheduler.docker.scarf.sh/apache" registry: "dolphinscheduler.docker.scarf.sh/apache"
tag: "dev-SNAPSHOT" tag: "3.1.5"
pullPolicy: "IfNotPresent" pullPolicy: "IfNotPresent"
pullSecret: "" pullSecret: ""
master: dolphinscheduler-master
worker: dolphinscheduler-worker
api: dolphinscheduler-api
alert: dolphinscheduler-alert-server
tools: dolphinscheduler-tools
## If not exists external database, by default, Dolphinscheduler's database will use it. ## If not exists external database, by default, Dolphinscheduler's database will use it.
postgresql: postgresql:
@ -33,11 +38,25 @@ postgresql:
postgresqlUsername: "root" postgresqlUsername: "root"
postgresqlPassword: "root" postgresqlPassword: "root"
postgresqlDatabase: "dolphinscheduler" postgresqlDatabase: "dolphinscheduler"
params: "characterEncoding=utf8"
persistence: persistence:
enabled: false enabled: false
size: "20Gi" size: "20Gi"
storageClass: "-" storageClass: "-"
mysql:
enabled: false
auth:
username: "ds"
password: "ds"
database: "dolphinscheduler"
params: "characterEncoding=utf8"
primary:
persistence:
enabled: false
size: "20Gi"
storageClass: "-"
## If exists external database, and set postgresql.enable value to false. ## If exists external database, and set postgresql.enable value to false.
## external database will be used, otherwise Dolphinscheduler's database will be used. ## external database will be used, otherwise Dolphinscheduler's database will be used.
externalDatabase: externalDatabase:
@ -53,7 +72,7 @@ externalDatabase:
zookeeper: zookeeper:
enabled: true enabled: true
service: service:
port: 2181 port: 2181
fourlwCommandsWhitelist: "srvr,ruok,wchs,cons" fourlwCommandsWhitelist: "srvr,ruok,wchs,cons"
persistence: persistence:
enabled: false enabled: false
@ -74,8 +93,8 @@ conf:
# resource storage type: HDFS, S3, NONE # resource storage type: HDFS, S3, NONE
resource.storage.type: HDFS resource.storage.type: HDFS
# resource store on HDFS/S3 path, resource file will store to this hadoop hdfs path, self configuration, please make sure the directory exists on hdfs and have read write permissions. "/dolphinscheduler" is recommended # resource store on HDFS/S3 path, resource file will store to this base path, self configuration, please make sure the directory exists on hdfs and have read write permissions. "/dolphinscheduler" is recommended
resource.upload.path: /dolphinscheduler resource.storage.upload.base.path: /dolphinscheduler
# whether to startup kerberos # whether to startup kerberos
hadoop.security.authentication.startup.state: false hadoop.security.authentication.startup.state: false
@ -93,14 +112,20 @@ conf:
kerberos.expire.time: 2 kerberos.expire.time: 2
# resource view suffixs # resource view suffixs
#resource.view.suffixs: txt,log,sh,bat,conf,cfg,py,java,sql,xml,hql,properties,json,yml,yaml,ini,js #resource.view.suffixs: txt,log,sh,bat,conf,cfg,py,java,sql,xml,hql,properties,json,yml,yaml,ini,js
# if resource.storage.type: HDFS, the user must have the permission to create directories under the HDFS root path # if resource.storage.type=HDFS, the user must have the permission to create directories under the HDFS root path
hdfs.root.user: hdfs resource.hdfs.root.user: hdfs
# if resource.storage.type: S3, the value like: s3a://dolphinscheduler; if resource.storage.type: HDFS and namenode HA is enabled, you need to copy core-site.xml and hdfs-site.xml to conf dir # if resource.storage.type=S3, the value like: s3a://dolphinscheduler; if resource.storage.type=HDFS and namenode HA is enabled, you need to copy core-site.xml and hdfs-site.xml to conf dir
fs.defaultFS: file:/// resource.hdfs.fs.defaultFS: hdfs://mycluster:8020
aws.access.key.id: minioadmin # The AWS access key. if resource.storage.type=S3 or use EMR-Task, This configuration is required
aws.secret.access.key: minioadmin resource.aws.access.key.id: minioadmin
aws.region: us-east-1 # The AWS secret access key. if resource.storage.type=S3 or use EMR-Task, This configuration is required
aws.endpoint: http://localhost:9000 resource.aws.secret.access.key: minioadmin
# The AWS Region to use. if resource.storage.type=S3 or use EMR-Task, This configuration is required
resource.aws.region: cn-north-1
# The name of the bucket. You need to create them by yourself. Otherwise, the system cannot start. All buckets in Amazon S3 share a single namespace; ensure the bucket is given a unique name.
resource.aws.s3.bucket.name: dolphinscheduler
# You need to set this parameter when private cloud s3. If S3 uses public cloud, you only need to set resource.aws.region or set to the endpoint of a public cloud such as S3.cn-north-1.amazonaws.com.cn
resource.aws.s3.endpoint: http://localhost:9000
# resourcemanager port, the default value is 8088 if not specified # resourcemanager port, the default value is 8088 if not specified
resource.manager.httpaddress.port: 8088 resource.manager.httpaddress.port: 8088
# if resourcemanager HA is enabled, please set the HA IPs; if resourcemanager is single, keep this value empty # if resourcemanager HA is enabled, please set the HA IPs; if resourcemanager is single, keep this value empty
@ -149,32 +174,15 @@ common:
configmap: configmap:
DOLPHINSCHEDULER_OPTS: "" DOLPHINSCHEDULER_OPTS: ""
DATA_BASEDIR_PATH: "/tmp/dolphinscheduler" DATA_BASEDIR_PATH: "/tmp/dolphinscheduler"
RESOURCE_STORAGE_TYPE: "HDFS"
RESOURCE_UPLOAD_PATH: "/dolphinscheduler" RESOURCE_UPLOAD_PATH: "/dolphinscheduler"
FS_DEFAULT_FS: "file:///"
FS_S3A_ENDPOINT: "s3.xxx.amazonaws.com"
FS_S3A_ACCESS_KEY: "xxxxxxx"
FS_S3A_SECRET_KEY: "xxxxxxx"
HADOOP_SECURITY_AUTHENTICATION_STARTUP_STATE: "false"
JAVA_SECURITY_KRB5_CONF_PATH: "/opt/krb5.conf"
LOGIN_USER_KEYTAB_USERNAME: "hdfs@HADOOP.COM"
LOGIN_USER_KEYTAB_PATH: "/opt/hdfs.keytab"
KERBEROS_EXPIRE_TIME: "2"
HDFS_ROOT_USER: "hdfs"
RESOURCE_MANAGER_HTTPADDRESS_PORT: "8088"
YARN_RESOURCEMANAGER_HA_RM_IDS: ""
YARN_APPLICATION_STATUS_ADDRESS: "http://ds1:%s/ws/v1/cluster/apps/%s"
YARN_JOB_HISTORY_STATUS_ADDRESS: "http://ds1:19888/ws/v1/history/mapreduce/jobs/%s"
DATASOURCE_ENCRYPTION_ENABLE: "false"
DATASOURCE_ENCRYPTION_SALT: "!@#$%^&*"
SUDO_ENABLE: "true"
# dolphinscheduler env # dolphinscheduler env
HADOOP_HOME: "/opt/soft/hadoop" HADOOP_HOME: "/opt/soft/hadoop"
HADOOP_CONF_DIR: "/opt/soft/hadoop/etc/hadoop" HADOOP_CONF_DIR: "/opt/soft/hadoop/etc/hadoop"
SPARK_HOME1: "/opt/soft/spark1" SPARK_HOME1: "/opt/soft/spark1"
SPARK_HOME2: "/opt/soft/spark2" SPARK_HOME2: "/opt/soft/spark2"
PYTHON_HOME: "/usr/bin/python" PYTHON_HOME: "/usr/bin/python"
JAVA_HOME: "/usr/local/openjdk-8" JAVA_HOME: "/opt/java/openjdk"
HIVE_HOME: "/opt/soft/hive" HIVE_HOME: "/opt/soft/hive"
FLINK_HOME: "/opt/soft/flink" FLINK_HOME: "/opt/soft/flink"
DATAX_HOME: "/opt/soft/datax" DATAX_HOME: "/opt/soft/datax"
@ -335,14 +343,12 @@ worker:
storageClassName: "-" storageClassName: "-"
storage: "20Gi" storage: "20Gi"
env: env:
WORKER_GROUPS_0: default
WORKER_MAX_CPU_LOAD_AVG: "-1" WORKER_MAX_CPU_LOAD_AVG: "-1"
WORKER_RESERVED_MEMORY: "0.3" WORKER_RESERVED_MEMORY: "0.3"
WORKER_EXEC_THREADS: "100" WORKER_EXEC_THREADS: "100"
WORKER_HEARTBEAT_INTERVAL: "10s" WORKER_HEARTBEAT_INTERVAL: "10s"
WORKER_HEART_ERROR_THRESHOLD: "5" WORKER_HEART_ERROR_THRESHOLD: "5"
WORKER_HOST_WEIGHT: "100" WORKER_HOST_WEIGHT: "100"
WORKER_GROUPS: "default"
alert: alert:
## Number of desired pods. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1. ## Number of desired pods. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1.
@ -468,8 +474,10 @@ api:
type: "ClusterIP" type: "ClusterIP"
## clusterIP is the IP address of the service and is usually assigned randomly by the master ## clusterIP is the IP address of the service and is usually assigned randomly by the master
clusterIP: "" clusterIP: ""
## nodePort is the port on each node on which this service is exposed when type=NodePort ## nodePort is the port on each node on which this api service is exposed when type=NodePort
nodePort: "" nodePort: ""
## pythonNodePort is the port on each node on which this python api service is exposed when type=NodePort
pythonNodePort: ""
## externalIPs is a list of IP addresses for which nodes in the cluster will also accept traffic for this service ## externalIPs is a list of IP addresses for which nodes in the cluster will also accept traffic for this service
externalIPs: [] externalIPs: []
## externalName is the external reference that kubedns or equivalent will return as a CNAME record for this service, requires Type to be ExternalName ## externalName is the external reference that kubedns or equivalent will return as a CNAME record for this service, requires Type to be ExternalName

File diff suppressed because it is too large Load Diff

View File

@ -45,11 +45,16 @@ export default {
children: [ children: [
{ {
key: 'docs0', key: 'docs0',
text: 'latest(3.0.0)', text: 'latest(3.1.5)',
link: '/en-us/docs/latest/user_doc/about/introduction.html', link: '/en-us/docs/latest/user_doc/about/introduction.html',
}, },
{ {
key: 'docs1', key: 'docs1',
text: '3.0.1',
link: '/en-us/docs/3.0.1/user_doc/about/introduction.html',
},
{
key: 'docs2',
text: '2.0.6', text: '2.0.6',
link: '/en-us/docs/2.0.6/user_doc/guide/quick-start.html', link: '/en-us/docs/2.0.6/user_doc/guide/quick-start.html',
}, },

View File

@ -55,11 +55,11 @@ Here is the template for mail
```text ```text
Hi community, Hi community,
<CHANGE-TO-YOUR-PROPOSAL-DETAIL> <CHANGE-TO-YOUR-PROPOSAL-DETAIL>
I already add a GitHub Issue for my proposal, which you could see in <CHANGE-TO-YOUR-GITHUB-ISSUE-LINK>. I already add a GitHub Issue for my proposal, which you could see in <CHANGE-TO-YOUR-GITHUB-ISSUE-LINK>.
Looking forward any feedback for this thread. Looking forward any feedback for this thread.
``` ```
@ -89,3 +89,4 @@ closed and transfer from [current DSIPs][current-DSIPs] to [past DSIPs][past-DSI
[github-issue-choose]: https://github.com/apache/dolphinscheduler/issues/new/choose [github-issue-choose]: https://github.com/apache/dolphinscheduler/issues/new/choose
[mail-to-dev]: mailto:dev@dolphinscheduler.apache.org [mail-to-dev]: mailto:dev@dolphinscheduler.apache.org
[DSIP-1]: https://github.com/apache/dolphinscheduler/issues/6407 [DSIP-1]: https://github.com/apache/dolphinscheduler/issues/6407

View File

@ -16,4 +16,5 @@
## High Scalability ## High Scalability
- **Scalability**: Supports multitenancy and online resource management. Stable operation of 100,000 data tasks per day is supported. - **Scalability**: Supports multitenancy and online resource management. Stable operation of 100,000 data tasks per day is supported.

View File

@ -17,10 +17,10 @@ there are no subsequent nodes. Examples are as follows:
manual start or scheduled scheduling. Each time the process definition runs, a process instance is generated manual start or scheduled scheduling. Each time the process definition runs, a process instance is generated
**Task instance**: The task instance is the instantiation of the task node in the process definition, which identifies **Task instance**: The task instance is the instantiation of the task node in the process definition, which identifies
the specific task execution status the specific task
**Task type**: Currently supports SHELL, SQL, SUB_PROCESS (sub-process), PROCEDURE, MR, SPARK, PYTHON, DEPENDENT ( **Task type**: Currently supports SHELL, SQL, SUB_PROCESS (sub-process), PROCEDURE, MR, SPARK, PYTHON, DEPENDENT (
depends), and plans to support dynamic plug-in expansion, note: **SUB_PROCESS** It is also a separate process depends), and plans to support dynamic plug-in expansion, note: **SUB_PROCESS** need relation with another workflow definition which also a separate process
definition that can be started and executed separately definition that can be started and executed separately
**Scheduling method**: The system supports scheduled scheduling and manual scheduling based on cron expressions. Command **Scheduling method**: The system supports scheduled scheduling and manual scheduling based on cron expressions. Command
@ -45,10 +45,14 @@ provided. **Continue** refers to regardless of the status of the task running in
failure. **End** means that once a failed task is found, Kill will also run the parallel task at the same time, and the failure. **End** means that once a failed task is found, Kill will also run the parallel task at the same time, and the
process fails and ends process fails and ends
**Complement**: Supplement historical datasupports **interval parallel and serial** two complement methods, and two types of date selection which include **date range** and **date enumeration**. **Complement**: Supplement historical datasupports **interval parallel** and **serial** two complement methods, and two types of date selection which include **date range** and **date enumeration**.
### 2.Module introduction ### 2.Module introduction
- dolphinscheduler-master master module, provides workflow management and orchestration.
- dolphinscheduler-worker worker module, provides task execution management.
- dolphinscheduler-alert alarm module, providing AlertServer service. - dolphinscheduler-alert alarm module, providing AlertServer service.
- dolphinscheduler-api web application module, providing ApiServer service. - dolphinscheduler-api web application module, providing ApiServer service.
@ -59,8 +63,6 @@ process fails and ends
- dolphinscheduler-remote client and server based on netty - dolphinscheduler-remote client and server based on netty
- dolphinscheduler-server MasterServer and WorkerServer services
- dolphinscheduler-service service module, including Quartz, Zookeeper, log client access service, easy to call server - dolphinscheduler-service service module, including Quartz, Zookeeper, log client access service, easy to call server
module and api module module and api module
@ -71,4 +73,3 @@ process fails and ends
From the perspective of scheduling, this article preliminarily introduces the architecture principles and implementation From the perspective of scheduling, this article preliminarily introduces the architecture principles and implementation
ideas of the big data distributed workflow scheduling system-DolphinScheduler. To be continued ideas of the big data distributed workflow scheduling system-DolphinScheduler. To be continued

View File

@ -6,15 +6,15 @@ This section briefs about the hardware requirements for DolphinScheduler. Dolphi
The Linux operating systems specified below can run on physical servers and mainstream virtualization environments such as VMware, KVM, and XEN. The Linux operating systems specified below can run on physical servers and mainstream virtualization environments such as VMware, KVM, and XEN.
| Operating System | Version | | Operating System | Version |
| :----------------------- | :----------: | |:-------------------------|:---------------:|
| Red Hat Enterprise Linux | 7.0 and above | | Red Hat Enterprise Linux | 7.0 and above |
| CentOS | 7.0 and above | | CentOS | 7.0 and above |
| Oracle Enterprise Linux | 7.0 and above | | Oracle Enterprise Linux | 7.0 and above |
| Ubuntu LTS | 16.04 and above | | Ubuntu LTS | 16.04 and above |
> **Note:** > **Note:**
>The above Linux operating systems can run on physical servers and mainstream virtualization environments such as VMware, KVM, and XEN. > The above Linux operating systems can run on physical servers and mainstream virtualization environments such as VMware, KVM, and XEN.
## Server Configuration ## Server Configuration
@ -23,8 +23,8 @@ DolphinScheduler supports 64-bit hardware platforms with Intel x86-64 architectu
### Production Environment ### Production Environment
| **CPU** | **MEM** | **HD** | **NIC** | **Num** | | **CPU** | **MEM** | **HD** | **NIC** | **Num** |
| --- | --- | --- | --- | --- | |---------|---------|--------|---------|---------|
| 4 core+ | 8 GB+ | SAS | GbE | 1+ | | 4 core+ | 8 GB+ | SAS | GbE | 1+ |
> **Note:** > **Note:**
> - The above recommended configuration is the minimum configuration for deploying DolphinScheduler. Higher configuration is strongly recommended for production environments. > - The above recommended configuration is the minimum configuration for deploying DolphinScheduler. Higher configuration is strongly recommended for production environments.
@ -34,11 +34,11 @@ DolphinScheduler supports 64-bit hardware platforms with Intel x86-64 architectu
DolphinScheduler provides the following network port configurations for normal operation: DolphinScheduler provides the following network port configurations for normal operation:
| Server | Port | Desc | | Server | Port | Desc |
| --- | --- | --- | |----------------------|-------|----------------------------------------------------------------------|
| MasterServer | 5678 | not the communication port, require the native ports do not conflict | | MasterServer | 5678 | not the communication port, require the native ports do not conflict |
| WorkerServer | 1234 | not the communication port, require the native ports do not conflict | | WorkerServer | 1234 | not the communication port, require the native ports do not conflict |
| ApiApplicationServer | 12345 | backend communication port | | ApiApplicationServer | 12345 | backend communication port |
> **Note:** > **Note:**
> - MasterServer and WorkerServer do not need to enable communication between the networks. As long as the local ports do not conflict. > - MasterServer and WorkerServer do not need to enable communication between the networks. As long as the local ports do not conflict.
@ -46,4 +46,4 @@ DolphinScheduler provides the following network port configurations for normal o
## Browser Requirements ## Browser Requirements
The minimum supported version of Google Chrome is version 85, but version 90 or above is recommended. The minimum supported version of Google Chrome is version 85, but version 90 or above is recommended.

View File

@ -4,4 +4,4 @@ Apache DolphinScheduler provides a distributed and easy to expand visual workflo
Apache DolphinScheduler aims to solve complex big data task dependencies and to trigger relationships in data OPS orchestration for various big data applications. Solves the intricate dependencies of data R&D ETL and the inability to monitor the health status of tasks. DolphinScheduler assembles tasks in the Directed Acyclic Graph (DAG) streaming mode, which can monitor the execution status of tasks in time, and supports operations like retry, recovery failure from specified nodes, pause, resume, and kill tasks, etc. Apache DolphinScheduler aims to solve complex big data task dependencies and to trigger relationships in data OPS orchestration for various big data applications. Solves the intricate dependencies of data R&D ETL and the inability to monitor the health status of tasks. DolphinScheduler assembles tasks in the Directed Acyclic Graph (DAG) streaming mode, which can monitor the execution status of tasks in time, and supports operations like retry, recovery failure from specified nodes, pause, resume, and kill tasks, etc.
![Apache DolphinScheduler](../../../img/introduction_ui.png) ![Apache DolphinScheduler](../../../img/introduction_ui.png)

View File

@ -39,4 +39,4 @@ Note: the final strategy for cache update comes from the expiration strategy con
The sequence diagram shows below: The sequence diagram shows below:
<img src="../../../img/cache-evict.png" alt="cache-evict" style="zoom: 67%;" /> <img src="../../../img/cache-evict.png" alt="cache-evict" style="zoom: 67%;" />

View File

@ -101,8 +101,6 @@ The directory structure of DolphinScheduler is as follows:
## Configurations in Details ## Configurations in Details
### dolphinscheduler-daemon.sh [startup or shutdown DolphinScheduler application] ### dolphinscheduler-daemon.sh [startup or shutdown DolphinScheduler application]
dolphinscheduler-daemon.sh is responsible for DolphinScheduler startup and shutdown. dolphinscheduler-daemon.sh is responsible for DolphinScheduler startup and shutdown.
@ -110,6 +108,7 @@ Essentially, start-all.sh or stop-all.sh startup and shutdown the cluster via do
Currently, DolphinScheduler just makes a basic config, remember to config further JVM options based on your practical situation of resources. Currently, DolphinScheduler just makes a basic config, remember to config further JVM options based on your practical situation of resources.
Default simplified parameters are: Default simplified parameters are:
```bash ```bash
export DOLPHINSCHEDULER_OPTS=" export DOLPHINSCHEDULER_OPTS="
-server -server
@ -157,8 +156,8 @@ The default configuration is as follows:
Note that DolphinScheduler also supports database configuration through `bin/env/dolphinscheduler_env.sh`. Note that DolphinScheduler also supports database configuration through `bin/env/dolphinscheduler_env.sh`.
### Zookeeper related configuration ### Zookeeper related configuration
DolphinScheduler uses Zookeeper for cluster management, fault tolerance, event monitoring and other functions. Configuration file location: DolphinScheduler uses Zookeeper for cluster management, fault tolerance, event monitoring and other functions. Configuration file location:
|Service| Configuration file | |Service| Configuration file |
|--|--| |--|--|
@ -226,8 +225,8 @@ The default configuration is as follows:
|alert.rpc.port | 50052 | the RPC port of Alert Server| |alert.rpc.port | 50052 | the RPC port of Alert Server|
|zeppelin.rest.url | http://localhost:8080 | the RESTful API url of zeppelin| |zeppelin.rest.url | http://localhost:8080 | the RESTful API url of zeppelin|
### Api-server related configuration ### Api-server related configuration
Location: `api-server/conf/application.yaml` Location: `api-server/conf/application.yaml`
|Parameters | Default value| Description| |Parameters | Default value| Description|
@ -257,6 +256,7 @@ Location: `api-server/conf/application.yaml`
|traffic.control.customize-tenant-qps-rate||customize tenant max request number per second| |traffic.control.customize-tenant-qps-rate||customize tenant max request number per second|
### Master Server related configuration ### Master Server related configuration
Location: `master-server/conf/application.yaml` Location: `master-server/conf/application.yaml`
|Parameters | Default value| Description| |Parameters | Default value| Description|
@ -277,9 +277,10 @@ Location: `master-server/conf/application.yaml`
|master.kill-yarn-job-when-task-failover|true|whether to kill yarn job when failover taskInstance| |master.kill-yarn-job-when-task-failover|true|whether to kill yarn job when failover taskInstance|
|master.registry-disconnect-strategy.strategy|stop|Used when the master disconnect from registry, default value: stop. Optional values include stop, waiting| |master.registry-disconnect-strategy.strategy|stop|Used when the master disconnect from registry, default value: stop. Optional values include stop, waiting|
|master.registry-disconnect-strategy.max-waiting-time|100s|Used when the master disconnect from registry, and the disconnect strategy is waiting, this config means the master will waiting to reconnect to registry in given times, and after the waiting times, if the master still cannot connect to registry, will stop itself, if the value is 0s, the Master will waitting infinitely| |master.registry-disconnect-strategy.max-waiting-time|100s|Used when the master disconnect from registry, and the disconnect strategy is waiting, this config means the master will waiting to reconnect to registry in given times, and after the waiting times, if the master still cannot connect to registry, will stop itself, if the value is 0s, the Master will waitting infinitely|
|master.worker-group-refresh-interval|10s|The interval to refresh worker group from db to memory|
### Worker Server related configuration ### Worker Server related configuration
Location: `worker-server/conf/application.yaml` Location: `worker-server/conf/application.yaml`
|Parameters | Default value| Description| |Parameters | Default value| Description|
@ -291,13 +292,14 @@ Location: `worker-server/conf/application.yaml`
|worker.tenant-auto-create|true|tenant corresponds to the user of the system, which is used by the worker to submit the job. If system does not have this user, it will be automatically created after the parameter worker.tenant.auto.create is true.| |worker.tenant-auto-create|true|tenant corresponds to the user of the system, which is used by the worker to submit the job. If system does not have this user, it will be automatically created after the parameter worker.tenant.auto.create is true.|
|worker.max-cpu-load-avg|-1|worker max CPU load avg, only higher than the system CPU load average, worker server can be dispatched tasks. default value -1: the number of CPU cores * 2| |worker.max-cpu-load-avg|-1|worker max CPU load avg, only higher than the system CPU load average, worker server can be dispatched tasks. default value -1: the number of CPU cores * 2|
|worker.reserved-memory|0.3|worker reserved memory, only lower than system available memory, worker server can be dispatched tasks. default value 0.3, the unit is G| |worker.reserved-memory|0.3|worker reserved memory, only lower than system available memory, worker server can be dispatched tasks. default value 0.3, the unit is G|
|worker.groups|default|worker groups separated by comma, e.g., 'worker.groups=default,test' <br> worker will join corresponding group according to this config when startup|
|worker.alert-listen-host|localhost|the alert listen host of worker| |worker.alert-listen-host|localhost|the alert listen host of worker|
|worker.alert-listen-port|50052|the alert listen port of worker| |worker.alert-listen-port|50052|the alert listen port of worker|
|worker.registry-disconnect-strategy.strategy|stop|Used when the worker disconnect from registry, default value: stop. Optional values include stop, waiting| |worker.registry-disconnect-strategy.strategy|stop|Used when the worker disconnect from registry, default value: stop. Optional values include stop, waiting|
|worker.registry-disconnect-strategy.max-waiting-time|100s|Used when the worker disconnect from registry, and the disconnect strategy is waiting, this config means the worker will waiting to reconnect to registry in given times, and after the waiting times, if the worker still cannot connect to registry, will stop itself, if the value is 0s, will waitting infinitely | |worker.registry-disconnect-strategy.max-waiting-time|100s|Used when the worker disconnect from registry, and the disconnect strategy is waiting, this config means the worker will waiting to reconnect to registry in given times, and after the waiting times, if the worker still cannot connect to registry, will stop itself, if the value is 0s, will waitting infinitely |
|worker.task-execute-threads-full-policy|REJECT|If REJECT, when the task waiting in the worker reaches exec-threads, it will reject the received task and the Master will redispatch it; If CONTINUE, it will put the task into the worker's execution queue and wait for a free thread to start execution|
### Alert Server related configuration ### Alert Server related configuration
Location: `alert-server/conf/application.yaml` Location: `alert-server/conf/application.yaml`
|Parameters | Default value| Description| |Parameters | Default value| Description|
@ -305,7 +307,6 @@ Location: `alert-server/conf/application.yaml`
|server.port|50053|the port of Alert Server| |server.port|50053|the port of Alert Server|
|alert.port|50052|the port of alert| |alert.port|50052|the port of alert|
### Quartz related configuration ### Quartz related configuration
This part describes quartz configs and configure them based on your practical situation and resources. This part describes quartz configs and configure them based on your practical situation and resources.
@ -335,7 +336,6 @@ The default configuration is as follows:
|spring.quartz.properties.org.quartz.jobStore.driverDelegateClass | org.quartz.impl.jdbcjobstore.PostgreSQLDelegate| |spring.quartz.properties.org.quartz.jobStore.driverDelegateClass | org.quartz.impl.jdbcjobstore.PostgreSQLDelegate|
|spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval | 5000| |spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval | 5000|
### dolphinscheduler_env.sh [load environment variables configs] ### dolphinscheduler_env.sh [load environment variables configs]
When using shell to commit tasks, DolphinScheduler will export environment variables from `bin/env/dolphinscheduler_env.sh`. The When using shell to commit tasks, DolphinScheduler will export environment variables from `bin/env/dolphinscheduler_env.sh`. The

View File

@ -22,58 +22,58 @@
### Architecture Description ### Architecture Description
* **MasterServer** * **MasterServer**
MasterServer adopts a distributed and decentralized design concept. MasterServer is mainly responsible for DAG task segmentation, task submission monitoring, and monitoring the health status of other MasterServer and WorkerServer at the same time. MasterServer adopts a distributed and decentralized design concept. MasterServer is mainly responsible for DAG task segmentation, task submission monitoring, and monitoring the health status of other MasterServer and WorkerServer at the same time.
When the MasterServer service starts, register a temporary node with ZooKeeper, and perform fault tolerance by monitoring changes in the temporary node of ZooKeeper. When the MasterServer service starts, register a temporary node with ZooKeeper, and perform fault tolerance by monitoring changes in the temporary node of ZooKeeper.
MasterServer provides monitoring services based on netty. MasterServer provides monitoring services based on netty.
#### The Service Mainly Includes: #### The Service Mainly Includes:
- **DistributedQuartz** distributed scheduling component, which is mainly responsible for the start and stop operations of scheduled tasks. When quartz start the task, there will be a thread pool inside the Master responsible for the follow-up operation of the processing task;
- **MasterSchedulerService** is a scanning thread that regularly scans the `t_ds_command` table in the database, runs different business operations according to different **command types**; - **DistributedQuartz** distributed scheduling component, which is mainly responsible for the start and stop operations of scheduled tasks. When quartz start the task, there will be a thread pool inside the Master responsible for the follow-up operation of the processing task;
- **WorkflowExecuteRunnable** is mainly responsible for DAG task segmentation, task submission monitoring, and logical processing of different event types; - **MasterSchedulerService** is a scanning thread that regularly scans the `t_ds_command` table in the database, runs different business operations according to different **command types**;
- **TaskExecuteRunnable** is mainly responsible for the processing and persistence of tasks, and generates task events and submits them to the event queue of the process instance; - **WorkflowExecuteRunnable** is mainly responsible for DAG task segmentation, task submission monitoring, and logical processing of different event types;
- **EventExecuteService** is mainly responsible for the polling of the event queue of the process instances; - **TaskExecuteRunnable** is mainly responsible for the processing and persistence of tasks, and generates task events and submits them to the event queue of the process instance;
- **StateWheelExecuteThread** is mainly responsible for process instance and task timeout, task retry, task-dependent polling, and generates the corresponding process instance or task event and submits it to the event queue of the process instance; - **EventExecuteService** is mainly responsible for the polling of the event queue of the process instances;
- **FailoverExecuteThread** is mainly responsible for the logic of Master fault tolerance and Worker fault tolerance; - **StateWheelExecuteThread** is mainly responsible for process instance and task timeout, task retry, task-dependent polling, and generates the corresponding process instance or task event and submits it to the event queue of the process instance;
* **WorkerServer** - **FailoverExecuteThread** is mainly responsible for the logic of Master fault tolerance and Worker fault tolerance;
WorkerServer also adopts a distributed and decentralized design concept. WorkerServer is mainly responsible for task execution and providing log services. * **WorkerServer**
When the WorkerServer service starts, register a temporary node with ZooKeeper and maintain a heartbeat. WorkerServer also adopts a distributed and decentralized design concept. WorkerServer is mainly responsible for task execution and providing log services.
WorkerServer provides monitoring services based on netty.
#### The Service Mainly Includes:
- **WorkerManagerThread** is mainly responsible for the submission of the task queue, continuously receives tasks from the task queue, and submits them to the thread pool for processing; When the WorkerServer service starts, register a temporary node with ZooKeeper and maintain a heartbeat.
WorkerServer provides monitoring services based on netty.
- **TaskExecuteThread** is mainly responsible for the process of task execution, and the actual processing of tasks according to different task types; #### The Service Mainly Includes:
- **RetryReportTaskStatusThread** is mainly responsible for regularly polling to report the task status to the Master until the Master replies to the status ack to avoid the loss of the task status; - **WorkerManagerThread** is mainly responsible for the submission of the task queue, continuously receives tasks from the task queue, and submits them to the thread pool for processing;
* **ZooKeeper** - **TaskExecuteThread** is mainly responsible for the process of task execution, and the actual processing of tasks according to different task types;
ZooKeeper service, MasterServer and WorkerServer nodes in the system all use ZooKeeper for cluster management and fault tolerance. In addition, the system implements event monitoring and distributed locks based on ZooKeeper. - **RetryReportTaskStatusThread** is mainly responsible for regularly polling to report the task status to the Master until the Master replies to the status ack to avoid the loss of the task status;
We have also implemented queues based on Redis, but we hope DolphinScheduler depends on as few components as possible, so we finally removed the Redis implementation. * **ZooKeeper**
* **AlertServer** ZooKeeper service, MasterServer and WorkerServer nodes in the system all use ZooKeeper for cluster management and fault tolerance. In addition, the system implements event monitoring and distributed locks based on ZooKeeper.
We have also implemented queues based on Redis, but we hope DolphinScheduler depends on as few components as possible, so we finally removed the Redis implementation.
* **AlertServer**
Provides alarm services, and implements rich alarm methods through alarm plugins. Provides alarm services, and implements rich alarm methods through alarm plugins.
* **API** * **API**
The API interface layer is mainly responsible for processing requests from the front-end UI layer. The service uniformly provides RESTful APIs to provide request services to external. The API interface layer is mainly responsible for processing requests from the front-end UI layer. The service uniformly provides RESTful APIs to provide request services to external.
* **UI** * **UI**
The front-end page of the system provides various visual operation interfaces of the system, see more at [Introduction to Functions](../guide/homepage.md) section. The front-end page of the system provides various visual operation interfaces of the system, see more at [Introduction to Functions](../guide/homepage.md) section.
@ -84,6 +84,7 @@
##### Centralized Thinking ##### Centralized Thinking
The centralized design concept is relatively simple. The nodes in the distributed cluster are roughly divided into two roles according to responsibilities: The centralized design concept is relatively simple. The nodes in the distributed cluster are roughly divided into two roles according to responsibilities:
<p align="center"> <p align="center">
<img src="https://analysys.github.io/easyscheduler_docs_cn/images/master_slave.png" alt="master-slave character" width="50%" /> <img src="https://analysys.github.io/easyscheduler_docs_cn/images/master_slave.png" alt="master-slave character" width="50%" />
</p> </p>
@ -120,8 +121,6 @@ The service fault-tolerance design relies on ZooKeeper's Watcher mechanism, and
</p> </p>
Among them, the Master monitors the directories of other Masters and Workers. If the remove event is triggered, perform fault tolerance of the process instance or task instance according to the specific business logic. Among them, the Master monitors the directories of other Masters and Workers. If the remove event is triggered, perform fault tolerance of the process instance or task instance according to the specific business logic.
- Master fault tolerance - Master fault tolerance
<p align="center"> <p align="center">
@ -146,7 +145,7 @@ Fault-tolerant content: When sending the remove event of the Worker node, the Ma
Fault-tolerant post-processing: Once the Master Scheduler thread finds that the task instance is in the "fault-tolerant" state, it takes over the task and resubmits it. Fault-tolerant post-processing: Once the Master Scheduler thread finds that the task instance is in the "fault-tolerant" state, it takes over the task and resubmits it.
Note: Due to "network jitter", the node may lose heartbeat with ZooKeeper in a short period of time, and the node's remove event may occur. For this situation, we use the simplest way, that is, once the node and ZooKeeper timeout connection occurs, then directly stop the Master or Worker service. Note: Due to "network jitter", the node may lose heartbeat with ZooKeeper in a short period of time, and the node's remove event may occur. For this situation, we use the simplest way, that is, once the node and ZooKeeper timeout connection occurs, then directly stop the Master or Worker service.
##### Task Failed and Try Again ##### Task Failed and Try Again
@ -170,26 +169,26 @@ If there is a task failure in the workflow that reaches the maximum retry times,
In the early schedule design, if there is no priority design and use the fair scheduling, the task submitted first may complete at the same time with the task submitted later, thus invalid the priority of process or task. So we have re-designed this, and the following is our current design: In the early schedule design, if there is no priority design and use the fair scheduling, the task submitted first may complete at the same time with the task submitted later, thus invalid the priority of process or task. So we have re-designed this, and the following is our current design:
- According to **the priority of different process instances** prior over **priority of the same process instance** prior over **priority of tasks within the same process** prior over **tasks within the same process**, process task submission order from highest to Lowest. - According to **the priority of different process instances** prior over **priority of the same process instance** prior over **priority of tasks within the same process** prior over **tasks within the same process**, process task submission order from highest to Lowest.
- The specific implementation is to parse the priority according to the JSON of the task instance, and then save the **process instance priority_process instance id_task priority_task id** information to the ZooKeeper task queue. When obtain from the task queue, we can get the highest priority task by comparing string. - The specific implementation is to parse the priority according to the JSON of the task instance, and then save the **process instance priority_process instance id_task priority_task id** information to the ZooKeeper task queue. When obtain from the task queue, we can get the highest priority task by comparing string.
- The priority of the process definition is to consider that some processes need to process before other processes. Configure the priority when the process starts or schedules. There are 5 levels in total, which are HIGHEST, HIGH, MEDIUM, LOW, and LOWEST. As shown below
- The priority of the process definition is to consider that some processes need to process before other processes. Configure the priority when the process starts or schedules. There are 5 levels in total, which are HIGHEST, HIGH, MEDIUM, LOW, and LOWEST. As shown below <p align="center">
<p align="center"> <img src="https://user-images.githubusercontent.com/10797147/146744784-eb351b14-c94a-4ed6-8ba4-5132c2a3d116.png" alt="Process priority configuration" width="40%" />
<img src="https://user-images.githubusercontent.com/10797147/146744784-eb351b14-c94a-4ed6-8ba4-5132c2a3d116.png" alt="Process priority configuration" width="40%" /> </p>
</p>
- The priority of the task is also divides into 5 levels, ordered by HIGHEST, HIGH, MEDIUM, LOW, LOWEST. As shown below: - The priority of the task is also divides into 5 levels, ordered by HIGHEST, HIGH, MEDIUM, LOW, LOWEST. As shown below:
<p align="center">
<img src="https://user-images.githubusercontent.com/10797147/146744830-5eac611f-5933-4f53-a0c6-31613c283708.png" alt="Task priority configuration" width="35%" /> <p align="center">
</p> <img src="https://user-images.githubusercontent.com/10797147/146744830-5eac611f-5933-4f53-a0c6-31613c283708.png" alt="Task priority configuration" width="35%" />
</p>
#### Logback and Netty Implement Log Access #### Logback and Netty Implement Log Access
- Since Web (UI) and Worker are not always on the same machine, to view the log cannot be like querying a local file. There are two options: - Since Web (UI) and Worker are not always on the same machine, to view the log cannot be like querying a local file. There are two options:
- Put logs on the ES search engine. - Put logs on the ES search engine.
- Obtain remote log information through netty communication. - Obtain remote log information through netty communication.
- In consideration of the lightness of DolphinScheduler as much as possible, so choose gRPC to achieve remote access to log information.
- In consideration of the lightness of DolphinScheduler as much as possible, so choose gRPC to achieve remote access to log information.
<p align="center"> <p align="center">
<img src="https://analysys.github.io/easyscheduler_docs_cn/images/grpc.png" alt="grpc remote access" width="50%" /> <img src="https://analysys.github.io/easyscheduler_docs_cn/images/grpc.png" alt="grpc remote access" width="50%" />
@ -198,10 +197,10 @@ In the early schedule design, if there is no priority design and use the fair sc
- For details, please refer to the logback configuration of Master and Worker, as shown in the following example: - For details, please refer to the logback configuration of Master and Worker, as shown in the following example:
```xml ```xml
<conversionRule conversionWord="messsage" converterClass="org.apache.dolphinscheduler.server.log.SensitiveDataConverter"/> <conversionRule conversionWord="messsage" converterClass="org.apache.dolphinscheduler.service.log.SensitiveDataConverter"/>
<appender name="TASKLOGFILE" class="ch.qos.logback.classic.sift.SiftingAppender"> <appender name="TASKLOGFILE" class="ch.qos.logback.classic.sift.SiftingAppender">
<filter class="org.apache.dolphinscheduler.server.log.TaskLogFilter"/> <filter class="org.apache.dolphinscheduler.service.log.TaskLogFilter"/>
<Discriminator class="org.apache.dolphinscheduler.server.log.TaskLogDiscriminator"> <Discriminator class="org.apache.dolphinscheduler.service.log.TaskLogDiscriminator">
<key>taskAppId</key> <key>taskAppId</key>
<logBase>${log.base}</logBase> <logBase>${log.base}</logBase>
</Discriminator> </Discriminator>

View File

@ -57,3 +57,4 @@ You can customise the configuration by changing the following properties in work
- worker.max.cpuload.avg=-1 (worker max cpuload avg, only higher than the system cpu load average, worker server can be dispatched tasks. default value -1: the number of cpu cores * 2) - worker.max.cpuload.avg=-1 (worker max cpuload avg, only higher than the system cpu load average, worker server can be dispatched tasks. default value -1: the number of cpu cores * 2)
- worker.reserved.memory=0.3 (worker reserved memory, only lower than system available memory, worker server can be dispatched tasks. default value 0.3, the unit is G) - worker.reserved.memory=0.3 (worker reserved memory, only lower than system available memory, worker server can be dispatched tasks. default value 0.3, the unit is G)

View File

@ -1,8 +1,8 @@
# MetaData # MetaData
## Table Schema ## Table Schema
see sql files in `dolphinscheduler/dolphinscheduler-dao/src/main/resources/sql`
see sql files in `dolphinscheduler/dolphinscheduler-dao/src/main/resources/sql`
--- ---
@ -15,7 +15,7 @@ see sql files in `dolphinscheduler/dolphinscheduler-dao/src/main/resources/sql`
- One tenant can own Multiple users. - One tenant can own Multiple users.
- The queue field in the `t_ds_user` table stores the `queue_name` information in the `t_ds_queue` table, `t_ds_tenant` stores queue information using `queue_id` column. During the execution of the process definition, the user queue has the highest priority. If the user queue is null, use the tenant queue. - The queue field in the `t_ds_user` table stores the `queue_name` information in the `t_ds_queue` table, `t_ds_tenant` stores queue information using `queue_id` column. During the execution of the process definition, the user queue has the highest priority. If the user queue is null, use the tenant queue.
- The `user_id` field in the `t_ds_datasource` table shows the user who create the data source. The user_id in `t_ds_relation_datasource_user` shows the user who has permission to the data source. - The `user_id` field in the `t_ds_datasource` table shows the user who create the data source. The user_id in `t_ds_relation_datasource_user` shows the user who has permission to the data source.
### Project Resource Alert ### Project Resource Alert
![image.png](../../../img/metadata-erd/project-resource-alert.png) ![image.png](../../../img/metadata-erd/project-resource-alert.png)
@ -26,6 +26,7 @@ see sql files in `dolphinscheduler/dolphinscheduler-dao/src/main/resources/sql`
- The `user_id` in the `t_ds_udfs` table represents the user who create the UDF, and the `user_id` in the `t_ds_relation_udfs_user` table represents a user who has permission to the UDF. - The `user_id` in the `t_ds_udfs` table represents the user who create the UDF, and the `user_id` in the `t_ds_relation_udfs_user` table represents a user who has permission to the UDF.
### Project - Tenant - ProcessDefinition - Schedule ### Project - Tenant - ProcessDefinition - Schedule
![image.png](../../../img/metadata-erd/project_tenant_process_definition_schedule.png) ![image.png](../../../img/metadata-erd/project_tenant_process_definition_schedule.png)
- A project can have multiple process definitions, and each process definition belongs to only one project. - A project can have multiple process definitions, and each process definition belongs to only one project.
@ -33,8 +34,10 @@ see sql files in `dolphinscheduler/dolphinscheduler-dao/src/main/resources/sql`
- A workflow definition can have one or more schedules. - A workflow definition can have one or more schedules.
### Process Definition Execution ### Process Definition Execution
![image.png](../../../img/metadata-erd/process_definition.png) ![image.png](../../../img/metadata-erd/process_definition.png)
- A process definition corresponds to multiple task definitions, which are associated through `t_ds_process_task_relation` and the associated key is `code + version`. When the pre-task of the task is empty, the corresponding `pre_task_node` and `pre_task_version` are 0. - A process definition corresponds to multiple task definitions, which are associated through `t_ds_process_task_relation` and the associated key is `code + version`. When the pre-task of the task is empty, the corresponding `pre_task_node` and `pre_task_version` are 0.
- A process definition can have multiple process instances `t_ds_process_instance`, one process instance corresponds to one or more task instances `t_ds_task_instance`. - A process definition can have multiple process instances `t_ds_process_instance`, one process instance corresponds to one or more task instances `t_ds_task_instance`.
- The data stored in the `t_ds_relation_process_instance` table is used to handle the case that the process definition contains sub-processes. `parent_process_instance_id` represents the id of the main process instance containing the sub-process, `process_instance_id` represents the id of the sub-process instance, `parent_task_instance_id` represents the task instance id of the sub-process node. The process instance table and the task instance table correspond to the `t_ds_process_instance` table and the `t_ds_task_instance` table, respectively. - The data stored in the `t_ds_relation_process_instance` table is used to handle the case that the process definition contains sub-processes. `parent_process_instance_id` represents the id of the main process instance containing the sub-process, `process_instance_id` represents the id of the sub-process instance, `parent_task_instance_id` represents the task instance id of the sub-process node. The process instance table and the task instance table correspond to the `t_ds_process_instance` table and the `t_ds_task_instance` table, respectively.

View File

@ -6,28 +6,28 @@ All tasks in DolphinScheduler are saved in the `t_ds_process_definition` table.
The following shows the `t_ds_process_definition` table structure: The following shows the `t_ds_process_definition` table structure:
No. | field | type | description | No. | field | type | description |
-------- | ---------| -------- | --------- |-----|-------------------------|--------------|------------------------------------------------------------------------------|
1|id|int(11)|primary key | 1 | id | int(11) | primary key |
2|name|varchar(255)|process definition name | 2 | name | varchar(255) | process definition name |
3|version|int(11)|process definition version | 3 | version | int(11) | process definition version |
4|release_state|tinyint(4)|release status of process definition: 0 not released, 1 released | 4 | release_state | tinyint(4) | release status of process definition: 0 not released, 1 released |
5|project_id|int(11)|project id | 5 | project_id | int(11) | project id |
6|user_id|int(11)|user id of the process definition | 6 | user_id | int(11) | user id of the process definition |
7|process_definition_json|longtext|process definition JSON | 7 | process_definition_json | longtext | process definition JSON |
8|description|text|process definition description | 8 | description | text | process definition description |
9|global_params|text|global parameters | 9 | global_params | text | global parameters |
10|flag|tinyint(4)|specify whether the process is available: 0 is not available, 1 is available | 10 | flag | tinyint(4) | specify whether the process is available: 0 is not available, 1 is available |
11|locations|text|node location information | 11 | locations | text | node location information |
12|connects|text|node connectivity info | 12 | connects | text | node connectivity info |
13|receivers|text|receivers | 13 | receivers | text | receivers |
14|receivers_cc|text|CC receivers | 14 | receivers_cc | text | CC receivers |
15|create_time|datetime|create time | 15 | create_time | datetime | create time |
16|timeout|int(11) |timeout | 16 | timeout | int(11) | timeout |
17|tenant_id|int(11) |tenant id | 17 | tenant_id | int(11) | tenant id |
18|update_time|datetime|update time | 18 | update_time | datetime | update time |
19|modify_by|varchar(36)|specify the user that made the modification | 19 | modify_by | varchar(36) | specify the user that made the modification |
20|resource_ids|varchar(255)|resource ids | 20 | resource_ids | varchar(255) | resource ids |
The `process_definition_json` field is the core field, which defines the task information in the DAG diagram, and it is stored in JSON format. The `process_definition_json` field is the core field, which defines the task information in the DAG diagram, and it is stored in JSON format.
@ -40,6 +40,7 @@ No. | field | type | description
4|timeout|int|timeout 4|timeout|int|timeout
Data example: Data example:
```bash ```bash
{ {
"globalParams":[ "globalParams":[
@ -74,7 +75,7 @@ No.|parameter name||type|description |notes
9|runFlag | |String |execution flag| | 9|runFlag | |String |execution flag| |
10|conditionResult | |Object|condition branch | | 10|conditionResult | |Object|condition branch | |
11| | successNode| Array|jump to node if success| | 11| | successNode| Array|jump to node if success| |
12| | failedNode|Array|jump to node if failure| 12| | failedNode|Array|jump to node if failure|
13| dependence| |Object |task dependency |mutual exclusion with params 13| dependence| |Object |task dependency |mutual exclusion with params
14|maxRetryTimes | |String|max retry times | | 14|maxRetryTimes | |String|max retry times | |
15|retryInterval | |String |retry interval| | 15|retryInterval | |String |retry interval| |
@ -159,7 +160,7 @@ No.|parameter name||type|description |note
19|runFlag | |String |execution flag| | 19|runFlag | |String |execution flag| |
20|conditionResult | |Object|condition branch | | 20|conditionResult | |Object|condition branch | |
21| | successNode| Array|jump to node if success| | 21| | successNode| Array|jump to node if success| |
22| | failedNode|Array|jump to node if failure| 22| | failedNode|Array|jump to node if failure|
23| dependence| |Object |task dependency |mutual exclusion with params 23| dependence| |Object |task dependency |mutual exclusion with params
24|maxRetryTimes | |String|max retry times | | 24|maxRetryTimes | |String|max retry times | |
25|retryInterval | |String |retry interval| | 25|retryInterval | |String |retry interval| |
@ -238,38 +239,38 @@ No.|parameter name||type|description |note
**The following shows the node data structure:** **The following shows the node data structure:**
No.|parameter name||type|description |notes | No. | parameter name || type | description | notes |
-------- | ---------| ---------| -------- | --------- | --------- |-----|----------------------|----------------|--------|-----------------------------|------------------------------|
1|id | |String| task Id| | 1 | id | | String | task Id |
2|type ||String |task type |SPARK | 2 | type || String | task type | SPARK |
3| name| |String|task name | | 3 | name | | String | task name |
4| params| |Object|customized parameters |JSON format | 4 | params | | Object | customized parameters | JSON format |
5| |mainClass |String | main class | 5 | | mainClass | String | main class |
6| |mainArgs | String| execution arguments | 6 | | mainArgs | String | execution arguments |
7| |others | String| other arguments | 7 | | others | String | other arguments |
8| |mainJar |Object | application jar package | 8 | | mainJar | Object | application jar package |
9| |deployMode |String |deployment mode |local,client,cluster | 9 | | deployMode | String | deployment mode | local,client,cluster |
10| |driverCores | String| driver cores | 10 | | driverCores | String | driver cores |
11| |driverMemory | String| driver memory | 11 | | driverMemory | String | driver memory |
12| |numExecutors |String | executor count | 12 | | numExecutors | String | executor count |
13| |executorMemory |String | executor memory | 13 | | executorMemory | String | executor memory |
14| |executorCores |String | executor cores | 14 | | executorCores | String | executor cores |
15| |programType | String| program type|JAVA,SCALA,PYTHON | 15 | | programType | String | program type | JAVA,SCALA,PYTHON |
16| | sparkVersion| String| Spark version| SPARK1 , SPARK2 | 16 | | sparkVersion | String | Spark version | SPARK1 , SPARK2 |
17| | localParams| Array|customized local parameters | 17 | | localParams | Array | customized local parameters |
18| | resourceList| Array|resource files | 18 | | resourceList | Array | resource files |
19|description | |String|description | | | 19 | description | | String | description | |
20|runFlag | |String |execution flag| | | 20 | runFlag | | String | execution flag | |
21|conditionResult | |Object|condition branch| | | 21 | conditionResult | | Object | condition branch | |
22| | successNode| Array|jump to node if success| | | 22 | | successNode | Array | jump to node if success | |
23| | failedNode|Array|jump to node if failure| | 23 | | failedNode | Array | jump to node if failure |
24| dependence| |Object |task dependency |mutual exclusion with params | 24 | dependence | | Object | task dependency | mutual exclusion with params |
25|maxRetryTimes | |String|max retry times | | | 25 | maxRetryTimes | | String | max retry times | |
26|retryInterval | |String |retry interval| | | 26 | retryInterval | | String | retry interval | |
27|timeout | |Object|timeout | | | 27 | timeout | | Object | timeout | |
28| taskInstancePriority| |String|task priority | | | 28 | taskInstancePriority | | String | task priority | |
29|workerGroup | |String |Worker group| | | 29 | workerGroup | | String | Worker group | |
30|preTasks | |Array|preposition tasks| | | 30 | preTasks | | Array | preposition tasks | |
**Node data example:** **Node data example:**
@ -336,31 +337,31 @@ No.|parameter name||type|description |notes
**The following shows the node data structure:** **The following shows the node data structure:**
No.|parameter name||type|description |notes | No. | parameter name || type | description | notes |
-------- | ---------| ---------| -------- | --------- | --------- |-----|----------------------|--------------|--------|-----------------------------|------------------------------|
1|id | |String| task Id| | 1 | id | | String | task Id |
2|type ||String |task type |MR | 2 | type || String | task type | MR |
3| name| |String|task name | | 3 | name | | String | task name |
4| params| |Object|customized parameters |JSON format | 4 | params | | Object | customized parameters | JSON format |
5| |mainClass |String | main class | 5 | | mainClass | String | main class |
6| |mainArgs | String|execution arguments | 6 | | mainArgs | String | execution arguments |
7| |others | String|other arguments | 7 | | others | String | other arguments |
8| |mainJar |Object | application jar package | 8 | | mainJar | Object | application jar package |
9| |programType | String|program type|JAVA,PYTHON | 9 | | programType | String | program type | JAVA,PYTHON |
10| | localParams| Array|customized local parameters | 10 | | localParams | Array | customized local parameters |
11| | resourceList| Array|resource files | 11 | | resourceList | Array | resource files |
12|description | |String|description | | | 12 | description | | String | description | |
13|runFlag | |String |execution flag| | | 13 | runFlag | | String | execution flag | |
14|conditionResult | |Object|condition branch| | | 14 | conditionResult | | Object | condition branch | |
15| | successNode| Array|jump to node if success| | | 15 | | successNode | Array | jump to node if success | |
16| | failedNode|Array|jump to node if failure| | 16 | | failedNode | Array | jump to node if failure |
17| dependence| |Object |task dependency |mutual exclusion with params | 17 | dependence | | Object | task dependency | mutual exclusion with params |
18|maxRetryTimes | |String|max retry times | | | 18 | maxRetryTimes | | String | max retry times | |
19|retryInterval | |String |retry interval| | | 19 | retryInterval | | String | retry interval | |
20|timeout | |Object|timeout | | | 20 | timeout | | Object | timeout | |
21| taskInstancePriority| |String|task priority| | | 21 | taskInstancePriority | | String | task priority | |
22|workerGroup | |String |Worker group| | | 22 | workerGroup | | String | Worker group | |
23|preTasks | |Array|preposition tasks| | | 23 | preTasks | | Array | preposition tasks | |
**Node data example:** **Node data example:**
@ -432,7 +433,7 @@ No.|parameter name||type|description |notes
9|runFlag | |String |execution flag| | 9|runFlag | |String |execution flag| |
10|conditionResult | |Object|condition branch| | 10|conditionResult | |Object|condition branch| |
11| | successNode| Array|jump to node if success| | 11| | successNode| Array|jump to node if success| |
12| | failedNode|Array|jump to node if failure | 12| | failedNode|Array|jump to node if failure |
13| dependence| |Object |task dependency |mutual exclusion with params 13| dependence| |Object |task dependency |mutual exclusion with params
14|maxRetryTimes | |String|max retry times | | 14|maxRetryTimes | |String|max retry times | |
15|retryInterval | |String |retry interval| | 15|retryInterval | |String |retry interval| |
@ -493,36 +494,36 @@ No.|parameter name||type|description |notes
**The following shows the node data structure:** **The following shows the node data structure:**
No.|parameter name||type|description |notes | No. | parameter name || type | description | notes |
-------- | ---------| ---------| -------- | --------- | --------- |-----|----------------------|-------------------|--------|-------------------------|------------------------------|
1|id | |String|task Id| | 1 | id | | String | task Id |
2|type ||String |task type|FLINK | 2 | type || String | task type | FLINK |
3| name| |String|task name| | 3 | name | | String | task name |
4| params| |Object|customized parameters |JSON format | 4 | params | | Object | customized parameters | JSON format |
5| |mainClass |String |main class | 5 | | mainClass | String | main class |
6| |mainArgs | String|execution arguments | 6 | | mainArgs | String | execution arguments |
7| |others | String|other arguments | 7 | | others | String | other arguments |
8| |mainJar |Object |application jar package | 8 | | mainJar | Object | application jar package |
9| |deployMode |String |deployment mode |local,client,cluster | 9 | | deployMode | String | deployment mode | local,client,cluster |
10| |slot | String| slot count | 10 | | slot | String | slot count |
11| |taskManager |String | taskManager count | 11 | | taskManager | String | taskManager count |
12| |taskManagerMemory |String |taskManager memory size | 12 | | taskManagerMemory | String | taskManager memory size |
13| |jobManagerMemory |String | jobManager memory size | 13 | | jobManagerMemory | String | jobManager memory size |
14| |programType | String| program type|JAVA,SCALA,PYTHON | 14 | | programType | String | program type | JAVA,SCALA,PYTHON |
15| | localParams| Array|local parameters | 15 | | localParams | Array | local parameters |
16| | resourceList| Array|resource files | 16 | | resourceList | Array | resource files |
17|description | |String|description | | | 17 | description | | String | description | |
18|runFlag | |String |execution flag| | | 18 | runFlag | | String | execution flag | |
19|conditionResult | |Object|condition branch| | | 19 | conditionResult | | Object | condition branch | |
20| | successNode| Array|jump node if success| | | 20 | | successNode | Array | jump node if success | |
21| | failedNode|Array|jump node if failure| | 21 | | failedNode | Array | jump node if failure |
22| dependence| |Object |task dependency |mutual exclusion with params | 22 | dependence | | Object | task dependency | mutual exclusion with params |
23|maxRetryTimes | |String|max retry times| | | 23 | maxRetryTimes | | String | max retry times | |
24|retryInterval | |String |retry interval| | | 24 | retryInterval | | String | retry interval | |
25|timeout | |Object|timeout | | | 25 | timeout | | Object | timeout | |
26| taskInstancePriority| |String|task priority| | | 26 | taskInstancePriority | | String | task priority | |
27|workerGroup | |String |Worker group| | | 27 | workerGroup | | String | Worker group | |
38|preTasks | |Array|preposition tasks| | | 38 | preTasks | | Array | preposition tasks | |
**Node data example:** **Node data example:**
@ -588,30 +589,30 @@ No.|parameter name||type|description |notes
**The following shows the node data structure:** **The following shows the node data structure:**
No.|parameter name||type|description |notes | No. | parameter name || type | description | notes |
-------- | ---------| ---------| -------- | --------- | --------- |-----|----------------------|--------------------|--------|--------------------------------|------------------------------|
1|id | |String|task Id| | 1 | id | | String | task Id |
2|type ||String |task type|HTTP | 2 | type || String | task type | HTTP |
3| name| |String|task name| | 3 | name | | String | task name |
4| params| |Object|customized parameters |JSON format | 4 | params | | Object | customized parameters | JSON format |
5| |url |String |request url | 5 | | url | String | request url |
6| |httpMethod | String|http method|GET,POST,HEAD,PUT,DELETE | 6 | | httpMethod | String | http method | GET,POST,HEAD,PUT,DELETE |
7| | httpParams| Array|http parameters | 7 | | httpParams | Array | http parameters |
8| |httpCheckCondition | String|validation of HTTP code status|default code 200 | 8 | | httpCheckCondition | String | validation of HTTP code status | default code 200 |
9| |condition |String |validation conditions | 9 | | condition | String | validation conditions |
10| | localParams| Array|customized local parameters | 10 | | localParams | Array | customized local parameters |
11|description | |String|description| | | 11 | description | | String | description | |
12|runFlag | |String |execution flag| | | 12 | runFlag | | String | execution flag | |
13|conditionResult | |Object|condition branch| | | 13 | conditionResult | | Object | condition branch | |
14| | successNode| Array|jump node if success| | | 14 | | successNode | Array | jump node if success | |
15| | failedNode|Array|jump node if failure| | 15 | | failedNode | Array | jump node if failure |
16| dependence| |Object |task dependency |mutual exclusion with params | 16 | dependence | | Object | task dependency | mutual exclusion with params |
17|maxRetryTimes | |String|max retry times | | | 17 | maxRetryTimes | | String | max retry times | |
18|retryInterval | |String |retry interval| | | 18 | retryInterval | | String | retry interval | |
19|timeout | |Object|timeout | | | 19 | timeout | | Object | timeout | |
20| taskInstancePriority| |String|task priority| | | 20 | taskInstancePriority | | String | task priority | |
21|workerGroup | |String |Worker group| | | 21 | workerGroup | | String | Worker group | |
22|preTasks | |Array|preposition tasks| | | 22 | preTasks | | Array | preposition tasks | |
**Node data example:** **Node data example:**
@ -682,7 +683,7 @@ No.|parameter name||type|description |notes
6| |dsType |String | datasource type 6| |dsType |String | datasource type
7| |dataSource |Int | datasource ID 7| |dataSource |Int | datasource ID
8| |dtType | String|target database type 8| |dtType | String|target database type
9| |dataTarget | Int|target database ID 9| |dataTarget | Int|target database ID
10| |sql |String | SQL statements 10| |sql |String | SQL statements
11| |targetTable |String |target table 11| |targetTable |String |target table
12| |jobSpeedByte |Int |job speed limiting(bytes) 12| |jobSpeedByte |Int |job speed limiting(bytes)
@ -695,7 +696,7 @@ No.|parameter name||type|description |notes
19|runFlag | |String |execution flag| | 19|runFlag | |String |execution flag| |
20|conditionResult | |Object|condition branch| | 20|conditionResult | |Object|condition branch| |
21| | successNode| Array|jump node if success| | 21| | successNode| Array|jump node if success| |
22| | failedNode|Array|jump node if failure| 22| | failedNode|Array|jump node if failure|
23| dependence| |Object |task dependency |mutual exclusion with params 23| dependence| |Object |task dependency |mutual exclusion with params
24|maxRetryTimes | |String|max retry times| | 24|maxRetryTimes | |String|max retry times| |
25|retryInterval | |String |retry interval| | 25|retryInterval | |String |retry interval| |
@ -776,7 +777,7 @@ No.|parameter name||type|description |notes
13|runFlag | |String |execution flag| | 13|runFlag | |String |execution flag| |
14|conditionResult | |Object|condition branch| | 14|conditionResult | |Object|condition branch| |
15| | successNode| Array|jump node if success| | 15| | successNode| Array|jump node if success| |
16| | failedNode|Array|jump node if failure| 16| | failedNode|Array|jump node if failure|
17| dependence| |Object |task dependency |mutual exclusion with params 17| dependence| |Object |task dependency |mutual exclusion with params
18|maxRetryTimes | |String|max retry times| | 18|maxRetryTimes | |String|max retry times| |
19|retryInterval | |String |retry interval| | 19|retryInterval | |String |retry interval| |
@ -844,7 +845,7 @@ No.|parameter name||type|description |notes
6|runFlag | |String |execution flag| | 6|runFlag | |String |execution flag| |
7|conditionResult | |Object|condition branch | | 7|conditionResult | |Object|condition branch | |
8| | successNode| Array|jump to node if success| | 8| | successNode| Array|jump to node if success| |
9| | failedNode|Array|jump to node if failure| 9| | failedNode|Array|jump to node if failure|
10| dependence| |Object |task dependency |mutual exclusion with params 10| dependence| |Object |task dependency |mutual exclusion with params
11|maxRetryTimes | |String|max retry times | | 11|maxRetryTimes | |String|max retry times | |
12|retryInterval | |String |retry interval| | 12|retryInterval | |String |retry interval| |
@ -909,7 +910,7 @@ No.|parameter name||type|description |notes
7|runFlag | |String |execution flag| | 7|runFlag | |String |execution flag| |
8|conditionResult | |Object|condition branch | | 8|conditionResult | |Object|condition branch | |
9| | successNode| Array|jump to node if success| | 9| | successNode| Array|jump to node if success| |
10| | failedNode|Array|jump to node if failure| 10| | failedNode|Array|jump to node if failure|
11| dependence| |Object |task dependency |mutual exclusion with params 11| dependence| |Object |task dependency |mutual exclusion with params
12|maxRetryTimes | |String|max retry times| | 12|maxRetryTimes | |String|max retry times| |
13|retryInterval | |String |retry interval| | 13|retryInterval | |String |retry interval| |
@ -970,7 +971,7 @@ No.|parameter name||type|description |notes
9|runFlag | |String |execution flag| | 9|runFlag | |String |execution flag| |
10|conditionResult | |Object|condition branch| | 10|conditionResult | |Object|condition branch| |
11| | successNode| Array|jump to node if success| | 11| | successNode| Array|jump to node if success| |
12| | failedNode|Array|jump to node if failure| 12| | failedNode|Array|jump to node if failure|
13| dependence| |Object |task dependency |mutual exclusion with params 13| dependence| |Object |task dependency |mutual exclusion with params
14| | relation|String |relation|AND,OR 14| | relation|String |relation|AND,OR
15| | dependTaskList|Array |dependent task list| 15| | dependTaskList|Array |dependent task list|
@ -1111,4 +1112,5 @@ No.|parameter name||type|description |notes
] ]
} }
``` ```

View File

@ -1,9 +1,11 @@
# API design standard # API design standard
A standardized and unified API is the cornerstone of project design.The API of DolphinScheduler follows the REST ful standard. REST ful is currently the most popular Internet software architecture. It has a clear structure, conforms to standards, is easy to understand and extend. A standardized and unified API is the cornerstone of project design.The API of DolphinScheduler follows the REST ful standard. REST ful is currently the most popular Internet software architecture. It has a clear structure, conforms to standards, is easy to understand and extend.
This article uses the DolphinScheduler API as an example to explain how to construct a Restful API. This article uses the DolphinScheduler API as an example to explain how to construct a Restful API.
## 1. URI design ## 1. URI design
REST is "Representational State Transfer".The design of Restful URI is based on resources.The resource corresponds to an entity on the network, for example: a piece of text, a picture, and a service. And each resource corresponds to a URI. REST is "Representational State Transfer".The design of Restful URI is based on resources.The resource corresponds to an entity on the network, for example: a piece of text, a picture, and a service. And each resource corresponds to a URI.
+ One Kind of Resource: expressed in the plural, such as `task-instances`、`groups` ; + One Kind of Resource: expressed in the plural, such as `task-instances`、`groups` ;
@ -12,36 +14,43 @@ REST is "Representational State Transfer".The design of Restful URI is based on
+ A Sub Resource`/instances/{instanceId}/tasks/{taskId}`; + A Sub Resource`/instances/{instanceId}/tasks/{taskId}`;
## 2. Method design ## 2. Method design
We need to locate a certain resource by URI, and then use Method or declare actions in the path suffix to reflect the operation of the resource. We need to locate a certain resource by URI, and then use Method or declare actions in the path suffix to reflect the operation of the resource.
### ① Query - GET ### ① Query - GET
Use URI to locate the resource, and use GET to indicate query. Use URI to locate the resource, and use GET to indicate query.
+ When the URI is a type of resource, it means to query a type of resource. For example, the following example indicates paging query `alter-groups`. + When the URI is a type of resource, it means to query a type of resource. For example, the following example indicates paging query `alter-groups`.
``` ```
Method: GET Method: GET
/dolphinscheduler/alert-groups /dolphinscheduler/alert-groups
``` ```
+ When the URI is a single resource, it means to query this resource. For example, the following example means to query the specified `alter-group`. + When the URI is a single resource, it means to query this resource. For example, the following example means to query the specified `alter-group`.
``` ```
Method: GET Method: GET
/dolphinscheduler/alter-groups/{id} /dolphinscheduler/alter-groups/{id}
``` ```
+ In addition, we can also express query sub-resources based on URI, as follows: + In addition, we can also express query sub-resources based on URI, as follows:
``` ```
Method: GET Method: GET
/dolphinscheduler/projects/{projectId}/tasks /dolphinscheduler/projects/{projectId}/tasks
``` ```
**The above examples all represent paging query. If we need to query all data, we need to add `/list` after the URI to distinguish. Do not mix the same API for both paged query and query.** **The above examples all represent paging query. If we need to query all data, we need to add `/list` after the URI to distinguish. Do not mix the same API for both paged query and query.**
``` ```
Method: GET Method: GET
/dolphinscheduler/alert-groups/list /dolphinscheduler/alert-groups/list
``` ```
### ② Create - POST ### ② Create - POST
Use URI to locate the resource, use POST to indicate create, and then return the created id to requester. Use URI to locate the resource, use POST to indicate create, and then return the created id to requester.
+ create an `alter-group` + create an `alter-group`
@ -52,35 +61,42 @@ Method: POST
``` ```
+ create sub-resources is also the same as above. + create sub-resources is also the same as above.
``` ```
Method: POST Method: POST
/dolphinscheduler/alter-groups/{alterGroupId}/tasks /dolphinscheduler/alter-groups/{alterGroupId}/tasks
``` ```
### ③ Modify - PUT ### ③ Modify - PUT
Use URI to locate the resource, use PUT to indicate modify. Use URI to locate the resource, use PUT to indicate modify.
+ modify an `alert-group` + modify an `alert-group`
``` ```
Method: PUT Method: PUT
/dolphinscheduler/alter-groups/{alterGroupId} /dolphinscheduler/alter-groups/{alterGroupId}
``` ```
### ④ Delete -DELETE ### ④ Delete -DELETE
Use URI to locate the resource, use DELETE to indicate delete. Use URI to locate the resource, use DELETE to indicate delete.
+ delete an `alert-group` + delete an `alert-group`
``` ```
Method: DELETE Method: DELETE
/dolphinscheduler/alter-groups/{alterGroupId} /dolphinscheduler/alter-groups/{alterGroupId}
``` ```
+ batch deletion: batch delete the id arraywe should use POST. **Do not use the DELETE method, because the body of the DELETE request has no semantic meaning, and it is possible that some gateways, proxies, and firewalls will directly strip off the request body after receiving the DELETE request.** + batch deletion: batch delete the id arraywe should use POST. **Do not use the DELETE method, because the body of the DELETE request has no semantic meaning, and it is possible that some gateways, proxies, and firewalls will directly strip off the request body after receiving the DELETE request.**
``` ```
Method: POST Method: POST
/dolphinscheduler/alter-groups/batch-delete /dolphinscheduler/alter-groups/batch-delete
``` ```
### ⑤ Partial Modifications -PATCH ### ⑤ Partial Modifications -PATCH
Use URI to locate the resource, use PATCH to partial modifications. Use URI to locate the resource, use PATCH to partial modifications.
``` ```
@ -89,20 +105,27 @@ Method: PATCH
``` ```
### ⑥ Others ### ⑥ Others
In addition to creating, deleting, modifying and quering, we also locate the corresponding resource through url, and then append operations to it after the path, such as: In addition to creating, deleting, modifying and quering, we also locate the corresponding resource through url, and then append operations to it after the path, such as:
``` ```
/dolphinscheduler/alert-groups/verify-name /dolphinscheduler/alert-groups/verify-name
/dolphinscheduler/projects/{projectCode}/process-instances/{code}/view-gantt /dolphinscheduler/projects/{projectCode}/process-instances/{code}/view-gantt
``` ```
## 3. Parameter design ## 3. Parameter design
There are two types of parameters, one is request parameter and the other is path parameter. And the parameter must use small hump. There are two types of parameters, one is request parameter and the other is path parameter. And the parameter must use small hump.
In the case of paging, if the parameter entered by the user is less than 1, the front end needs to automatically turn to 1, indicating that the first page is requested; When the backend finds that the parameter entered by the user is greater than the total number of pages, it should directly return to the last page. In the case of paging, if the parameter entered by the user is less than 1, the front end needs to automatically turn to 1, indicating that the first page is requested; When the backend finds that the parameter entered by the user is greater than the total number of pages, it should directly return to the last page.
## 4. Others design ## 4. Others design
### base URL ### base URL
The URI of the project needs to use `/<project_name>` as the base path, so as to identify that these APIs are under this project. The URI of the project needs to use `/<project_name>` as the base path, so as to identify that these APIs are under this project.
``` ```
/dolphinscheduler /dolphinscheduler
``` ```

View File

@ -10,7 +10,6 @@ In contrast, API testing focuses on whether a complete operation chain can be co
For example, the API test of the tenant management interface focuses on whether users can log in normally; If the login fails, whether the error message can be displayed correctly. After logging in, you can perform tenant management operations through the sessionid you carry. For example, the API test of the tenant management interface focuses on whether users can log in normally; If the login fails, whether the error message can be displayed correctly. After logging in, you can perform tenant management operations through the sessionid you carry.
## API Test ## API Test
### API-Pages ### API-Pages
@ -49,7 +48,6 @@ In addition, during the testing process, the interface are not requested directl
On the login page, only the input parameter specification of the interface request is defined. For the output parameter of the interface request, only the unified basic response structure is defined. The data actually returned by the interface is tested in the actual test case. Whether the input and output of main test interfaces can meet the requirements of test cases. On the login page, only the input parameter specification of the interface request is defined. For the output parameter of the interface request, only the unified basic response structure is defined. The data actually returned by the interface is tested in the actual test case. Whether the input and output of main test interfaces can meet the requirements of test cases.
### API-Cases ### API-Cases
The following is an example of a tenant management test. As explained earlier, we use docker-compose for deployment, so for each test case, we need to import the corresponding file in the form of an annotation. The following is an example of a tenant management test. As explained earlier, we use docker-compose for deployment, so for each test case, we need to import the corresponding file in the form of an annotation.
@ -86,7 +84,7 @@ https://github.com/apache/dolphinscheduler/tree/dev/dolphinscheduler-api-test/do
## Supplements ## Supplements
When running API tests locally, First, you need to start the local service, you can refer to this page: When running API tests locally, First, you need to start the local service, you can refer to this page:
[development-environment-setup](./development-environment-setup.md) [development-environment-setup](./development-environment-setup.md)
When running API tests locally, the `-Dlocal=true` parameter can be configured to connect locally and facilitate changes to the UI. When running API tests locally, the `-Dlocal=true` parameter can be configured to connect locally and facilitate changes to the UI.

View File

@ -1,4 +1,5 @@
## Architecture Design ## Architecture Design
Before explaining the architecture of the schedule system, let us first understand the common nouns of the schedule system. Before explaining the architecture of the schedule system, let us first understand the common nouns of the schedule system.
### 1.Noun Interpretation ### 1.Noun Interpretation
@ -12,7 +13,7 @@ Before explaining the architecture of the schedule system, let us first understa
</p> </p>
</p> </p>
**Process definition**: Visualization **DAG** by dragging task nodes and establishing associations of task nodes **Process definition**: Visualization **DAG** by dragging task nodes and establishing associations of task nodes
**Process instance**: A process instance is an instantiation of a process definition, which can be generated by manual startup or scheduling. The process definition runs once, a new process instance is generated **Process instance**: A process instance is an instantiation of a process definition, which can be generated by manual startup or scheduling. The process definition runs once, a new process instance is generated
@ -34,11 +35,10 @@ Before explaining the architecture of the schedule system, let us first understa
**Complement**: Complement historical data, support **interval parallel and serial** two complement methods **Complement**: Complement historical data, support **interval parallel and serial** two complement methods
### 2.System architecture ### 2.System architecture
#### 2.1 System Architecture Diagram #### 2.1 System Architecture Diagram
<p align="center"> <p align="center">
<img src="../../../img/architecture.jpg" alt="System Architecture Diagram" /> <img src="../../../img/architecture.jpg" alt="System Architecture Diagram" />
<p align="center"> <p align="center">
@ -46,60 +46,51 @@ Before explaining the architecture of the schedule system, let us first understa
</p> </p>
</p> </p>
#### 2.2 Architectural description #### 2.2 Architectural description
* **MasterServer** * **MasterServer**
MasterServer adopts the distributed non-central design concept. MasterServer is mainly responsible for DAG task split, task submission monitoring, and monitoring the health status of other MasterServer and WorkerServer. MasterServer adopts the distributed non-central design concept. MasterServer is mainly responsible for DAG task split, task submission monitoring, and monitoring the health status of other MasterServer and WorkerServer.
When the MasterServer service starts, it registers a temporary node with Zookeeper, and listens to the Zookeeper temporary node state change for fault tolerance processing. When the MasterServer service starts, it registers a temporary node with Zookeeper, and listens to the Zookeeper temporary node state change for fault tolerance processing.
##### The service mainly contains:
##### The service mainly contains: - **Distributed Quartz** distributed scheduling component, mainly responsible for the start and stop operation of the scheduled task. When the quartz picks up the task, the master internally has a thread pool to be responsible for the subsequent operations of the task.
- **Distributed Quartz** distributed scheduling component, mainly responsible for the start and stop operation of the scheduled task. When the quartz picks up the task, the master internally has a thread pool to be responsible for the subsequent operations of the task. - **MasterSchedulerThread** is a scan thread that periodically scans the **command** table in the database for different business operations based on different **command types**
- **MasterSchedulerThread** is a scan thread that periodically scans the **command** table in the database for different business operations based on different **command types** - **MasterExecThread** is mainly responsible for DAG task segmentation, task submission monitoring, logic processing of various command types
- **MasterExecThread** is mainly responsible for DAG task segmentation, task submission monitoring, logic processing of various command types - **MasterTaskExecThread** is mainly responsible for task persistence
- **MasterTaskExecThread** is mainly responsible for task persistence * **WorkerServer**
- WorkerServer also adopts a distributed, non-central design concept. WorkerServer is mainly responsible for task execution and providing log services. When the WorkerServer service starts, it registers the temporary node with Zookeeper and maintains the heartbeat.
* **WorkerServer** ##### This service contains:
- WorkerServer also adopts a distributed, non-central design concept. WorkerServer is mainly responsible for task execution and providing log services. When the WorkerServer service starts, it registers the temporary node with Zookeeper and maintains the heartbeat. - **FetchTaskThread** is mainly responsible for continuously receiving tasks from **Task Queue** and calling **TaskScheduleThread** corresponding executors according to different task types.
- **ZooKeeper**
##### This service contains: The ZooKeeper service, the MasterServer and the WorkerServer nodes in the system all use the ZooKeeper for cluster management and fault tolerance. In addition, the system also performs event monitoring and distributed locking based on ZooKeeper.
We have also implemented queues based on Redis, but we hope that DolphinScheduler relies on as few components as possible, so we finally removed the Redis implementation.
- **FetchTaskThread** is mainly responsible for continuously receiving tasks from **Task Queue** and calling **TaskScheduleThread** corresponding executors according to different task types. - **Task Queue**
- **ZooKeeper** The task queue operation is provided. Currently, the queue is also implemented based on Zookeeper. Since there is less information stored in the queue, there is no need to worry about too much data in the queue. In fact, we have over-measured a million-level data storage queue, which has no effect on system stability and performance.
The ZooKeeper service, the MasterServer and the WorkerServer nodes in the system all use the ZooKeeper for cluster management and fault tolerance. In addition, the system also performs event monitoring and distributed locking based on ZooKeeper. - **Alert**
We have also implemented queues based on Redis, but we hope that DolphinScheduler relies on as few components as possible, so we finally removed the Redis implementation.
- **Task Queue** Provides alarm-related interfaces. The interfaces mainly include **Alarms**. The storage, query, and notification functions of the two types of alarm data. The notification function has two types: **mail notification** and **SNMP (not yet implemented)**.
The task queue operation is provided. Currently, the queue is also implemented based on Zookeeper. Since there is less information stored in the queue, there is no need to worry about too much data in the queue. In fact, we have over-measured a million-level data storage queue, which has no effect on system stability and performance. - **API**
- **Alert** The API interface layer is mainly responsible for processing requests from the front-end UI layer. The service provides a RESTful api to provide request services externally.
Interfaces include workflow creation, definition, query, modification, release, offline, manual start, stop, pause, resume, start execution from this node, and more.
Provides alarm-related interfaces. The interfaces mainly include **Alarms**. The storage, query, and notification functions of the two types of alarm data. The notification function has two types: **mail notification** and **SNMP (not yet implemented)**. - **UI**
- **API** The front-end page of the system provides various visual operation interfaces of the system. For details, see the [quick start](https://dolphinscheduler.apache.org/en-us/docs/3.1.2/about/introduction) section.
The API interface layer is mainly responsible for processing requests from the front-end UI layer. The service provides a RESTful api to provide request services externally.
Interfaces include workflow creation, definition, query, modification, release, offline, manual start, stop, pause, resume, start execution from this node, and more.
- **UI**
The front-end page of the system provides various visual operation interfaces of the system. For details, see the [quick start](https://dolphinscheduler.apache.org/en-us/docs/latest/user_doc/about/introduction.html) section.
#### 2.3 Architectural Design Ideas #### 2.3 Architectural Design Ideas
@ -130,10 +121,9 @@ Problems in the design of centralized :
- In the decentralized design, there is usually no Master/Slave concept, all roles are the same, the status is equal, the global Internet is a typical decentralized distributed system, networked arbitrary node equipment down machine , all will only affect a small range of features. - In the decentralized design, there is usually no Master/Slave concept, all roles are the same, the status is equal, the global Internet is a typical decentralized distributed system, networked arbitrary node equipment down machine , all will only affect a small range of features.
- The core design of decentralized design is that there is no "manager" that is different from other nodes in the entire distributed system, so there is no single point of failure problem. However, since there is no "manager" node, each node needs to communicate with other nodes to get the necessary machine information, and the unreliable line of distributed system communication greatly increases the difficulty of implementing the above functions. - The core design of decentralized design is that there is no "manager" that is different from other nodes in the entire distributed system, so there is no single point of failure problem. However, since there is no "manager" node, each node needs to communicate with other nodes to get the necessary machine information, and the unreliable line of distributed system communication greatly increases the difficulty of implementing the above functions.
- In fact, truly decentralized distributed systems are rare. Instead, dynamic centralized distributed systems are constantly emerging. Under this architecture, the managers in the cluster are dynamically selected, rather than preset, and when the cluster fails, the nodes of the cluster will spontaneously hold "meetings" to elect new "managers". Go to preside over the work. The most typical case is the Etcd implemented in ZooKeeper and Go. - In fact, truly decentralized distributed systems are rare. Instead, dynamic centralized distributed systems are constantly emerging. Under this architecture, the managers in the cluster are dynamically selected, rather than preset, and when the cluster fails, the nodes of the cluster will spontaneously hold "meetings" to elect new "managers". Go to preside over the work. The most typical case is the Etcd implemented in ZooKeeper and Go.
- Decentralization of DolphinScheduler is the registration of Master/Worker to ZooKeeper. The Master Cluster and the Worker Cluster are not centered, and the Zookeeper distributed lock is used to elect one Master or Worker as the “manager” to perform the task. - Decentralization of DolphinScheduler is the registration of Master/Worker to ZooKeeper. The Master Cluster and the Worker Cluster are not centered, and the Zookeeper distributed lock is used to elect one Master or Worker as the “manager” to perform the task.
##### 二、Distributed lock practice ##### 二、Distributed lock practice
DolphinScheduler uses ZooKeeper distributed locks to implement only one Master to execute the Scheduler at the same time, or only one Worker to perform task submission. DolphinScheduler uses ZooKeeper distributed locks to implement only one Master to execute the Scheduler at the same time, or only one Worker to perform task submission.
@ -184,8 +174,6 @@ Service fault tolerance design relies on ZooKeeper's Watcher mechanism. The impl
The Master monitors the directories of other Masters and Workers. If the remove event is detected, the process instance is fault-tolerant or the task instance is fault-tolerant according to the specific business logic. The Master monitors the directories of other Masters and Workers. If the remove event is detected, the process instance is fault-tolerant or the task instance is fault-tolerant according to the specific business logic.
- Master fault tolerance flow chart: - Master fault tolerance flow chart:
<p align="center"> <p align="center">
@ -194,8 +182,6 @@ The Master monitors the directories of other Masters and Workers. If the remove
After the ZooKeeper Master is fault-tolerant, it is rescheduled by the Scheduler thread in DolphinScheduler. It traverses the DAG to find the "Running" and "Submit Successful" tasks, and monitors the status of its task instance for the "Running" task. You need to determine whether the Task Queue already exists. If it exists, monitor the status of the task instance. If it does not exist, resubmit the task instance. After the ZooKeeper Master is fault-tolerant, it is rescheduled by the Scheduler thread in DolphinScheduler. It traverses the DAG to find the "Running" and "Submit Successful" tasks, and monitors the status of its task instance for the "Running" task. You need to determine whether the Task Queue already exists. If it exists, monitor the status of the task instance. If it does not exist, resubmit the task instance.
- Worker fault tolerance flow chart: - Worker fault tolerance flow chart:
<p align="center"> <p align="center">
@ -204,7 +190,7 @@ After the ZooKeeper Master is fault-tolerant, it is rescheduled by the Scheduler
Once the Master Scheduler thread finds the task instance as "need to be fault tolerant", it takes over the task and resubmits. Once the Master Scheduler thread finds the task instance as "need to be fault tolerant", it takes over the task and resubmits.
Note: Because the "network jitter" may cause the node to lose the heartbeat of ZooKeeper in a short time, the node's remove event occurs. In this case, we use the easiest way, that is, once the node has timeout connection with ZooKeeper, it will directly stop the Master or Worker service. Note: Because the "network jitter" may cause the node to lose the heartbeat of ZooKeeper in a short time, the node's remove event occurs. In this case, we use the easiest way, that is, once the node has timeout connection with ZooKeeper, it will directly stop the Master or Worker service.
###### 2. Task failure retry ###### 2. Task failure retry
@ -214,8 +200,6 @@ Here we must first distinguish between the concept of task failure retry, proces
- Process failure recovery is process level, is done manually, recovery can only be performed **from the failed node** or **from the current node** - Process failure recovery is process level, is done manually, recovery can only be performed **from the failed node** or **from the current node**
- Process failure rerun is also process level, is done manually, rerun is from the start node - Process failure rerun is also process level, is done manually, rerun is from the start node
Next, let's talk about the topic, we divided the task nodes in the workflow into two types. Next, let's talk about the topic, we divided the task nodes in the workflow into two types.
- One is a business node, which corresponds to an actual script or processing statement, such as a Shell node, an MR node, a Spark node, a dependent node, and so on. - One is a business node, which corresponds to an actual script or processing statement, such as a Shell node, an MR node, a Spark node, a dependent node, and so on.
@ -225,16 +209,12 @@ Each **service node** can configure the number of failed retries. When the task
If there is a task failure in the workflow that reaches the maximum number of retries, the workflow will fail to stop, and the failed workflow can be manually rerun or process resumed. If there is a task failure in the workflow that reaches the maximum number of retries, the workflow will fail to stop, and the failed workflow can be manually rerun or process resumed.
##### V. Task priority design ##### V. Task priority design
In the early scheduling design, if there is no priority design and fair scheduling design, it will encounter the situation that the task submitted first may be completed simultaneously with the task submitted subsequently, but the priority of the process or task cannot be set. We have redesigned this, and we are currently designing it as follows: In the early scheduling design, if there is no priority design and fair scheduling design, it will encounter the situation that the task submitted first may be completed simultaneously with the task submitted subsequently, but the priority of the process or task cannot be set. We have redesigned this, and we are currently designing it as follows:
- According to **different process instance priority** prioritizes **same process instance priority** prioritizes **task priority within the same process** takes precedence over **same process** commit order from high Go to low for task processing. - According to **different process instance priority** prioritizes **same process instance priority** prioritizes **task priority within the same process** takes precedence over **same process** commit order from high Go to low for task processing.
- The specific implementation is to resolve the priority according to the json of the task instance, and then save the **process instance priority _ process instance id_task priority _ task id** information in the ZooKeeper task queue, when obtained from the task queue, Through string comparison, you can get the task that needs to be executed first. - The specific implementation is to resolve the priority according to the json of the task instance, and then save the **process instance priority _ process instance id_task priority _ task id** information in the ZooKeeper task queue, when obtained from the task queue, Through string comparison, you can get the task that needs to be executed first.
- The priority of the process definition is that some processes need to be processed before other processes. This can be configured at the start of the process or at the time of scheduled start. There are 5 levels, followed by HIGHEST, HIGH, MEDIUM, LOW, and LOWEST. As shown below - The priority of the process definition is that some processes need to be processed before other processes. This can be configured at the start of the process or at the time of scheduled start. There are 5 levels, followed by HIGHEST, HIGH, MEDIUM, LOW, and LOWEST. As shown below
<p align="center"> <p align="center">
@ -308,8 +288,6 @@ Public class TaskLogFilter extends Filter<ILoggingEvent> {
} }
``` ```
### summary ### summary
Starting from the scheduling, this paper introduces the architecture principle and implementation ideas of the big data distributed workflow scheduling system-DolphinScheduler. To be continued Starting from the scheduling, this paper introduces the architecture principle and implementation ideas of the big data distributed workflow scheduling system-DolphinScheduler. To be continued

View File

@ -59,3 +59,4 @@ Assign the parameters with matching values to varPool (List, which contains the
* Format the varPool as json and pass it to master. * Format the varPool as json and pass it to master.
* The parameters that are OUT would be written into the localParam after the master has received the varPool. * The parameters that are OUT would be written into the localParam after the master has received the varPool.

View File

@ -1,6 +1,6 @@
# Overview # Overview
<!-- TODO Since the side menu does not support multiple levels, add new page to keep all sub page here --> <!-- TODO Since the side menu does not support multiple levels, add new page to keep all sub page here -->
* [Global Parameter](global-parameter.md) * [Global Parameter](global-parameter.md)
* [Switch Task type](task/switch.md) * [Switch Task type](task/switch.md)

View File

@ -6,3 +6,4 @@ Switch task workflow step as follows
* `SwitchTaskExecThread` processes the expressions defined in `switch` from top to bottom, obtains the value of the variable from `varPool`, and parses the expression through `javascript`. If the expression returns true, stop checking and record The order of the expression, here we record as resultConditionLocation. The task of SwitchTaskExecThread is over * `SwitchTaskExecThread` processes the expressions defined in `switch` from top to bottom, obtains the value of the variable from `varPool`, and parses the expression through `javascript`. If the expression returns true, stop checking and record The order of the expression, here we record as resultConditionLocation. The task of SwitchTaskExecThread is over
* After the `switch` task runs, if there is no error (more commonly, the user-defined expression is out of specification or there is a problem with the parameter name), then `MasterExecThread.submitPostNode` will obtain the downstream node of the `DAG` to continue execution. * After the `switch` task runs, if there is no error (more commonly, the user-defined expression is out of specification or there is a problem with the parameter name), then `MasterExecThread.submitPostNode` will obtain the downstream node of the `DAG` to continue execution.
* If it is found in `DagHelper.parsePostNodes` that the current node (the node that has just completed the work) is a `switch` node, the `resultConditionLocation` will be obtained, and all branches except `resultConditionLocation` in the SwitchParameters will be skipped. In this way, only the branches that need to be executed are left * If it is found in `DagHelper.parsePostNodes` that the current node (the node that has just completed the work) is a `switch` node, the `resultConditionLocation` will be obtained, and all branches except `resultConditionLocation` in the SwitchParameters will be skipped. In this way, only the branches that need to be executed are left

View File

@ -6,7 +6,7 @@ DolphinScheduler is undergoing a microkernel + plug-in architecture change. All
For alarm-related codes, please refer to the `dolphinscheduler-alert-api` module. This module defines the extension interface of the alarm plug-in and some basic codes. When we need to realize the plug-inization of related functions, it is recommended to read the code of this block first. Of course, it is recommended that you read the document. This will reduce a lot of time, but the document There is a certain degree of lag. When the document is missing, it is recommended to take the source code as the standard (if you are interested, we also welcome you to submit related documents). In addition, we will hardly make changes to the extended interface (excluding new additions) , Unless there is a major structural adjustment, there is an incompatible upgrade version, so the existing documents can generally be satisfied. For alarm-related codes, please refer to the `dolphinscheduler-alert-api` module. This module defines the extension interface of the alarm plug-in and some basic codes. When we need to realize the plug-inization of related functions, it is recommended to read the code of this block first. Of course, it is recommended that you read the document. This will reduce a lot of time, but the document There is a certain degree of lag. When the document is missing, it is recommended to take the source code as the standard (if you are interested, we also welcome you to submit related documents). In addition, we will hardly make changes to the extended interface (excluding new additions) , Unless there is a major structural adjustment, there is an incompatible upgrade version, so the existing documents can generally be satisfied.
We use the native JAVA-SPI, when you need to extend, in fact, you only need to pay attention to the extension of the `org.apache.dolphinscheduler.alert.api.AlertChannelFactory` interface, the underlying logic such as plug-in loading, and other kernels have been implemented, Which makes our development more focused and simple. We use the native JAVA-SPI, when you need to extend, in fact, you only need to pay attention to the extension of the `org.apache.dolphinscheduler.alert.api.AlertChannelFactory` interface, the underlying logic such as plug-in loading, and other kernels have been implemented, Which makes our development more focused and simple.
In additional, the `AlertChannelFactory` extends from `PrioritySPI`, this means you can set the plugin priority, when you have two plugin has the same name, you can customize the priority by override the `getIdentify` method. The high priority plugin will be load, but if you have two plugin with the same name and same priority, the server will throw `IllegalArgumentException` when load the plugin. In additional, the `AlertChannelFactory` extends from `PrioritySPI`, this means you can set the plugin priority, when you have two plugin has the same name, you can customize the priority by override the `getIdentify` method. The high priority plugin will be load, but if you have two plugin with the same name and same priority, the server will throw `IllegalArgumentException` when load the plugin.
@ -26,8 +26,8 @@ If you don't care about its internal design, but simply want to know how to deve
This module is currently a plug-in provided by us, and now we have supported dozens of plug-ins, such as Email, DingTalk, Script, etc. This module is currently a plug-in provided by us, and now we have supported dozens of plug-ins, such as Email, DingTalk, Script, etc.
#### Alert SPI Main class information. #### Alert SPI Main class information.
AlertChannelFactory AlertChannelFactory
Alarm plug-in factory interface. All alarm plug-ins need to implement this interface. This interface is used to define the name of the alarm plug-in and the required parameters. The create method is used to create a specific alarm plug-in instance. Alarm plug-in factory interface. All alarm plug-ins need to implement this interface. This interface is used to define the name of the alarm plug-in and the required parameters. The create method is used to create a specific alarm plug-in instance.
@ -56,36 +56,40 @@ The specific design of alert_spi can be seen in the issue: [Alert Plugin Design]
* Email * Email
Email alert notification Email alert notification
* DingTalk * DingTalk
Alert for DingTalk group chat bots Alert for DingTalk group chat bots
Related parameter configuration can refer to the DingTalk robot document. Related parameter configuration can refer to the DingTalk robot document.
* EnterpriseWeChat * EnterpriseWeChat
EnterpriseWeChat alert notifications EnterpriseWeChat alert notifications
Related parameter configuration can refer to the EnterpriseWeChat robot document. Related parameter configuration can refer to the EnterpriseWeChat robot document.
* Script * Script
We have implemented a shell script for alerting. We will pass the relevant alert parameters to the script and you can implement your alert logic in the shell. This is a good way to interface with internal alerting applications. We have implemented a shell script for alerting. We will pass the relevant alert parameters to the script and you can implement your alert logic in the shell. This is a good way to interface with internal alerting applications.
* SMS * SMS
SMS alerts SMS alerts
* FeiShu * FeiShu
FeiShu alert notification FeiShu alert notification
* Slack * Slack
Slack alert notification Slack alert notification
* PagerDuty * PagerDuty
PagerDuty alert notification PagerDuty alert notification
* WebexTeams * WebexTeams
WebexTeams alert notification WebexTeams alert notification
@ -95,9 +99,10 @@ The specific design of alert_spi can be seen in the issue: [Alert Plugin Design]
* Telegram * Telegram
Telegram alert notification Telegram alert notification
Related parameter configuration can refer to the Telegram document. Related parameter configuration can refer to the Telegram document.
* Http * Http
We have implemented a Http script for alerting. And calling most of the alerting plug-ins end up being Http requests, if we not support your alert plug-in yet, you can use Http to realize your alert login. Also welcome to contribute your common plug-ins to the community :) We have implemented a Http script for alerting. And calling most of the alerting plug-ins end up being Http requests, if we not support your alert plug-in yet, you can use Http to realize your alert login. Also welcome to contribute your common plug-ins to the community :)

View File

@ -22,4 +22,4 @@ In additional, the `DataSourceChannelFactory` extends from `PrioritySPI`, this m
#### **Future plan** #### **Future plan**
Support data sources such as kafka, http, files, sparkSQL, FlinkSQL, etc. Support data sources such as kafka, http, files, sparkSQL, FlinkSQL, etc.

View File

@ -6,9 +6,10 @@ Make the following configuration (take zookeeper as an example)
* Registry plug-in configuration, take Zookeeper as an example (registry.properties) * Registry plug-in configuration, take Zookeeper as an example (registry.properties)
dolphinscheduler-service/src/main/resources/registry.properties dolphinscheduler-service/src/main/resources/registry.properties
```registry.properties ```registry.properties
registry.plugin.name=zookeeper registry.plugin.name=zookeeper
registry.servers=127.0.0.1:2181 registry.servers=127.0.0.1:2181
``` ```
For specific configuration information, please refer to the parameter information provided by the specific plug-in, for example zk: `org/apache/dolphinscheduler/plugin/registry/zookeeper/ZookeeperConfiguration.java` For specific configuration information, please refer to the parameter information provided by the specific plug-in, for example zk: `org/apache/dolphinscheduler/plugin/registry/zookeeper/ZookeeperConfiguration.java`

View File

@ -14,4 +14,4 @@ In additional, the `TaskChannelFactory` extends from `PrioritySPI`, this means y
Since the task plug-in involves the front-end page, the front-end SPI has not yet been implemented, so you need to implement the front-end page corresponding to the plug-in separately. Since the task plug-in involves the front-end page, the front-end SPI has not yet been implemented, so you need to implement the front-end page corresponding to the plug-in separately.
If there is a class conflict in the task plugin, you can use [Shade-Relocating Classes](https://maven.apache.org/plugins/maven-shade-plugin/) to solve this problem. If there is a class conflict in the task plugin, you can use [Shade-Relocating Classes](https://maven.apache.org/plugins/maven-shade-plugin/) to solve this problem.

View File

@ -1,6 +1,7 @@
# DolphinScheduler development # DolphinScheduler development
## Software Requirements ## Software Requirements
Before setting up the DolphinScheduler development environment, please make sure you have installed the software as below: Before setting up the DolphinScheduler development environment, please make sure you have installed the software as below:
* [Git](https://git-scm.com/downloads) * [Git](https://git-scm.com/downloads)
@ -46,6 +47,7 @@ fix things for you.
DolphinScheduler will release new Docker images after it released, you could find them in [Docker Hub](https://hub.docker.com/search?q=DolphinScheduler). DolphinScheduler will release new Docker images after it released, you could find them in [Docker Hub](https://hub.docker.com/search?q=DolphinScheduler).
* If you want to modify DolphinScheduler source code, and build Docker images locally, you can run when finished the modification * If you want to modify DolphinScheduler source code, and build Docker images locally, you can run when finished the modification
```shell ```shell
cd dolphinscheduler cd dolphinscheduler
./mvnw -B clean package \ ./mvnw -B clean package \
@ -59,6 +61,7 @@ cd dolphinscheduler
When the command is finished you could find them by command `docker imaegs`. When the command is finished you could find them by command `docker imaegs`.
* If you want to modify DolphinScheduler source code, build and push Docker images to your registry <HUB_URL>you can run when finished the modification * If you want to modify DolphinScheduler source code, build and push Docker images to your registry <HUB_URL>you can run when finished the modification
```shell ```shell
cd dolphinscheduler cd dolphinscheduler
./mvnw -B clean deploy \ ./mvnw -B clean deploy \
@ -92,7 +95,6 @@ RUN apt update ; \
> >
> Have to use version after Docker 19.03, because after 19.03 docker contains buildx > Have to use version after Docker 19.03, because after 19.03 docker contains buildx
## Notice ## Notice
There are two ways to configure the DolphinScheduler development environment, standalone mode and normal mode There are two ways to configure the DolphinScheduler development environment, standalone mode and normal mode
@ -122,6 +124,7 @@ Find the class `org.apache.dolphinscheduler.StandaloneServer` in Intellij IDEA a
### Start frontend server ### Start frontend server
Install frontend dependencies and run it. Install frontend dependencies and run it.
> Note: You can see more detail about the frontend setting in [frontend development](./frontend-development.md). > Note: You can see more detail about the frontend setting in [frontend development](./frontend-development.md).
```shell ```shell
@ -130,7 +133,7 @@ pnpm install
pnpm run dev pnpm run dev
``` ```
The browser access address [http://localhost:3000](http://localhost:3000) can login DolphinScheduler UI. The default username and password are **admin/dolphinscheduler123** The browser access address [http://localhost:5173](http://localhost:5173) can login DolphinScheduler UI. The default username and password are **admin/dolphinscheduler123**
## DolphinScheduler Normal Mode ## DolphinScheduler Normal Mode
@ -143,12 +146,11 @@ Download [ZooKeeper](https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3
* Create directory `zkData` and `zkLog` * Create directory `zkData` and `zkLog`
* Go to the zookeeper installation directory, copy configure file `zoo_sample.cfg` to `conf/zoo.cfg`, and change value of dataDir in conf/zoo.cfg to dataDir=./tmp/zookeeper * Go to the zookeeper installation directory, copy configure file `zoo_sample.cfg` to `conf/zoo.cfg`, and change value of dataDir in conf/zoo.cfg to dataDir=./tmp/zookeeper
```shell ```shell
# We use path /data/zookeeper/data and /data/zookeeper/datalog here as example # We use path /data/zookeeper/data and /data/zookeeper/datalog here as example
dataDir=/data/zookeeper/data dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/datalog dataLogDir=/data/zookeeper/datalog
``` ```
* Run `./bin/zkServer.sh` in terminal by command `./bin/zkServer.sh start`. * Run `./bin/zkServer.sh` in terminal by command `./bin/zkServer.sh start`.
#### Database #### Database
@ -166,21 +168,22 @@ Following steps will guide how to start the DolphinScheduler backend service
* Open project: Use IDE open the project, here we use Intellij IDEA as an example, after opening it will take a while for Intellij IDEA to complete the dependent download * Open project: Use IDE open the project, here we use Intellij IDEA as an example, after opening it will take a while for Intellij IDEA to complete the dependent download
* File change * File change
* If you use MySQL as your metadata database, you need to modify `dolphinscheduler/pom.xml` and change the `scope` of the `mysql-connector-java` dependency to `compile`. This step is not necessary to use PostgreSQL * If you use MySQL as your metadata database, you need to modify `dolphinscheduler/pom.xml` and change the `scope` of the `mysql-connector-java` dependency to `compile`. This step is not necessary to use PostgreSQL
* Modify database configuration, modify the database configuration in the `dolphinscheduler-master/src/main/resources/application.yaml` * Modify database configuration, modify the database configuration in the `dolphinscheduler-master/src/main/resources/application.yaml`
* Modify database configuration, modify the database configuration in the `dolphinscheduler-worker/src/main/resources/application.yaml` * Modify database configuration, modify the database configuration in the `dolphinscheduler-worker/src/main/resources/application.yaml`
* Modify database configuration, modify the database configuration in the `dolphinscheduler-api/src/main/resources/application.yaml` * Modify database configuration, modify the database configuration in the `dolphinscheduler-api/src/main/resources/application.yaml`
We here use MySQL with database, username, password named dolphinscheduler as an example We here use MySQL with database, username, password named dolphinscheduler as an example
```application.yaml
spring: ```application.yaml
datasource: spring:
driver-class-name: com.mysql.cj.jdbc.Driver datasource:
url: jdbc:mysql://127.0.0.1:3306/dolphinscheduler?useUnicode=true&characterEncoding=UTF-8 driver-class-name: com.mysql.cj.jdbc.Driver
username: dolphinscheduler url: jdbc:mysql://127.0.0.1:3306/dolphinscheduler?useUnicode=true&characterEncoding=UTF-8
password: dolphinscheduler username: dolphinscheduler
``` password: dolphinscheduler
```
* Log level: add a line `<appender-ref ref="STDOUT"/>` to the following configuration to enable the log to be displayed on the command line * Log level: add a line `<appender-ref ref="STDOUT"/>` to the following configuration to enable the log to be displayed on the command line
@ -220,4 +223,4 @@ pnpm install
pnpm run dev pnpm run dev
``` ```
The browser access address [http://localhost:3000](http://localhost:3000) can login DolphinScheduler UI. The default username and password are **admin/dolphinscheduler123** The browser access address [http://localhost:5173](http://localhost:5173) can login DolphinScheduler UI. The default username and password are **admin/dolphinscheduler123**

View File

@ -77,31 +77,31 @@ In addition, during the testing process, the elements are not manipulated direct
The SecurityPage provides goToTab methods to test the corresponding sidebar jumps, mainly including TenantPage, UserPage, WorkerGroupPage and QueuePage. These pages are implemented in the same way, mainly to test whether the input, add and delete buttons of the form can return to the corresponding page. The SecurityPage provides goToTab methods to test the corresponding sidebar jumps, mainly including TenantPage, UserPage, WorkerGroupPage and QueuePage. These pages are implemented in the same way, mainly to test whether the input, add and delete buttons of the form can return to the corresponding page.
```java ```java
public <T extends SecurityPage.Tab> T goToTab(Class<T> tab) { public <T extends SecurityPage.Tab> T goToTab(Class<T> tab) {
if (tab == TenantPage.class) { if (tab == TenantPage.class) {
WebElement menuTenantManageElement = new WebDriverWait(driver, 60) WebElement menuTenantManageElement = new WebDriverWait(driver, 60)
.until(ExpectedConditions.elementToBeClickable(menuTenantManage)); .until(ExpectedConditions.elementToBeClickable(menuTenantManage));
((JavascriptExecutor)driver).executeScript("arguments[0].click();", menuTenantManageElement); ((JavascriptExecutor)driver).executeScript("arguments[0].click();", menuTenantManageElement);
return tab.cast(new TenantPage(driver)); return tab.cast(new TenantPage(driver));
} }
if (tab == UserPage.class) { if (tab == UserPage.class) {
WebElement menUserManageElement = new WebDriverWait(driver, 60) WebElement menUserManageElement = new WebDriverWait(driver, 60)
.until(ExpectedConditions.elementToBeClickable(menUserManage)); .until(ExpectedConditions.elementToBeClickable(menUserManage));
((JavascriptExecutor)driver).executeScript("arguments[0].click();", menUserManageElement); ((JavascriptExecutor)driver).executeScript("arguments[0].click();", menUserManageElement);
return tab.cast(new UserPage(driver)); return tab.cast(new UserPage(driver));
} }
if (tab == WorkerGroupPage.class) { if (tab == WorkerGroupPage.class) {
WebElement menWorkerGroupManageElement = new WebDriverWait(driver, 60) WebElement menWorkerGroupManageElement = new WebDriverWait(driver, 60)
.until(ExpectedConditions.elementToBeClickable(menWorkerGroupManage)); .until(ExpectedConditions.elementToBeClickable(menWorkerGroupManage));
((JavascriptExecutor)driver).executeScript("arguments[0].click();", menWorkerGroupManageElement); ((JavascriptExecutor)driver).executeScript("arguments[0].click();", menWorkerGroupManageElement);
return tab.cast(new WorkerGroupPage(driver)); return tab.cast(new WorkerGroupPage(driver));
} }
if (tab == QueuePage.class) { if (tab == QueuePage.class) {
menuQueueManage().click(); menuQueueManage().click();
return tab.cast(new QueuePage(driver)); return tab.cast(new QueuePage(driver));
} }
throw new UnsupportedOperationException("Unknown tab: " + tab.getName()); throw new UnsupportedOperationException("Unknown tab: " + tab.getName());
} }
``` ```
![SecurityPage](../../../img/e2e-test/SecurityPage.png) ![SecurityPage](../../../img/e2e-test/SecurityPage.png)
@ -146,14 +146,14 @@ The following is an example of a tenant management test. As explained earlier, w
The browser is loaded using the RemoteWebDriver provided with Selenium. Before each test case is started there is some preparation work that needs to be done. For example: logging in the user, jumping to the corresponding page (depending on the specific test case). The browser is loaded using the RemoteWebDriver provided with Selenium. Before each test case is started there is some preparation work that needs to be done. For example: logging in the user, jumping to the corresponding page (depending on the specific test case).
```java ```java
@BeforeAll @BeforeAll
public static void setup() { public static void setup() {
new LoginPage(browser) new LoginPage(browser)
.login("admin", "dolphinscheduler123") .login("admin", "dolphinscheduler123")
.goToNav(SecurityPage.class) .goToNav(SecurityPage.class)
.goToTab(TenantPage.class) .goToTab(TenantPage.class)
; ;
} }
``` ```
When the preparation is complete, it is time for the formal test case writing. We use a form of @Order() annotation for modularity, to confirm the order of the tests. After the tests have been run, assertions are used to determine if the tests were successful, and if the assertion returns true, the tenant creation was successful. The following code can be used as a reference: When the preparation is complete, it is time for the formal test case writing. We use a form of @Order() annotation for modularity, to confirm the order of the tests. After the tests have been run, assertions are used to determine if the tests were successful, and if the assertion returns true, the tenant creation was successful. The following code can be used as a reference:
@ -176,14 +176,14 @@ The rest are similar cases and can be understood by referring to the specific so
https://github.com/apache/dolphinscheduler/tree/dev/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/cases https://github.com/apache/dolphinscheduler/tree/dev/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/cases
## III. Supplements ## III. Supplements
When running E2E tests locally, First, you need to start the local service, you can refer to this page: When running E2E tests locally, First, you need to start the local service, you can refer to this page:
[development-environment-setup](./development-environment-setup.md) [development-environment-setup](./development-environment-setup.md)
When running E2E tests locally, the `-Dlocal=true` parameter can be configured to connect locally and facilitate changes to the UI. When running E2E tests locally, the `-Dlocal=true` parameter can be configured to connect locally and facilitate changes to the UI.
When running E2E tests with `M1` chip, you can use `-Dm1_chip=true` parameter to configure containers supported by When running E2E tests with `M1` chip, you can use `-Dm1_chip=true` parameter to configure containers supported by
`ARM64`. `ARM64`.
![Dlocal](../../../img/e2e-test/Dlocal.png) ![Dlocal](../../../img/e2e-test/Dlocal.png)

View File

@ -1,6 +1,7 @@
# Front-end development documentation # Front-end development documentation
### Technical selection ### Technical selection
``` ```
Vue mvvm framework Vue mvvm framework
@ -17,10 +18,16 @@ Lodash high performance JavaScript utility library
### Development environment ### Development environment
- #### Node installation -
Node package download (note version v12.20.2) `https://nodejs.org/download/release/v12.20.2/`
#### Node installation
Node package download (note version v12.20.2) `https://nodejs.org/download/release/v12.20.2/`
-
#### Front-end project construction
- #### Front-end project construction
Use the command line mode `cd` enter the `dolphinscheduler-ui` project directory and execute `npm install` to pull the project dependency package. Use the command line mode `cd` enter the `dolphinscheduler-ui` project directory and execute `npm install` to pull the project dependency package.
> If `npm install` is very slow, you can set the taobao mirror > If `npm install` is very slow, you can set the taobao mirror
@ -36,13 +43,16 @@ npm config set registry http://registry.npm.taobao.org/
API_BASE = http://127.0.0.1:12345 API_BASE = http://127.0.0.1:12345
``` ```
> ##### ! ! ! Special attention here. If the project reports a "node-sass error" error while pulling the dependency package, execute the following command again after execution. ##### ! ! ! Special attention here. If the project reports a "node-sass error" error while pulling the dependency package, execute the following command again after execution.
```bash ```bash
npm install node-sass --unsafe-perm #Install node-sass dependency separately npm install node-sass --unsafe-perm #Install node-sass dependency separately
``` ```
- #### Development environment operation -
#### Development environment operation
- `npm start` project development environment (after startup address http://localhost:8888) - `npm start` project development environment (after startup address http://localhost:8888)
#### Front-end project release #### Front-end project release
@ -140,6 +150,7 @@ Public module and utill `src/js/module`
Home => `http://localhost:8888/#/home` Home => `http://localhost:8888/#/home`
Project Management => `http://localhost:8888/#/projects/list` Project Management => `http://localhost:8888/#/projects/list`
``` ```
| Project Home | Project Home
| Workflow | Workflow
@ -149,6 +160,7 @@ Project Management => `http://localhost:8888/#/projects/list`
``` ```
Resource Management => `http://localhost:8888/#/resource/file` Resource Management => `http://localhost:8888/#/resource/file`
``` ```
| File Management | File Management
| udf Management | udf Management
@ -159,6 +171,7 @@ Resource Management => `http://localhost:8888/#/resource/file`
Data Source Management => `http://localhost:8888/#/datasource/list` Data Source Management => `http://localhost:8888/#/datasource/list`
Security Center => `http://localhost:8888/#/security/tenant` Security Center => `http://localhost:8888/#/security/tenant`
``` ```
| Tenant Management | Tenant Management
| User Management | User Management
@ -174,16 +187,19 @@ User Center => `http://localhost:8888/#/user/account`
The project `src/js/conf/home` is divided into The project `src/js/conf/home` is divided into
`pages` => route to page directory `pages` => route to page directory
``` ```
The page file corresponding to the routing address The page file corresponding to the routing address
``` ```
`router` => route management `router` => route management
``` ```
vue router, the entry file index.js in each page will be registered. Specific operations: https://router.vuejs.org/zh/ vue router, the entry file index.js in each page will be registered. Specific operations: https://router.vuejs.org/zh/
``` ```
`store` => status management `store` => status management
``` ```
The page corresponding to each route has a state management file divided into: The page corresponding to each route has a state management file divided into:
@ -201,9 +217,13 @@ Specific actionhttps://vuex.vuejs.org/zh/
``` ```
## specification ## specification
## Vue specification ## Vue specification
##### 1.Component name ##### 1.Component name
The component is named multiple words and is connected with a wire (-) to avoid conflicts with HTML tags and a clearer structure. The component is named multiple words and is connected with a wire (-) to avoid conflicts with HTML tags and a clearer structure.
``` ```
// positive example // positive example
export default { export default {
@ -212,7 +232,9 @@ export default {
``` ```
##### 2.Component files ##### 2.Component files
The internal common component of the `src/js/module/components` project writes the folder name with the same name as the file name. The subcomponents and util tools that are split inside the common component are placed in the internal `_source` folder of the component. The internal common component of the `src/js/module/components` project writes the folder name with the same name as the file name. The subcomponents and util tools that are split inside the common component are placed in the internal `_source` folder of the component.
``` ```
└── components └── components
├── header ├── header
@ -228,6 +250,7 @@ The internal common component of the `src/js/module/components` project writes t
``` ```
##### 3.Prop ##### 3.Prop
When you define Prop, you should always name it in camel format (camelCase) and use the connection line (-) when assigning values to the parent component. When you define Prop, you should always name it in camel format (camelCase) and use the connection line (-) when assigning values to the parent component.
This follows the characteristics of each language, because it is case-insensitive in HTML tags, and the use of links is more friendly; in JavaScript, the more natural is the hump name. This follows the characteristics of each language, because it is case-insensitive in HTML tags, and the use of links is more friendly; in JavaScript, the more natural is the hump name.
@ -270,7 +293,9 @@ props: {
``` ```
##### 4.v-for ##### 4.v-for
When performing v-for traversal, you should always bring a key value to make rendering more efficient when updating the DOM. When performing v-for traversal, you should always bring a key value to make rendering more efficient when updating the DOM.
``` ```
<ul> <ul>
<li v-for="item in list" :key="item.id"> <li v-for="item in list" :key="item.id">
@ -280,6 +305,7 @@ When performing v-for traversal, you should always bring a key value to make ren
``` ```
v-for should be avoided on the same element as v-if (`for example: <li>`) because v-for has a higher priority than v-if. To avoid invalid calculations and rendering, you should try to use v-if Put it on top of the container's parent element. v-for should be avoided on the same element as v-if (`for example: <li>`) because v-for has a higher priority than v-if. To avoid invalid calculations and rendering, you should try to use v-if Put it on top of the container's parent element.
``` ```
<ul v-if="showList"> <ul v-if="showList">
<li v-for="item in list" :key="item.id"> <li v-for="item in list" :key="item.id">
@ -289,7 +315,9 @@ v-for should be avoided on the same element as v-if (`for example: <li>`) becaus
``` ```
##### 5.v-if / v-else-if / v-else ##### 5.v-if / v-else-if / v-else
If the elements in the same set of v-if logic control are logically identical, Vue reuses the same part for more efficient element switching, `such as: value`. In order to avoid the unreasonable effect of multiplexing, you should add key to the same element for identification. If the elements in the same set of v-if logic control are logically identical, Vue reuses the same part for more efficient element switching, `such as: value`. In order to avoid the unreasonable effect of multiplexing, you should add key to the same element for identification.
``` ```
<div v-if="hasData" key="mazey-data"> <div v-if="hasData" key="mazey-data">
<span>{{ mazeyData }}</span> <span>{{ mazeyData }}</span>
@ -300,12 +328,15 @@ If the elements in the same set of v-if logic control are logically identical, V
``` ```
##### 6.Instruction abbreviation ##### 6.Instruction abbreviation
In order to unify the specification, the instruction abbreviation is always used. Using `v-bind`, `v-on` is not bad. Here is only a unified specification. In order to unify the specification, the instruction abbreviation is always used. Using `v-bind`, `v-on` is not bad. Here is only a unified specification.
``` ```
<input :value="mazeyUser" @click="verifyUser"> <input :value="mazeyUser" @click="verifyUser">
``` ```
##### 7.Top-level element order of single file components ##### 7.Top-level element order of single file components
Styles are packaged in a file, all the styles defined in a single vue file, the same name in other files will also take effect. All will have a top class name before creating a component. Styles are packaged in a file, all the styles defined in a single vue file, the same name in other files will also take effect. All will have a top class name before creating a component.
Note: The sass plugin has been added to the project, and the sas syntax can be written directly in a single vue file. Note: The sass plugin has been added to the project, and the sas syntax can be written directly in a single vue file.
For uniformity and ease of reading, they should be placed in the order of `<template>`、`<script>`、`<style>`. For uniformity and ease of reading, they should be placed in the order of `<template>`、`<script>`、`<style>`.
@ -357,25 +388,31 @@ For uniformity and ease of reading, they should be placed in the order of `<tem
## JavaScript specification ## JavaScript specification
##### 1.var / let / const ##### 1.var / let / const
It is recommended to no longer use var, but use let / const, prefer const. The use of any variable must be declared in advance, except that the function defined by function can be placed anywhere. It is recommended to no longer use var, but use let / const, prefer const. The use of any variable must be declared in advance, except that the function defined by function can be placed anywhere.
##### 2.quotes ##### 2.quotes
``` ```
const foo = 'after division' const foo = 'after division'
const bar = `${foo}ront-end engineer` const bar = `${foo}ront-end engineer`
``` ```
##### 3.function ##### 3.function
Anonymous functions use the arrow function uniformly. When multiple parameters/return values are used, the object's structure assignment is used first. Anonymous functions use the arrow function uniformly. When multiple parameters/return values are used, the object's structure assignment is used first.
``` ```
function getPersonInfo ({name, sex}) { function getPersonInfo ({name, sex}) {
// ... // ...
return {name, gender} return {name, gender}
} }
``` ```
The function name is uniformly named with a camel name. The beginning of the capital letter is a constructor. The lowercase letters start with ordinary functions, and the new operator should not be used to operate ordinary functions. The function name is uniformly named with a camel name. The beginning of the capital letter is a constructor. The lowercase letters start with ordinary functions, and the new operator should not be used to operate ordinary functions.
##### 4.object ##### 4.object
``` ```
const foo = {a: 0, b: 1} const foo = {a: 0, b: 1}
const bar = JSON.parse(JSON.stringify(foo)) const bar = JSON.parse(JSON.stringify(foo))
@ -393,7 +430,9 @@ for (let [key, value] of myMap.entries()) {
``` ```
##### 5.module ##### 5.module
Unified management of project modules using import / export. Unified management of project modules using import / export.
``` ```
// lib.js // lib.js
export default {} export default {}
@ -411,13 +450,16 @@ If the module has only one output value, use `export default`otherwise no.
##### 1.Label ##### 1.Label
Do not write the type attribute when referencing external CSS or JavaScript. The HTML5 default type is the text/css and text/javascript properties, so there is no need to specify them. Do not write the type attribute when referencing external CSS or JavaScript. The HTML5 default type is the text/css and text/javascript properties, so there is no need to specify them.
``` ```
<link rel="stylesheet" href="//www.test.com/css/test.css"> <link rel="stylesheet" href="//www.test.com/css/test.css">
<script src="//www.test.com/js/test.js"></script> <script src="//www.test.com/js/test.js"></script>
``` ```
##### 2.Naming ##### 2.Naming
The naming of Class and ID should be semantic, and you can see what you are doing by looking at the name; multiple words are connected by a link. The naming of Class and ID should be semantic, and you can see what you are doing by looking at the name; multiple words are connected by a link.
``` ```
// positive example // positive example
.test-header{ .test-header{
@ -426,6 +468,7 @@ The naming of Class and ID should be semantic, and you can see what you are doin
``` ```
##### 3.Attribute abbreviation ##### 3.Attribute abbreviation
CSS attributes use abbreviations as much as possible to improve the efficiency and ease of understanding of the code. CSS attributes use abbreviations as much as possible to improve the efficiency and ease of understanding of the code.
``` ```
@ -439,6 +482,7 @@ border: 1px solid #ccc;
``` ```
##### 4.Document type ##### 4.Document type
The HTML5 standard should always be used. The HTML5 standard should always be used.
``` ```
@ -446,7 +490,9 @@ The HTML5 standard should always be used.
``` ```
##### 5.Notes ##### 5.Notes
A block comment should be written to a module file. A block comment should be written to a module file.
``` ```
/** /**
* @module mazey/api * @module mazey/api
@ -457,7 +503,8 @@ A block comment should be written to a module file.
## interface ## interface
##### All interfaces are returned as Promise ##### All interfaces are returned as Promise
Note that non-zero is wrong for catching catch Note that non-zero is wrong for catching catch
``` ```
@ -477,6 +524,7 @@ test.then(res => {
``` ```
Normal return Normal return
``` ```
{ {
code:0, code:0,
@ -486,6 +534,7 @@ Normal return
``` ```
Error return Error return
``` ```
{ {
code:10000, code:10000,
@ -493,8 +542,10 @@ Error return
msg:'failed' msg:'failed'
} }
``` ```
If the interface is a post request, the Content-Type defaults to application/x-www-form-urlencoded; if the Content-Type is changed to application/json, If the interface is a post request, the Content-Type defaults to application/x-www-form-urlencoded; if the Content-Type is changed to application/json,
Interface parameter transfer needs to be changed to the following way Interface parameter transfer needs to be changed to the following way
``` ```
io.post('url', payload, null, null, { emulateJSON: false } res => { io.post('url', payload, null, null, { emulateJSON: false } res => {
resolve(res) resolve(res)
@ -524,6 +575,7 @@ User Center Related Interfaces `src/js/conf/home/store/user/actions.js`
(1) First place the icon icon of the node in the `src/js/conf/home/pages/dag/img `folder, and note the English name of the node defined by the `toolbar_${in the background. For example: SHELL}.png` (1) First place the icon icon of the node in the `src/js/conf/home/pages/dag/img `folder, and note the English name of the node defined by the `toolbar_${in the background. For example: SHELL}.png`
(2) Find the `tasksType` object in `src/js/conf/home/pages/dag/_source/config.js` and add it to it. (2) Find the `tasksType` object in `src/js/conf/home/pages/dag/_source/config.js` and add it to it.
``` ```
'DEPENDENT': { // The background definition node type English name is used as the key value 'DEPENDENT': { // The background definition node type English name is used as the key value
desc: 'DEPENDENT', // tooltip desc desc: 'DEPENDENT', // tooltip desc
@ -532,6 +584,7 @@ User Center Related Interfaces `src/js/conf/home/store/user/actions.js`
``` ```
(3) Add a `${node type (lowercase)}`.vue file in `src/js/conf/home/pages/dag/_source/formModel/tasks`. The contents of the components related to the current node are written here. Must belong to a node component must have a function _verification () After the verification is successful, the relevant data of the current component is thrown to the parent component. (3) Add a `${node type (lowercase)}`.vue file in `src/js/conf/home/pages/dag/_source/formModel/tasks`. The contents of the components related to the current node are written here. Must belong to a node component must have a function _verification () After the verification is successful, the relevant data of the current component is thrown to the parent component.
``` ```
/** /**
* Verification * Verification
@ -566,6 +619,7 @@ User Center Related Interfaces `src/js/conf/home/store/user/actions.js`
(4) Common components used inside the node component are under` _source`, and `commcon.js` is used to configure public data. (4) Common components used inside the node component are under` _source`, and `commcon.js` is used to configure public data.
##### 2.Increase the status type ##### 2.Increase the status type
(1) Find the `tasksState` object in `src/js/conf/home/pages/dag/_source/config.js` and add it to it. (1) Find the `tasksState` object in `src/js/conf/home/pages/dag/_source/config.js` and add it to it.
``` ```
@ -579,7 +633,9 @@ User Center Related Interfaces `src/js/conf/home/store/user/actions.js`
``` ```
##### 3.Add the action bar tool ##### 3.Add the action bar tool
(1) Find the `toolOper` object in `src/js/conf/home/pages/dag/_source/config.js` and add it to it. (1) Find the `toolOper` object in `src/js/conf/home/pages/dag/_source/config.js` and add it to it.
``` ```
{ {
code: 'pointer', // tool identifier code: 'pointer', // tool identifier
@ -599,13 +655,12 @@ User Center Related Interfaces `src/js/conf/home/store/user/actions.js`
`util.js` => belongs to the `plugIn` tool class `util.js` => belongs to the `plugIn` tool class
The operation is handled in the `src/js/conf/home/pages/dag/_source/dag.js` => `toolbarEvent` event. The operation is handled in the `src/js/conf/home/pages/dag/_source/dag.js` => `toolbarEvent` event.
##### 3.Add a routing page ##### 3.Add a routing page
(1) First add a routing address`src/js/conf/home/router/index.js` in route management (1) First add a routing address`src/js/conf/home/router/index.js` in route management
``` ```
routing address{ routing address{
path: '/test', // routing address path: '/test', // routing address
@ -619,12 +674,12 @@ routing address{
(2)Create a `test` folder in `src/js/conf/home/pages` and create an `index.vue `entry file in the folder. (2)Create a `test` folder in `src/js/conf/home/pages` and create an `index.vue `entry file in the folder.
This will give you direct access to`http://localhost:8888/#/test` This will give you direct access to`http://localhost:8888/#/test`
##### 4.Increase the preset mailbox ##### 4.Increase the preset mailbox
Find the `src/lib/localData/email.js` startup and timed email address input to automatically pull down the match. Find the `src/lib/localData/email.js` startup and timed email address input to automatically pull down the match.
``` ```
export default ["test@analysys.com.cn","test1@analysys.com.cn","test3@analysys.com.cn"] export default ["test@analysys.com.cn","test1@analysys.com.cn","test3@analysys.com.cn"]
``` ```

View File

@ -21,8 +21,9 @@ Some quick tips when using email:
- Tagging the subject line of your email will help you get a faster response, e.g. [api-server]: How to get open api interface? - Tagging the subject line of your email will help you get a faster response, e.g. [api-server]: How to get open api interface?
- Tags may help identify a topic by: - Tags may help identify a topic by:
- Component: MasterServer,ApiServer,WorkerServer,AlertServer, etc - Component: MasterServer,ApiServer,WorkerServer,AlertServer, etc
- Level: Beginner, Intermediate, Advanced - Level: Beginner, Intermediate, Advanced
- Scenario: Debug, How-to - Scenario: Debug, How-to
- For error logs or long code examples, please use [GitHub gist](https://gist.github.com/) and include only a few lines of the pertinent code / log within the email. - For error logs or long code examples, please use [GitHub gist](https://gist.github.com/) and include only a few lines of the pertinent code / log within the email.

View File

@ -20,7 +20,6 @@ Moreover, when we intend to refer a new software ( not limited to 3rd party jar,
* [COMMUNITY-LED DEVELOPMENT "THE APACHE WAY"](https://apache.org/dev/licensing-howto.html) * [COMMUNITY-LED DEVELOPMENT "THE APACHE WAY"](https://apache.org/dev/licensing-howto.html)
For example, we should contain the NOTICE file (every open-source project has NOTICE file, generally under root directory) of ZooKeeper in our project when we are using ZooKeeper. As the Apache explains, "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work. For example, we should contain the NOTICE file (every open-source project has NOTICE file, generally under root directory) of ZooKeeper in our project when we are using ZooKeeper. As the Apache explains, "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work.
We are not going to dive into every 3rd party open-source license policy, you may look up them if interested. We are not going to dive into every 3rd party open-source license policy, you may look up them if interested.
@ -40,3 +39,4 @@ We need to follow the following steps when we need to add new jars or external r
* [COMMUNITY-LED DEVELOPMENT "THE APACHE WAY"](https://apache.org/dev/licensing-howto.html) * [COMMUNITY-LED DEVELOPMENT "THE APACHE WAY"](https://apache.org/dev/licensing-howto.html)
* [ASF 3RD PARTY LICENSE POLICY](https://apache.org/legal/resolved.html) * [ASF 3RD PARTY LICENSE POLICY](https://apache.org/legal/resolved.html)

View File

@ -8,4 +8,4 @@ In Dolphinscheduler community, if a committer who have earned even more merit, c
One thing that is sometimes hard to understand when you are new to the open development process used at the ASF, is that we value the community more than the code. A strong and healthy community will be respectful and be a fun and rewarding place. More importantly, a diverse and healthy community can continue to support the code over the longer term, even as individual companies come and go from the field. One thing that is sometimes hard to understand when you are new to the open development process used at the ASF, is that we value the community more than the code. A strong and healthy community will be respectful and be a fun and rewarding place. More importantly, a diverse and healthy community can continue to support the code over the longer term, even as individual companies come and go from the field.
More details could be found [here](https://community.apache.org/contributors/). More details could be found [here](https://community.apache.org/contributors/).

View File

@ -3,66 +3,67 @@
The following Code of Conduct is based on full compliance with the [Apache Software Foundation Code of Conduct](https://www.apache.org/foundation/policies/conduct.html). The following Code of Conduct is based on full compliance with the [Apache Software Foundation Code of Conduct](https://www.apache.org/foundation/policies/conduct.html).
## Development philosophy ## Development philosophy
- **Consistent** code style, naming, and usage are consistent.
- **Easy to read** code is obvious, easy to read and understand, when debugging one knows the intent of the code. - **Consistent** code style, naming, and usage are consistent.
- **Neat** agree with the concepts of《Refactoring》and《Code Cleanliness》and pursue clean and elegant code. - **Easy to read** code is obvious, easy to read and understand, when debugging one knows the intent of the code.
- **Abstract** hierarchy is clear and the concepts are refined and reasonable. Keep methods, classes, packages, and modules at the same level of abstraction. - **Neat** agree with the concepts of《Refactoring》and《Code Cleanliness》and pursue clean and elegant code.
- **Heart** Maintain a sense of responsibility and continue to be carved in the spirit of artisans. - **Abstract** hierarchy is clear and the concepts are refined and reasonable. Keep methods, classes, packages, and modules at the same level of abstraction.
- **Heart** Maintain a sense of responsibility and continue to be carved in the spirit of artisans.
## Development specifications ## Development specifications
- Executing `mvn -U clean package -Prelease` can compile and test through all test cases. - Executing `mvn -U clean package -Prelease` can compile and test through all test cases.
- The test coverage tool checks for no less than dev branch coverage. - The test coverage tool checks for no less than dev branch coverage.
- In the root directory, use Checkstyle to check your code for special reasons for violating validation rules. The template location is located at ds_check_style.xml. - In the root directory, use Checkstyle to check your code for special reasons for violating validation rules. The template location is located at ds_check_style.xml.
- Follow the coding specifications. - Follow the coding specifications.
## Coding specifications ## Coding specifications
- Use linux line breaks. - Use linux line breaks.
- Indentation (including empty lines) is consistent with the last line. - Indentation (including empty lines) is consistent with the last line.
- An empty line is required between the class declaration and the following variable or method. - An empty line is required between the class declaration and the following variable or method.
- There should be no meaningless empty lines. - There should be no meaningless empty lines.
- Classes, methods, and variables should be named as the name implies and abbreviations should be avoided. - Classes, methods, and variables should be named as the name implies and abbreviations should be avoided.
- Return value variables are named after `result`; `each` is used in loops to name loop variables; and `entry` is used in map instead of `each`. - Return value variables are named after `result`; `each` is used in loops to name loop variables; and `entry` is used in map instead of `each`.
- The cached exception is called `e`; Catch the exception and do nothing, and the exception is named `ignored`. - The cached exception is called `e`; Catch the exception and do nothing, and the exception is named `ignored`.
- Configuration Files are named in camelCase, and file names are lowercase with uppercase initial/starting letter. - Configuration Files are named in camelCase, and file names are lowercase with uppercase initial/starting letter.
- Code that requires comment interpretation should be as small as possible and interpreted by method name. - Code that requires comment interpretation should be as small as possible and interpreted by method name.
- `equals` and `==` In a conditional expression, the constant is left, the variable is on the right, and in the expression greater than less than condition, the variable is left and the constant is right. - `equals` and `==` In a conditional expression, the constant is left, the variable is on the right, and in the expression greater than less than condition, the variable is left and the constant is right.
- In addition to the abstract classes used for inheritance, try to design the class as `final`. - In addition to the abstract classes used for inheritance, try to design the class as `final`.
- Nested loops are as much a method as possible. - Nested loops are as much a method as possible.
- The order in which member variables are defined and the order in which parameters are passed is consistent across classes and methods. - The order in which member variables are defined and the order in which parameters are passed is consistent across classes and methods.
- Priority is given to the use of guard statements. - Priority is given to the use of guard statements.
- Classes and methods have minimal access control. - Classes and methods have minimal access control.
- The private method used by the method should follow the method, and if there are multiple private methods, the writing private method should appear in the same order as the private method in the original method. - The private method used by the method should follow the method, and if there are multiple private methods, the writing private method should appear in the same order as the private method in the original method.
- Method entry and return values are not allowed to be `null`. - Method entry and return values are not allowed to be `null`.
- The return and assignment statements of if else are preferred with the tri-objective operator. - The return and assignment statements of if else are preferred with the tri-objective operator.
- Priority is given to `LinkedList` and only use `ArrayList` if you need to get element values in the collection through the index. - Priority is given to `LinkedList` and only use `ArrayList` if you need to get element values in the collection through the index.
- Collection types such as `ArrayList``HashMap` that may produce expansion must specify the initial size of the collection to avoid expansion. - Collection types such as `ArrayList``HashMap` that may produce expansion must specify the initial size of the collection to avoid expansion.
- Logs and notes are always in English. - Logs and notes are always in English.
- Comments can only contain `javadoc`, `todo` and `fixme`. - Comments can only contain `javadoc`, `todo` and `fixme`.
- Exposed classes and methods must have javadoc, other classes and methods and methods that override the parent class do not require javadoc. - Exposed classes and methods must have javadoc, other classes and methods and methods that override the parent class do not require javadoc.
## Unit test specifications ## Unit test specifications
- Test code and production code are subject to the same code specifications. - Test code and production code are subject to the same code specifications.
- Unit tests are subject to AIR (Automatic, Independent, Repeatable) Design concept. - Unit tests are subject to AIR (Automatic, Independent, Repeatable) Design concept.
- Automatic: Unit tests should be fully automated, not interactive. Manual checking of output results is prohibited, `System.out`, `log`, etc. are not allowed, and must be verified with assertions. - Automatic: Unit tests should be fully automated, not interactive. Manual checking of output results is prohibited, `System.out`, `log`, etc. are not allowed, and must be verified with assertions.
- Independent: It is prohibited to call each other between unit test cases and to rely on the order of execution. Each unit test can be run independently. - Independent: It is prohibited to call each other between unit test cases and to rely on the order of execution. Each unit test can be run independently.
- Repeatable: Unit tests cannot be affected by the external environment and can be repeated. - Repeatable: Unit tests cannot be affected by the external environment and can be repeated.
- Unit tests are subject to BCDEBorder, Correct, Design, Error) Design principles. - Unit tests are subject to BCDEBorder, Correct, Design, Error) Design principles.
- Border (Boundary value test): The expected results are obtained by entering the boundaries of loop boundaries, special values, data order, etc. - Border (Boundary value test): The expected results are obtained by entering the boundaries of loop boundaries, special values, data order, etc.
- Correct (Correctness test): The expected results are obtained with the correct input. - Correct (Correctness test): The expected results are obtained with the correct input.
- Design (Rationality Design): Design high-quality unit tests in combination with production code design. - Design (Rationality Design): Design high-quality unit tests in combination with production code design.
- Error (Fault tolerance test): The expected results are obtained through incorrect input such as illegal data, abnormal flow, etc. - Error (Fault tolerance test): The expected results are obtained through incorrect input such as illegal data, abnormal flow, etc.
- If there is no special reason, the test needs to be fully covered. - If there is no special reason, the test needs to be fully covered.
- Each test case needs to be accurately asserted. - Each test case needs to be accurately asserted.
- Prepare the environment for code separation from the test code. - Prepare the environment for code separation from the test code.
- Only jUnit `Assert`hamcrest `CoreMatchers`Mockito Correlation can use static import. - Only jUnit `Assert`hamcrest `CoreMatchers`Mockito Correlation can use static import.
- Single-data assertions should use `assertTrue``assertFalse``assertNull` and `assertNotNull`. - Single-data assertions should use `assertTrue``assertFalse``assertNull` and `assertNotNull`.
- Multi-data assertions should use `assertThat`. - Multi-data assertions should use `assertThat`.
- Accurate assertion, try not to use `not``containsString` assertion. - Accurate assertion, try not to use `not``containsString` assertion.
- The true value of the test case should be named actualXXX, and the expected value should be named expectedXXX. - The true value of the test case should be named actualXXX, and the expected value should be named expectedXXX.
- Classes and Methods with `@Test` labels do not require javadoc. - Classes and Methods with `@Test` labels do not require javadoc.
- Public specifications.
- Each line is no longer than `200` in length, ensuring that each line is semantically complete for easy understanding.
- Public specifications.
- Each line is no longer than `200` in length, ensuring that each line is semantically complete for easy understanding.

View File

@ -13,8 +13,8 @@ We encourage any form of participation in the community that will eventually bec
* Help promote DolphinScheduler, participate in technical conferences or meetup, sharing and more. * Help promote DolphinScheduler, participate in technical conferences or meetup, sharing and more.
Welcome to the contributing team and join open source starting with submitting your first PR. Welcome to the contributing team and join open source starting with submitting your first PR.
- For example, add code comments or find "easy to fix" tags or some very simple issue (misspellings, etc.) and so on, first familiarize yourself with the submission process through the first simple PR. - For example, add code comments or find "easy to fix" tags or some very simple issue (misspellings, etc.) and so on, first familiarize yourself with the submission process through the first simple PR.
Note: Contributions are not limited to PR Only, but contribute to the development of the project. Note: Contributions are not limited to PR Only, but contribute to the development of the project.
I'm sure you'll benefit from open source by participating in DolphinScheduler! I'm sure you'll benefit from open source by participating in DolphinScheduler!
@ -37,4 +37,4 @@ If you want to implement a Feature or fix a Bug. Please refer to the following:
* You should create a new branch to start your work, to get the name of the branch refer to the [Submit Guide-Pull Request Notice](./pull-request.md). For example, if you want to complete the feature and submit Issue 111, your branch name should be feature-111. The feature name can be determined after discussion with the instructor. * You should create a new branch to start your work, to get the name of the branch refer to the [Submit Guide-Pull Request Notice](./pull-request.md). For example, if you want to complete the feature and submit Issue 111, your branch name should be feature-111. The feature name can be determined after discussion with the instructor.
* When you're done, send a Pull Request to dolphinscheduler, please refer to the《[Submit Guide-Submit Pull Request Process](./submit-code.md)》 * When you're done, send a Pull Request to dolphinscheduler, please refer to the《[Submit Guide-Submit Pull Request Process](./submit-code.md)》
If you want to submit a Pull Request to complete a Feature or fix a Bug, it is recommended that you start with the `good first issue`, `easy-to-fix` issues, complete a small function to submit, do not change too many files at a time, changing too many files will also put a lot of pressure on Reviewers, it is recommended to submit them through multiple Pull Requests, not all at once. If you want to submit a Pull Request to complete a Feature or fix a Bug, it is recommended that you start with the `good first issue`, `easy-to-fix` issues, complete a small function to submit, do not change too many files at a time, changing too many files will also put a lot of pressure on Reviewers, it is recommended to submit them through multiple Pull Requests, not all at once.

View File

@ -2,7 +2,7 @@
Good documentation is critical for any type of software. Any contribution that can improve the DolphinScheduler documentation is welcome. Good documentation is critical for any type of software. Any contribution that can improve the DolphinScheduler documentation is welcome.
### Get the document project ### Get the document project
Documentation for the DolphinScheduler project is maintained in a separate [git repository](https://github.com/apache/dolphinscheduler-website). Documentation for the DolphinScheduler project is maintained in a separate [git repository](https://github.com/apache/dolphinscheduler-website).
@ -52,8 +52,8 @@ Now you can run and build the website in your local environment.
2. Simply push the changed files, for example: 2. Simply push the changed files, for example:
* `*.md` * `*.md`
* `blog.js or docs.js or site.js` * `blog.js or docs.js or site.js`
3. Submit the Pull Request to the **master** branch. 3. Submit the Pull Request to the **master** branch.

View File

@ -1,6 +1,7 @@
# Issue Notice # Issue Notice
## Preface ## Preface
Issues function is used to track various Features, Bugs, Functions, etc. The project maintainer can organize the tasks to be completed through issues. Issues function is used to track various Features, Bugs, Functions, etc. The project maintainer can organize the tasks to be completed through issues.
Issue is an important step in drawing out a feature or bug, Issue is an important step in drawing out a feature or bug,
@ -129,8 +130,8 @@ The main purpose of this is to avoid wasting time caused by different opinions o
- How to deal with the user who raises an issue does not know the module corresponding to the issue. - How to deal with the user who raises an issue does not know the module corresponding to the issue.
It is true that most users when raising issue do not know which module the issue belongs to. It is true that most users when raising issue do not know which module the issue belongs to.
In fact, this is very common in many open source communities. In this case, the committer / contributor actually knows the module affected by the issue. In fact, this is very common in many open source communities. In this case, the committer / contributor actually knows the module affected by the issue.
If the issue is really valuable after being approved by committer and contributor, then the committer can modify the issue title according to the specific module involved in the issue, If the issue is really valuable after being approved by committer and contributor, then the committer can modify the issue title according to the specific module involved in the issue,
or leave a message to the user who raises the issue to modify it into the corresponding title. or leave a message to the user who raises the issue to modify it into the corresponding title.

View File

@ -1,6 +1,7 @@
# Pull Request Notice # Pull Request Notice
## Preface ## Preface
Pull Request is a way of software cooperation, which is a process of bringing code involving different functions into the trunk. During this process, the code can be discussed, reviewed, and modified. Pull Request is a way of software cooperation, which is a process of bringing code involving different functions into the trunk. During this process, the code can be discussed, reviewed, and modified.
In Pull Request, we try not to discuss the implementation of the code. The general implementation of the code and its logic should be determined in Issue. In the Pull Request, we only focus on the code format and code specification, so as to avoid wasting time caused by different opinions on implementation. In Pull Request, we try not to discuss the implementation of the code. The general implementation of the code and its logic should be determined in Issue. In the Pull Request, we only focus on the code format and code specification, so as to avoid wasting time caused by different opinions on implementation.
@ -62,8 +63,12 @@ Please refer to the commit message section.
### Pull Request Code Style ### Pull Request Code Style
DolphinScheduler uses `Spotless` to automatically fix code style and formatting errors, [//]: # (TODO: use the commented anchor below once our website template supports this syntax)
see [Code Style](../development-environment-setup.md#code-style) for details. [//]: # (DolphinScheduler uses `Spotless` to automatically fix code style and formatting errors,)
[//]: # (see [Development Environment Setup]&#40;../development-environment-setup.md#code-style&#41; `Code Style` section for details.)
DolphinScheduler uses `Spotless` to automatically fix code style and formatting errors,
see [Development Environment Setup](../development-environment-setup.md) `Code Style` section for details.
### Question ### Question
@ -74,4 +79,5 @@ see [Code Style](../development-environment-setup.md#code-style) for details.
Usually, there are two solutions to this scenario: the first is to merge multiple issues with into the same issue, and then close the other issues; Usually, there are two solutions to this scenario: the first is to merge multiple issues with into the same issue, and then close the other issues;
the second is multiple issues have subtle differences. the second is multiple issues have subtle differences.
In this scenario, the responsibilities of each issue can be clearly divided. The type of each issue is marked as Sub-Task, and then these sub task type issues are associated with one issue. In this scenario, the responsibilities of each issue can be clearly divided. The type of each issue is marked as Sub-Task, and then these sub task type issues are associated with one issue.
And each Pull Request is submitted should be associated with only one issue of a sub task. And each Pull Request is submitted should be associated with only one issue of a sub task.

View File

@ -10,7 +10,7 @@ from the community to review them. You could see detail in [mail][mail-review-wa
in [GitHub Discussion][discussion-result-review-wanted]. in [GitHub Discussion][discussion-result-review-wanted].
> Note: It is only users mentioned in the [GitHub Discussion][discussion-result-review-wanted] can review Issues or Pull > Note: It is only users mentioned in the [GitHub Discussion][discussion-result-review-wanted] can review Issues or Pull
> Requests, Community advocates **Anyone is encouraged to review Issues and Pull Requests**. Users in > Requests, Community advocates **Anyone is encouraged to review Issues and Pull Requests**. Users in
> [GitHub Discussion][discussion-result-review-wanted] show their willing to review when we collect in the mail thread. > [GitHub Discussion][discussion-result-review-wanted] show their willing to review when we collect in the mail thread.
> The advantage of this list is when the community has discussion, in addition to the mention Members in [team](/us-en/community/community.html), > The advantage of this list is when the community has discussion, in addition to the mention Members in [team](/us-en/community/community.html),
> you can also find some help in [GitHub Discussion][discussion-result-review-wanted] people. If you want to join the > you can also find some help in [GitHub Discussion][discussion-result-review-wanted] people. If you want to join the
@ -27,43 +27,43 @@ go to section [review Pull Requests](#pull-requests).
Review Issues means discuss [Issues][all-issues] in GitHub and give suggestions on it. Include but are not limited to the following situations Review Issues means discuss [Issues][all-issues] in GitHub and give suggestions on it. Include but are not limited to the following situations
| Situation | Reason | Label | Action | | Situation | Reason | Label | Action |
| ------ | ------ | ------ | ------ | |-------------------------|-------------------------------|------------------------------------------------------|---------------------------------------------------------------------|
| wont fix | Has been fixed in dev branch | [wontfix][label-wontfix] | Close Issue, inform creator the fixed version if it already release | | wont fix | Has been fixed in dev branch | [wontfix][label-wontfix] | Close Issue, inform creator the fixed version if it already release |
| duplicate issue | Had the same problem before | [duplicate][label-duplicate] | Close issue, inform creator the link of same issue | | duplicate issue | Had the same problem before | [duplicate][label-duplicate] | Close issue, inform creator the link of same issue |
| Description not clearly | Without detail reproduce step | [need more information][label-need-more-information] | Inform creator add more description | | Description not clearly | Without detail reproduce step | [need more information][label-need-more-information] | Inform creator add more description |
In addition give suggestion, add label for issue is also important during review. The labeled issues can be retrieved In addition give suggestion, add label for issue is also important during review. The labeled issues can be retrieved
better, which convenient for further processing. An issue can with more than one label. Common issue categories are: better, which convenient for further processing. An issue can with more than one label. Common issue categories are:
| Label | Meaning | | Label | Meaning |
| ------ | ------ | |------------------------------------------|--------------------------------|
| [UI][label-UI] | UI and front-end related | | [UI][label-UI] | UI and front-end related |
| [security][label-security] | Security Issue | | [security][label-security] | Security Issue |
| [user experience][label-user-experience] | User experience Issue | | [user experience][label-user-experience] | User experience Issue |
| [development][label-development] | Development Issue | | [development][label-development] | Development Issue |
| [Python][label-Python] | Python Issue | | [Python][label-Python] | Python Issue |
| [plug-in][label-plug-in] | Plug-in Issue | | [plug-in][label-plug-in] | Plug-in Issue |
| [document][label-document] | Document Issue | | [document][label-document] | Document Issue |
| [docker][label-docker] | Docker Issue | | [docker][label-docker] | Docker Issue |
| [need verify][label-need-verify] | Need verify Issue | | [need verify][label-need-verify] | Need verify Issue |
| [e2e][label-e2e] | E2E Issue | | [e2e][label-e2e] | E2E Issue |
| [win-os][label-win-os] | windows operating system Issue | | [win-os][label-win-os] | windows operating system Issue |
| [suggestion][label-suggestion] | Give suggestion to us | | [suggestion][label-suggestion] | Give suggestion to us |
Beside classification, label could also set the priority of Issues. The higher the priority, the more attention pay Beside classification, label could also set the priority of Issues. The higher the priority, the more attention pay
in the community, the easier it is to be fixed or implemented. The priority label are as follows in the community, the easier it is to be fixed or implemented. The priority label are as follows
| Label | priority | | Label | priority |
| ------ | ------ | |------------------------------------------|-----------------|
| [priority:high][label-priority-high] | High priority | | [priority:high][label-priority-high] | High priority |
| [priority:middle][label-priority-middle] | Middle priority | | [priority:middle][label-priority-middle] | Middle priority |
| [priority:low][label-priority-low] | Low priority | | [priority:low][label-priority-low] | Low priority |
All the labels above in common label. For all labels in this project you could see in [full label list][label-all-list] All the labels above in common label. For all labels in this project you could see in [full label list][label-all-list]
Before reading following content, please make sure you have labeled the Issue. Before reading following content, please make sure you have labeled the Issue.
* Remove label [Waiting for reply][label-waiting-for-reply] after replying: Label [Waiting for reply][label-waiting-for-reply] * Remove label [Waiting for reply][label-waiting-for-reply] after replying: Label [Waiting for reply][label-waiting-for-reply]
added when [creating an Issue][issue-choose]. It makes positioning un reply issue more convenient, and you should remove added when [creating an Issue][issue-choose]. It makes positioning un reply issue more convenient, and you should remove
this label after you reviewed it. If you do not remove it, will cause others to waste time looking on the same issue. this label after you reviewed it. If you do not remove it, will cause others to waste time looking on the same issue.
@ -74,12 +74,12 @@ Before reading following content, please make sure you have labeled the Issue.
When an Issue need to create Pull Requests, you could also labeled it from below. When an Issue need to create Pull Requests, you could also labeled it from below.
| Label | Mean | | Label | Mean |
| ------ | ------ | |--------------------------------------------|---------------------------------------------|
| [Chore][label-Chore] | Chore for project | | [Chore][label-Chore] | Chore for project |
| [Good first issue][label-good-first-issue] | Good first issue for new contributor | | [Good first issue][label-good-first-issue] | Good first issue for new contributor |
| [easy to fix][label-easy-to-fix] | Easy to fix, harder than `Good first issue` | | [easy to fix][label-easy-to-fix] | Easy to fix, harder than `Good first issue` |
| [help wanted][label-help-wanted] | Help wanted | | [help wanted][label-help-wanted] | Help wanted |
> Note: Only members have permission to add or delete label. When you need to add or remove lebals but are not member, > Note: Only members have permission to add or delete label. When you need to add or remove lebals but are not member,
> you can `@` members to do that. But as long as you have a GitHub account, you can comment on issues and give suggestions. > you can `@` members to do that. But as long as you have a GitHub account, you can comment on issues and give suggestions.
@ -90,14 +90,14 @@ When an Issue need to create Pull Requests, you could also labeled it from below
<!-- markdown-link-check-disable --> <!-- markdown-link-check-disable -->
Review Pull mean discussing in [Pull Requests][all-PRs] in GitHub and giving suggestions to it. DolphinScheduler's Review Pull mean discussing in [Pull Requests][all-PRs] in GitHub and giving suggestions to it. DolphinScheduler's
Pull Requests reviewing are the same as [GitHub's reviewing changes in pull requests][gh-review-pr]. You can give your Pull Requests reviewing are the same as [GitHub's reviewing changes in pull requests][gh-review-pr]. You can give your
suggestions in Pull Requests suggestions in Pull Reque-->
* When you think the Pull Request is OK to be merged, you can agree to the Pull Request according to the "Approve" process * When you think the Pull Request is OK to be merged, you can agree to the Pull Request according to the "Approve" process
in [GitHub's reviewing changes in pull requests][gh-review-pr]. in [GitHub's reviewing changes in pull requests][gh-review-pr].
* When you think Pull Request needs to be changed, you can comment it according to the "Comment" process in * When you think Pull Request needs to be changed, you can comment it according to the "Comment" process in
[GitHub's reviewing changes in pull requests][gh-review-pr]. And when you think issues that must be fixed before they [GitHub's reviewing changes in pull requests][gh-review-pr]. And when you think issues that must be fixed before they
merged, please follow "Request changes" in [GitHub's reviewing changes in pull requests][gh-review-pr] to ask contributors merged, please follow "Request changes" in [GitHub's reviewing changes in pull requests][gh-review-pr] to ask contributors
modify it. modify it.
<!-- markdown-link-check-enable --> <!-- markdown-link-check-enable -->
Labeled Pull Requests is an important part. Reasonable classification can save a lot of time for reviewers. The good news Labeled Pull Requests is an important part. Reasonable classification can save a lot of time for reviewers. The good news
@ -107,11 +107,11 @@ and [priority:high][label-priority-high].
Pull Requests have some unique labels of it own Pull Requests have some unique labels of it own
| Label | Mean | | Label | Mean |
| ------ | ------ | |--------------------------------------------------------|----------------------------------------------------------|
| [miss document][label-miss-document] | Pull Requests miss document, and should be add | | [miss document][label-miss-document] | Pull Requests miss document, and should be add |
| [first time contributor][label-first-time-contributor] | Pull Requests submit by first time contributor | | [first time contributor][label-first-time-contributor] | Pull Requests submit by first time contributor |
| [don't merge][label-do-not-merge] | Pull Requests have some problem and should not be merged | | [don't merge][label-do-not-merge] | Pull Requests have some problem and should not be merged |
> Note: Only members have permission to add or delete label. When you need to add or remove lebals but are not member, > Note: Only members have permission to add or delete label. When you need to add or remove lebals but are not member,
> you can `@` members to do that. But as long as you have a GitHub account, you can comment on Pull Requests and give suggestions. > you can `@` members to do that. But as long as you have a GitHub account, you can comment on Pull Requests and give suggestions.
@ -151,3 +151,4 @@ Pull Requests have some unique labels of it own
[all-issues]: https://github.com/apache/dolphinscheduler/issues [all-issues]: https://github.com/apache/dolphinscheduler/issues
[all-PRs]: https://github.com/apache/dolphinscheduler/pulls [all-PRs]: https://github.com/apache/dolphinscheduler/pulls
[gh-review-pr]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/about-pull-request-reviews [gh-review-pr]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/about-pull-request-reviews

View File

@ -3,26 +3,23 @@
* First from the remote repository *https://github.com/apache/dolphinscheduler.git* fork a copy of the code into your own repository * First from the remote repository *https://github.com/apache/dolphinscheduler.git* fork a copy of the code into your own repository
* There are currently three branches in the remote repository: * There are currently three branches in the remote repository:
* master normal delivery branch
After the stable release, merge the code from the stable branch into the master.
    
* dev daily development branch
Every day dev development branch, newly submitted code can pull request to this branch.
* master normal delivery branch
After the stable release, merge the code from the stable branch into the master.
    
* dev daily development branch
Every day dev development branch, newly submitted code can pull request to this branch.
* Clone your repository to your local * Clone your repository to your local
`git clone https://github.com/apache/dolphinscheduler.git` `git clone https://github.com/apache/dolphinscheduler.git`
* Add remote repository address, named upstream * Add remote repository address, named upstream
`git remote add upstream https://github.com/apache/dolphinscheduler.git` `git remote add upstream https://github.com/apache/dolphinscheduler.git`
* View repository * View repository
    `git remote -v`     `git remote -v`
>At this time, there will be two repositories: origin (your own repository) and upstream (remote repository) > At this time, there will be two repositories: origin (your own repository) and upstream (remote repository)
* Get/Update remote repository code * Get/Update remote repository code
    `git fetch upstream`     `git fetch upstream`
* Synchronize remote repository code to local repository * Synchronize remote repository code to local repository
@ -32,22 +29,23 @@ git merge --no-ff upstream/dev
``` ```
If remote branch has a new branch such as `dev-1.0`, you need to synchronize this branch to the local repository If remote branch has a new branch such as `dev-1.0`, you need to synchronize this branch to the local repository
``` ```
git checkout -b dev-1.0 upstream/dev-1.0 git checkout -b dev-1.0 upstream/dev-1.0
git push --set-upstream origin dev-1.0 git push --set-upstream origin dev-1.0
``` ```
* Create new branch * Create new branch
``` ```
git checkout -b xxx origin/dev git checkout -b xxx origin/dev
``` ```
Make sure that the branch `xxx` is building successfully on the latest code of the official dev branch Make sure that the branch `xxx` is building successfully on the latest code of the official dev branch
* After modifying the code locally in the new branch, submit it to your own repository: * After modifying the code locally in the new branch, submit it to your own repository:
`git commit -m 'commit content'` `git commit -m 'commit content'`
`git push origin xxx --set-upstream` `git push origin xxx --set-upstream`
* Submit changes to the remote repository * Submit changes to the remote repository
@ -60,4 +58,3 @@ Make sure that the branch `xxx` is building successfully on the latest code of t
* Finally, congratulations, you have become an official contributor to dolphinscheduler! * Finally, congratulations, you have become an official contributor to dolphinscheduler!

View File

@ -21,3 +21,4 @@ Unsubscribe from the mailing list steps are as follows:
2. Receive confirmation email and reply. After completing step 1, you will receive a confirmation email from dev-help@dolphinscheduler.apache.org (if not received, please confirm whether the email is automatically classified as spam, promotion email, subscription email, etc.) . Then reply directly to the email, or click on the link in the email to reply quickly, the subject and content are arbitrary. 2. Receive confirmation email and reply. After completing step 1, you will receive a confirmation email from dev-help@dolphinscheduler.apache.org (if not received, please confirm whether the email is automatically classified as spam, promotion email, subscription email, etc.) . Then reply directly to the email, or click on the link in the email to reply quickly, the subject and content are arbitrary.
3. Receive a goodbye email. After completing the above steps, you will receive a goodbye email with the subject GOODBYE from dev@dolphinscheduler.apache.org, and you have successfully unsubscribed to the Apache DolphinScheduler mailing list, and you will not receive emails from dev@dolphinscheduler.apache.org. 3. Receive a goodbye email. After completing the above steps, you will receive a goodbye email with the subject GOODBYE from dev@dolphinscheduler.apache.org, and you have successfully unsubscribed to the Apache DolphinScheduler mailing list, and you will not receive emails from dev@dolphinscheduler.apache.org.

View File

@ -2,25 +2,27 @@
### 1. The Benefits of Writing Unit Tests ### 1. The Benefits of Writing Unit Tests
- Unit tests help everyone to get into the details of the code and understand how it works. - Unit tests help everyone to get into the details of the code and understand how it works.
- Through test cases we can find bugs and submit robust code. - Through test cases we can find bugs and submit robust code.
- The test case is also a demo usage of the code. - The test case is also a demo usage of the code.
### 2. Some design principles for unit test cases ### 2. Some design principles for unit test cases
- The steps, granularity and combination of conditions should be carefully designed. - The steps, granularity and combination of conditions should be carefully designed.
- Pay attention to boundary conditions. - Pay attention to boundary conditions.
- Unit tests should be well designed as well as avoiding useless code. - Unit tests should be well designed as well as avoiding useless code.
- When you find a `method` is difficult to write unit test, and if you confirm that the `method` is `bad code`, then refactor it with the developer. - When you find a `method` is difficult to write unit test, and if you confirm that the `method` is `bad code`, then refactor it with the developer.
<!-- markdown-link-check-disable --> <!-- markdown-link-check-disable -->
- DolphinScheduler: [mockito](http://site.mockito.org/). Here are some development guides: [mockito tutorial](http://www.baeldung.com/bdd-mockito), [mockito refcard](https://dzone.com/refcardz/mockito) - DolphinScheduler: [mockito](http://site.mockito.org/). Here are some development guides: [mockito tutorial](http://www.baeldung.com/bdd-mockito), [mockito refcard](https://dzone.com/refcardz/mockito)
<!-- markdown-link-check-enable --> <!-- markdown-link-check-enable -->
- TDD(option): When you start writing a new feature, you can try writing test cases first. - TDD(option): When you start writing a new feature, you can try writing test cases first.
### 3. Test coverage setpoint ### 3. Test coverage setpoint
- At this stage, the default value for test coverage of Delta change codes is >= 60%, the higher the better. - At this stage, the default value for test coverage of Delta change codes is >= 60%, the higher the better.
- We can see the test reports on this page: https://codecov.io/gh/apache/dolphinscheduler - We can see the test reports on this page: https://codecov.io/gh/apache/dolphinscheduler
## Fundamental guidelines for unit test ## Fundamental guidelines for unit test
@ -64,13 +66,13 @@ Invalid assertions make the test itself meaningless, it has little to do with wh
There are several types of invalid assertions: There are several types of invalid assertions:
1. Different types of comparisons. 1. Different types of comparisons.
2. Determines that an object or variable with a default value is not null. 2. Determines that an object or variable with a default value is not null.
This seems meaningless. Therefore, when making the relevant judgements you should pay attention to whether it contains a default value itself. This seems meaningless. Therefore, when making the relevant judgements you should pay attention to whether it contains a default value itself.
3. Assertions should be affirmative rather than negative if possible. Assertions should be within a range of predicted results, or exact values, whenever possible (otherwise you may end up with something that doesn't match your actual expectations but passes the assertion) unless your code only cares about whether it is empty or not. 3. Assertions should be affirmative rather than negative if possible. Assertions should be within a range of predicted results, or exact values, whenever possible (otherwise you may end up with something that doesn't match your actual expectations but passes the assertion) unless your code only cares about whether it is empty or not.
### 8. Some points to note for unit tests ### 8. Some points to note for unit tests
@ -90,17 +92,18 @@ For example @Ignore("see #1").
The test will fail when the code in the unit test throws an exception. Therefore, there is no need to use try-catch to catch exceptions. The test will fail when the code in the unit test throws an exception. Therefore, there is no need to use try-catch to catch exceptions.
```java ```java
@Test @Test
public void testMethod() { public void testMethod() {
try { try {
// Some code // Some code
} catch (MyException e) { } catch (MyException e) {
Assert.fail(e.getMessage()); // Noncompliant Assert.fail(e.getMessage()); // Noncompliant
} }
} }
``` ```
You should this:
You should this:
```java ```java
@Test @Test

View File

@ -35,7 +35,7 @@ The content of the logs determines whether the logs can completely restore the s
### Log format specification ### Log format specification
The logs of Master module and Worker module are printed using the following format. The logs of Master module and Worker module are printed using the following format.
```xml ```xml
[%level] %date{yyyy-MM-dd HH:mm:ss.SSS Z} %logger{96}:[%line] - [WorkflowInstance-%X{workflowInstanceId:-0}][TaskInstance-%X{taskInstanceId:-0}] - %msg%n [%level] %date{yyyy-MM-dd HH:mm:ss.SSS Z} %logger{96}:[%line] - [WorkflowInstance-%X{workflowInstanceId:-0}][TaskInstance-%X{taskInstanceId:-0}] - %msg%n
@ -49,4 +49,5 @@ That is, the workflow instance ID and task instance ID are injected in the print
- The use of printStackTrace() is prohibited for exception handling. This method prints the exception stack information to the standard error output. - The use of printStackTrace() is prohibited for exception handling. This method prints the exception stack information to the standard error output.
- Branch printing of logs is prohibited. The contents of the logs need to be associated with the relevant information in the log format, and printing them in separate lines will cause the contents of the logs to not match the time and other information, and cause the logs to be mixed in a large number of log environments, which will make log retrieval more difficult. - Branch printing of logs is prohibited. The contents of the logs need to be associated with the relevant information in the log format, and printing them in separate lines will cause the contents of the logs to not match the time and other information, and cause the logs to be mixed in a large number of log environments, which will make log retrieval more difficult.
- The use of the "+" operator for splicing log content is prohibited. Use placeholders for formatting logs for printing to improve memory usage efficiency. - The use of the "+" operator for splicing log content is prohibited. Use placeholders for formatting logs for printing to improve memory usage efficiency.
- When the log content includes object instances, you need to make sure to override the toString() method to prevent printing meaningless hashcode. - When the log content includes object instances, you need to make sure to override the toString() method to prevent printing meaningless hashcode.

View File

@ -1,6 +1,11 @@
# Release Guide # Release Guide
## Check Your Environment ## Preparation
This section is pre-release work, most of it is one-off, meaning **it is only needed for your first release**. If you have
released before, then skip this section to the next.
### Check Your Environment
To make sure you could successfully complete the release for DolphinScheduler, you should check your environment and make sure To make sure you could successfully complete the release for DolphinScheduler, you should check your environment and make sure
all conditions are met, if any or them are missing, you should install them and make sure them work. all conditions are met, if any or them are missing, you should install them and make sure them work.
@ -10,13 +15,11 @@ all conditions are met, if any or them are missing, you should install them and
java -version java -version
# Maven requests # Maven requests
mvn -version mvn -version
# Python 3.6 above is requests, and you have to make keyword `python` work in your terminal and version match
python --version
``` ```
## GPG Settings ### GPG Settings
### Install GPG #### Install GPG
Download installation package on [official GnuPG website](https://www.gnupg.org/download/index.html). Download installation package on [official GnuPG website](https://www.gnupg.org/download/index.html).
The command of GnuPG 1.x version can differ a little from that of 2.x version. The command of GnuPG 1.x version can differ a little from that of 2.x version.
@ -28,7 +31,7 @@ After the installation, execute the following command to check the version numbe
gpg --version gpg --version
``` ```
### Create Key #### Create Key
After the installation, execute the following command to create key. After the installation, execute the following command to create key.
@ -82,7 +85,7 @@ Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key. # Input your Apache mail passwords You need a Passphrase to protect your secret key. # Input your Apache mail passwords
``` ```
### Check Generated Key #### Check Generated Key
```shell ```shell
gpg --list-keys gpg --list-keys
@ -98,7 +101,7 @@ sub 4096R/A63BC462 2019-11-15
Among them, 85E11560 is public key ID. Among them, 85E11560 is public key ID.
### Upload the Public Key to Key Server #### Upload the Public Key to Key Server
The command is as follow: The command is as follow:
@ -110,9 +113,9 @@ gpg --keyserver hkp://pool.sks-keyservers.net --send-key 85E11560
Each server will automatically synchronize with one another, so it would be okay to choose any one, a backup keys servers Each server will automatically synchronize with one another, so it would be okay to choose any one, a backup keys servers
is `gpg --keyserver hkp://keyserver.ubuntu.com --send-key <YOUR_KEY_ID>` is `gpg --keyserver hkp://keyserver.ubuntu.com --send-key <YOUR_KEY_ID>`
## Apache Maven Central Repository Release ### Configure Apache Maven Central Repository
### Set `settings-security.xml` and `settings.xml` #### Set `settings-security.xml` and `settings.xml`
In this section, we add Apache server maven configuration to prepare the release, we have to add `settings-security.xml` according In this section, we add Apache server maven configuration to prepare the release, we have to add `settings-security.xml` according
to [here](http://maven.apache.org/guides/mini/guide-encryption.html) firstly and then change your `~/.m2/settings.xml` like below to [here](http://maven.apache.org/guides/mini/guide-encryption.html) firstly and then change your `~/.m2/settings.xml` like below
@ -134,6 +137,16 @@ to [here](http://maven.apache.org/guides/mini/guide-encryption.html) firstly and
</settings> </settings>
``` ```
## Releasing
### Check release-docs
Compared with the last release, the `release-docs` of the current release needs to be updated to the latest, if there are dependencies and versions changes
- `dolphinscheduler-dist/release-docs/LICENSE`
- `dolphinscheduler-dist/release-docs/NOTICE`
- `dolphinscheduler-dist/release-docs/licenses`
### Set Release in Environment ### Set Release in Environment
We will use the release version, your github name and your Apache username below several times, so it is better to store We will use the release version, your github name and your Apache username below several times, so it is better to store
@ -141,42 +154,68 @@ it to bash variable for easier use.
```shell ```shell
VERSION=<THE-VERSION-YOU-RELEASE> VERSION=<THE-VERSION-YOU-RELEASE>
SOURCE_CODE_DIR=<YOUR-SOURCE-CODE-ROOT-DIR> # the directory of your source code hold, the location of parent pom.xml instead of binary package
GH_USERNAME=<YOUR-GITHUB-USERNAME> GH_USERNAME=<YOUR-GITHUB-USERNAME>
GH_REMOTE=<GITHUB-REMOTE> # we use `upstream` or `origin` mostly base on your release environment
A_USERNAME=<YOUR-APACHE-USERNAME> A_USERNAME=<YOUR-APACHE-USERNAME>
SVN_DIR=<PATH-TO-SVN-ROOT> # to keep binary package checkout from SVN, the sub path end with `/dolphinscheduler/dev` and `/dolphinscheduler/release` will be create
``` ```
> Note: We can use the variable directly in you bash after we set environment, without changing anything. For example, we > Note: We can use the variable directly in you bash after we set environment, without changing anything. For example, we
> can use command `git clone -b "${VERSION}"-prepare https://github.com/apache/dolphinscheduler.git` to clone the release branch > can use command `git clone -b "${VERSION}"-prepare https://github.com/apache/dolphinscheduler.git` to clone the release branch
> and it can be success by covert the `"${VERSION}"` to `<THE-VERSION-YOU-RELEASE>`. But you have to change `<VERSION>` manually in > and it can be successful by converting the `"${VERSION}"` to `<THE-VERSION-YOU-RELEASE>`. But you have to change `<VERSION>` manually in
> some of not bash step like [vote mail](#vote-procedure), we using `<VERSION>` instead of `"${VERSION}"` to notice release > some of not bash step like [vote mail](#vote-procedure), we are using `<VERSION>` instead of `"${VERSION}"` to notice release
> manager they have to change by hand. > manager they have to change by hand.
### Create Release Branch ### Update Documentation or Code Version
In this section, we dwonload source code from github and create new branch to release We need to update some documentation before the Maven release. For example, to release version `VERSION`, the following updates are required:
- Version in the code:
- `sql`:
- `dolphinscheduler_mysql.sql`: `t_ds_version` needs to be updated to `VERSION`
- `dolphinscheduler_postgre.sql`: `t_ds_version` needs to be updated to `VERSION`
- `dolphinscheduler_h2.sql`: `t_ds_version` needs to be updated to `VERSION`
- `upgrade`: whether to add `VERSION_schema` if there are some upgrade DDL or DML, can skip this step if no any DDL or DML added.
- `soft_version`: need to be updated to `VERSION`
- `deploy/docker/.env`: `HUB` change to `apache``TAG` change to `VERSION`
- `deploy/kubernetes/dolphinscheduler`:
- `Chart.yaml`: `appVersion` and `version` needs to be updated to x.y.z
- `values.yaml`: `image.tag` needs to be updated to x.y.z
- Version in the docs:
- Change the placeholder `<version>`(except `pom`) to the `x.y.z` in directory `docs`
- Add new history version
- `docs/docs/en/history-versions.md` and `docs/docs/zh/history-versions.md`: Add the new version and link for `x.y.z`
- `docs/configs/docsdev.js`: change `/dev/` to `/x.y.z/`, **DO NOT** change this filename, is will be auto change by website tools.
> Note: `VERSION` is a place hold string, is same as the version we set in `VERSION=<THE-VERSION-YOU-RELEASE>`.
### Maven Release
#### Maven Release Check
Create release branch base on prepare branch.
```shell ```shell
git clone -b "${VERSION}"-prepare https://github.com/apache/dolphinscheduler.git cd "${SOURCE_CODE_DIR}"
cd ~/dolphinscheduler/ git checkout -b "${VERSION}"-release "${VERSION}"-prepare
git pull git push "${GH_REMOTE}" "${VERSION}"-release
git checkout -b "${VERSION}"-release
git push origin "${VERSION}"-release
``` ```
### Pre-Release Check > Note: If you release in remote host without source code, you should run `git clone -b "${VERSION}"-prepare https://github.com/apache/dolphinscheduler.git`
> first to clone the source code. And then make sure you set `GH_REMOTE="origin"` to make all command work fine.
```shell ```shell
# make gpg command could be run in maven correct mvn release:prepare -Prelease -Darguments="-Dmaven.test.skip=true -Dcheckstyle.skip=true -Dmaven.javadoc.skip=true -Dspotless.check.skip=true" -DautoVersionSubmodules=true -DdryRun=true -Dusername="${GH_USERNAME}"
export GPG_TTY=$(tty)
mvn release:prepare -Prelease,python -Darguments="-Dmaven.test.skip=true -Dcheckstyle.skip=true -Dmaven.javadoc.skip=true" -DautoVersionSubmodules=true -DdryRun=true -Dusername="${GH_USERNAME}"
``` ```
* `-Prelease,python`: choose release and python profile, which will pack all the source codes, jar files and executable binary packages, and Python distribute package. - `-Prelease`: choose release profile, which will pack all the source codes, jar files and executable binary packages.
* `-DautoVersionSubmodules=true`: it can make the version number is inputted only once and not for each sub-module. - `-DautoVersionSubmodules=true`: it can make the version number is inputted only once and not for each sub-module.
* `-DdryRun=true`: dry run which means not to generate or submit new version number and new tag. - `-DdryRun=true`: dry run which means not to generate or submit new version number and new tag.
### Prepare for the Release #### Maven Release Check Prepare
First, clean local pre-release check information. First, clean local pre-release check information.
@ -187,12 +226,12 @@ mvn release:clean
Then, prepare to execute the release. Then, prepare to execute the release.
```shell ```shell
mvn release:prepare -Prelease,python -Darguments="-Dmaven.test.skip=true -Dcheckstyle.skip=true -Dmaven.javadoc.skip=true" -DautoVersionSubmodules=true -DpushChanges=false -Dusername="${GH_USERNAME}" mvn release:prepare -Prelease -Darguments="-Dmaven.test.skip=true -Dcheckstyle.skip=true -Dmaven.javadoc.skip=true -Dspotless.check.skip=true" -DautoVersionSubmodules=true -DpushChanges=false -Dusername="${GH_USERNAME}"
``` ```
It is basically the same as the previous rehearsal command, but deleting `-DdryRun=true` parameter. It is basically the same as the previous rehearsal command, but deleting `-DdryRun=true` parameter.
* `-DpushChanges=fals`: do not submit the edited version number and tag to GitHub automatically. - `-DpushChanges=false`: do not submit the edited version number and tag to GitHub automatically.
> Note: You have to config your git `user.name` and `user.password` by command `git config --global user.email "you@example.com"` > Note: You have to config your git `user.name` and `user.password` by command `git config --global user.email "you@example.com"`
> and `git config --global user.name "Your Name"` if you meet some mistake like **Please tell me who you are.** > and `git config --global user.name "Your Name"` if you meet some mistake like **Please tell me who you are.**
@ -201,8 +240,8 @@ It is basically the same as the previous rehearsal command, but deleting `-DdryR
After making sure there is no mistake in local files, submit them to GitHub. After making sure there is no mistake in local files, submit them to GitHub.
```shell ```shell
git push -u origin "${VERSION}"-release git push -u "${GH_REMOTE}" "${VERSION}"-release
git push origin --tags git push "${GH_REMOTE}" --tags
``` ```
<!-- markdown-link-check-disable --> <!-- markdown-link-check-disable -->
@ -210,16 +249,16 @@ git push origin --tags
> Note1: In this step, you should use github token for password because native password no longer supported, you can see > Note1: In this step, you should use github token for password because native password no longer supported, you can see
> https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token for more > https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token for more
> detail about how to create token about it. > detail about how to create token about it.
>
> Note2: After the command done, it will auto-created `release.properties` file and `*.Backup` files, their will be need > Note2: After the command done, it will auto-created `release.properties` file and `*.Backup` files, their will be need
> in the following command and DO NOT DELETE THEM > in the following command and DO NOT DELETE THEM
<!-- markdown-link-check-enable --> <!-- markdown-link-check-enable -->
### Deploy the Release #### Maven Release Deploy
```shell ```shell
mvn release:perform -Prelease,python -Darguments="-Dmaven.test.skip=true -Dcheckstyle.skip=true -Dmaven.javadoc.skip=true" -DautoVersionSubmodules=true -Dusername="${GH_USERNAME}" mvn release:perform -Prelease -Darguments="-Dmaven.test.skip=true -Dcheckstyle.skip=true -Dmaven.javadoc.skip=true -Dspotless.check.skip=true" -DautoVersionSubmodules=true -Dusername="${GH_USERNAME}"
``` ```
After that command is executed, the version to be released will be uploaded to Apache staging repository automatically. After that command is executed, the version to be released will be uploaded to Apache staging repository automatically.
@ -227,120 +266,69 @@ Go to [apache staging repositories](https://repository.apache.org/#stagingReposi
Click `Close` to tell Nexus that the construction is finished, because only in this way, this version can be usable. Click `Close` to tell Nexus that the construction is finished, because only in this way, this version can be usable.
If there is any problem in gpg signature, `Close` will fail, but you can see the failure information through `Activity`. If there is any problem in gpg signature, `Close` will fail, but you can see the failure information through `Activity`.
## Apache SVN Repository Release ### SVN
### Checkout dolphinscheduler Release Directory #### Checkout Dolphinscheduler Release Directory
If there is no local work directory, create one at first. We need too checkout Dolphinscheduler dev release directory to local, and
```shell ```shell
mkdir -p ~/ds_svn/dev/ SVN_DIR_DEV="${SVN_DIR}/dolphinscheduler/dev"
cd ~/ds_svn/dev/ SVN_DIR_RELEASE="${SVN_DIR}/dolphinscheduler/release"
# Optional, only if the SVN root path not exists.
mkdir -p "${SVN_DIR_DEV}"
# When you first time checkout from this path
svn --username="${A_USERNAME}" co https://dist.apache.org/repos/dist/dev/dolphinscheduler "${SVN_DIR_DEV}"
# Or update when the svn directory exists, and you already checkout
svn --username="${A_USERNAME}" update "${SVN_DIR_DEV}"
``` ```
After the creation, checkout dolphinscheduler release directory from Apache SVN. > NOTE: it may take a few minutes to sync to the mirror in your first time checkout, because it will download all the files
#### Export New GPG Key to KEYS(Optional)
Only if the first time you release with this gpg KEY, including it is you first release, or you change your KEY. You should
change working directory to another one because this step need checkout and change KEYS in release directory.
```shell ```shell
svn --username="${A_USERNAME}" co https://dist.apache.org/repos/dist/dev/dolphinscheduler # Optional, only if the SVN root path not exists.
cd ~/ds_svn/dev/dolphinscheduler mkdir -p "${SVN_DIR_RELEASE}"
```
### Add gpg Public Key cd "${SVN_DIR_RELEASE}"
svn --username="${A_USERNAME}" co https://dist.apache.org/repos/dist/release/dolphinscheduler
Only the account in its first deployment needs to add that. # Change the placeholder <YOUR-GPG-KEY-ID> to your id
It is alright for `KEYS` to only include the public key of the deployed account.
```shell
gpg -a --export <YOUR-GPG-KEY-ID> >> KEYS gpg -a --export <YOUR-GPG-KEY-ID> >> KEYS
svn add *
svn --username="${A_USERNAME}" commit -m "new key <YOUR-GPG-KEY-ID> add"
``` ```
### Add the Release Content to SVN Directory #### Add Release Content to SVN
Create folder by version number. Create folder by version number, and move the source code packages, binary packages and executable binary packages to SVN working directory.
```shell ```shell
mkdir -p ~/ds_svn/dev/dolphinscheduler/"${VERSION}" mkdir -p "${SVN_DIR_DEV}/${VERSION}"
mkdir -p ~/ds_svn/dev/dolphinscheduler/"${VERSION}"/python
cd ~/ds_svn/dev/dolphinscheduler/"${VERSION}"
```
Add source code packages, binary packages and executable binary packages to SVN working directory. # Add to SVN
cp -f "${SOURCE_CODE_DIR}"/dolphinscheduler-dist/target/*.tar.gz "${SVN_DIR_DEV}/${VERSION}"
cp -f "${SOURCE_CODE_DIR}"/dolphinscheduler-dist/target/*.tar.gz.asc "${SVN_DIR_DEV}/${VERSION}"
```shell # Create sign
# Source and binary tarball for main code cd "${SVN_DIR_DEV}"
cp -f ~/dolphinscheduler/dolphinscheduler-dist/target/*.tar.gz ~/ds_svn/dev/dolphinscheduler/"${VERSION}"
cp -f ~/dolphinscheduler/dolphinscheduler-dist/target/*.tar.gz.asc ~/ds_svn/dev/dolphinscheduler/"${VERSION}"
# Source and binary tarball for Python API
cp -f ~/dolphinscheduler/dolphinscheduler-dist/target/python/* ~/ds_svn/dev/dolphinscheduler/"${VERSION}"/python
```
### Generate sign files
```shell
shasum -a 512 apache-dolphinscheduler-"${VERSION}"-src.tar.gz >> apache-dolphinscheduler-"${VERSION}"-src.tar.gz.sha512 shasum -a 512 apache-dolphinscheduler-"${VERSION}"-src.tar.gz >> apache-dolphinscheduler-"${VERSION}"-src.tar.gz.sha512
shasum -b -a 512 apache-dolphinscheduler-"${VERSION}"-bin.tar.gz >> apache-dolphinscheduler-"${VERSION}"-bin.tar.gz.sha512 shasum -b -a 512 apache-dolphinscheduler-"${VERSION}"-bin.tar.gz >> apache-dolphinscheduler-"${VERSION}"-bin.tar.gz.sha512
cd python
shasum -a 512 apache-dolphinscheduler-python-"${VERSION}".tar.gz >> apache-dolphinscheduler-python-"${VERSION}".tar.gz.sha512
shasum -b -a 512 apache_dolphinscheduler-python-"${VERSION}"-py3-none-any.whl >> apache_dolphinscheduler-python-"${VERSION}"-py3-none-any.whl.sha512
cd ../
```
### Commit to Apache SVN # Check sha512
```shell
cd ~/ds_svn/dev/dolphinscheduler
svn add *
svn --username="${A_USERNAME}" commit -m "release ${VERSION}"
```
## Check Release
### Check sha512 hash
```shell
shasum -c apache-dolphinscheduler-"${VERSION}"-src.tar.gz.sha512 shasum -c apache-dolphinscheduler-"${VERSION}"-src.tar.gz.sha512
shasum -c apache-dolphinscheduler-"${VERSION}"-bin.tar.gz.sha512 shasum -c apache-dolphinscheduler-"${VERSION}"-bin.tar.gz.sha512
cd python # Check gpg signature
shasum -c apache-dolphinscheduler-python-"${VERSION}".tar.gz.sha512
shasum -c apache_dolphinscheduler-python-"${VERSION}"-py3-none-any.whl.sha512
cd ../
```
### Check gpg Signature
First, import releaser's public key.
Import KEYS from SVN repository to local. (The releaser does not need to import again; the checking assistant needs to import it, with the user name filled as the releaser's. )
```shell
curl https://dist.apache.org/repos/dist/dev/dolphinscheduler/KEYS >> KEYS
gpg --import KEYS
gpg --edit-key "${A_USERNAME}"
> trust
Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)
1 = I don't know or won't say
2 = I do NOT trust
3 = I trust marginally
4 = I trust fully
5 = I trust ultimately
m = back to the main menu
Your decision? 5
> save
```
Then, check the gpg signature.
```shell
gpg --verify apache-dolphinscheduler-"${VERSION}"-src.tar.gz.asc gpg --verify apache-dolphinscheduler-"${VERSION}"-src.tar.gz.asc
gpg --verify apache-dolphinscheduler-"${VERSION}"-bin.tar.gz.asc gpg --verify apache-dolphinscheduler-"${VERSION}"-bin.tar.gz.asc
cd python
gpg --verify apache-dolphinscheduler-python-"${VERSION}".tar.gz.asc # Commit to Apache SVN
gpg --verify apache_dolphinscheduler-python-"${VERSION}"-py3-none-any.whl.asc svn add *
cd ../ svn --username="${A_USERNAME}" commit -m "release ${VERSION}"
``` ```
> Note: You have to create gpg signature manually when you can not find your `asc` file, the command > Note: You have to create gpg signature manually when you can not find your `asc` file, the command
@ -351,21 +339,20 @@ cd ../
#### Check source package #### Check source package
Decompress `apache-dolphinscheduler-<VERSION>-src.tar.gz` and `python/apache-dolphinscheduler-python-<VERSION>.tar.gz` then check the following items: Decompress `apache-dolphinscheduler-<VERSION>-src.tar.gz` then check the following items:
* Check whether source tarball is oversized for including nonessential files - Check whether source tarball is oversized for including nonessential files
* `LICENSE` and `NOTICE` files exist - `LICENSE` and `NOTICE` files exist
* Correct year in `NOTICE` file - Correct year in `NOTICE` file
* There is only text files but no binary files - There is only text files but no binary files
* All source files have ASF headers - All source files have ASF headers
* Codes can be compiled and pass the unit tests (mvn install) - Codes can be compiled and pass the unit tests (mvn install)
* The contents of the release match with what's tagged in version control (diff -r a verify_dir tag_dir) - The contents of the release match with what's tagged in version control (diff -r a verify_dir tag_dir)
* Check if there is any extra files or folders, empty folders for example - Check if there is any extra files or folders, empty folders for example
#### Check binary packages #### Check binary packages
Decompress `apache-dolphinscheduler-<VERSION>-src.tar.gz` and `python/apache-dolphinscheduler-python-<VERSION>-bin.tar.gz` Decompress `apache-dolphinscheduler-<VERSION>-bin.tar.gz` to check the following items:
to check the following items:
- `LICENSE` and `NOTICE` files exist - `LICENSE` and `NOTICE` files exist
- Correct year in `NOTICE` file - Correct year in `NOTICE` file
@ -375,26 +362,28 @@ to check the following items:
- All the third party dependency licenses are under `licenses` folder - All the third party dependency licenses are under `licenses` folder
- If it depends on Apache license and has a `NOTICE` file, that `NOTICE` file need to be added to `NOTICE` file of the release - If it depends on Apache license and has a `NOTICE` file, that `NOTICE` file need to be added to `NOTICE` file of the release
## Call for a Vote ## VOTE
### Update Release Notes ### Update Release Notes
You should create a release note in GitHub by [new release note](https://github.com/apache/dolphinscheduler/releases/new). You should create a release note in GitHub by [new release note](https://github.com/apache/dolphinscheduler/releases/new).
It should be done before vote mail because we need the release note in the mail. You could use command It should be done before vote mail because we need the release note in the mail. You could use command
`git log --pretty="- %s" <PREVIOUS-RELEASE-SHA>..<CURRENT-RELEASE-SHA> > changelog.md` to creat the changelog(some log `python release.py changelog` in directory `tools/release` to creat the changelog.
maybe not correct, you should filter them by yourself) and classify them and paste them to GitHub release note page
> NOTE: Or if you prefer to create manually, you can use command `git log --pretty="- %s" <PREVIOUS-RELEASE-SHA>..<CURRENT-RELEASE-SHA> > changelog.md`
> (some log maybe not correct, you should filter them by yourself) and classify them and paste them to GitHub release note page
### Vote procedure ### Vote procedure
1. DolphinScheduler community vote: send the vote e-mail to `dev@dolphinscheduler.apache.org`. DolphinScheduler community vote: send the vote e-mail to `dev@dolphinscheduler.apache.org`. PMC needs to check the
PMC needs to check the rightness of the version according to the document before they vote. rightness of the version according to the document before they vote. After at least 72 hours and with at least 3
After at least 72 hours and with at least 3 `+1 and no -1 PMC member` votes, it can come to the next stage of the vote. `+1 and no -1 PMC member` votes, it can come to the next stage of the vote.
2. Announce the vote result: send the result vote e-mail to `dev@dolphinscheduler.apache.org` Announce the vote result: send the result vote e-mail to `dev@dolphinscheduler.apache.org`
### Vote Templates ### Templates
#### DolphinScheduler Community Vote Template #### Vote Template
Title Title
@ -413,15 +402,15 @@ Release notes: https://github.com/apache/dolphinscheduler/releases/tag/<VERSION>
The release candidates: https://dist.apache.org/repos/dist/dev/dolphinscheduler/<VERSION>/ The release candidates: https://dist.apache.org/repos/dist/dev/dolphinscheduler/<VERSION>/
Maven 2 staging repository: https://repository.apache.org/content/repositories/<VERSION>/org/apache/dolphinscheduler/ Maven 2 staging repository: https://repository.apache.org/content/repositories/<STAGING.REPOSITORY>/org/apache/dolphinscheduler/
Git tag for the release: https://github.com/apache/dolphinscheduler/tree/<VERSION> Git tag for the release: https://github.com/apache/dolphinscheduler/tree/<VERSION>
Release Commit ID: https://github.com/apache/dolphinscheduler/commit/<SHA-VALUE> Release Commit ID: https://github.com/apache/dolphinscheduler/commit/<SHA-VALUE>
Keys to verify the Release Candidate: https://dist.apache.org/repos/dist/dev/dolphinscheduler/KEYS Keys to verify the Release Candidate: https://downloads.apache.org/dolphinscheduler/KEYS
Look at here for how to verify this release candidate: https://dolphinscheduler.apache.org/en-us/community/release.html Look at here for how to verify this release candidate: https://github.com/apache/dolphinscheduler/blob/dev/docs/docs/en/contribute/release.md
The vote will be open for at least 72 hours or until necessary number of votes are reached. The vote will be open for at least 72 hours or until necessary number of votes are reached.
@ -441,7 +430,13 @@ Checklist for reference:
[ ] No compiled archives bundled in source archive. [ ] No compiled archives bundled in source archive.
``` ```
2. Announce the vote result: #### Result Template
Title
```txt
[RESULT][VOTE] Release Apache DolphinScheduler <VERSION>
```
Body Body
@ -461,26 +456,23 @@ xxx
Thanks everyone for taking time to check this release and help us. Thanks everyone for taking time to check this release and help us.
``` ```
## Finish the Release ## Announce
### Move source packages, binary packages from the `dev` directory to `release` directory ### Handle Release Tarball and Remove Release Branch
```shell ```shell
svn mv https://dist.apache.org/repos/dist/dev/dolphinscheduler/"${VERSION}" https://dist.apache.org/repos/dist/release/dolphinscheduler/ # move to release directory
svn mv -m "release ${VERSION}" https://dist.apache.org/repos/dist/dev/dolphinscheduler/"${VERSION}" https://dist.apache.org/repos/dist/release/dolphinscheduler/
# remove old release directory
svn delete -m "remove old release" https://dist.apache.org/repos/dist/release/dolphinscheduler/<PREVIOUS-RELEASE-VERSION>
# Remove prepare branch
cd "${SOURCE_CODE_DIR}"
git push --delete "${GH_REMOTE}" "${VERSION}-prepare"
``` ```
### Export you new gpg KEYS from dev to release(optional) and then find DolphinScheduler in [apache staging repositories](https://repository.apache.org/#stagingRepositories) and click `Release`
Only if the first time you release with this gpg KEY, including it is you first release or you change your KEY
```shell
mkdir -p ~/ds_svn/release/
cd ~/ds_svn/release/
svn --username="${A_USERNAME}" co https://dist.apache.org/repos/dist/release/dolphinscheduler
gpg -a --export <YOUR-GPG-KEY-ID> >> KEYS
svn add *
svn --username="${A_USERNAME}" commit -m "new key <YOUR-GPG-KEY-ID> add"
```
### Update Document ### Update Document
@ -488,20 +480,25 @@ Website should be present before you send the announce mail this section will te
the release version is `<VERSION>`, the following updates are required(note it will take effect immediately when the PR is merged): the release version is `<VERSION>`, the following updates are required(note it will take effect immediately when the PR is merged):
- Repository **apache/dolphinscheduler-website**: - Repository **apache/dolphinscheduler-website**:
- `download/en-us/download.md` and `download/zh-cn/download.md`: add the download of the `<VERSION>` release package - `config/download.json`: add the download of the `<VERSION>` release package
- `scripts/conf.sh`: Add new release version `<VERSION>` key-value pair to variable `DEV_RELEASE_DOCS_VERSIONS` - `scripts/conf.sh`: Add new release version `<VERSION>` key-value pair to variable `DEV_RELEASE_DOCS_VERSIONS`
- Repository **apache/dolphinscheduler**: - Repository **apache/dolphinscheduler** (dev branch):
- `docs/configs/site.js`: - `docs/configs/site.js`:
- `docsLatest`: update to `<VERSION>` - `docsLatest`: update to `<VERSION>`
- `docs0`: The `text` of two places of `en-us/zh-cn` needs to be updated to `latest(<VERSION>)` - `docs0`: The `text` of two places of `en-us/zh-cn` needs to be updated to `latest(<VERSION>)`
- `docsxyz`: Add a drop-down menu with `key` as `docsxyz` and `text` as `<VERSION>` in `children` of two places of `en-us/zh-cn` - `docs/configs/index.md.jsx`: Add `<VERSION>: docsxyzConfig` and add new `import` for the new `docsxyzConfig`
- `docs/configs/index.md.jsx`: Add `<VERSION>: docsxyzConfig`
- `docs/docs/en/history-versions.md` and `docs/docs/zh/history-versions.md`: Add new `<VERSION>` release docs. - `docs/docs/en/history-versions.md` and `docs/docs/zh/history-versions.md`: Add new `<VERSION>` release docs.
- `.github/ISSUE_TEMPLATE/bug-report.yml`: DolphinScheduler's GitHub [bug-report](https://github.com/apache/dolphinscheduler/blob/dev/.github/ISSUE_TEMPLATE/bug-report.yml) - `.github/ISSUE_TEMPLATE/bug-report.yml`: DolphinScheduler's GitHub [bug-report](https://github.com/apache/dolphinscheduler/blob/dev/.github/ISSUE_TEMPLATE/bug-report.yml)
issue template have **Version** selection bottom. So after we release DolphinScheduler we should and the new `<VERSION>` to issue template have **Version** selection bottom. So after released we should add the new `<VERSION>` to
bug-report.yml bug-report.yml
### Find DolphinScheduler in [apache staging repositories](https://repository.apache.org/#stagingRepositories) and click `Release` ### Publish Docker Image and Helm Chart
We have a [workflow](../../../../.github/workflows/publish-docker.yaml) to automatically publish Docker images
and a [workflow](../../../../.github/workflows/publish-helm-chart.yaml) to automatically publish Helm Chart to Docker Hub,
after you change the release from "pre-release" to "release", the workflow will be triggered. All you need to do
is to observe the aforementioned workflows, and after they are completed, you can pull the Docker images locally and
verify that they work as expected.
### Send Announcement E-mail Community ### Send Announcement E-mail Community
@ -527,7 +524,7 @@ Dolphin Scheduler is a distributed and easy-to-extend visual workflow scheduler
dedicated to solving the complex task dependencies in data processing, making the scheduler system out of the box for data processing. dedicated to solving the complex task dependencies in data processing, making the scheduler system out of the box for data processing.
Download Links: https://dolphinscheduler.apache.org/en-us/download/download.html Download Links: https://dolphinscheduler.apache.org/en-us/download
Release Notes: https://github.com/apache/dolphinscheduler/releases/tag/<VERSION> Release Notes: https://github.com/apache/dolphinscheduler/releases/tag/<VERSION>
@ -536,5 +533,19 @@ Website: https://dolphinscheduler.apache.org/
DolphinScheduler Resources: DolphinScheduler Resources:
- Issue: https://github.com/apache/dolphinscheduler/issues/ - Issue: https://github.com/apache/dolphinscheduler/issues/
- Mailing list: dev@dolphinscheduler.apache.org - Mailing list: dev@dolphinscheduler.apache.org
- Documents: https://dolphinscheduler.apache.org/zh-cn/docs/<VERSION>/user_doc/about/introduction.html - Documents: https://dolphinscheduler.apache.org/zh-cn/docs/<VERSION>/about/introduction
``` ```
## News
After all set, an article should be written and publish it to the community, it should include:
- What is the major purpose of the version, feature add, bugfix, or both
- Major new features and how to use it, better with picture or gif
- Major bugfix and make what different from previous version, better with picture or gif
- All contributors since previous release
### Get All Contributors
You might need all contributors in current release when you want to publish the release news or announcement, you could
use command `python release.py contributor` in directory `tools/release` to auto generate contributor GitHub id.

View File

@ -1,32 +0,0 @@
# Release Post
We still have some publish task to do after we send the announcement mail, currently we have to publish Docker images to
Docker Hub and also publish pydolphinscheduler to PyPI.
## Publish Docker Image
we already have the exists CI to publish the latest Docker image to GitHub container register with [config](https://github.com/apache/dolphinscheduler/blob/d80cf21456265c9d84e642bdb4db4067c7577fc6/.github/workflows/publish-docker.yaml#L55-L63).
We could reuse the main command the CI run and publish our Docker images to Docker Hub by single command.
```bash
# Please change the <VERSION> place hold to the version you release
./mvnw -B clean deploy \
-Dmaven.test.skip \
-Dmaven.javadoc.skip \
-Dmaven.checkstyle.skip \
-Dmaven.deploy.skip \
-Ddocker.tag=<VERSION> \
-Ddocker.hub=apache \
-Pdocker,release
```
## Publish pydolphinscheduler to PyPI
Python API need to release to PyPI for easier download and use, you can see more detail in [Python API release](https://github.com/apache/dolphinscheduler/blob/dev/dolphinscheduler-python/pydolphinscheduler/RELEASE.md#to-pypi)
to finish PyPI release.
## Get All Contributors
You might need all contributors in current release when you want to publish the release news or announcement, you could
use the git command `git log --pretty="%an" <PREVIOUS-RELEASE-SHA>..<CURRENT-RELEASE-SHA> | sort | uniq` to auto generate
the git author name.

View File

@ -1,31 +0,0 @@
# Release Preparation
## Check release-docs
Compared with the last release, the `release-docs` of the current release needs to be updated to the latest, if there are dependencies and versions changes
- `dolphinscheduler-dist/release-docs/LICENSE`
- `dolphinscheduler-dist/release-docs/NOTICE`
- `dolphinscheduler-dist/release-docs/licenses`
## Update Version
For example, to release `x.y.z`, the following updates are required:
- Version in the code:
- `sql`:
- `dolphinscheduler_mysql.sql`: `t_ds_version` needs to be updated to x.y.z
- `dolphinscheduler_postgre.sql`: `t_ds_version` needs to be updated to x.y.z
- `dolphinscheduler_h2.sql`: `t_ds_version` needs to be updated to x.y.z
- `upgrade`: whether to add`x.y.z_schema`
- `soft_version`: need to be updated to x.y.z
- `deploy/docker/.env`: `HUB` change to `apache``TAG` change to `x.y.z`
- `deploy/kubernetes/dolphinscheduler`:
- `Chart.yaml`: `appVersion` needs to be updated to x.y.z (`version` is helm chart versionincremented and different from x.y.z)
- `values.yaml`: `image.tag` needs to be updated to x.y.z
- `dolphinscheduler-python/pydolphinscheduler/setup.py`: change `version` to x.y.z
- Version in the docs:
- Change the placeholder `<version>`(except `pom`) to the `x.y.z` in directory `docs`
- Add new history version
- `docs/docs/en/history-versions.md` and `docs/docs/zh/history-versions.md`: Add the new version and link for `x.y.z`
- `docs/configs/docsdev.js`: change `/dev/` to `/x.y.z/`

View File

@ -280,7 +280,7 @@ A Will hive pom
<dependency> <dependency>
<groupId>org.apache.hive</groupId> <groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId> <artifactId>hive-jdbc</artifactId>
<version>2.1.0</version> <version>2.3.9</version>
</dependency> </dependency>
``` ```

View File

@ -9,7 +9,7 @@ The alarm module supports the following scenarios:
Steps to be used are as follows: Steps to be used are as follows:
- Go to `Security -> Alarm Group Management -> Alarm Instance Management -> Alarm Instance`. - Go to `Security -> Alarm Group Management -> Alarm Instance Management -> Alarm Instance`.
- Select the corresponding alarm plug-in and fill in the relevant alarm parameters. - Select the corresponding alarm plug-in and fill in the relevant alarm parameters.
- Select `Alarm Group Management`, create an alarm group, and choose the corresponding alarm instance. - Select `Alarm Group Management`, create an alarm group, and choose the corresponding alarm instance.
@ -19,4 +19,4 @@ Steps to be used are as follows:
![alert-instance03](../../../../img/new_ui/dev/alert/alert_instance03.png) ![alert-instance03](../../../../img/new_ui/dev/alert/alert_instance03.png)
![alert-instance04](../../../../img/new_ui/dev/alert/alert_instance04.png) ![alert-instance04](../../../../img/new_ui/dev/alert/alert_instance04.png)

View File

@ -8,20 +8,21 @@ The following shows the `DingTalk` configuration example:
## Parameter Configuration ## Parameter Configuration
| **Parameter** | **Description** | | **Parameter** | **Description** |
| --- | --- | |----------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Warning Type | Alert on success or failure or both. | | Warning Type | Alert on success or failure or both. |
| WebHook | The format is: [https://oapi.dingtalk.com/robot/send?access\_token=XXXXXX](https://oapi.dingtalk.com/robot/send?access_token=XXXXXX) | | WebHook | The format is: [https://oapi.dingtalk.com/robot/send?access\_token=XXXXXX](https://oapi.dingtalk.com/robot/send?access_token=XXXXXX) |
| Keyword | Custom keywords for security settings. | | Keyword | Custom keywords for security settings. |
| Secret | Signature of security settings | | Secret | Signature of security settings |
| Msg Type | Message parse type (support txt, markdown, markdownV2, html). | | Msg Type | Message parse type (support txt, markdown, markdownV2, html). |
| At User Mobile | When a custom bot sends a message, you can specify the "@person list" by their mobile phone number. When the selected people in the "@people list" receive the message, there will be a `@` message reminder. `No disturb` mode always receives reminders, and "someone @ you" appears in the message. The "At User Mobile" represents mobile phone number of the "@person" | | At User Mobile | When a custom bot sends a message, you can specify the "@person list" by their mobile phone number. When the selected people in the "@people list" receive the message, there will be a `@` message reminder. `No disturb` mode always receives reminders, and "someone @ you" appears in the message. The "At User Mobile" represents mobile phone number of the "@person" |
| At User Ids | The user ID by "@person" | | At User Ids | The user ID by "@person" |
| Proxy | The proxy address of the proxy server. | | Proxy | The proxy address of the proxy server. |
| Port | The proxy port of Proxy-Server. | | Port | The proxy port of Proxy-Server. |
| User | Authentication(Username) for the proxy server. | | User | Authentication(Username) for the proxy server. |
| Password | Authentication(Password) for the proxy server. | | Password | Authentication(Password) for the proxy server. |
## Reference ## Reference
- [DingTalk Custom Robot Access Development Documentation](https://open.dingtalk.com/document/robots/custom-robot-access) - [DingTalk Custom Robot Access Development Documentation](https://open.dingtalk.com/document/robots/custom-robot-access)

View File

@ -1,4 +1,5 @@
# Email # Email
If you need to use `Email` for alerting, create an alert instance in the alert instance management and select the Email plugin. If you need to use `Email` for alerting, create an alert instance in the alert instance management and select the Email plugin.
The following shows the `Email` configuration example: The following shows the `Email` configuration example:
@ -7,4 +8,4 @@ The following shows the `Email` configuration example:
![alert-email](../../../../img/alert/email-alter-setup2-en.png) ![alert-email](../../../../img/alert/email-alter-setup2-en.png)
![alert-email](../../../../img/alert/email-alter-setup3-en.png) ![alert-email](../../../../img/alert/email-alter-setup3-en.png)

View File

@ -7,14 +7,14 @@ The following is the `WebexTeams` configuration example:
## Parameter Configuration ## Parameter Configuration
| **Parameter** | **Description** | | **Parameter** | **Description** |
| --- | --- | |-----------------|-------------------------------------------------------------------------------------------------------------------------|
| botAccessToken | The access token of robot. | | botAccessToken | The access token of robot. |
| roomID | The ID of the room that receives message (only support one room ID). | | roomID | The ID of the room that receives message (only support one room ID). |
| toPersonId | The person ID of the recipient when sending a private 1:1 message. | | toPersonId | The person ID of the recipient when sending a private 1:1 message. |
| toPersonEmail | The email address of the recipient when sending a private 1:1 message. | | toPersonEmail | The email address of the recipient when sending a private 1:1 message. |
| atSomeoneInRoom | If the message destination is room, the emails of the person being @, use `,` (eng commas) to separate multiple emails. | | atSomeoneInRoom | If the message destination is room, the emails of the person being @, use `,` (eng commas) to separate multiple emails. |
| destination |The destination of the message (one message only support one destination). | | destination | The destination of the message (one message only support one destination). |
## Create Bot ## Create Bot
@ -58,4 +58,5 @@ The `Room ID` we can acquire it from the `id` of creating a new group chat room
## References: ## References:
- [WebexTeams Application Bot Guide](https://developer.webex.com/docs/bots) - [WebexTeams Application Bot Guide](https://developer.webex.com/docs/bots)
- [WebexTeams Message Guide](https://developer.webex.com/docs/api/v1/messages/create-a-message) - [WebexTeams Message Guide](https://developer.webex.com/docs/api/v1/messages/create-a-message)

View File

@ -40,7 +40,6 @@ The following is the `query userId` API example:
APP: https://work.weixin.qq.com/api/doc/90000/90135/90236 APP: https://work.weixin.qq.com/api/doc/90000/90135/90236
### Group Chat ### Group Chat
The Group Chat send type means to notify the alert results via group chat created by Enterprise WeChat API, sending messages to all members of the group and specified users are not supported. The Group Chat send type means to notify the alert results via group chat created by Enterprise WeChat API, sending messages to all members of the group and specified users are not supported.
@ -68,4 +67,5 @@ The following is the `create new group chat` API and `query userId` API example:
## Reference ## Reference
- Group Chathttps://work.weixin.qq.com/api/doc/90000/90135/90248 - Group Chathttps://work.weixin.qq.com/api/doc/90000/90135/90248

View File

@ -10,6 +10,7 @@ The following shows the `Feishu` configuration example:
## Parameter Configuration ## Parameter Configuration
* Webhook * Webhook
> Copy the robot webhook URL shown below: > Copy the robot webhook URL shown below:
![alert-feishu-webhook](../../../../img/new_ui/dev/alert/alert_feishu_webhook.png) ![alert-feishu-webhook](../../../../img/new_ui/dev/alert/alert_feishu_webhook.png)

View File

@ -4,13 +4,13 @@ If you need to use `Http script` for alerting, create an alert instance in the a
## Parameter Configuration ## Parameter Configuration
| **Parameter** | **Description** | | **Parameter** | **Description** |
| --- | --- | |---------------|-----------------------------------------------------------------------------------------------------|
| URL | The `Http` request URL needs to contain protocol, host, path and parameters if the method is `GET`. | | URL | The `Http` request URL needs to contain protocol, host, path and parameters if the method is `GET`. |
| Request Type | Select the request type from `POST` or `GET`. | | Request Type | Select the request type from `POST` or `GET`. |
| Headers | The headers of the `Http` request in JSON format. | | Headers | The headers of the `Http` request in JSON format. |
| Body | The request body of the `Http` request in JSON format, when using `POST` method to alert. | | Body | The request body of the `Http` request in JSON format, when using `POST` method to alert. |
| Content Field | The field name to place the alert information. | | Content Field | The field name to place the alert information. |
## Send Type ## Send Type
@ -28,4 +28,4 @@ The following shows the `GET` configuration example:
Send alert information inside `Http` body by `Http` POST method. Send alert information inside `Http` body by `Http` POST method.
The following shows the `POST` configuration example: The following shows the `POST` configuration example:
![enterprise-wechat-app-msg-config](../../../../img/alert/http-post-example.png) ![enterprise-wechat-app-msg-config](../../../../img/alert/http-post-example.png)

View File

@ -1,18 +1,18 @@
# Script # Script
If you need to use `Shell script` for alerting, create an alert instance in the alert instance management and select the `Script` plugin. If you need to use `Shell script` for alerting, create an alert instance in the alert instance management and select the `Script` plugin.
The following shows the `Script` configuration example: The following shows the `Script` configuration example:
![dingtalk-plugin](../../../../img/alert/script-plugin.png) ![dingtalk-plugin](../../../../img/alert/script-plugin.png)
## Parameter Configuration ## Parameter Configuration
| **Parameter** | **Description** | | **Parameter** | **Description** |
| --- | --- | |---------------|--------------------------------------------------|
| User Params | User defined parameters will pass to the script. | | User Params | User defined parameters will pass to the script. |
| Script Path |The file location path in the server. | | Script Path | The file location path in the server. |
| Type | Support `Shell` script. | | Type | Support `Shell` script. |
### Note ### Note
Consider the script file access privileges with the executing tenant. Consider the script file access privileges with the executing tenant.

View File

@ -7,17 +7,17 @@ The following shows the `Telegram` configuration example:
## Parameter Configuration ## Parameter Configuration
| **Parameter** | **Description** | | **Parameter** | **Description** |
| --- | --- | |---------------|---------------------------------------------------------------|
| WebHook | The WebHook of Telegram when use robot to send message. | | WebHook | The WebHook of Telegram when use robot to send message. |
| botToken | The access token of robot. | | botToken | The access token of robot. |
| chatId | Sub Telegram Channel. | | chatId | Sub Telegram Channel. |
| parseMode | Message parse type (support txt, markdown, markdownV2, html). | | parseMode | Message parse type (support txt, markdown, markdownV2, html). |
| EnableProxy | Enable proxy sever. | | EnableProxy | Enable proxy sever. |
| Proxy | The proxy address of the proxy server. | | Proxy | The proxy address of the proxy server. |
| Port | The proxy port of proxy server. | | Port | The proxy port of proxy server. |
| User | Authentication(Username) for the proxy server. | | User | Authentication(Username) for the proxy server. |
| Password | Authentication(Password) for the proxy server. | | Password | Authentication(Password) for the proxy server. |
### NOTE ### NOTE
@ -34,4 +34,5 @@ The webhook needs to be able to receive and use the same JSON body of HTTP POST
- [Telegram Application Bot Guide](https://core.telegram.org/bots) - [Telegram Application Bot Guide](https://core.telegram.org/bots)
- [Telegram Bots Api](https://core.telegram.org/bots/api) - [Telegram Bots Api](https://core.telegram.org/bots/api)
- [Telegram SendMessage Api](https://core.telegram.org/bots/api#sendmessage) - [Telegram SendMessage Api](https://core.telegram.org/bots/api#sendmessage)

View File

@ -39,3 +39,4 @@ curl --request GET 'http://localhost:50053/actuator/health'
``` ```
> Notice: If you modify the default service port and address, you need to modify the IP+Port to the modified value. > Notice: If you modify the default service port and address, you need to modify the IP+Port to the modified value.

View File

@ -10,11 +10,11 @@ Generally, projects and processes are created through pages, but considering the
1. Log in to the scheduling system, click "Security", then click "Token manage" on the left, and click "Create token" to create a token. 1. Log in to the scheduling system, click "Security", then click "Token manage" on the left, and click "Create token" to create a token.
![create-token](../../../img/new_ui/dev/security/create-token.png) ![create-token](../../../../img/new_ui/dev/security/create-token.png)
2. Select the "Expiration time" (Token validity time), select "User" (choose the specified user to perform the API operation), click "Generate token", copy the `Token` string, and click "Submit". 2. Select the "Expiration time" (Token validity time), select "User" (choose the specified user to perform the API operation), click "Generate token", copy the `Token` string, and click "Submit".
![token-expiration](../../../img/new_ui/dev/open-api/token_expiration.png) ![token-expiration](../../../../img/new_ui/dev/open-api/token_expiration.png)
### Examples ### Examples
@ -24,19 +24,19 @@ Generally, projects and processes are created through pages, but considering the
> Addresshttp://{API server ip}:12345/dolphinscheduler/swagger-ui/index.html?language=en_US&lang=en > Addresshttp://{API server ip}:12345/dolphinscheduler/swagger-ui/index.html?language=en_US&lang=en
![api-doc](../../../img/new_ui/dev/open-api/api_doc.png) ![api-doc](../../../../img/new_ui/dev/open-api/api_doc.png)
2. select a test API, the API selected for this test is `queryAllProjectList` 2. select a test API, the API selected for this test is `queryAllProjectList`
> projects/list > projects/list
>
3. Open `Postman`, fill in the API address, enter the `Token` in `Headers`, and then send the request to view the result: 3. Open `Postman`, fill in the API address, enter the `Token` in `Headers`, and then send the request to view the result:
``` ```
token: The Token just generated token: The Token just generated
``` ```
![api-test](../../../img/new_ui/dev/open-api/api_test.png) ![api-test](../../../../img/new_ui/dev/open-api/api_test.png)
#### Create a Project #### Create a Project
@ -44,15 +44,15 @@ This demonstrates how to use the calling api to create the corresponding project
By consulting the api documentation, configure the KEY as Accept and VALUE as the parameter of application/json in the headers of Postman. By consulting the api documentation, configure the KEY as Accept and VALUE as the parameter of application/json in the headers of Postman.
![create-project01](../../../img/new_ui/dev/open-api/create_project01.png) ![create-project01](../../../../img/new_ui/dev/open-api/create_project01.png)
And then configure the required projectName and description parameters in Body. And then configure the required projectName and description parameters in Body.
![create-project02](../../../img/new_ui/dev/open-api/create_project02.png) ![create-project02](../../../../img/new_ui/dev/open-api/create_project02.png)
Check the post request result. Check the post request result.
![create-project03](../../../img/new_ui/dev/open-api/create_project03.png) ![create-project03](../../../../img/new_ui/dev/open-api/create_project03.png)
The returned `msg` information is "success", indicating that we have successfully created the project through API. The returned `msg` information is "success", indicating that we have successfully created the project through API.
@ -60,6 +60,6 @@ If you are interested in the source code of creating a project, please continue
### Appendix The Source Code of Creating a Project ### Appendix The Source Code of Creating a Project
![api-source01](../../../img/new_ui/dev/open-api/api_source01.png) ![api-source01](../../../../img/new_ui/dev/open-api/api_source01.png)
![api-source02](../../../img/new_ui/dev/open-api/api_source02.png) ![api-source02](../../../../img/new_ui/dev/open-api/api_source02.png)

View File

@ -0,0 +1,5 @@
# PyDolphinScheduler
PyDolphinScheduler is python API for Apache DolphinScheduler, which allow you definition your workflow by python code, aka workflow-as-codes.
For more information, please refer to [PyDolphinScheduler](https://dolphinscheduler.apache.org/python/main/)

View File

@ -1,4 +1,5 @@
# Data Quality # Data Quality
## Introduction ## Introduction
The data quality task is used to check the data accuracy during the integration and processing of data. Data quality tasks in this release include single-table checking, single-table custom SQL checking, multi-table accuracy, and two-table value comparisons. The running environment of the data quality task is Spark 2.4.0, and other versions have not been verified, and users can verify by themselves. The data quality task is used to check the data accuracy during the integration and processing of data. Data quality tasks in this release include single-table checking, single-table custom SQL checking, multi-table accuracy, and two-table value comparisons. The running environment of the data quality task is Spark 2.4.0, and other versions have not been verified, and users can verify by themselves.
@ -7,9 +8,9 @@ The execution logic of the data quality task is as follows:
- The user defines the task in the interface, and the user input value is stored in `TaskParam`. - The user defines the task in the interface, and the user input value is stored in `TaskParam`.
- When running a task, `Master` will parse `TaskParam`, encapsulate the parameters required by `DataQualityTask` and send it to `Worker`. - When running a task, `Master` will parse `TaskParam`, encapsulate the parameters required by `DataQualityTask` and send it to `Worker`.
- Worker runs the data quality task. After the data quality task finishes running, it writes the statistical results to the specified storage engine. - Worker runs the data quality task. After the data quality task finishes running, it writes the statistical results to the specified storage engine.
- The current data quality task result is stored in the `t_ds_dq_execute_result` table of `dolphinscheduler` - The current data quality task result is stored in the `t_ds_dq_execute_result` table of `dolphinscheduler`
`Worker` sends the task result to `Master`, after `Master` receives `TaskResponse`, it will judge whether the task type is `DataQualityTask`, if so, it will read the corresponding result from `t_ds_dq_execute_result` according to `taskInstanceId`, and then The result is judged according to the check mode, operator and threshold configured by the user. `Worker` sends the task result to `Master`, after `Master` receives `TaskResponse`, it will judge whether the task type is `DataQualityTask`, if so, it will read the corresponding result from `t_ds_dq_execute_result` according to `taskInstanceId`, and then The result is judged according to the check mode, operator and threshold configured by the user.
- If the result is a failure, the corresponding operation, alarm or interruption will be performed according to the failure policy configured by the user. - If the result is a failure, the corresponding operation, alarm or interruption will be performed according to the failure policy configured by the user.
- Add config : `<server-name>/conf/common.properties` - Add config : `<server-name>/conf/common.properties`
@ -21,20 +22,20 @@ data-quality.jar.name=dolphinscheduler-data-quality-dev-SNAPSHOT.jar
- Please fill in `data-quality.jar.name` according to the actual package name. - Please fill in `data-quality.jar.name` according to the actual package name.
- If you package `data-quality` separately, remember to modify the package name to be consistent with `data-quality.jar.name`. - If you package `data-quality` separately, remember to modify the package name to be consistent with `data-quality.jar.name`.
- If the old version is upgraded and used, you need to execute the `sql` update script to initialize the database before running. - If the old version is upgraded and used, you need to execute the `sql` update script to initialize the database before running.
- If you want to use `MySQL` data, you need to comment out the `scope` of `MySQL` in `pom.xml`. - `dolphinscheduler-data-quality-dev-SNAPSHOT.jar` was built with no dependencies. If a `JDBC` driver is required, you can set the `-jars` parameter in the `node settings` `Option Parameters`, e.g. `--jars /lib/jars/mysql-connector-java-8.0.16.jar`.
- Currently only `MySQL`, `PostgreSQL` and `HIVE` data sources have been tested, other data sources have not been tested yet. - Currently only `MySQL`, `PostgreSQL` and `HIVE` data sources have been tested, other data sources have not been tested yet.
- `Spark` needs to be configured to read `Hive` metadata, `Spark` does not use `jdbc` to read `Hive`. - `Spark` needs to be configured to read `Hive` metadata, `Spark` does not use `jdbc` to read `Hive`.
## Detailed Inspection Logic ## Detailed Inspection Logic
| **Parameter** | **Description** | | **Parameter** | **Description** |
| ----- | ---- | |---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| CheckMethod | [CheckFormula][Operator][Threshold], if the result is true, it indicates that the data does not meet expectations, and the failure strategy is executed. | | CheckMethod | [CheckFormula][Operator][Threshold], if the result is true, it indicates that the data does not meet expectations, and the failure strategy is executed. |
| CheckFormula | <ul><li>Expected-Actual</li><li>Actual-Expected</li><li>(Actual/Expected)x100%</li><li>(Expected-Actual)/Expected x100%</li></ul> | | CheckFormula | <ul><li>Expected-Actual</li><li>Actual-Expected</li><li>(Actual/Expected)x100%</li><li>(Expected-Actual)/Expected x100%</li></ul> |
| Operator | =, >, >=, <, <=, != | | Operator | =, >, >=, <, <=, != |
| ExpectedValue | <ul><li>FixValue</li><li>DailyAvg</li><li>WeeklyAvg</li><li>MonthlyAvg</li><li>Last7DayAvg</li><li>Last30DayAvg</li><li>SrcTableTotalRows</li><li>TargetTableTotalRows</li></ul> | | ExpectedValue | <ul><li>FixValue</li><li>DailyAvg</li><li>WeeklyAvg</li><li>MonthlyAvg</li><li>Last7DayAvg</li><li>Last30DayAvg</li><li>SrcTableTotalRows</li><li>TargetTableTotalRows</li></ul> |
| Example |<ul><li>CheckFormulaExpected-Actual</li><li>Operator></li><li>Threshold0</li><li>ExpectedValueFixValue=9</li></ul> | Example | <ul><li>CheckFormulaExpected-Actual</li><li>Operator></li><li>Threshold0</li><li>ExpectedValueFixValue=9</li></ul> |
In the example, assuming that the actual value is 10, the operator is >, and the expected value is 9, then the result 10 -9 > 0 is true, which means that the row data in the empty column has exceeded the threshold, and the task is judged to fail. In the example, assuming that the actual value is 10, the operator is >, and the expected value is 9, then the result 10 -9 > 0 is true, which means that the row data in the empty column has exceeded the threshold, and the task is judged to fail.
# Task Operation Guide # Task Operation Guide
@ -50,7 +51,6 @@ The goal of the null value check is to check the number of empty rows in the spe
```sql ```sql
SELECT COUNT(*) AS miss FROM ${src_table} WHERE (${src_field} is null or ${src_field} = '') AND (${src_filter}) SELECT COUNT(*) AS miss FROM ${src_table} WHERE (${src_field} is null or ${src_field} = '') AND (${src_filter})
``` ```
- The SQL to calculate the total number of rows in the table is as follows: - The SQL to calculate the total number of rows in the table is as follows:
```sql ```sql
@ -61,155 +61,163 @@ The goal of the null value check is to check the number of empty rows in the spe
![dataquality_null_check](../../../img/tasks/demo/null_check.png) ![dataquality_null_check](../../../img/tasks/demo/null_check.png)
| **Parameter** | **Description** | | **Parameter** | **Description** |
| ----- | ---- | |------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Source data type | Select MySQL, PostgreSQL, etc. | | Source data type | Select MySQL, PostgreSQL, etc. |
| Source data source | The corresponding data source under the source data type. | | Source data source | The corresponding data source under the source data type. |
| Source data table | Drop-down to select the table where the validation data is located. | | Source data table | Drop-down to select the table where the validation data is located. |
| Src filter conditions | Such as the title, it will also be used when counting the total number of rows in the table, optional. | | Src filter conditions | Such as the title, it will also be used when counting the total number of rows in the table, optional. |
| Src table check column | Drop-down to select the check column name. | | Src table check column | Drop-down to select the check column name. |
| Check method | <ul><li>[Expected-Actual]</li><li>[Actual-Expected]</li><li>[Actual/Expected]x100%</li><li>[(Expected-Actual)/Expected]x100%</li></ul> | | Check method | <ul><li>[Expected-Actual]</li><li>[Actual-Expected]</li><li>[Actual/Expected]x100%</li><li>[(Expected-Actual)/Expected]x100%</li></ul> |
| Check operators | =, >, >=, <, <=, ! = | | Check operators | =, >, >=, <, <=, ! = |
| Threshold | The value used in the formula for comparison. | | Threshold | The value used in the formula for comparison. |
| Failure strategy | <ul><li>Alert: The data quality task failed, the DolphinScheduler task result is successful, and an alert is sent.</li><li>Blocking: The data quality task fails, the DolphinScheduler task result is failed, and an alarm is sent.</li></ul> | | Failure strategy | <ul><li>Alert: The data quality task failed, the DolphinScheduler task result is successful, and an alert is sent.</li><li>Blocking: The data quality task fails, the DolphinScheduler task result is failed, and an alarm is sent.</li></ul> |
| Expected value type | Select the desired type from the drop-down menu. | | Expected value type | Select the desired type from the drop-down menu. |
## Timeliness Check of Single Table Check ## Timeliness Check of Single Table Check
### Inspection Introduction ### Inspection Introduction
The timeliness check is used to check whether the data is processed within the expected time. The start time and end time can be specified to define the time range. If the amount of data within the time range does not reach the set threshold, the check task will be judged as fail. The timeliness check is used to check whether the data is processed within the expected time. The start time and end time can be specified to define the time range. If the amount of data within the time range does not reach the set threshold, the check task will be judged as fail.
### Interface Operation Guide ### Interface Operation Guide
![dataquality_timeliness_check](../../../img/tasks/demo/timeliness_check.png) ![dataquality_timeliness_check](../../../img/tasks/demo/timeliness_check.png)
| **Parameter** | **Description** | | **Parameter** | **Description** |
| ----- | ---- | |------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Source data type | Select MySQL, PostgreSQL, etc. | Source data type | Select MySQL, PostgreSQL, etc. |
| Source data source | The corresponding data source under the source data type. | Source data source | The corresponding data source under the source data type. |
| Source data table | Drop-down to select the table where the validation data is located. | | Source data table | Drop-down to select the table where the validation data is located. |
| Src filter conditions | Such as the title, it will also be used when counting the total number of rows in the table, optional. | | Src filter conditions | Such as the title, it will also be used when counting the total number of rows in the table, optional. |
| Src table check column | Drop-down to select check column name. | | Src table check column | Drop-down to select check column name. |
| Start time | The start time of a time range. | | Start time | The start time of a time range. |
| end time | The end time of a time range. | | end time | The end time of a time range. |
| Time Format | Set the corresponding time format. | | Time Format | Set the corresponding time format. |
| Check method | <ul><li>[Expected-Actual]</li><li>[Actual-Expected]</li><li>[Actual/Expected]x100%</li><li>[(Expected-Actual)/Expected]x100%</li></ul> | | Check method | <ul><li>[Expected-Actual]</li><li>[Actual-Expected]</li><li>[Actual/Expected]x100%</li><li>[(Expected-Actual)/Expected]x100%</li></ul> |
| Check operators | =, >, >=, <, <=, ! = | | Check operators | =, >, >=, <, <=, ! = |
| Threshold | The value used in the formula for comparison. | | Threshold | The value used in the formula for comparison. |
| Failure strategy | <ul><li>Alert: The data quality task failed, the DolphinScheduler task result is successful, and an alert is sent.</li><li>Blocking: The data quality task fails, the DolphinScheduler task result is failed, and an alarm is sent.</li></ul> | | Failure strategy | <ul><li>Alert: The data quality task failed, the DolphinScheduler task result is successful, and an alert is sent.</li><li>Blocking: The data quality task fails, the DolphinScheduler task result is failed, and an alarm is sent.</li></ul> |
| Expected value type | Select the desired type from the drop-down menu. | | Expected value type | Select the desired type from the drop-down menu. |
## Field Length Check for Single Table Check ## Field Length Check for Single Table Check
### Inspection Introduction ### Inspection Introduction
The goal of field length verification is to check whether the length of the selected field meets the expectations. If there is data that does not meet the requirements, and the number of rows exceeds the threshold, the task will be judged to fail. The goal of field length verification is to check whether the length of the selected field meets the expectations. If there is data that does not meet the requirements, and the number of rows exceeds the threshold, the task will be judged to fail.
### Interface Operation Guide ### Interface Operation Guide
![dataquality_length_check](../../../img/tasks/demo/field_length_check.png) ![dataquality_length_check](../../../img/tasks/demo/field_length_check.png)
| **Parameter** | **Description** | | **Parameter** | **Description** |
| ----- | ---- | |------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Source data type | Select MySQL, PostgreSQL, etc. | | Source data type | Select MySQL, PostgreSQL, etc. |
| Source data source | The corresponding data source under the source data type. | | Source data source | The corresponding data source under the source data type. |
| Source data table | Drop-down to select the table where the validation data is located. | | Source data table | Drop-down to select the table where the validation data is located. |
| Src filter conditions | Such as the title, it will also be used when counting the total number of rows in the table, optional. | | Src filter conditions | Such as the title, it will also be used when counting the total number of rows in the table, optional. |
| Src table check column | Drop-down to select the check column name. | | Src table check column | Drop-down to select the check column name. |
| Logical operators | =, >, >=, <, <=, ! = | | Logical operators | =, >, >=, <, <=, ! = |
| Field length limit | Like the title. | | Field length limit | Like the title. |
| Check method | <ul><li>[Expected-Actual]</li><li>[Actual-Expected]</li><li>[Actual/Expected]x100%</li><li>[(Expected-Actual)/Expected]x100%</li></ul> | | Check method | <ul><li>[Expected-Actual]</li><li>[Actual-Expected]</li><li>[Actual/Expected]x100%</li><li>[(Expected-Actual)/Expected]x100%</li></ul> |
| Check operators | =, >, >=, <, <=, ! = | | Check operators | =, >, >=, <, <=, ! = |
| Threshold | The value used in the formula for comparison. | | Threshold | The value used in the formula for comparison. |
| Failure strategy | <ul><li>Alert: The data quality task failed, the DolphinScheduler task result is successful, and an alert is sent.</li><li>Blocking: The data quality task fails, the DolphinScheduler task result is failed, and an alarm is sent.</li></ul> | | Failure strategy | <ul><li>Alert: The data quality task failed, the DolphinScheduler task result is successful, and an alert is sent.</li><li>Blocking: The data quality task fails, the DolphinScheduler task result is failed, and an alarm is sent.</li></ul> |
| Expected value type | Select the desired type from the drop-down menu. | | Expected value type | Select the desired type from the drop-down menu. |
## Uniqueness Check for Single Table Check ## Uniqueness Check for Single Table Check
### Inspection Introduction ### Inspection Introduction
The goal of the uniqueness check is to check whether the fields are duplicated. It is generally used to check whether the primary key is duplicated. If there are duplicates and the threshold is reached, the check task will be judged to be failed. The goal of the uniqueness check is to check whether the fields are duplicated. It is generally used to check whether the primary key is duplicated. If there are duplicates and the threshold is reached, the check task will be judged to be failed.
### Interface Operation Guide ### Interface Operation Guide
![dataquality_uniqueness_check](../../../img/tasks/demo/uniqueness_check.png) ![dataquality_uniqueness_check](../../../img/tasks/demo/uniqueness_check.png)
| **Parameter** | **Description** | | **Parameter** | **Description** |
| ----- | ---- | |------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Source data type | Select MySQL, PostgreSQL, etc. | | Source data type | Select MySQL, PostgreSQL, etc. |
| Source data source | The corresponding data source under the source data type. | | Source data source | The corresponding data source under the source data type. |
| Source data table | Drop-down to select the table where the validation data is located. | | Source data table | Drop-down to select the table where the validation data is located. |
| Src filter conditions | Such as the title, it will also be used when counting the total number of rows in the table, optional. | | Src filter conditions | Such as the title, it will also be used when counting the total number of rows in the table, optional. |
| Src table check column | Drop-down to select the check column name. | | Src table check column | Drop-down to select the check column name. |
| Check method | <ul><li>[Expected-Actual]</li><li>[Actual-Expected]</li><li>[Actual/Expected]x100%</li><li>[(Expected-Actual)/Expected]x100%</li></ul> | | Check method | <ul><li>[Expected-Actual]</li><li>[Actual-Expected]</li><li>[Actual/Expected]x100%</li><li>[(Expected-Actual)/Expected]x100%</li></ul> |
| Check operators | =, >, >=, <, <=, ! = | | Check operators | =, >, >=, <, <=, ! = |
| Threshold | The value used in the formula for comparison. | | Threshold | The value used in the formula for comparison. |
| Failure strategy | <ul><li>Alert: The data quality task failed, the DolphinScheduler task result is successful, and an alert is sent.</li><li>Blocking: The data quality task fails, the DolphinScheduler task result is failed, and an alarm is sent.</li></ul> | | Failure strategy | <ul><li>Alert: The data quality task failed, the DolphinScheduler task result is successful, and an alert is sent.</li><li>Blocking: The data quality task fails, the DolphinScheduler task result is failed, and an alarm is sent.</li></ul> |
| Expected value type | Select the desired type from the drop-down menu. | | Expected value type | Select the desired type from the drop-down menu. |
## Regular Expression Check for Single Table Check ## Regular Expression Check for Single Table Check
### Inspection Introduction ### Inspection Introduction
The goal of regular expression verification is to check whether the format of the value of a field meets the requirements, such as time format, email format, ID card format, etc. If there is data that does not meet the format and exceeds the threshold, the task will be judged as failed. The goal of regular expression verification is to check whether the format of the value of a field meets the requirements, such as time format, email format, ID card format, etc. If there is data that does not meet the format and exceeds the threshold, the task will be judged as failed.
### Interface Operation Guide ### Interface Operation Guide
![dataquality_regex_check](../../../img/tasks/demo/regexp_check.png) ![dataquality_regex_check](../../../img/tasks/demo/regexp_check.png)
| **Parameter** | **Description** | | **Parameter** | **Description** |
| ----- | ---- | |------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Source data type | Select MySQL, PostgreSQL, etc. | | Source data type | Select MySQL, PostgreSQL, etc. |
| Source data source | The corresponding data source under the source data type. | | Source data source | The corresponding data source under the source data type. |
| Source data table | Drop-down to select the table where the validation data is located. | | Source data table | Drop-down to select the table where the validation data is located. |
| Src filter conditions | Such as the title, it will also be used when counting the total number of rows in the table, optional. | | Src filter conditions | Such as the title, it will also be used when counting the total number of rows in the table, optional. |
| Src table check column | Drop-down to select check column name. | | Src table check column | Drop-down to select check column name. |
| Regular expression | As title. | | Regular expression | As title. |
| Check method | <ul><li>[Expected-Actual]</li><li>[Actual-Expected]</li><li>[Actual/Expected]x100%</li><li>[(Expected-Actual)/Expected]x100%</li></ul> | | Check method | <ul><li>[Expected-Actual]</li><li>[Actual-Expected]</li><li>[Actual/Expected]x100%</li><li>[(Expected-Actual)/Expected]x100%</li></ul> |
| Check operators | =, >, >=, <, <=, ! = | | Check operators | =, >, >=, <, <=, ! = |
| Threshold | The value used in the formula for comparison. | | Threshold | The value used in the formula for comparison. |
| Failure strategy | <ul><li>Alert: The data quality task failed, the DolphinScheduler task result is successful, and an alert is sent.</li><li>Blocking: The data quality task fails, the DolphinScheduler task result is failed, and an alarm is sent.</li></ul> | | Failure strategy | <ul><li>Alert: The data quality task failed, the DolphinScheduler task result is successful, and an alert is sent.</li><li>Blocking: The data quality task fails, the DolphinScheduler task result is failed, and an alarm is sent.</li></ul> |
| Expected value type | Select the desired type from the drop-down menu. | | Expected value type | Select the desired type from the drop-down menu. |
## Enumeration Value Validation for Single Table Check ## Enumeration Value Validation for Single Table Check
### Inspection Introduction ### Inspection Introduction
The goal of enumeration value verification is to check whether the value of a field is within the range of the enumeration value. If there is data that is not in the range of the enumeration value and exceeds the threshold, the task will be judged to fail. The goal of enumeration value verification is to check whether the value of a field is within the range of the enumeration value. If there is data that is not in the range of the enumeration value and exceeds the threshold, the task will be judged to fail.
### Interface Operation Guide ### Interface Operation Guide
![dataquality_enum_check](../../../img/tasks/demo/enumeration_check.png) ![dataquality_enum_check](../../../img/tasks/demo/enumeration_check.png)
| **Parameter** | **Description** | | **Parameter** | **Description** |
| ----- | ---- | |-----------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Source data type | Select MySQL, PostgreSQL, etc. | | Source data type | Select MySQL, PostgreSQL, etc. |
| Source data source | The corresponding data source under the source data type. | | Source data source | The corresponding data source under the source data type. |
| Source data table | Drop-down to select the table where the validation data is located. | | Source data table | Drop-down to select the table where the validation data is located. |
| Src table filter conditions | Such as title, also used when counting the total number of rows in the table, optional. | | Src table filter conditions | Such as title, also used when counting the total number of rows in the table, optional. |
| Src table check column | Drop-down to select the check column name. | | Src table check column | Drop-down to select the check column name. |
| List of enumeration values | Separated by commas. | | List of enumeration values | Separated by commas. |
| Check method | <ul><li>[Expected-Actual]</li><li>[Actual-Expected]</li><li>[Actual/Expected]x100%</li><li>[(Expected-Actual)/Expected]x100%</li></ul> | | Check method | <ul><li>[Expected-Actual]</li><li>[Actual-Expected]</li><li>[Actual/Expected]x100%</li><li>[(Expected-Actual)/Expected]x100%</li></ul> |
| Check operators | =, >, >=, <, <=, ! = | | Check operators | =, >, >=, <, <=, ! = |
| Threshold | The value used in the formula for comparison. | | Threshold | The value used in the formula for comparison. |
| Failure strategy | <ul><li>Alert: The data quality task failed, the DolphinScheduler task result is successful, and an alert is sent.</li><li>Blocking: The data quality task fails, the DolphinScheduler task result is failed, and an alarm is sent.</li></ul> | | Failure strategy | <ul><li>Alert: The data quality task failed, the DolphinScheduler task result is successful, and an alert is sent.</li><li>Blocking: The data quality task fails, the DolphinScheduler task result is failed, and an alarm is sent.</li></ul> |
| Expected value type | Select the desired type from the drop-down menu. | | Expected value type | Select the desired type from the drop-down menu. |
## Table Row Number Verification for Single Table Check ## Table Row Number Verification for Single Table Check
### Inspection Introduction ### Inspection Introduction
The goal of table row number verification is to check whether the number of rows in the table reaches the expected value. If the number of rows does not meet the standard, the task will be judged as failed. The goal of table row number verification is to check whether the number of rows in the table reaches the expected value. If the number of rows does not meet the standard, the task will be judged as failed.
### Interface Operation Guide ### Interface Operation Guide
![dataquality_count_check](../../../img/tasks/demo/table_count_check.png) ![dataquality_count_check](../../../img/tasks/demo/table_count_check.png)
| **Parameter** | **Description** | | **Parameter** | **Description** |
| ----- | ---- | |------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Source data type | Select MySQL, PostgreSQL, etc. | | Source data type | Select MySQL, PostgreSQL, etc. |
| Source data source | The corresponding data source under the source data type. | | Source data source | The corresponding data source under the source data type. |
| Source data table | Drop-down to select the table where the validation data is located. | | Source data table | Drop-down to select the table where the validation data is located. |
| Src filter conditions | Such as the title, it will also be used when counting the total number of rows in the table, optional. | | Src filter conditions | Such as the title, it will also be used when counting the total number of rows in the table, optional. |
| Src table check column | Drop-down to select the check column name. | | Src table check column | Drop-down to select the check column name. |
| Check method | <ul><li>[Expected-Actual]</li><li>[Actual-Expected]</li><li>[Actual/Expected]x100%</li><li>[(Expected-Actual)/Expected]x100%</li></ul> | | Check method | <ul><li>[Expected-Actual]</li><li>[Actual-Expected]</li><li>[Actual/Expected]x100%</li><li>[(Expected-Actual)/Expected]x100%</li></ul> |
| Check operators | =, >, >=, <, <=, ! = | | Check operators | =, >, >=, <, <=, ! = |
| Threshold | The value used in the formula for comparison. | | Threshold | The value used in the formula for comparison. |
| Failure strategy | <ul><li>Alert: The data quality task failed, the DolphinScheduler task result is successful, and an alert is sent.</li><li>Blocking: The data quality task fails, the DolphinScheduler task result is failed, and an alarm is sent.</li></ul> | | Failure strategy | <ul><li>Alert: The data quality task failed, the DolphinScheduler task result is successful, and an alert is sent.</li><li>Blocking: The data quality task fails, the DolphinScheduler task result is failed, and an alarm is sent.</li></ul> |
| Expected value type | Select the desired type from the drop-down menu. | | Expected value type | Select the desired type from the drop-down menu. |
## Custom SQL Check for Single Table Check ## Custom SQL Check for Single Table Check
@ -217,36 +225,38 @@ The goal of table row number verification is to check whether the number of rows
![dataquality_custom_sql_check](../../../img/tasks/demo/custom_sql_check.png) ![dataquality_custom_sql_check](../../../img/tasks/demo/custom_sql_check.png)
| **Parameter** | **Description** | | **Parameter** | **Description** |
| ----- | ---- | |------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Source data type | Select MySQL, PostgreSQL, etc. | | Source data type | Select MySQL, PostgreSQL, etc. |
| Source data source | The corresponding data source under the source data type. | | Source data source | The corresponding data source under the source data type. |
| Source data table | Drop-down to select the table where the data to be verified is located. | | Source data table | Drop-down to select the table where the data to be verified is located. |
| Actual value name | Alias in SQL for statistical value calculation, such as max_num. | | Actual value name | Alias in SQL for statistical value calculation, such as max_num. |
|Actual value calculation SQL | SQL for outputting actual values. Note:<ul><li>The SQL must be statistical SQL, such as counting the number of rows, calculating the maximum value, minimum value, etc.</li><li>Select max(a) as max_num from ${src_table}, the table name must be filled like this.</li></ul> | | Actual value calculation SQL | SQL for outputting actual values. Note:<ul><li>The SQL must be statistical SQL, such as counting the number of rows, calculating the maximum value, minimum value, etc.</li><li>Select max(a) as max_num from ${src_table}, the table name must be filled like this.</li></ul> |
| Src filter conditions | Such as the title, it will also be used when counting the total number of rows in the table, optional. | | Src filter conditions | Such as the title, it will also be used when counting the total number of rows in the table, optional. |
| Check method | <ul><li>[Expected-Actual]</li><li>[Actual-Expected]</li><li>[Actual/Expected]x100%</li><li>[(Expected-Actual)/Expected]x100%</li></ul> | | Check method | <ul><li>[Expected-Actual]</li><li>[Actual-Expected]</li><li>[Actual/Expected]x100%</li><li>[(Expected-Actual)/Expected]x100%</li></ul> |
| Check operators | =, >, >=, <, <=, ! = | | Check operators | =, >, >=, <, <=, ! = |
| Threshold | The value used in the formula for comparison. | | Threshold | The value used in the formula for comparison. |
| Failure strategy | <ul><li>Alert: The data quality task failed, the DolphinScheduler task result is successful, and an alert is sent.</li><li>Blocking: The data quality task fails, the DolphinScheduler task result is failed, and an alarm is sent.</li></ul> | | Failure strategy | <ul><li>Alert: The data quality task failed, the DolphinScheduler task result is successful, and an alert is sent.</li><li>Blocking: The data quality task fails, the DolphinScheduler task result is failed, and an alarm is sent.</li></ul> |
| Expected value type | Select the desired type from the drop-down menu. | | Expected value type | Select the desired type from the drop-down menu. |
## Accuracy Check of Multi-table ## Accuracy Check of Multi-table
### Inspection Introduction ### Inspection Introduction
Accuracy checks are performed by comparing the accuracy differences of data records for selected fields between two tables, examples are as follows Accuracy checks are performed by comparing the accuracy differences of data records for selected fields between two tables, examples are as follows
- table test1 - table test1
| c1 | c2 | | c1 | c2 |
| :---: | :---: | |:--:|:--:|
| a | 1 | | a | 1 |
| b | 2 | | b | 2 |
- table test2 - table test2
| c21 | c22 | | c21 | c22 |
| :---: | :---: | |:---:|:---:|
| a | 1 | | a | 1 |
| b | 3 | | b | 3 |
If you compare the data in c1 and c21, the tables test1 and test2 are exactly the same. If you compare c2 and c22, the data in table test1 and table test2 are inconsistent. If you compare the data in c1 and c21, the tables test1 and test2 are exactly the same. If you compare c2 and c22, the data in table test1 and table test2 are inconsistent.
@ -254,45 +264,47 @@ If you compare the data in c1 and c21, the tables test1 and test2 are exactly th
![dataquality_multi_table_accuracy_check](../../../img/tasks/demo/multi_table_accuracy_check.png) ![dataquality_multi_table_accuracy_check](../../../img/tasks/demo/multi_table_accuracy_check.png)
| **Parameter** | **Description** | | **Parameter** | **Description** |
| ----- | ---- | |--------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Source data type | Select MySQL, PostgreSQL, etc. | | Source data type | Select MySQL, PostgreSQL, etc. |
| Source data source | The corresponding data source under the source data type. | | Source data source | The corresponding data source under the source data type. |
| Source data table | Drop-down to select the table where the data to be verified is located. | | Source data table | Drop-down to select the table where the data to be verified is located. |
| Src filter conditions | Such as the title, it will also be used when counting the total number of rows in the table, optional. | | Src filter conditions | Such as the title, it will also be used when counting the total number of rows in the table, optional. |
| Target data type | Choose MySQL, PostgreSQL, etc. | | Target data type | Choose MySQL, PostgreSQL, etc. |
| Target data source | The corresponding data source under the source data type. | | Target data source | The corresponding data source under the source data type. |
| Target data table | Drop-down to select the table where the data to be verified is located. | | Target data table | Drop-down to select the table where the data to be verified is located. |
| Target filter conditions | Such as the title, it will also be used when counting the total number of rows in the table, optional. | | Target filter conditions | Such as the title, it will also be used when counting the total number of rows in the table, optional. |
| Check column | Fill in the source data column, operator and target data column respectively. | | Check column | Fill in the source data column, operator and target data column respectively. |
| Verification method | Select the desired verification method. | | Verification method | Select the desired verification method. |
| Operators | =, >, >=, <, <=, ! = | | Operators | =, >, >=, <, <=, ! = |
| Failure strategy | <ul><li>Alert: The data quality task failed, the DolphinScheduler task result is successful, and an alert is sent.</li><li>Blocking: The data quality task fails, the DolphinScheduler task result is failed, and an alarm is sent.</li><ul> | | Failure strategy | <ul><li>Alert: The data quality task failed, the DolphinScheduler task result is successful, and an alert is sent.</li><li>Blocking: The data quality task fails, the DolphinScheduler task result is failed, and an alarm is sent.</li><ul> |
| Expected value type | Select the desired type in the drop-down menu, only `SrcTableTotalRow`, `TargetTableTotalRow` and fixed value are suitable for selection here. | | Expected value type | Select the desired type in the drop-down menu, only `SrcTableTotalRow`, `TargetTableTotalRow` and fixed value are suitable for selection here. |
## Comparison of the values checked by the two tables ## Comparison of the values checked by the two tables
### Inspection Introduction ### Inspection Introduction
Two-table value comparison allows users to customize different SQL statistics for two tables and compare the corresponding values. For example, for the source table A, the total amount of a certain column is calculated, and for the target table, the total amount of a certain column is calculated. value sum2, compare sum1 and sum2 to determine the check result. Two-table value comparison allows users to customize different SQL statistics for two tables and compare the corresponding values. For example, for the source table A, the total amount of a certain column is calculated, and for the target table, the total amount of a certain column is calculated. value sum2, compare sum1 and sum2 to determine the check result.
### Interface Operation Guide ### Interface Operation Guide
![dataquality_multi_table_comparison_check](../../../img/tasks/demo/multi_table_comparison_check.png) ![dataquality_multi_table_comparison_check](../../../img/tasks/demo/multi_table_comparison_check.png)
| **Parameter** | **Description** | | **Parameter** | **Description** |
| ----- | ---- | |--------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Source data type | Select MySQL, PostgreSQL, etc. | | Source data type | Select MySQL, PostgreSQL, etc. |
| Source data source | The corresponding data source under the source data type. | | Source data source | The corresponding data source under the source data type. |
| Source data table | The table where the data is to be verified. | | Source data table | The table where the data is to be verified. |
| Actual value name | Calculate the alias in SQL for the actual value, such as max_age1. | | Actual value name | Calculate the alias in SQL for the actual value, such as max_age1. |
| Actual value calculation SQL | SQL for outputting actual values. Note: <ul><li>The SQL must be statistical SQL, such as counting the number of rows, calculating the maximum value, minimum value, etc.</li><li>Select max(age) as max_age1 from ${src_table} The table name must be filled like this.</li></ul> | | Actual value calculation SQL | SQL for outputting actual values. Note: <ul><li>The SQL must be statistical SQL, such as counting the number of rows, calculating the maximum value, minimum value, etc.</li><li>Select max(age) as max_age1 from ${src_table} The table name must be filled like this.</li></ul> |
| Target data type | Choose MySQL, PostgreSQL, etc. | | Target data type | Choose MySQL, PostgreSQL, etc. |
| Target data source | The corresponding data source under the source data type. | | Target data source | The corresponding data source under the source data type. |
| Target data table | The table where the data is to be verified. | | Target data table | The table where the data is to be verified. |
| Expected value name | Calculate the alias in SQL for the expected value, such as max_age2. | | Expected value name | Calculate the alias in SQL for the expected value, such as max_age2. |
| Expected value calculation SQL | SQL for outputting expected value. Note: <ul><li>The SQL must be statistical SQL, such as counting the number of rows, calculating the maximum value, minimum value, etc.</li><li>Select max(age) as max_age2 from ${target_table} The table name must be filled like this.</li></ul> | | Expected value calculation SQL | SQL for outputting expected value. Note: <ul><li>The SQL must be statistical SQL, such as counting the number of rows, calculating the maximum value, minimum value, etc.</li><li>Select max(age) as max_age2 from ${target_table} The table name must be filled like this.</li></ul> |
| Verification method | Select the desired verification method. | | Verification method | Select the desired verification method. |
| Operators | =, >, >=, <, <=, ! = | | Operators | =, >, >=, <, <=, ! = |
| Failure strategy | <ul><li>Alert: The data quality task failed, the DolphinScheduler task result is successful, and an alert is sent.</li><li>Blocking: The data quality task fails, the DolphinScheduler task result is failed, and an alarm is sent.</li></ul> | | Failure strategy | <ul><li>Alert: The data quality task failed, the DolphinScheduler task result is successful, and an alert is sent.</li><li>Blocking: The data quality task fails, the DolphinScheduler task result is failed, and an alarm is sent.</li></ul> |
## Task result view ## Task result view
@ -306,4 +318,4 @@ Two-table value comparison allows users to customize different SQL statistics fo
### Rules Details ### Rules Details
![dataquality_rule_detail](../../../img/tasks/demo/rule_detail.png) ![dataquality_rule_detail](../../../img/tasks/demo/rule_detail.png)

View File

@ -0,0 +1,23 @@
# AWS Athena
![AWS Athena](../../../../img/new_ui/dev/datasource/athena.png)
## Datasource Parameters
| **Datasource** | **Description** |
|----------------------------|-----------------------------------------------------------|
| Datasource | Select ATHENA. |
| Datasource name | Enter the name of the DataSource. |
| Description | Enter a description of the DataSource. |
| Username | Set the AWS access key. |
| Password | Set the AWS secret access key. |
| AwsRegion | Set the AWS region. |
| Database name | Enter the database name of the ATHENA connection. |
| Jdbc connection parameters | Parameter settings for ATHENA connection, in JSON format. |
## Native Supported
- No, read section example in [datasource-setting](../howto/datasource-setting.md) `DataSource Center` section to activate this datasource.
- JDBC driver configuration reference document [athena-connect-with-jdbc](https://docs.amazonaws.cn/athena/latest/ug/connect-with-jdbc.html)
- Driver download link [SimbaAthenaJDBC-2.0.31.1000/AthenaJDBC42.jar](https://s3.cn-north-1.amazonaws.com.cn/athena-downloads-cn/drivers/JDBC/SimbaAthenaJDBC-2.0.31.1000/AthenaJDBC42.jar)

View File

@ -4,18 +4,18 @@
## Datasource Parameters ## Datasource Parameters
| **Datasource** | **Description** | | **Datasource** | **Description** |
| --- | --- | |-------------------------|---------------------------------------------------------------|
| Datasource | Select CLICKHOUSE. | | Datasource | Select CLICKHOUSE. |
| Datasource Name | Enter the name of the datasource. | | Datasource Name | Enter the name of the datasource. |
| Description | Enter a description of the datasource. | | Description | Enter a description of the datasource. |
| IP/Host Name | Enter the CLICKHOUSE service IP. | | IP/Host Name | Enter the CLICKHOUSE service IP. |
| Port | Enter the CLICKHOUSE service port. | | Port | Enter the CLICKHOUSE service port. |
| Username | Set the username for CLICKHOUSE connection. | | Username | Set the username for CLICKHOUSE connection. |
| Password | Set the password for CLICKHOUSE connection. | | Password | Set the password for CLICKHOUSE connection. |
| Database Name | Enter the database name of the CLICKHOUSE connection. | | Database Name | Enter the database name of the CLICKHOUSE connection. |
| jdbc connect parameters | Parameter settings for CLICKHOUSE connection, in JSON format. | | jdbc connect parameters | Parameter settings for CLICKHOUSE connection, in JSON format. |
## Native Supported ## Native Supported
Yes, could use this datasource by default. Yes, could use this datasource by default.

View File

@ -4,18 +4,18 @@
## Datasource Parameters ## Datasource Parameters
| **Datasource** | **Description** | | **Datasource** | **Description** |
| --- | --- | |-------------------------|--------------------------------------------------------|
| Datasource | Select DB2. | | Datasource | Select DB2. |
| Datasource Name | Enter the name of the datasource. | | Datasource Name | Enter the name of the datasource. |
| Description | Enter a description of the datasource. | | Description | Enter a description of the datasource. |
| IP/Host Name | Enter the DB2 service IP. | | IP/Host Name | Enter the DB2 service IP. |
| Port | Enter the DB2 service port. | | Port | Enter the DB2 service port. |
| Username | Set the username for DB2 connection. | | Username | Set the username for DB2 connection. |
| Password | Set the password for DB2 connection. | | Password | Set the password for DB2 connection. |
| Database Name | Enter the database name of the DB2 connection. | | Database Name | Enter the database name of the DB2 connection. |
| jdbc connect parameters | Parameter settings for DB2 connection, in JSON format. | | jdbc connect parameters | Parameter settings for DB2 connection, in JSON format. |
## Native Supported ## Native Supported
Yes, could use this datasource by default. Yes, could use this datasource by default.

View File

@ -6,27 +6,27 @@
## Datasource Parameters ## Datasource Parameters
| **Datasource** | **Description** | | **Datasource** | **Description** |
| --- | --- | |----------------------------|---------------------------------------------------------|
| Datasource | Select HIVE. | | Datasource | Select HIVE. |
| Datasource name | Enter the name of the DataSource. | | Datasource name | Enter the name of the DataSource. |
| Description | Enter a description of the DataSource. | | Description | Enter a description of the DataSource. |
| IP/Host Name | Enter the HIVE service IP. | | IP/Host Name | Enter the HIVE service IP. |
| Port | Enter the HIVE service port. | | Port | Enter the HIVE service port. |
| Username | Set the username for HIVE connection. | | Username | Set the username for HIVE connection. |
| Password | Set the password for HIVE connection. | | Password | Set the password for HIVE connection. |
| Database name | Enter the database name of the HIVE connection. | | Database name | Enter the database name of the HIVE connection. |
| Jdbc connection parameters | Parameter settings for HIVE connection, in JSON format. | | Jdbc connection parameters | Parameter settings for HIVE connection, in JSON format. |
> NOTICE: If you wish to execute multiple HIVE SQL in the same session, you could set `support.hive.oneSession = true` in `common.properties`. > NOTICE: If you wish to execute multiple HIVE SQL in the same session, you could set `support.hive.oneSession = true` in `common.properties`.
> It is helpful when you try to set env variables before running HIVE SQL. Default value of `support.hive.oneSession` is `false` and multi-SQLs run in different sessions. > It is helpful when you try to set env variables before running HIVE SQL. Default value of `support.hive.oneSession` is `false` and multi-SQLs run in different sessions.
## Use HiveServer2 HA ZooKeeper ## Use HiveServer2 HA ZooKeeper
![hive-server2](../../../../img/new_ui/dev/datasource/hiveserver2.png) ![hive-server2](../../../../img/new_ui/dev/datasource/hiveserver2.png)
NOTICE: If Kerberos is disabled, ensure the parameter `hadoop.security.authentication.startup.state` is false, and parameter `java.security.krb5.conf.path` value sets null. NOTICE: If Kerberos is disabled, ensure the parameter `hadoop.security.authentication.startup.state` is false, and parameter `java.security.krb5.conf.path` value sets null.
If **Kerberos** is enabled, needs to set the following parameters in `common.properties`: If **Kerberos** is enabled, needs to set the following parameters in `common.properties`:
```conf ```conf
# whether to startup kerberos # whether to startup kerberos
@ -44,4 +44,4 @@ login.user.keytab.path=/opt/hdfs.headless.keytab
## Native Supported ## Native Supported
Yes, could use this datasource by default. Yes, could use this datasource by default.

View File

@ -4,16 +4,16 @@
## Datasource Parameters ## Datasource Parameters
| **Datasource** | **Description** | | **Datasource** | **Description** |
| --- | --- | |----------------------------|----------------------------------------------------------|
| Datasource | Select MYSQL. | | Datasource | Select MYSQL. |
| Datasource name | Enter the name of the DataSource. | | Datasource name | Enter the name of the DataSource. |
| Description | Enter a description of the DataSource. | | Description | Enter a description of the DataSource. |
| IP/Host Name | Enter the MYSQL service IP. | | IP/Host Name | Enter the MYSQL service IP. |
| Port | Enter the MYSQL service port. | | Port | Enter the MYSQL service port. |
| Username | Set the username for MYSQL connection. | | Username | Set the username for MYSQL connection. |
| Password | Set the password for MYSQL connection. | | Password | Set the password for MYSQL connection. |
| Database name | Enter the database name of the MYSQL connection. | | Database name | Enter the database name of the MYSQL connection. |
| Jdbc connection parameters | Parameter settings for MYSQL connection, in JSON format. | | Jdbc connection parameters | Parameter settings for MYSQL connection, in JSON format. |
## Native Supported ## Native Supported

View File

@ -4,18 +4,19 @@
## Datasource Parameters ## Datasource Parameters
| **Datasource** | **Description** | | **Datasource** | **Description** |
| --- | --- | |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------|
| Datasource | Select Oracle. | | Datasource | Select Oracle. |
| Datasource Name | Enter the name of the datasource. | | Datasource Name | Enter the name of the datasource. |
| Description | Enter a description of the datasource. | | Description | Enter a description of the datasource. |
| IP/Host Name | Enter the Oracle service IP. | | IP/Host Name | Enter the Oracle service IP. |
| Port | Enter the Oracle service port. | | Port | Enter the Oracle service port. |
| Username | Set the username for Oracle connection. | | Username | Set the username for Oracle connection. |
| Password | Set the password for Oracle connection. | | Password | Set the password for Oracle connection. |
| Database Name | Enter the database name of the Oracle connection. | | Database Name | Enter the ServiceName or SID of the Oracle connection. |
| jdbc connect parameters | Parameter settings for Oracle connection, in JSON format. | | ServiceName or SID | Choose ServiceName or SID according to your entry in Database Name column. |
| jdbc connect parameters | Parameter settings for Oracle connection, in JSON format. For example, you can use {"schema": "abc"} to specify database abc for using. |
## Native Supported ## Native Supported
Yes, could use this datasource by default. Yes, could use this datasource by default.

View File

@ -4,18 +4,18 @@
## Datasource Parameters ## Datasource Parameters
| **Datasource** | **Description** | | **Datasource** | **Description** |
| --- | --- | |----------------------------|---------------------------------------------------------------|
| Datasource | Select POSTGRESQL. | | Datasource | Select POSTGRESQL. |
| Datasource name | Enter the name of the DataSource. | | Datasource name | Enter the name of the DataSource. |
| Description | Enter a description of the DataSource. | | Description | Enter a description of the DataSource. |
| IP/Host Name | Enter the PostgreSQL service IP. | | IP/Host Name | Enter the PostgreSQL service IP. |
| Port | Enter the PostgreSQL service port. | | Port | Enter the PostgreSQL service port. |
| Username | Set the username for PostgreSQL connection. | | Username | Set the username for PostgreSQL connection. |
| Password | Set the password for PostgreSQL connection. | | Password | Set the password for PostgreSQL connection. |
| Database name | Enter the database name of the PostgreSQL connection. | | Database name | Enter the database name of the PostgreSQL connection. |
| Jdbc connection parameters | Parameter settings for PostgreSQL connection, in JSON format. | | Jdbc connection parameters | Parameter settings for PostgreSQL connection, in JSON format. |
## Native Supported ## Native Supported
Yes, could use this datasource by default. Yes, could use this datasource by default.

View File

@ -4,19 +4,18 @@
## Datasource Parameters ## Datasource Parameters
| **Datasource** | **Description** | | **Datasource** | **Description** |
| --- | --- | |-------------------------|-----------------------------------------------------------|
| Datasource | Select Presto. | | Datasource | Select Presto. |
| Datasource Name | Enter the name of the datasource. | | Datasource Name | Enter the name of the datasource. |
| Description | Enter a description of the datasource. | | Description | Enter a description of the datasource. |
| IP/Host Name | Enter the Presto service IP. | | IP/Host Name | Enter the Presto service IP. |
| Port | Enter the Presto service port. | | Port | Enter the Presto service port. |
| Username | Set the username for Presto connection. | | Username | Set the username for Presto connection. |
| Password | Set the password for Presto connection. | | Password | Set the password for Presto connection. |
| Database Name | Enter the database name of the Presto connection. | | Database Name | Enter the database name of the Presto connection. |
| jdbc connect parameters | Parameter settings for Presto connection, in JSON format. | | jdbc connect parameters | Parameter settings for Presto connection, in JSON format. |
## Native Supported ## Native Supported
Yes, could use this datasource by default. Yes, could use this datasource by default.

View File

@ -4,18 +4,18 @@
## Datasource Parameters ## Datasource Parameters
| **Datasource** | **Description** | | **Datasource** | **Description** |
| --- | --- | |-------------------------|-------------------------------------------------------------|
| Datasource | Select Redshift. | | Datasource | Select Redshift. |
| Datasource Name | Enter the name of the datasource. | | Datasource Name | Enter the name of the datasource. |
| Description | Enter a description of the datasource. | | Description | Enter a description of the datasource. |
| IP/Host Name | Enter the Redshift service IP. | | IP/Host Name | Enter the Redshift service IP. |
| Port | Enter the Redshift service port. | | Port | Enter the Redshift service port. |
| Username | Set the username for Redshift connection. | | Username | Set the username for Redshift connection. |
| Password | Set the password for Redshift connection. | | Password | Set the password for Redshift connection. |
| Database Name | Enter the database name of the Redshift connection. | | Database Name | Enter the database name of the Redshift connection. |
| jdbc connect parameters | Parameter settings for Redshift connection, in JSON format. | | jdbc connect parameters | Parameter settings for Redshift connection, in JSON format. |
## Native Supported ## Native Supported
Yes, could use this datasource by default. Yes, could use this datasource by default.

View File

@ -4,18 +4,18 @@
## Datasource Parameters ## Datasource Parameters
| **Datasource** | **Description** | | **Datasource** | **Description** |
| --- | --- | |----------------------------|----------------------------------------------------------|
| Datasource | Select Spark. | | Datasource | Select Spark. |
| Datasource name | Enter the name of the DataSource. | | Datasource name | Enter the name of the DataSource. |
| Description | Enter a description of the DataSource. | | Description | Enter a description of the DataSource. |
| IP/Host Name | Enter the Spark service IP. | | IP/Host Name | Enter the Spark service IP. |
| Port | Enter the Spark service port. | | Port | Enter the Spark service port. |
| Username | Set the username for Spark connection. | | Username | Set the username for Spark connection. |
| Password | Set the password for Spark connection. | | Password | Set the password for Spark connection. |
| Database name | Enter the database name of the Spark connection. | | Database name | Enter the database name of the Spark connection. |
| Jdbc connection parameters | Parameter settings for Spark connection, in JSON format. | | Jdbc connection parameters | Parameter settings for Spark connection, in JSON format. |
## Native Supported ## Native Supported
Yes, could use this datasource by default. Yes, could use this datasource by default.

View File

@ -4,18 +4,18 @@
## Datasource Parameters ## Datasource Parameters
| **Datasource** | **Description** | | **Datasource** | **Description** |
| --- | --- | |-------------------------|--------------------------------------------------------------|
| Datasource | Select SQLSERVER. | | Datasource | Select SQLSERVER. |
| Datasource Name | Enter the name of the datasource. | | Datasource Name | Enter the name of the datasource. |
| Description | Enter a description of the datasource. | | Description | Enter a description of the datasource. |
| IP/Host Name | Enter the SQLSERVER service IP. | | IP/Host Name | Enter the SQLSERVER service IP. |
| Port | Enter the SQLSERVER service port. | | Port | Enter the SQLSERVER service port. |
| Username | Set the username for SQLSERVER connection. | | Username | Set the username for SQLSERVER connection. |
| Password | Set the password for SQLSERVER connection. | | Password | Set the password for SQLSERVER connection. |
| Database Name | Enter the database name of the SQLSERVER connection. | | Database Name | Enter the database name of the SQLSERVER connection. |
| jdbc connect parameters | Parameter settings for SQLSERVER connection, in JSON format. | | jdbc connect parameters | Parameter settings for SQLSERVER connection, in JSON format. |
## Native Supported ## Native Supported
Yes, could use this datasource by default. Yes, could use this datasource by default.

View File

@ -1,12 +1,12 @@
# DolphinScheduler Expansion and Reduction # DolphinScheduler Expansion and Reduction
## Expansion ## Expansion
This article describes how to add a new master service or worker service to an existing DolphinScheduler cluster. This article describes how to add a new master service or worker service to an existing DolphinScheduler cluster.
``` ```
Attention: There cannot be more than one master service process or worker service process on a physical machine. Attention: There cannot be more than one master service process or worker service process on a physical machine.
If the physical machine which locate the expansion master or worker node has already installed the scheduled service, check the [1.4 Modify configuration] and edit the configuration file `conf/config/install_config.conf` on ** all ** nodes, add masters or workers parameter, and restart the scheduling cluster. If the physical machine which locate the expansion master or worker node has already installed the scheduled service, check the [1.4 Modify configuration] and edit the configuration file `conf/config/install_config.conf` on ** all ** nodes, add masters or workers parameter, and restart the scheduling cluster.
``` ```
### Basic software installation ### Basic software installation
@ -14,16 +14,15 @@ This article describes how to add a new master service or worker service to an e
* [required] [JDK](https://www.oracle.com/technetwork/java/javase/downloads/index.html) (version 1.8+): must install, install and configure `JAVA_HOME` and `PATH` variables under `/etc/profile` * [required] [JDK](https://www.oracle.com/technetwork/java/javase/downloads/index.html) (version 1.8+): must install, install and configure `JAVA_HOME` and `PATH` variables under `/etc/profile`
* [optional] If the expansion is a worker node, you need to consider whether to install an external client, such as Hadoop, Hive, Spark Client. * [optional] If the expansion is a worker node, you need to consider whether to install an external client, such as Hadoop, Hive, Spark Client.
```markdown ```markdown
Attention: DolphinScheduler itself does not depend on Hadoop, Hive, Spark, but will only call their Client for the corresponding task submission. Attention: DolphinScheduler itself does not depend on Hadoop, Hive, Spark, but will only call their Client for the corresponding task submission.
``` ```
### Get Installation Package ### Get Installation Package
- Check the version of DolphinScheduler used in your existing environment, and get the installation package of the corresponding version, if the versions are different, there may be compatibility problems. - Check the version of DolphinScheduler used in your existing environment, and get the installation package of the corresponding version, if the versions are different, there may be compatibility problems.
- Confirm the unified installation directory of other nodes, this article assumes that DolphinScheduler is installed in `/opt/` directory, and the full path is `/opt/dolphinscheduler`. - Confirm the unified installation directory of other nodes, this article assumes that DolphinScheduler is installed in `/opt/` directory, and the full path is `/opt/dolphinscheduler`.
- Please download the corresponding version of the installation package to the server installation directory, uncompress it and rename it to `dolphinscheduler` and store it in the `/opt` directory. - Please download the corresponding version of the installation package to the server installation directory, uncompress it and rename it to `dolphinscheduler` and store it in the `/opt` directory.
- Add database dependency package, this document uses Mysql database, add `mysql-connector-java` driver package to `/opt/dolphinscheduler/lib` directory. - Add database dependency package, this document uses Mysql database, add `mysql-connector-java` driver package to `/opt/dolphinscheduler/lib` directory.
```shell ```shell
@ -31,13 +30,13 @@ This article describes how to add a new master service or worker service to an e
mkdir -p /opt mkdir -p /opt
cd /opt cd /opt
# decompress # decompress
tar -zxvf apache-dolphinscheduler-<version>-bin.tar.gz -C /opt tar -zxvf apache-dolphinscheduler-3.1.5-bin.tar.gz -C /opt
cd /opt cd /opt
mv apache-dolphinscheduler-<version>-bin dolphinscheduler mv apache-dolphinscheduler-3.1.5-bin dolphinscheduler
``` ```
```markdown ```markdown
Attention: You can copy the installation package directly from an existing environment to an expanded physical machine. Attention: You can copy the installation package directly from an existing environment to an expanded physical machine.
``` ```
### Create Deployment Users ### Create Deployment Users
@ -58,53 +57,49 @@ sed -i 's/Defaults requirett/#Defaults requirett/g' /etc/sudoers
``` ```
```markdown ```markdown
Attention: Attention:
- Since it is `sudo -u {linux-user}` to switch between different Linux users to run multi-tenant jobs, the deploying user needs to have sudo privileges and be password free. - Since it is `sudo -u {linux-user}` to switch between different Linux users to run multi-tenant jobs, the deploying user needs to have sudo privileges and be password free.
- If you find the line `Default requiretty` in the `/etc/sudoers` file, please also comment it out. - If you find the line `Default requiretty` in the `/etc/sudoers` file, please also comment it out.
- If have needs to use resource uploads, you also need to assign read and write permissions to the deployment user on `HDFS or MinIO`. - If have needs to use resource uploads, you also need to assign read and write permissions to the deployment user on `HDFS or MinIO`.
``` ```
### Modify Configuration ### Modify Configuration
- From an existing node such as `Master/Worker`, copy the configuration directory directly to replace the configuration directory in the new node. After finishing the file copy, check whether the configuration items are correct. - From an existing node such as `Master/Worker`, copy the configuration directory directly to replace the configuration directory in the new node. After finishing the file copy, check whether the configuration items are correct.
```markdown
Highlights:
datasource.properties: database connection information
zookeeper.properties: information for connecting zk
common.properties: Configuration information about the resource store (if hadoop is set up, please check if the core-site.xml and hdfs-site.xml configuration files exist).
dolphinscheduler_env.sh: environment Variables
````
```markdown
Highlights:
datasource.properties: database connection information
zookeeper.properties: information for connecting zk
common.properties: Configuration information about the resource store (if hadoop is set up, please check if the core-site.xml and hdfs-site.xml configuration files exist).
dolphinscheduler_env.sh: environment Variables
```
- Modify the `dolphinscheduler_env.sh` environment variable in the `bin/env/dolphinscheduler_env.sh` directory according to the machine configuration (the following is the example that all the used software install under `/opt/soft`) - Modify the `dolphinscheduler_env.sh` environment variable in the `bin/env/dolphinscheduler_env.sh` directory according to the machine configuration (the following is the example that all the used software install under `/opt/soft`)
```shell ```shell
export HADOOP_HOME=/opt/soft/hadoop export HADOOP_HOME=/opt/soft/hadoop
export HADOOP_CONF_DIR=/opt/soft/hadoop/etc/hadoop export HADOOP_CONF_DIR=/opt/soft/hadoop/etc/hadoop
# export SPARK_HOME1=/opt/soft/spark1 # export SPARK_HOME1=/opt/soft/spark1
export SPARK_HOME2=/opt/soft/spark2 export SPARK_HOME2=/opt/soft/spark2
export PYTHON_HOME=/opt/soft/python export PYTHON_HOME=/opt/soft/python
export JAVA_HOME=/opt/soft/jav export JAVA_HOME=/opt/soft/jav
export HIVE_HOME=/opt/soft/hive export HIVE_HOME=/opt/soft/hive
export FLINK_HOME=/opt/soft/flink export FLINK_HOME=/opt/soft/flink
export DATAX_HOME=/opt/soft/datax/bin/datax.py export DATAX_HOME=/opt/soft/datax/bin/datax.py
export PATH=$HADOOP_HOME/bin:$SPARK_HOME2/bin:$PYTHON_HOME:$JAVA_HOME/bin:$HIVE_HOME/bin:$PATH:$FLINK_HOME/bin:$DATAX_HOME:$PATH export PATH=$HADOOP_HOME/bin:$SPARK_HOME2/bin:$PYTHON_HOME:$JAVA_HOME/bin:$HIVE_HOME/bin:$PATH:$FLINK_HOME/bin:$DATAX_HOME:$PATH
```
`Attention: This step is very important, such as `JAVA_HOME` and `PATH` is necessary to configure if haven not used just ignore or comment out` ```
`Attention: This step is very important, such as `JAVA_HOME` and `PATH` is necessary to configure if haven not used just ignore or comment out`
- Soft link the `JDK` to `/usr/bin/java` (still using `JAVA_HOME=/opt/soft/java` as an example) - Soft link the `JDK` to `/usr/bin/java` (still using `JAVA_HOME=/opt/soft/java` as an example)
```shell ```shell
sudo ln -s /opt/soft/java/bin/java /usr/bin/java sudo ln -s /opt/soft/java/bin/java /usr/bin/java
``` ```
- Modify the configuration file `conf/config/install_config.conf` on the **all** nodes, synchronizing the following configuration.
- Modify the configuration file `conf/config/install_config.conf` on the **all** nodes, synchronizing the following configuration. * To add a new master node, you need to modify the IPs and masters parameters.
* To add a new worker node, modify the IPs and workers parameters.
* To add a new master node, you need to modify the IPs and masters parameters.
* To add a new worker node, modify the IPs and workers parameters.
```shell ```shell
# which machines to deploy DS services on, separated by commas between multiple physical machines # which machines to deploy DS services on, separated by commas between multiple physical machines
@ -120,6 +115,7 @@ masters="existing master01,existing master02,ds1,ds2"
workers="existing worker01:default,existing worker02:default,ds3:default,ds4:default" workers="existing worker01:default,existing worker02:default,ds3:default,ds4:default"
``` ```
- If the expansion is for worker nodes, you need to set the worker group, refer to the security of the [Worker grouping](./security.md) - If the expansion is for worker nodes, you need to set the worker group, refer to the security of the [Worker grouping](./security.md)
- On all new nodes, change the directory permissions so that the deployment user has access to the DolphinScheduler directory - On all new nodes, change the directory permissions so that the deployment user has access to the DolphinScheduler directory
@ -154,26 +150,26 @@ bash bin/dolphinscheduler-daemon.sh start alert-server # start alert service
``` ```
``` ```
Attention: When using `stop-all.sh` or `stop-all.sh`, if the physical machine execute the command is not configured to be ssh-free on all machines, it will prompt to enter the password Attention: When using `stop-all.sh` or `stop-all.sh`, if the physical machine execute the command is not configured to be ssh-free on all machines, it will prompt to enter the password
``` ```
- After completing the script, use the `jps` command to see if every node service is started (`jps` comes with the `Java JDK`) - After completing the script, use the `jps` command to see if every node service is started (`jps` comes with the `Java JDK`)
``` ```
MasterServer ----- master service MasterServer ----- master service
WorkerServer ----- worker service WorkerServer ----- worker service
ApiApplicationServer ----- api service ApiApplicationServer ----- api service
AlertServer ----- alert service AlertServer ----- alert service
``` ```
After successful startup, you can view the logs, which are stored in the `logs` folder. After successful startup, you can view the logs, which are stored in the `logs` folder.
```Log Path ```Log Path
logs/ logs/
├── dolphinscheduler-alert-server.log ├── dolphinscheduler-alert-server.log
├── dolphinscheduler-master-server.log ├── dolphinscheduler-master-server.log
├── dolphinscheduler-worker-server.log ├── dolphinscheduler-worker-server.log
├── dolphinscheduler-api-server.log ├── dolphinscheduler-api-server.log
``` ```
If the above services start normally and the scheduling system page is normal, check whether there is an expanded Master or Worker service in the [Monitor] of the web system. If it exists, the expansion is complete. If the above services start normally and the scheduling system page is normal, check whether there is an expanded Master or Worker service in the [Monitor] of the web system. If it exists, the expansion is complete.
@ -187,9 +183,9 @@ There are two steps for shrinking. After performing the following two steps, the
### Stop the Service on the Scaled-Down Node ### Stop the Service on the Scaled-Down Node
* If you are scaling down the master node, identify the physical machine where the master service is located, and stop the master service on the physical machine. * If you are scaling down the master node, identify the physical machine where the master service is located, and stop the master service on the physical machine.
* If scale down the worker node, determine the physical machine where the worker service scale down and stop the worker services on the physical machine. * If scale down the worker node, determine the physical machine where the worker service scale down and stop the worker services on the physical machine.
```shell ```shell
# stop command: # stop command:
bin/stop-all.sh # stop all services bin/stop-all.sh # stop all services
@ -211,26 +207,25 @@ bash bin/dolphinscheduler-daemon.sh start alert-server # start alert service
``` ```
``` ```
Attention: When using `stop-all.sh` or `stop-all.sh`, if the machine without the command is not configured to be ssh-free for all machines, it will prompt to enter the password Attention: When using `stop-all.sh` or `stop-all.sh`, if the machine without the command is not configured to be ssh-free for all machines, it will prompt to enter the password
``` ```
- After the script is completed, use the `jps` command to see if every node service was successfully shut down (`jps` comes with the `Java JDK`) - After the script is completed, use the `jps` command to see if every node service was successfully shut down (`jps` comes with the `Java JDK`)
``` ```
MasterServer ----- master service MasterServer ----- master service
WorkerServer ----- worker service WorkerServer ----- worker service
ApiApplicationServer ----- api service ApiApplicationServer ----- api service
AlertServer ----- alert service AlertServer ----- alert service
``` ```
If the corresponding master service or worker service does not exist, then the master or worker service is successfully shut down.
If the corresponding master service or worker service does not exist, then the master or worker service is successfully shut down.
### Modify the Configuration File ### Modify the Configuration File
- modify the configuration file `conf/config/install_config.conf` on the **all** nodes, synchronizing the following configuration. - modify the configuration file `conf/config/install_config.conf` on the **all** nodes, synchronizing the following configuration.
* to scale down the master node, modify the IPs and masters parameters.
* to scale down the master node, modify the IPs and masters parameters. * to scale down worker nodes, modify the IPs and workers parameters.
* to scale down worker nodes, modify the IPs and workers parameters.
```shell ```shell
# which machines to deploy DS services on, "localhost" for this machine # which machines to deploy DS services on, "localhost" for this machine
@ -246,3 +241,4 @@ masters="existing master01,existing master02,ds1,ds2"
workers="existing worker01:default,existing worker02:default,ds3:default,ds4:default" workers="existing worker01:default,existing worker02:default,ds3:default,ds4:default"
``` ```

Some files were not shown because too many files have changed in this diff Show More