Skip to content

Commit 3273bfb

Browse files
author
gituser
committed
Merge branch 'hotfix_1.10_4.1.x_34810' into 1.10_release_4.1.x
2 parents dd55139 + 7bbd2da commit 3273bfb

File tree

22 files changed

+286
-154
lines changed

22 files changed

+286
-154
lines changed

core/pom.xml

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -108,17 +108,6 @@
108108
<artifactId>joda-time</artifactId>
109109
<version>2.5</version>
110110
</dependency>
111-
<dependency>
112-
<groupId>org.slf4j</groupId>
113-
<artifactId>slf4j-simple</artifactId>
114-
<version>1.7.30</version>
115-
</dependency>
116-
117-
<dependency>
118-
<groupId>log4j</groupId>
119-
<artifactId>log4j</artifactId>
120-
<version>1.2.17</version>
121-
</dependency>
122111
</dependencies>
123112

124113
<build>
@@ -187,6 +176,7 @@
187176
<include name="${project.artifactId}-${project.version}.jar" />
188177
</fileset>
189178
</copy>
179+
<!--suppress UnresolvedMavenProperty -->
190180
<move file="${basedir}/../sqlplugins/${project.artifactId}-${project.version}.jar"
191181
tofile="${basedir}/../sqlplugins/${project.name}-${git.branch}.jar" />
192182
</tasks>

core/src/main/java/com/dtstack/flink/sql/dirtyManager/consumer/AbstractDirtyDataConsumer.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import org.slf4j.LoggerFactory;
2424

2525
import java.io.Serializable;
26-
import java.util.Properties;
26+
import java.util.Map;
2727
import java.util.concurrent.LinkedBlockingQueue;
2828
import java.util.concurrent.TimeUnit;
2929
import java.util.concurrent.atomic.AtomicBoolean;
@@ -66,7 +66,7 @@ public abstract class AbstractDirtyDataConsumer implements Runnable, Serializabl
6666
* @param properties 任务参数
6767
* @throws Exception throw exception
6868
*/
69-
public abstract void init(Properties properties) throws Exception;
69+
public abstract void init(Map<String, Object> properties) throws Exception;
7070

