merge from dev1.3.0
This commit is contained in:
commit
b9bc052abe
|
|
@ -21,7 +21,6 @@ on:
|
|||
branches:
|
||||
- dev
|
||||
env:
|
||||
DOCKER_DIR: ./docker
|
||||
LOG_DIR: /tmp/dolphinscheduler
|
||||
|
||||
name: Unit Test
|
||||
|
|
@ -49,6 +48,8 @@ jobs:
|
|||
- name: Bootstrap database
|
||||
run: |
|
||||
sed -i "s/: root/: test/g" $(pwd)/docker/docker-swarm/docker-compose.yml
|
||||
docker-compose -f $(pwd)/docker/docker-swarm/docker-compose.yml create --force-recreate dolphinscheduler-zookeeper dolphinscheduler-postgresql
|
||||
sudo cp $(pwd)/sql/dolphinscheduler-postgre.sql $(docker volume inspect docker-swarm_dolphinscheduler-postgresql-initdb | grep "Mountpoint" | awk -F "\"" '{print $4}')
|
||||
docker-compose -f $(pwd)/docker/docker-swarm/docker-compose.yml up -d dolphinscheduler-zookeeper dolphinscheduler-postgresql
|
||||
- name: Set up JDK 1.8
|
||||
uses: actions/setup-java@v1
|
||||
|
|
@ -84,6 +85,5 @@ jobs:
|
|||
- name: Collect logs
|
||||
run: |
|
||||
mkdir -p ${LOG_DIR}
|
||||
cd ${DOCKER_DIR}
|
||||
docker-compose logs db > ${LOG_DIR}/db.txt
|
||||
docker-compose -f $(pwd)/docker/docker-swarm/docker-compose.yml logs dolphinscheduler-postgresql > ${LOG_DIR}/db.txt
|
||||
continue-on-error: true
|
||||
|
|
|
|||
|
|
@ -37,14 +37,13 @@ RUN apk add openjdk8
|
|||
ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk
|
||||
ENV PATH $JAVA_HOME/bin:$PATH
|
||||
|
||||
#3. install pg
|
||||
RUN apk add postgresql postgresql-contrib
|
||||
|
||||
#4. add dolphinscheduler
|
||||
#3. add dolphinscheduler
|
||||
ADD ./apache-dolphinscheduler-incubating-${VERSION}-dolphinscheduler-bin.tar.gz /opt/
|
||||
RUN mv /opt/apache-dolphinscheduler-incubating-${VERSION}-dolphinscheduler-bin/ /opt/dolphinscheduler/
|
||||
ENV DOLPHINSCHEDULER_HOME /opt/dolphinscheduler
|
||||
|
||||
#4. install pg
|
||||
RUN apk add postgresql postgresql-contrib
|
||||
#5. modify nginx
|
||||
RUN echo "daemon off;" >> /etc/nginx/nginx.conf && \
|
||||
rm -rf /etc/nginx/conf.d/*
|
||||
|
|
@ -73,8 +72,9 @@ RUN chmod +x /root/checkpoint.sh && \
|
|||
ln -s /bin/bash /bin/sh && \
|
||||
mkdir -p /tmp/xls
|
||||
|
||||
#7. remove apk index cache
|
||||
RUN rm -rf /var/cache/apk/*
|
||||
#7. remove apk index cache and disable coredup for sudo
|
||||
RUN rm -rf /var/cache/apk/* && \
|
||||
echo "Set disable_coredump false" >> /etc/sudo.conf
|
||||
|
||||
#8. expose port
|
||||
EXPOSE 2181 2888 3888 5432 5678 1234 12345 50051 8888
|
||||
|
|
|
|||
|
|
@ -24,31 +24,6 @@ DOLPHINSCHEDULER_LOGS=${DOLPHINSCHEDULER_HOME}/logs
|
|||
|
||||
# start postgresql
|
||||
initPostgreSQL() {
|
||||
echo "checking postgresql"
|
||||
if [[ "${POSTGRESQL_HOST}" = "127.0.0.1" || "${POSTGRESQL_HOST}" = "localhost" ]]; then
|
||||
export PGPORT=${POSTGRESQL_PORT}
|
||||
|
||||
echo "start postgresql service"
|
||||
rc-service postgresql restart
|
||||
|
||||
# role if not exists, create
|
||||
flag=$(sudo -u postgres psql -tAc "SELECT 1 FROM pg_roles WHERE rolname='${POSTGRESQL_USERNAME}'")
|
||||
if [ -z "${flag}" ]; then
|
||||
echo "create user"
|
||||
sudo -u postgres psql -tAc "create user ${POSTGRESQL_USERNAME} with password '${POSTGRESQL_PASSWORD}'"
|
||||
fi
|
||||
|
||||
# database if not exists, create
|
||||
flag=$(sudo -u postgres psql -tAc "select 1 from pg_database where datname='dolphinscheduler'")
|
||||
if [ -z "${flag}" ]; then
|
||||
echo "init db"
|
||||
sudo -u postgres psql -tAc "create database dolphinscheduler owner ${POSTGRESQL_USERNAME}"
|
||||
fi
|
||||
|
||||
# grant
|
||||
sudo -u postgres psql -tAc "grant all privileges on database dolphinscheduler to ${POSTGRESQL_USERNAME}"
|
||||
fi
|
||||
|
||||
echo "test postgresql service"
|
||||
while ! nc -z ${POSTGRESQL_HOST} ${POSTGRESQL_PORT}; do
|
||||
counter=$((counter+1))
|
||||
|
|
@ -73,24 +48,18 @@ initPostgreSQL() {
|
|||
|
||||
# start zk
|
||||
initZK() {
|
||||
echo -e "checking zookeeper"
|
||||
if [[ "${ZOOKEEPER_QUORUM}" = "127.0.0.1:2181" || "${ZOOKEEPER_QUORUM}" = "localhost:2181" ]]; then
|
||||
echo "start local zookeeper"
|
||||
/opt/zookeeper/bin/zkServer.sh restart
|
||||
else
|
||||
echo "connect remote zookeeper"
|
||||
echo "${ZOOKEEPER_QUORUM}" | awk -F ',' 'BEGIN{ i=1 }{ while( i <= NF ){ print $i; i++ } }' | while read line; do
|
||||
while ! nc -z ${line%:*} ${line#*:}; do
|
||||
counter=$((counter+1))
|
||||
if [ $counter == 30 ]; then
|
||||
echo "Error: Couldn't connect to zookeeper."
|
||||
exit 1
|
||||
fi
|
||||
echo "Trying to connect to zookeeper at ${line}. Attempt $counter."
|
||||
sleep 5
|
||||
done
|
||||
echo "connect remote zookeeper"
|
||||
echo "${ZOOKEEPER_QUORUM}" | awk -F ',' 'BEGIN{ i=1 }{ while( i <= NF ){ print $i; i++ } }' | while read line; do
|
||||
while ! nc -z ${line%:*} ${line#*:}; do
|
||||
counter=$((counter+1))
|
||||
if [ $counter == 30 ]; then
|
||||
echo "Error: Couldn't connect to zookeeper."
|
||||
exit 1
|
||||
fi
|
||||
echo "Trying to connect to zookeeper at ${line}. Attempt $counter."
|
||||
sleep 5
|
||||
done
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# start nginx
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ services:
|
|||
POSTGRESQL_DATABASE: dolphinscheduler
|
||||
volumes:
|
||||
- dolphinscheduler-postgresql:/bitnami/postgresql
|
||||
- dolphinscheduler-postgresql-initdb:/docker-entrypoint-initdb.d
|
||||
networks:
|
||||
- dolphinscheduler
|
||||
|
||||
|
|
@ -175,10 +176,10 @@ services:
|
|||
image: apache/dolphinscheduler:latest
|
||||
container_name: dolphinscheduler-worker
|
||||
command: ["worker-server"]
|
||||
ports:
|
||||
ports:
|
||||
- 1234:1234
|
||||
- 50051:50051
|
||||
environment:
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
WORKER_EXEC_THREADS: "100"
|
||||
WORKER_HEARTBEAT_INTERVAL: "10"
|
||||
|
|
@ -221,6 +222,7 @@ networks:
|
|||
|
||||
volumes:
|
||||
dolphinscheduler-postgresql:
|
||||
dolphinscheduler-postgresql-initdb:
|
||||
dolphinscheduler-zookeeper:
|
||||
dolphinscheduler-worker-data:
|
||||
dolphinscheduler-logs:
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@ public class DefaultHTMLTemplate implements AlertTemplate {
|
|||
|
||||
public static final Logger logger = LoggerFactory.getLogger(DefaultHTMLTemplate.class);
|
||||
|
||||
|
||||
@Override
|
||||
public String getMessageFromTemplate(String content, ShowType showType,boolean showAll) {
|
||||
|
||||
|
|
@ -140,7 +141,7 @@ public class DefaultHTMLTemplate implements AlertTemplate {
|
|||
checkNotNull(content);
|
||||
String htmlTableThead = StringUtils.isEmpty(title) ? "" : String.format("<thead>%s</thead>\n",title);
|
||||
|
||||
return "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'><html><head><title>dolphinscheduler</title><meta name='Keywords' content=''><meta name='Description' content=''><style type=\"text/css\">table {margin-top:0px;padding-top:0px;border:1px solid;font-size: 14px;color: #333333;border-width: 1px;border-color: #666666;border-collapse: collapse;}table th {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #dedede;text-align: left;}table td {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #ffffff;text-align: left;}</style></head><body style=\"margin:0;padding:0\"><table border=\"1px\" cellpadding=\"5px\" cellspacing=\"-10px\"> " +htmlTableThead + content +"</table></body></html>";
|
||||
return Constants.HTML_HEADER_PREFIX +htmlTableThead + content + Constants.TABLE_BODY_HTML_TAIL;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -157,6 +157,10 @@ public class Constants {
|
|||
|
||||
public static final String ENTERPRISE_WECHAT_USERS = "enterprise.wechat.users";
|
||||
|
||||
public static final String HTML_HEADER_PREFIX = "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'><html><head><title>dolphinscheduler</title><meta name='Keywords' content=''><meta name='Description' content=''><style type=\"text/css\">table {margin-top:0px;padding-top:0px;border:1px solid;font-size: 14px;color: #333333;border-width: 1px;border-color: #666666;border-collapse: collapse;}table th {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #dedede;text-align: left;}table td {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #ffffff;text-align: left;}</style></head><body style=\"margin:0;padding:0\"><table border=\"1px\" cellpadding=\"5px\" cellspacing=\"-10px\"> ";
|
||||
|
||||
public static final String TABLE_BODY_HTML_TAIL = "</table></body></html>";
|
||||
|
||||
/**
|
||||
* plugin config
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
*/
|
||||
package org.apache.dolphinscheduler.alert.template.impl;
|
||||
|
||||
import org.apache.dolphinscheduler.alert.utils.Constants;
|
||||
import org.apache.dolphinscheduler.alert.utils.JSONUtils;
|
||||
import org.apache.dolphinscheduler.common.enums.ShowType;
|
||||
import org.junit.Test;
|
||||
|
|
@ -82,42 +83,14 @@ public class DefaultHTMLTemplateTest{
|
|||
|
||||
private String generateMockTableTypeResultByHand(){
|
||||
|
||||
return "<html>\n" +
|
||||
" <head>\n" +
|
||||
" <title>dolphinscheduler</title>\n" +
|
||||
" <meta name='Keywords' content=''>\n" +
|
||||
" <meta name='Description' content=''>\n" +
|
||||
" <style type=\"text/css\">\n" +
|
||||
" table {margin-top:0px;padding-top:0px;border:1px solid;font-size: 14px;color: #333333;border-width: 1px;border-color: #666666;border-collapse: collapse;}\n" +
|
||||
" table th {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #dedede;text-align: right;}\n" +
|
||||
" table td {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #ffffff;text-align: right;}\n" +
|
||||
" </style>\n" +
|
||||
" </head>\n" +
|
||||
" <body style=\"margin:0;padding:0\">\n" +
|
||||
" <table border=\"1px\" cellpadding=\"5px\" cellspacing=\"-10px\">\n" +
|
||||
return Constants.HTML_HEADER_PREFIX +
|
||||
"<thead><tr><th>mysql service name</th><th>mysql address</th><th>port</th><th>no index of number</th><th>database client connections</th></tr></thead>\n" +
|
||||
"<tr><td>mysql200</td><td>192.168.xx.xx</td><td>3306</td><td>80</td><td>190</td></tr><tr><td>mysql210</td><td>192.168.xx.xx</td><td>3306</td><td>10</td><td>90</td></tr> </table>\n" +
|
||||
" </body>\n" +
|
||||
"</html>";
|
||||
"<tr><td>mysql200</td><td>192.168.xx.xx</td><td>3306</td><td>80</td><td>190</td></tr><tr><td>mysql210</td><td>192.168.xx.xx</td><td>3306</td><td>10</td><td>90</td></tr>" + Constants.TABLE_BODY_HTML_TAIL;
|
||||
|
||||
}
|
||||
|
||||
private String generateMockTextTypeResultByHand(){
|
||||
|
||||
return "<html>\n" +
|
||||
" <head>\n" +
|
||||
" <title>dolphinscheduler</title>\n" +
|
||||
" <meta name='Keywords' content=''>\n" +
|
||||
" <meta name='Description' content=''>\n" +
|
||||
" <style type=\"text/css\">\n" +
|
||||
" table {margin-top:0px;padding-top:0px;border:1px solid;font-size: 14px;color: #333333;border-width: 1px;border-color: #666666;border-collapse: collapse;}\n" +
|
||||
" table th {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #dedede;text-align: right;}\n" +
|
||||
" table td {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #ffffff;text-align: right;}\n" +
|
||||
" </style>\n" +
|
||||
" </head>\n" +
|
||||
" <body style=\"margin:0;padding:0\">\n" +
|
||||
" <table border=\"1px\" cellpadding=\"5px\" cellspacing=\"-10px\">\n" +
|
||||
"<tr><td>{\"mysql service name\":\"mysql200\",\"mysql address\":\"192.168.xx.xx\",\"database client connections\":\"190\",\"port\":\"3306\",\"no index of number\":\"80\"}</td></tr><tr><td>{\"mysql service name\":\"mysql210\",\"mysql address\":\"192.168.xx.xx\",\"database client connections\":\"90\",\"port\":\"3306\",\"no index of number\":\"10\"}</td></tr> </table>\n" +
|
||||
" </body>\n" +
|
||||
"</html>";
|
||||
return Constants.HTML_HEADER_PREFIX + "<tr><td>{\"mysql service name\":\"mysql200\",\"mysql address\":\"192.168.xx.xx\",\"database client connections\":\"190\",\"port\":\"3306\",\"no index of number\":\"80\"}</td></tr><tr><td>{\"mysql service name\":\"mysql210\",\"mysql address\":\"192.168.xx.xx\",\"database client connections\":\"90\",\"port\":\"3306\",\"no index of number\":\"10\"}</td></tr>" + Constants.TABLE_BODY_HTML_TAIL;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -476,8 +476,6 @@ public class ProcessInstanceService extends BaseDAGService {
|
|||
return checkResult;
|
||||
}
|
||||
ProcessInstance processInstance = processService.findProcessInstanceDetailById(processInstanceId);
|
||||
List<TaskInstance> taskInstanceList = processService.findValidTaskListByProcessId(processInstanceId);
|
||||
|
||||
if (null == processInstance) {
|
||||
putMsg(result, Status.PROCESS_INSTANCE_NOT_EXIST, processInstanceId);
|
||||
return result;
|
||||
|
|
@ -485,8 +483,11 @@ public class ProcessInstanceService extends BaseDAGService {
|
|||
|
||||
|
||||
|
||||
processService.removeTaskLogFile(processInstanceId);
|
||||
// delete database cascade
|
||||
int delete = processService.deleteWorkProcessInstanceById(processInstanceId);
|
||||
|
||||
|
||||
processService.deleteAllSubWorkProcessByParentId(processInstanceId);
|
||||
processService.deleteWorkProcessMapByParentId(processInstanceId);
|
||||
|
||||
|
|
|
|||
|
|
@ -73,6 +73,22 @@ public class ProcessDefinitionMapperTest {
|
|||
return processDefinition;
|
||||
}
|
||||
|
||||
/**
|
||||
* insert
|
||||
* @return ProcessDefinition
|
||||
*/
|
||||
private ProcessDefinition insertTwo(){
|
||||
//insertOne
|
||||
ProcessDefinition processDefinition = new ProcessDefinition();
|
||||
processDefinition.setName("def 2");
|
||||
processDefinition.setProjectId(1010);
|
||||
processDefinition.setUserId(101);
|
||||
processDefinition.setUpdateTime(new Date());
|
||||
processDefinition.setCreateTime(new Date());
|
||||
processDefinitionMapper.insert(processDefinition);
|
||||
return processDefinition;
|
||||
}
|
||||
|
||||
/**
|
||||
* test update
|
||||
*/
|
||||
|
|
@ -177,7 +193,7 @@ public class ProcessDefinitionMapperTest {
|
|||
public void testQueryDefinitionListByIdList() {
|
||||
|
||||
ProcessDefinition processDefinition = insertOne();
|
||||
ProcessDefinition processDefinition1 = insertOne();
|
||||
ProcessDefinition processDefinition1 = insertTwo();
|
||||
|
||||
Integer[] array = new Integer[2];
|
||||
array[0] = processDefinition.getId();
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
/*
* 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.
*/
package org.apache.dolphinscheduler.remote.command;
public enum CommandType {
/**
* roll view log request
*/
ROLL_VIEW_LOG_REQUEST,
/**
* roll view log response
*/
ROLL_VIEW_LOG_RESPONSE,
/**
* view whole log request
*/
VIEW_WHOLE_LOG_REQUEST,
/**
* view whole log response
*/
VIEW_WHOLE_LOG_RESPONSE,
/**
* get log bytes request
*/
GET_LOG_BYTES_REQUEST,
/**
* get log bytes response
*/
GET_LOG_BYTES_RESPONSE,
WORKER_REQUEST,
MASTER_RESPONSE,
/**
* execute task request
*/
TASK_EXECUTE_REQUEST,
/**
* execute task ack
*/
TASK_EXECUTE_ACK,
/**
* execute task response
*/
TASK_EXECUTE_RESPONSE,
/**
* kill task
*/
TASK_KILL_REQUEST,
/**
* kill task response
*/
TASK_KILL_RESPONSE,
/**
* ping
*/
PING,
/**
* pong
*/
PONG;
}
|
||||
/*
* 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.
*/
package org.apache.dolphinscheduler.remote.command;
public enum CommandType {
/**
* remove task log request,
*/
REMOVE_TAK_LOG_REQUEST,
/**
* remove task log response
*/
REMOVE_TAK_LOG_RESPONSE,
/**
* roll view log request
*/
ROLL_VIEW_LOG_REQUEST,
/**
* roll view log response
*/
ROLL_VIEW_LOG_RESPONSE,
/**
* view whole log request
*/
VIEW_WHOLE_LOG_REQUEST,
/**
* view whole log response
*/
VIEW_WHOLE_LOG_RESPONSE,
/**
* get log bytes request
*/
GET_LOG_BYTES_REQUEST,
/**
* get log bytes response
*/
GET_LOG_BYTES_RESPONSE,
WORKER_REQUEST,
MASTER_RESPONSE,
/**
* execute task request
*/
TASK_EXECUTE_REQUEST,
/**
* execute task ack
*/
TASK_EXECUTE_ACK,
/**
* execute task response
*/
TASK_EXECUTE_RESPONSE,
/**
* kill task
*/
TASK_KILL_REQUEST,
/**
* kill task response
*/
TASK_KILL_RESPONSE,
/**
* ping
*/
PING,
/**
* pong
*/
PONG;
}
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.remote.command.log;
|
||||
|
||||
import org.apache.dolphinscheduler.remote.command.Command;
|
||||
import org.apache.dolphinscheduler.remote.command.CommandType;
|
||||
import org.apache.dolphinscheduler.remote.utils.FastJsonSerializer;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* remove task log request command
|
||||
*/
|
||||
public class RemoveTaskLogRequestCommand implements Serializable {
|
||||
|
||||
/**
|
||||
* log path
|
||||
*/
|
||||
private String path;
|
||||
|
||||
public RemoveTaskLogRequestCommand() {
|
||||
}
|
||||
|
||||
public RemoveTaskLogRequestCommand(String path) {
|
||||
this.path = path;
|
||||
}
|
||||
|
||||
public String getPath() {
|
||||
return path;
|
||||
}
|
||||
|
||||
public void setPath(String path) {
|
||||
this.path = path;
|
||||
}
|
||||
|
||||
/**
|
||||
* package request command
|
||||
*
|
||||
* @return command
|
||||
*/
|
||||
public Command convert2Command(){
|
||||
Command command = new Command();
|
||||
command.setType(CommandType.REMOVE_TAK_LOG_REQUEST);
|
||||
byte[] body = FastJsonSerializer.serialize(this);
|
||||
command.setBody(body);
|
||||
return command;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.remote.command.log;
|
||||
|
||||
import org.apache.dolphinscheduler.remote.command.Command;
|
||||
import org.apache.dolphinscheduler.remote.command.CommandType;
|
||||
import org.apache.dolphinscheduler.remote.utils.FastJsonSerializer;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* remove task log request command
|
||||
*/
|
||||
public class RemoveTaskLogResponseCommand implements Serializable {
|
||||
|
||||
/**
|
||||
* log path
|
||||
*/
|
||||
private Boolean status;
|
||||
|
||||
public RemoveTaskLogResponseCommand() {
|
||||
}
|
||||
|
||||
public RemoveTaskLogResponseCommand(Boolean status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public Boolean getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(Boolean status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
/**
|
||||
* package request command
|
||||
*
|
||||
* @return command
|
||||
*/
|
||||
public Command convert2Command(long opaque){
|
||||
Command command = new Command(opaque);
|
||||
command.setType(CommandType.REMOVE_TAK_LOG_RESPONSE);
|
||||
byte[] body = FastJsonSerializer.serialize(this);
|
||||
command.setBody(body);
|
||||
return command;
|
||||
}
|
||||
}
|
||||
|
|
@ -60,14 +60,14 @@ public class LoggerRequestProcessor implements NettyRequestProcessor {
|
|||
*/
|
||||
final CommandType commandType = command.getType();
|
||||
switch (commandType){
|
||||
case GET_LOG_BYTES_REQUEST:
|
||||
GetLogBytesRequestCommand getLogRequest = FastJsonSerializer.deserialize(
|
||||
command.getBody(), GetLogBytesRequestCommand.class);
|
||||
byte[] bytes = getFileContentBytes(getLogRequest.getPath());
|
||||
GetLogBytesResponseCommand getLogResponse = new GetLogBytesResponseCommand(bytes);
|
||||
channel.writeAndFlush(getLogResponse.convert2Command(command.getOpaque()));
|
||||
break;
|
||||
case VIEW_WHOLE_LOG_REQUEST:
|
||||
case GET_LOG_BYTES_REQUEST:
|
||||
GetLogBytesRequestCommand getLogRequest = FastJsonSerializer.deserialize(
|
||||
command.getBody(), GetLogBytesRequestCommand.class);
|
||||
byte[] bytes = getFileContentBytes(getLogRequest.getPath());
|
||||
GetLogBytesResponseCommand getLogResponse = new GetLogBytesResponseCommand(bytes);
|
||||
channel.writeAndFlush(getLogResponse.convert2Command(command.getOpaque()));
|
||||
break;
|
||||
case VIEW_WHOLE_LOG_REQUEST:
|
||||
ViewLogRequestCommand viewLogRequest = FastJsonSerializer.deserialize(
|
||||
command.getBody(), ViewLogRequestCommand.class);
|
||||
String msg = readWholeFileContent(viewLogRequest.getPath());
|
||||
|
|
@ -86,6 +86,25 @@ public class LoggerRequestProcessor implements NettyRequestProcessor {
|
|||
RollViewLogResponseCommand rollViewLogRequestResponse = new RollViewLogResponseCommand(builder.toString());
|
||||
channel.writeAndFlush(rollViewLogRequestResponse.convert2Command(command.getOpaque()));
|
||||
break;
|
||||
case REMOVE_TAK_LOG_REQUEST:
|
||||
RemoveTaskLogRequestCommand removeTaskLogRequest = FastJsonSerializer.deserialize(
|
||||
command.getBody(), RemoveTaskLogRequestCommand.class);
|
||||
|
||||
String taskLogPath = removeTaskLogRequest.getPath();
|
||||
|
||||
File taskLogFile = new File(taskLogPath);
|
||||
Boolean status = true;
|
||||
try {
|
||||
if (taskLogFile.exists()){
|
||||
taskLogFile.delete();
|
||||
}
|
||||
}catch (Exception e){
|
||||
status = false;
|
||||
}
|
||||
|
||||
RemoveTaskLogResponseCommand removeTaskLogResponse = new RemoveTaskLogResponseCommand(status);
|
||||
channel.writeAndFlush(removeTaskLogResponse.convert2Command(command.getOpaque()));
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("unknown commandType");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -55,6 +55,7 @@ public class LoggerServer {
|
|||
this.server.registerProcessor(CommandType.GET_LOG_BYTES_REQUEST, requestProcessor, requestProcessor.getExecutor());
|
||||
this.server.registerProcessor(CommandType.ROLL_VIEW_LOG_REQUEST, requestProcessor, requestProcessor.getExecutor());
|
||||
this.server.registerProcessor(CommandType.VIEW_WHOLE_LOG_REQUEST, requestProcessor, requestProcessor.getExecutor());
|
||||
this.server.registerProcessor(CommandType.REMOVE_TAK_LOG_REQUEST, requestProcessor, requestProcessor.getExecutor());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -496,6 +496,7 @@ public class MasterExecThread implements Runnable {
|
|||
}
|
||||
|
||||
String processWorkerGroup = processInstance.getWorkerGroup();
|
||||
processWorkerGroup = StringUtils.isBlank(processWorkerGroup) ? DEFAULT_WORKER_GROUP : processWorkerGroup;
|
||||
String taskWorkerGroup = StringUtils.isBlank(taskNode.getWorkerGroup()) ? processWorkerGroup : taskNode.getWorkerGroup();
|
||||
if (!processWorkerGroup.equals(DEFAULT_WORKER_GROUP) && taskWorkerGroup.equals(DEFAULT_WORKER_GROUP)) {
|
||||
taskInstance.setWorkerGroup(processWorkerGroup);
|
||||
|
|
|
|||
|
|
@ -118,7 +118,7 @@ apiServerPort="12345"
|
|||
|
||||
# install hosts
|
||||
# Note: install the scheduled hostname list. If it is pseudo-distributed, just write a pseudo-distributed hostname
|
||||
ips="ark0,ark1,ark2,ark3,ark4"
|
||||
ips="ds1,ds2,ds3,ds4,ds5"
|
||||
|
||||
# ssh port, default 22
|
||||
# Note: if ssh port is not default, modify here
|
||||
|
|
@ -126,19 +126,19 @@ sshPort="22"
|
|||
|
||||
# run master machine
|
||||
# Note: list of hosts hostname for deploying master
|
||||
masters="ark0,ark1"
|
||||
masters="ds1,ds2"
|
||||
|
||||
# run worker machine
|
||||
# note: list of machine hostnames for deploying workers
|
||||
workers="ark2,ark3,ark4"
|
||||
# note: need to write the worker group name of each worker, the default value is "default"
|
||||
workersGroup=(["ds1"]="default" ["ds2"]="default" ["ds3"]="default" ["ds4"]="default" ["ds5"]="default")
|
||||
|
||||
# run alert machine
|
||||
# note: list of machine hostnames for deploying alert server
|
||||
alertServer="ark3"
|
||||
alertServer="ds3"
|
||||
|
||||
# run api machine
|
||||
# note: list of machine hostnames for deploying api server
|
||||
apiServers="ark1"
|
||||
apiServers="ds1"
|
||||
|
||||
# whether to start monitoring self-starting scripts
|
||||
monitorServerState="false"
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@
|
|||
# worker heartbeat interval
|
||||
#worker.heartbeat.interval=10
|
||||
|
||||
# submit the number of tasks at a time
|
||||
# submit the number of tasks at a time TODO
|
||||
#worker.fetch.task.num = 3
|
||||
|
||||
# only less than cpu avg load, worker server can work. default value : the number of cpu cores * 2
|
||||
|
|
@ -34,4 +34,4 @@
|
|||
#worker.listen.port: 1234
|
||||
|
||||
# default worker group
|
||||
#worker.group=default
|
||||
worker.group=default
|
||||
|
|
@ -144,4 +144,33 @@ public class LogClientService {
|
|||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* remove task log
|
||||
* @param host host
|
||||
* @param port port
|
||||
* @param path path
|
||||
* @return remove task status
|
||||
*/
|
||||
public Boolean removeTaskLog(String host, int port, String path) {
|
||||
logger.info("log path {}", path);
|
||||
RemoveTaskLogRequestCommand request = new RemoveTaskLogRequestCommand(path);
|
||||
Boolean result = false;
|
||||
final Host address = new Host(host, port);
|
||||
try {
|
||||
Command command = request.convert2Command();
|
||||
Command response = this.client.sendSync(address, command, LOG_REQUEST_TIMEOUT);
|
||||
if(response != null){
|
||||
RemoveTaskLogResponseCommand taskLogResponse = FastJsonSerializer.deserialize(
|
||||
response.getBody(), RemoveTaskLogResponseCommand.class);
|
||||
return taskLogResponse.getStatus();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error("remove task log error", e);
|
||||
} finally {
|
||||
this.client.closeChannel(address);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
@ -29,6 +29,8 @@ import org.apache.dolphinscheduler.common.task.subprocess.SubProcessParameters;
|
|||
import org.apache.dolphinscheduler.common.utils.*;
|
||||
import org.apache.dolphinscheduler.dao.entity.*;
|
||||
import org.apache.dolphinscheduler.dao.mapper.*;
|
||||
import org.apache.dolphinscheduler.remote.utils.Host;
|
||||
import org.apache.dolphinscheduler.service.log.LogClientService;
|
||||
import org.apache.dolphinscheduler.service.quartz.cron.CronUtils;
|
||||
import org.quartz.CronExpression;
|
||||
import org.slf4j.Logger;
|
||||
|
|
@ -37,6 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
|
@ -238,7 +241,7 @@ public class ProcessService {
|
|||
* @param defineId
|
||||
* @return
|
||||
*/
|
||||
public List<TaskNode> getTaskNodeListByDefinitionId(Integer defineId){
|
||||
public List<TaskNode> getTaskNodeListByDefinitionId(Integer defineId){
|
||||
ProcessDefinition processDefinition = processDefineMapper.selectById(defineId);
|
||||
if (processDefinition == null) {
|
||||
logger.info("process define not exists");
|
||||
|
|
@ -293,15 +296,44 @@ public class ProcessService {
|
|||
|
||||
List<Integer> subProcessIdList = processInstanceMapMapper.querySubIdListByParentId(processInstanceId);
|
||||
|
||||
for(Integer subId : subProcessIdList ){
|
||||
for(Integer subId : subProcessIdList){
|
||||
deleteAllSubWorkProcessByParentId(subId);
|
||||
deleteWorkProcessMapByParentId(subId);
|
||||
removeTaskLogFile(subId);
|
||||
deleteWorkProcessInstanceById(subId);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* remove task log file
|
||||
* @param processInstanceId processInstanceId
|
||||
*/
|
||||
public void removeTaskLogFile(Integer processInstanceId){
|
||||
|
||||
LogClientService logClient = new LogClientService();
|
||||
|
||||
List<TaskInstance> taskInstanceList = findValidTaskListByProcessId(processInstanceId);
|
||||
|
||||
if (CollectionUtils.isEmpty(taskInstanceList)){
|
||||
return;
|
||||
}
|
||||
|
||||
for (TaskInstance taskInstance : taskInstanceList){
|
||||
String taskLogPath = taskInstance.getLogPath();
|
||||
if (StringUtils.isEmpty(taskInstance.getHost())){
|
||||
continue;
|
||||
}
|
||||
String ip = Host.of(taskInstance.getHost()).getIp();
|
||||
int port = Constants.RPC_PORT;
|
||||
|
||||
// remove task log from loggerserver
|
||||
logClient.removeTaskLog(ip,port,taskLogPath);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* calculate sub process number in the process define.
|
||||
* @param processDefinitionId processDefinitionId
|
||||
|
|
@ -926,6 +958,7 @@ public class ProcessService {
|
|||
command.setCommandParam(processMapStr);
|
||||
command.setCommandType(commandType);
|
||||
command.setProcessInstancePriority(parentProcessInstance.getProcessInstancePriority());
|
||||
command.setWorkerGroup(parentProcessInstance.getWorkerGroup());
|
||||
createCommand(command);
|
||||
logger.info("sub process command created: {} ", command.toString());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ import org.quartz.JobExecutionException;
|
|||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
|
|
@ -98,7 +99,8 @@ public class ProcessScheduleJob implements Job {
|
|||
command.setScheduleTime(scheduledFireTime);
|
||||
command.setStartTime(fireTime);
|
||||
command.setWarningGroupId(schedule.getWarningGroupId());
|
||||
command.setWorkerGroup(schedule.getWorkerGroup());
|
||||
String workerGroup = StringUtils.isEmpty(schedule.getWorkerGroup()) ? Constants.DEFAULT_WORKER_GROUP : schedule.getWorkerGroup();
|
||||
command.setWorkerGroup(workerGroup);
|
||||
command.setWarningType(schedule.getWarningType());
|
||||
command.setProcessInstancePriority(schedule.getProcessInstancePriority());
|
||||
|
||||
|
|
|
|||
|
|
@ -20,6 +20,12 @@ workDir=`dirname $0`
|
|||
workDir=`cd ${workDir};pwd`
|
||||
source $workDir/../conf/config/install_config.conf
|
||||
|
||||
txt=""
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
# Mac OSX
|
||||
txt="''"
|
||||
fi
|
||||
|
||||
hostsArr=(${ips//,/ })
|
||||
for host in ${hostsArr[@]}
|
||||
do
|
||||
|
|
@ -33,6 +39,11 @@ do
|
|||
|
||||
for dsDir in bin conf lib script sql ui install.sh
|
||||
do
|
||||
# if worker in workersGroup
|
||||
if [[ "${map[${host}]}" ]] && [[ "${dsDir}" -eq "conf" ]]; then
|
||||
sed -i ${txt} "s#worker.group.*#worker.group=${map[${host}]}#g" $workDir/../conf/worker.properties
|
||||
fi
|
||||
|
||||
echo "start to scp $dsDir to $host/$installPath"
|
||||
scp -P $sshPort -r $workDir/../$dsDir $host:$installPath
|
||||
done
|
||||
|
|
|
|||
|
|
@ -28,8 +28,7 @@ do
|
|||
|
||||
done
|
||||
|
||||
workersHost=(${workers//,/ })
|
||||
for worker in ${workersHost[@]}
|
||||
for worker in ${!workersGroup[*]}
|
||||
do
|
||||
echo "$worker worker server is starting"
|
||||
|
||||
|
|
|
|||
|
|
@ -29,8 +29,7 @@ do
|
|||
|
||||
done
|
||||
|
||||
workersHost=(${workers//,/ })
|
||||
for worker in ${workersHost[@]}
|
||||
for worker in ${!workersGroup[*]}
|
||||
do
|
||||
echo "$worker worker server is stopping"
|
||||
ssh -p $sshPort $worker "cd $installPath/; sh bin/dolphinscheduler-daemon.sh stop worker-server;"
|
||||
|
|
|
|||
|
|
@ -17,4 +17,5 @@
|
|||
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
|
||||
SET FOREIGN_KEY_CHECKS=0;
|
||||
UPDATE t_ds_resources SET pid=-1,is_directory=false WHERE pid IS NULL;
|
||||
UPDATE t_ds_resources SET full_name = concat('/',alias) WHERE pid=-1 and full_name IS NULL;
|
||||
UPDATE t_ds_resources SET full_name = concat('/',alias) WHERE pid=-1 and full_name IS NULL;
|
||||
UPDATE QRTZ_JOB_DETAILS SET JOB_CLASS_NAME='org.apache.dolphinscheduler.service.quartz.ProcessScheduleJob' WHERE JOB_CLASS_NAME='org.apache.dolphinscheduler.server.quartz.ProcessScheduleJob';
|
||||
|
|
|
|||
|
|
@ -368,9 +368,9 @@ DROP FUNCTION dc_dolphin_T_t_ds_error_command_D_worker_group_id();
|
|||
delimiter d//
|
||||
CREATE OR REPLACE FUNCTION uc_dolphin_T_t_ds_process_definition_A_process_definition_unique() RETURNS void AS $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (SELECT 1 FROM information_schema.STATISTICS
|
||||
WHERE TABLE_NAME='t_ds_process_definition'
|
||||
AND INDEX_NAME ='process_definition_unique')
|
||||
IF NOT EXISTS (SELECT 1 FROM pg_stat_all_indexes
|
||||
WHERE relname='t_ds_process_definition'
|
||||
AND indexrelname ='process_definition_unique')
|
||||
THEN
|
||||
ALTER TABLE t_ds_process_definition ADD CONSTRAINT process_definition_unique UNIQUE (name,project_id);
|
||||
END IF;
|
||||
|
|
|
|||
|
|
@ -15,4 +15,5 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
UPDATE t_ds_resources SET pid=-1,is_directory=false WHERE pid IS NULL;
|
||||
UPDATE t_ds_resources SET full_name = concat('/',alias) WHERE pid=-1 and full_name IS NULL;
|
||||
UPDATE t_ds_resources SET full_name = concat('/',alias) WHERE pid=-1 and full_name IS NULL;
|
||||
UPDATE QRTZ_JOB_DETAILS SET JOB_CLASS_NAME='org.apache.dolphinscheduler.service.quartz.ProcessScheduleJob' WHERE JOB_CLASS_NAME='org.apache.dolphinscheduler.server.quartz.ProcessScheduleJob';
|
||||
Loading…
Reference in New Issue