Doris(0.15.1-rc09)使用Datax-DorisWrite导致BE固定节点streamLoad任务过多问题排查
admin
2024-01-28 06:51:46
0
版本:
Doris : 0.15.1-rc09
背景:

Datax是一个优秀的增量和全量数据同步工具。最近项目组在使用Datax和DorisWrite插件来备份Mysql数据到Doris中,随着备份任务的增加,我们发现,通过Prometheus监控的BE节点中,某固定BE节点Streamload任务增长速率过高(相关指标:doris_be_streaming_load_requests_total)频繁报警。

我们目前总共有10个BE节点。正常情况下,streamLoad任务应该是挑选BE负载低的节点来进行导入任务,而且备份任务是在任务的低峰期进行的,因此集群的负载不会太高,streamLoad任务也不应该频繁处在某一个固定BE节点,那么频繁告警某个BE节点streamload任务增长速率过高肯定是有异常。

具体Prometheus告警信息如下:

[FIRING:1] Doris be streamload request total
Alerts Firing
[WARN] doris be streamload requests to much
Description: doris be 172.22.1.1:8040 streamload request increase rate to quickly, current increase rate is 5.933333333333334
Graph: 📈
Details:alertname: Doris be streamload request total
instance: 172.22.1.1:8040
user: doris
问题排查:

1.排查datax 的配置文件:

通过配置文件我们可以发现,本次DorisWrite采用的是直连BE的方式,并没有采用连接FE,通过FE转发的方式来进行streamLoad导入任务下发的方式。那么就不可能是FE下发导入任务时导致的Bug,只可能是DorisWrite有异常。

{"job": {"content": [{"reader": {"name": "mysqlreader","parameter": {"column": ["id","a","b","c","d"],"connection": [{"jdbcUrl": ["jdbc:mysql://127.0.0.1:33306/test"],"table": ["w_tunnel"]}],"splitPk": "id","username": "test","password": "test","where": "d = '1'"}},"writer": {"name": "doriswriter","parameter": {"beLoadUrl": ["172.22.1.1:8040","172.22.1.2:8040","172.22.1.3:8040","172.22.1.4:8040","172.22.1.5:8040","172.22.1.6:8040"],"jdbcUrl": "jdbc:doris://172.22.1.1:9030/test","loadProps": {"strict_mode": true},"maxBatchRows": "30000","maxBatchByteSize": "31457280","database": "test_db","table": "test_tbl","column": ["id","a","b","c","d"],"username": "test","password": "test","customFlag": 1,"webhook": "https://oapi.dingtalk.com/robot/send?access_token=1fb619bdbba5858a77e0a5035b62b92ac23423432c246648b9d5f47592f2be549","ipPort": "https://127.0.0.1/*","planId": 118,"jobId": 21437,"postSql": [],"preSql": []}}}],"setting": {"speed": {"channel": "1"}}}
}

2.排查DorisWrite源码:

com/alibaba/datax/plugin/writer/doriswriter/Key.java 该类主要是解析datax配置的Json文件中Doris配置的部分属性,主要是通过getBeLoadUrlList()方法来获取BE的列表接口。

    public List getBeLoadUrlList() {return this.options.getList(BE_LOAD_URL, String.class);}