7171
/**
7272
* 检验consumer是否正在执行
@@ -83,8 +83,7 @@ public void run() {
8383
}
8484
} catch (Exception e) {
8585
LOG.error("consume dirtyData error", e);
86-
errorCount.incrementAndGet();
87-
if (errorCount.get() > errorLimit) {
86+
if (errorCount.getAndIncrement() > errorLimit) {
8887
throw new RuntimeException("The task failed due to the number of dirty data consume failed reached the limit " + errorLimit);
8988
}
9089
}

core/src/main/java/com/dtstack/flink/sql/dirtyManager/consumer/DirtyConsumerFactory.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@
3333
* Date 2020/12/21 星期一
3434
*/
3535
public class DirtyConsumerFactory {
36-
private static final String DEFAULT_DIRTY_TYPE = "console";
37-
private static final String DIRTY_CONSUMER_PATH = "dirtyData";
38-
private static final String CLASS_PRE_STR = "com.dtstack.flink.sql.dirty";
39-
private static final String CLASS_POST_STR = "DirtyDataConsumer";
36+
public static final String DEFAULT_DIRTY_TYPE = "console";
37+
public static final String DIRTY_CONSUMER_PATH = "dirtyData";
38+
public static final String CLASS_PRE_STR = "com.dtstack.flink.sql.dirty";
39+
public static final String CLASS_POST_STR = "DirtyDataConsumer";
4040

4141
/**
4242
* 通过动态方式去加载脏数据插件

core/src/main/java/com/dtstack/flink/sql/dirtyManager/manager/DirtyDataManager.java

Lines changed: 89 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -27,30 +27,41 @@
2727
import org.slf4j.LoggerFactory;
2828

2929
import java.io.Serializable;
30-
import java.util.Properties;
30+
import java.util.Map;
31+
import java.util.Objects;
3132
import java.util.concurrent.LinkedBlockingQueue;
3233
import java.util.concurrent.ThreadPoolExecutor;
3334
import java.util.concurrent.TimeUnit;
3435
import java.util.concurrent.atomic.AtomicLong;
3536

37+
import static com.dtstack.flink.sql.dirtyManager.manager.DirtyKeys.DEFAULT_BLOCKING_INTERVAL;
38+
import static com.dtstack.flink.sql.dirtyManager.manager.DirtyKeys.DEFAULT_ERROR_LIMIT_RATE;
39+
import static com.dtstack.flink.sql.dirtyManager.manager.DirtyKeys.DEFAULT_PRINT_LIMIT;
40+
import static com.dtstack.flink.sql.dirtyManager.manager.DirtyKeys.DEFAULT_TYPE;
41+
import static com.dtstack.flink.sql.dirtyManager.manager.DirtyKeys.DIRTY_BLOCK_STR;
42+
import static com.dtstack.flink.sql.dirtyManager.manager.DirtyKeys.DIRTY_LIMIT_RATE_STR;
43+
import static com.dtstack.flink.sql.dirtyManager.manager.DirtyKeys.PLUGIN_LOAD_MODE_STR;
44+
import static com.dtstack.flink.sql.dirtyManager.manager.DirtyKeys.PLUGIN_PATH_STR;
45+
import static com.dtstack.flink.sql.dirtyManager.manager.DirtyKeys.PLUGIN_TYPE_STR;
46+
import static com.dtstack.flink.sql.dirtyManager.manager.DirtyKeys.PRINT_LIMIT_STR;
47+
3648
/**
3749
* @author tiezhu
3850
* Company dtstack
3951
* Date 2020/8/27 星期四
4052
*/
4153
public class DirtyDataManager implements Serializable {
54+
private static final long serialVersionUID = 1L;
4255

4356
public final static int MAX_POOL_SIZE_LIMIT = 5;
44-
private static final long serialVersionUID = 7190970299538893497L;
4557
private static final Logger LOG = LoggerFactory.getLogger(DirtyDataManager.class);
46-
private static final String DIRTY_BLOCK_STR = "blockingInterval";
47-
private static final String DIRTY_LIMIT_RATE_STR = "errorLimitRate";
4858
private final static int MAX_TASK_QUEUE_SIZE = 100;
49-
private final static String DEFAULT_ERROR_LIMIT_RATE = "0.8";
50-
private final static String DEFAULT_BLOCKING_INTERVAL = "60";
51-
public static AbstractDirtyDataConsumer consumer;
5259

53-
private static ThreadPoolExecutor dirtyDataConsumer;
60+
private AbstractDirtyDataConsumer consumer;
61+
private transient ThreadPoolExecutor dirtyDataConsumer;
62+
63+
private static final DirtyDataManager INSTANCE = new DirtyDataManager();
64+
5465
/**
5566
* 统计manager收集到的脏数据条数
5667
*/
@@ -68,45 +79,65 @@ public class DirtyDataManager implements Serializable {
6879
*/
6980
private double errorLimitRate;
7081

82+
private DirtyDataManager() {
83+
84+
}
85+
7186
/**
7287
* 通过参数生成manager实例,并同时将consumer实例化
7388
*/
74-
public static DirtyDataManager newInstance(Properties properties) {
89+
public static DirtyDataManager newInstance(Map<String, Object> properties) {
7590
try {
76-
DirtyDataManager manager = new DirtyDataManager();
77-
manager.blockingInterval = Long.parseLong(String.valueOf(properties.getOrDefault(DIRTY_BLOCK_STR, DEFAULT_BLOCKING_INTERVAL)));
78-
manager.errorLimitRate = Double.parseDouble(String.valueOf(properties.getOrDefault(DIRTY_LIMIT_RATE_STR, DEFAULT_ERROR_LIMIT_RATE)));
79-
consumer = DirtyConsumerFactory.getDirtyConsumer(
80-
properties.getProperty("type")
81-
, properties.getProperty("pluginPath")
82-
, properties.getProperty("pluginLoadMode")
83-
);
84-
consumer.init(properties);
85-
consumer.setQueue(new LinkedBlockingQueue<>());
86-
dirtyDataConsumer = new ThreadPoolExecutor(MAX_POOL_SIZE_LIMIT, MAX_POOL_SIZE_LIMIT, 0, TimeUnit.MILLISECONDS,
87-
new LinkedBlockingQueue<>(MAX_TASK_QUEUE_SIZE), new DTThreadFactory("dirtyDataConsumer"), new ThreadPoolExecutor.CallerRunsPolicy());
88-
dirtyDataConsumer.execute(consumer);
89-
return manager;
91+
INSTANCE.setBlockingInterval(Long.parseLong(
92+
String.valueOf(properties.getOrDefault(DIRTY_BLOCK_STR, DEFAULT_BLOCKING_INTERVAL))));
93+
INSTANCE.setErrorLimitRate(Double.parseDouble(
94+
String.valueOf(properties.getOrDefault(DIRTY_LIMIT_RATE_STR, DEFAULT_ERROR_LIMIT_RATE))));
95+
96+
INSTANCE.setConsumer(properties);
97+
return INSTANCE;
9098
} catch (Exception e) {
9199
throw new RuntimeException("create dirtyManager error!", e);
92100
}
93101
}
94102

103+
private void setConsumer(Map<String, Object> properties) throws Exception {
104+
consumer = DirtyConsumerFactory.getDirtyConsumer(
105+
String.valueOf(properties.getOrDefault(PLUGIN_TYPE_STR, DEFAULT_TYPE)),
106+
String.valueOf(properties.get(PLUGIN_PATH_STR)),
107+
String.valueOf(properties.get(PLUGIN_LOAD_MODE_STR))
108+
);
109+
consumer.init(properties);
110+
consumer.setQueue(new LinkedBlockingQueue<>());
111+
}
112+
113+
public void execute() {
114+
if (Objects.isNull(dirtyDataConsumer)) {
115+
dirtyDataConsumer = new ThreadPoolExecutor(
116+
MAX_POOL_SIZE_LIMIT,
117+
MAX_POOL_SIZE_LIMIT,
118+
0,
119+
TimeUnit.MILLISECONDS,
120+
new LinkedBlockingQueue<>(MAX_TASK_QUEUE_SIZE),
121+
new DTThreadFactory("dirtyDataConsumer", true),
122+
new ThreadPoolExecutor.CallerRunsPolicy());
123+
dirtyDataConsumer.execute(consumer);
124+
}
125+
}
126+
95127
/**
96128
* 设置脏数据插件默认配置
97129
*
98130
* @return console的默认配置
99131
*/
100132
public static String buildDefaultDirty() {
101133
JSONObject jsonObject = new JSONObject();
102-
jsonObject.put("type", "console");
103-
jsonObject.put("printLimit", "1000");
134+
jsonObject.put(PLUGIN_TYPE_STR, DEFAULT_TYPE);
135+
jsonObject.put(PRINT_LIMIT_STR, DEFAULT_PRINT_LIMIT);
104136
return jsonObject.toJSONString();
105137
}
106138

107139
/**
108140
* 脏数据收集任务停止,任务停止之前,需要将队列中所有的数据清空
109-
* TODO consumer 关闭时仍有数据没有消费到,假如有500条数据,在结束时实际消费数量可能只有493
110141
*/
111142
public void close() {
112143
if (checkConsumer()) {
@@ -122,13 +153,17 @@ public void close() {
122153
public void collectDirtyData(String dataInfo, String cause) {
123154
DirtyDataEntity dirtyDataEntity = new DirtyDataEntity(dataInfo, System.currentTimeMillis(), cause);
124155
try {
125-
consumer.collectDirtyData(dirtyDataEntity, blockingInterval);
126156
count.incrementAndGet();
127-
} catch (Exception ignored) {
157+
consumer.collectDirtyData(dirtyDataEntity, blockingInterval);
158+
} catch (Exception e) {
128159
LOG.warn("dirty Data insert error ... Failed number: " + errorCount.incrementAndGet());
129-
LOG.warn("error dirty data:" + dirtyDataEntity.toString());
160+
LOG.warn("error cause: " + e.getMessage());
161+
LOG.warn("error dirty data:" + dirtyDataEntity.getDirtyData());
130162
if (errorCount.get() > Math.ceil(count.longValue() * errorLimitRate)) {
131-
throw new RuntimeException(String.format("The number of failed number 【%s】 reaches the limit, manager fails", errorCount.get()));
163+
// close consumer and manager
164+
close();
165+
throw new RuntimeException(
166+
String.format("The number of failed number 【%s】 reaches the limit, manager fails", errorCount.get()));
132167
}
133168
}
134169
}
@@ -139,4 +174,28 @@ public void collectDirtyData(String dataInfo, String cause) {
139174
public boolean checkConsumer() {
140175
return consumer.isRunning();
141176
}
177+
178+
public AtomicLong getCount() {
179+
return count;
180+
}
181+
182+
public AtomicLong getErrorCount() {
183+
return errorCount;
184+
}
185+
186+
public long getBlockingInterval() {
187+
return blockingInterval;
188+
}
189+
190+
public void setBlockingInterval(long blockingInterval) {
191+
this.blockingInterval = blockingInterval;
192+
}
193+
194+
public double getErrorLimitRate() {
195+
return errorLimitRate;
196+
}
197+
198+
public void setErrorLimitRate(double errorLimitRate) {
199+
this.errorLimitRate = errorLimitRate;
200+
}
142201
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
package com.dtstack.flink.sql.dirtyManager.manager;
20+
21+
/**
22+
* Date: 2021/1/6
23+
*
24+
* @author tiezhu
25+
* Company dtstack
26+
*/
27+
public class DirtyKeys {
28+
public final static String DEFAULT_TYPE = "console";
29+
public final static String DEFAULT_BLOCKING_INTERVAL = "60";
30+
public final static String DEFAULT_ERROR_LIMIT_RATE = "0.8";
31+
public final static String DEFAULT_PRINT_LIMIT = "1000";
32+
33+
public final static String DIRTY_BLOCK_STR = "blockingInterval";
34+
public final static String DIRTY_LIMIT_RATE_STR = "errorLimitRate";
35+
public final static String PLUGIN_TYPE_STR = "type";
36+
public final static String PLUGIN_PATH_STR = "pluginPath";
37+
public final static String PLUGIN_LOAD_MODE_STR = "pluginLoadMode";
38+
39+
public final static String PRINT_LIMIT_STR = "printLimit";
40+
41+
public final static String ENV_CLASSLOADER = "envClassLoader";
42+
public final static String TABLE_NAME = "tableName";
43+
}

core/src/main/java/com/dtstack/flink/sql/dirtyManager/manager/TestMain.java

Lines changed: 0 additions & 34 deletions
This file was deleted.

0 commit comments

Comments
 (0)