Oozie + YARN连接异常导致多工作流并发运行问题求助
我来帮你一步步拆解和解决这个问题:
一、先处理MySQL连接超时错误(E0603)
这个错误是Oozie服务/客户端和它的元数据MySQL数据库之间的连接超时导致的,完全不需要在Oozie工作流XML的每个action里配置,你需要修改的是Oozie的核心数据库连接配置:
配置JDBC连接参数
autoReconnect=true
找到Oozie的配置文件oozie-site.xml,定位到oozie.service.JPAService.jdbc.url这个属性,在JDBC URL末尾追加连接参数:jdbc:mysql://<你的数据库主机>:<端口>/<Oozie元数据库名>?autoReconnect=true&autoReconnectForPools=true加上
autoReconnectForPools是为了适配连接池场景,确保连接断开后能自动重连。调整MySQL服务器的
wait_timeout(可选)
如果你的工作流运行时间确实很长,超过了MySQL默认的wait_timeout(通常是8小时),可以修改MySQL的配置文件my.cnf(Linux)或my.ini(Windows):wait_timeout = 28800 # 单位是秒,这里设置为8小时,可根据工作流最长运行时间调整 interactive_timeout = 28800 # 建议同时调整这个参数修改后重启MySQL服务即可。如果没有权限修改MySQL配置,优先用上面的
autoReconnect=true方案。
二、解决同一时间多个工作流重复启动的问题
这个问题的根源是Oozie因为数据库连接超时,无法正确更新第一个工作流的状态,导致你的应用误以为第一个工作流已经中断,进而启动了第二个。解决完连接超时问题后,还可以再加一层保障:
启动前检查运行中的工作流
在你的应用启动新工作流之前,调用Oozie的API查询当前是否有处于RUNNING状态的目标工作流。比如用Oozie客户端命令:oozie jobs -oozie http://<Oozie服务地址>:11000/oozie -filter status=RUNNING,name=<你的工作流名称>如果返回结果不为空,就不启动新的工作流。
用Oozie Coordinator控制并发
如果你的工作流是周期性运行的,建议用Oozie Coordinator来调度,在Coordinator的XML里设置concurrency="1",这样Coordinator会自动确保同一时间只有一个工作流实例在运行:<coordinator-app name="your-coord" frequency="${coord:days(1)}" start="${startTime}" end="${endTime}" timezone="UTC" xmlns="uri:oozie:coordinator:0.5"> <controls> <concurrency>1</concurrency> <timeout>1440</timeout> </controls> <!-- 其他配置 --> </coordinator-app>避免误判工作流状态
不要仅通过“连接中断”就判定工作流结束,应该以Oozie返回的工作流状态(RUNNING/SUCCEEDED/FAILED)为准,因为YARN上的任务可能还在正常运行,只是Oozie和数据库的连接断了而已。
内容的提问来源于stack exchange,提问作者Anuj Mehra