com/alibaba/datax/plugin/writer/doriswriter/DorisWriter.java 这个主类就是DorisWrite的核心内容,我们从下面的初始化方法可以看到,DorisWriter初始化的时候,new 了一个DorisWriterEmitter对象,而这个对象中,主要是streamLoad导入核心类。

        @Overridepublic void init() {this.keys = new Key(super.getPluginJobConf());if("csv".equalsIgnoreCase(this.keys.getFormat())){this.rowCodec = new DorisCsvCodec(this.keys.getColumns(),this.keys.getColumnSeparator());}else{this.rowCodec = new DorisJsonCodec(this.keys.getColumns());}this.dorisWriterEmitter = new DorisWriterEmitter(keys); #重点类}

com/alibaba/datax/plugin/writer/doriswriter/DorisWriterEmitter.java 这个类主要就是获取连接地址,做一个具体的导入任务。通过getAvailableHost()来获取具体的BE连接HOST,通过代码我们可以看到,主要是通过hostPos的索引从targetHosts中来获取具体的HOST的。

public class DorisWriterEmitter {private static final Logger LOG = LoggerFactory.getLogger(DorisWriterEmitter.class);private final Key keys;private int hostPos = 0;//此处省略部分代码/*** loop to get target host** @return*/private String getAvailableHost() {if (this.hostPos >= targetHosts.size()) {this.hostPos = 0;}while (this.hostPos < targetHosts.size()) {final String host = targetHosts.get(hostPos);++this.hostPos;if (this.tryHttpConnection(host)) {return host;}}return null;}}

从这块代码就能很明显看出问题在哪了。在DorisWriter初始化时,每次都会new 一个新的DorisWriterEmitter对象,所以hostPos属性值每次都是0,如果targetHostslist的顺序不发生改变,且在

targetHosts索引为0时,能成功连接,那么无论如何都是拿到的targetHosts.get(0)处的host。datax的Json配置文件中beLoadUrl的顺序及告警信息刚好是一致的,说明问题就出在这了。

问题解决:

修改DorisWriterEmitter.getAvailableHost()方法,对beLoadUrl列表做一个shuffer,让它从targetHosts中随机选择一个Host即可。

    private String getAvailableHost() {Collections.shuffer(targetHosts);if (this.hostPos >= targetHosts.size()) {this.hostPos = 0;}while (this.hostPos < targetHosts.size()) {final String host = targetHosts.get(hostPos);++this.hostPos;if (this.tryHttpConnection(host)) {return host;}}return null;}
总结:

1.如果采用连接FE,通过FE转发的方式进行StreamLoad导入,可以在很大程度上避免这种情况出现,但通过转发之后,我们自己就没办法控制StreamLoad任务是落在哪个BE节点上。

2.采用BE直连的方式,可以在某种程度上提高导入效率,但如果出现像上面问题,可能会导致某节点负载过高,甚至OOM。

其他说明:

新版的Doris(1.1+)版本的DorisWrite代码进行了重构,现在是通过连接FE来实现的,可以避免这种情况。同时Datax最新Master分支代码,也已经合并了DorisWrite代码,后期,可以直接下载Datax来实现Doris数据导入,不用再自己编译打包DorisWrite插件了。

新版DorisWrite部分代码展示:

com/alibaba/datax/plugin/writer/doriswriter/DorisWriterManager.java

public class DorisWriterManager {//此处省略部分代码public DorisWriterManager( Keys options) {this.options = options;this.visitor = new DorisStreamLoadObserver (options);flushQueue = new LinkedBlockingDeque<>(options.getFlushQueueLength());this.startScheduler();this.startAsyncFlushing();}}

com/alibaba/datax/plugin/writer/doriswriter/DorisStreamLoadObserver.java

public class DorisStreamLoadObserver {private Keys options;private long pos;//此处省略部分代码private String getLoadHost() {List hostList = options.getLoadUrlList();long tmp = pos + hostList.size();for (; pos < tmp; pos++) {String host = new StringBuilder("http://").append(hostList.get((int)pos % hostList.size())).toString();if (checkConnection(host)) {return host;}}return null;}
}
附Prometheus监控规则:
groups:- name: Doris Be Streamload Request Totalrules:- alert: Doris be streamload request totalexpr: sum by(instance)(rate(doris_be_streaming_load_requests_total{group="be", job="pro-doris"}[1m])) > 5for: 1mlabels:user: dorisseverity: warnannotations:summary: "doris be streamload requests to much"description: "doris be {{ $labels.instance }} streamload request increase rate to quickly, current increase rate is {{$value}}"

相关内容

热门资讯

原创 1... 当全世界还沉浸在新年的余温里,79岁的特朗普却像个打了鸡血的斗士,精力旺盛得让人害怕。 他在委内瑞拉...
“科技年货”扎堆上新!华强北开... 新春将至 深圳华强北商业步行街 正掀起一场以 “科技年货”为主角的 消费热潮 记者近日采访获悉,围绕...
原创 中... 2026年1月15日,中国人工智能领域迎来里程碑时刻——由智谱与华为联合研发的多模态图像生成模型GL...
不学抖音学INS,OpenAI... 文 | 字母榜,作者 | 苗正,编辑 | 王靖 一年多以前,奥特曼对AI+广告这件事嗤之以鼻,他在...
真“车厘子自由”!价格近乎腰斩... 本文来源:消费者报道 作者:郑艺阳 “今年车厘子品质和价格达到了一个很好的平衡,不再是高端水果,而是...
阳光乳业大宗交易折价成交278... 阳光乳业01月16日大宗交易平台共发生13笔成交,合计成交量278.42万股,成交金额3872.81...
雷军:新一代SU7已经开始小订 雷军刚刚更新微博:新一代SU7已经开始小订,更多详情登录小米汽车APP。 来源:雷军
欧洲8国集体回应特朗普关税威胁... 据CCTV国际时讯:因丹麦自治领地格陵兰岛问题被美国总统特朗普宣布将加征关税的欧洲8国今天(1月18...
原创 中... 中国一年用的电,比美国、欧盟、俄罗斯、印度和日本加起来还多。当这个数字在2025年初被公之于众时,它...
中国芯片最大IPO,要来了 长鑫科技递交科创板IPO申请已获受理 资料图 作者 黎曼 编辑王庆武 原标题《开年最大IPO要来了》...
实探海南自贸港封关“满月”:国... 2026年1月18日,海南自贸港封关运作迎来“满月”。 走进海口国际免税城,椰风裹着暖融融的阳光,漫...
原创 杰... 财经摆渡人 精研出品 破浪前行,共探财富新局 大家好欢迎收看【古今财鉴】 2026年1月12日,北交...
突发特讯!马克龙回应美国关税威... 一场关税威胁,让美欧盟友关系再度紧绷。当地时间1月18日,法国总统马克龙针对美国的关税胁迫作出首次官...
原创 2... 彩排路透一曝光,镜头扫过那个圆乎乎的身影,弹幕瞬间分成了两派。一边开始吐槽:怎么又是他了?另一边则是...
内部炸锅!追觅员工怒怼CEO“... 来源:21ic电子网 快科技 近日,有员工在追觅科技智能汽车项目的千人大群里,直怼俞浩和陈龙冬的聊天...
兴业银行成功发行首单自贸区主体... 1月15日,兴业银行(601166.SH)在全市场首次以“玉兰债”模式发行银行自贸区主体境外债券,发...
印度对华出口激增67%,对美出... 参考消息网1月16日报道据美国消费者新闻与商业频道网站1月16日报道,随着美国总统特朗普加征的高额关...
投资前瞻(1.19—1.25)... 重点关注: ·央行连续第8个月通过买断式逆回购向市场注入中期流动性。 ·“十五五”期间电网投资计划比...
肿瘤科医生提醒:如果你属于这 ... 在所有常见肿瘤中,结直肠癌(也就是大家常说的“肠癌”)其实是个很“矛盾”的存在。一方面,它的发展速度...
九龙县多维发力激活电商发展新动... 01 “一村一主播”育才强基 紧扣高原农特产品上行需求,构建“基础培训、实战演练、创业孵化”三级体系...