Code Monkey home page Code Monkey logo

hera's Introduction

由于误操作,将仓库设置为私有导致之前500star丢失,欢迎大家从新star github地址:https://github.com/scxwhite/hera

数据平台打造的任务调度系统(HERA)

Build Status

目前接入hera的公司(点我接入):

  • 杭州二维火科技有限公司
  • 杭州涂鸦科技有限公司
  • 北京高因科技(居理新房)有限公司
  • 盈亚科技有限公司
  • 北京智融时代信息技术有限公司
  • 卓尔智联集团(02098·HK)
  • 北京果敢时代科技有限公司(大V店)
  • 中通天鸿-**领先的云计算呼叫中心平台及人工智能科技公司
  • 杭州-呆萝卜
  • 微神马科技(大连)有限公司
  • 上海骅天技术服务有限公司
  • 浙江格家网络技术有限公司
  • 紫梧桐(北京)资产管理有限公司 (蛋壳公寓)
  • 海拍客
  • 摩比神奇(北京)信息技术有限公司
  • 杭州富聊科技有限公司
  • 来伊份大数据--------新鲜零食 来自上海 全国2800家专卖店
  • 广东步步高教育电子有限公司
  • 浙江慧度资产管理有限公司
  • 持续更新中。。欢迎大家自荐

交流群

个人微信(已满99人,需要我拉你进去)

在这里插入图片描述

赞助

开源不易,感谢支持

开源不易,感谢支持

介绍文章

操作文档

赫拉(hera)分布式任务调度系统之操作文档

赫拉(hera)分布式任务调度系统之架构,基本功能(一)

赫拉(hera)分布式任务调度系统之项目启动(二)

赫拉(hera)分布式任务调度系统之开发中心(三)

赫拉(hera)分布式任务调度系统之版本(四)

赫拉(hera)分布式任务调度系统之Q&A(五)

前言

在大数据平台,随着业务发展,每天承载着成千上万的ETL任务调度,这些任务集中在hive,shell脚本调度。怎么样让大量的ETL任务准确的完成调度而不出现问题,甚至在任务调度执行中出现错误的情况下,任务能够完成自我恢复甚至执行错误告警与完整的日志查询。hera任务调度系统就是在这种背景下衍生的一款分布式调度系统。随着hera集群动态扩展,可以承载成千上万的任务调度。它是一款原生的分布式任务调度,可以快速的添加部署wokrer节点,动态扩展集群规模。支持shell,hive,spark脚本调度,可以动态的扩展支持python等服务器端脚本调度。

hera分布式任务调度系统是根据前阿里开源调度系统(zeus)进行的二次开发,其中zeus大概在2014年开源,开源后却并未进行维护。我公司(二维火)2015年引进了zeus任务调度系统,一直使用至今年11月份,在我们部门乃至整个公司发挥着不可替代的作用。在我使用zeus的这一年多,不得不承认它的强大,只要集群规模于配置适度,他可以承担数万乃至十万甚至更高的数量级的任务调度。但是由于zeus代码是未维护的,前端更是使用GWT技术,难于在zeus上面进行维护。我与另外一个小伙伴(花名:凌霄,现在阿里淘宝部门)于今年三月份开始重写zeus,改名赫拉(hera)

***项目地址:[email protected]:scxwhite/hera.git ***

架构

hera系统只是负责调度以及辅助的系统,具体的计算还是要落在hadoop、hive、yarn、spark等集群中去。所以此时又一个硬性要求,如果要执行hadoop,hive,spark等任务,我们的hera系统的worker一定要部署在这些集群某些机器之上。如果仅仅是shell,那么也至少需要linux系统。对于windows系统,可以把自己作为master进行调试。

在这里插入图片描述

hera系统本身严格的遵从主从架构模式,由主节点充当着任务调度触发与任务分发器,从节点作为具体的任务执行器.架构图如下:

在这里插入图片描述 hera2.4 版本以上也支持了emr 集群,即允许任务执行在阿里云、亚马逊的 emr 机器之上,架构图如下: 在这里插入图片描述

功能

具体功能

  • 支持任务的定时调度、依赖调度、手动调度、手动恢复、超级恢复、重跑历史
  • 支持丰富的任务类型:shell,hive,python,spark-sql,java
  • 可视化的任务DAG图展示,任务的执行严格按照任务的依赖关系执行
  • 某个任务的上、下游执行状况查看,通过任务依赖图可以清楚的判断当前任务为何还未执行,删除该任务会影响那些任务。
  • 支持上传文件到hdfs,支持使用hdfs文件资源
  • 支持日志的实时滚动
  • 支持任务失败自动恢复
  • 实现集群HA,机器宕机环境实现机器断线重连与心跳恢复与hera集群HA,节点单点故障环境下任务自动恢复,master断开,worker抢占master
  • 支持对master/work 负载,内存,进程,cpu信息的可视化查看
  • 支持正在等待执行的任务,每个worker上正在执行的任务信息的可视化查看
  • 支持实时运行的任务,失败任务,成功任务,任务耗时top10的可视化查看
  • 支持历史执行任务信息的折线图查看 具体到某天的总运行次数,总失败次数,总成功次数,总任务数,总失败任务数,总成功任务数
  • 支持关注自己的任务,自动调度执行失败时会向负责人发送邮件
  • 对外提供API,开放系统任务调度触发接口,便于对接其它需要使用hera的系统
  • 组下任务总览、组下任务失败、组下任务正在运行
  • 支持map-reduce任务和yarn任务的实时取消。
  • 支持任务超时提醒
  • 支持用户与组的概念
  • 支持任务操作历史记录查看与恢复
  • 支持任务告警定位到个人
  • 告警类型支持邮箱以及自定义的钉钉、企业微信、短信、电话等
  • 支持任务各种条件的模糊搜索
  • 支持阿里云emr的自动创建、销毁
  • 支持亚马逊emr的自动创建、销毁、弹性伸缩
  • (还有更多,等待大家探索)

安装部署与启动

创建表

当使用githera克隆到本地之后,首先在hera/hera-admin/resources目录下找到hera.sql文件,在自己的数据库中新建这些必要的表,并插入初始化的数据(如果你目前使用的是低版本的hera,那么你可以到 update 目录查看是否有你的 hera 版本升级的 ddl ,如果有请根据你的版本依次执行 ddl 语句)

此时可以在hera/hera-admin/resources目录下找到application.yml文件。在文件里修改数据源hera的数据源(修改druid.datasource下的配置)即可进行下面的操作。

## 省略部分
druid:
  datasource:
    username: root  #数据库用户名
    password: moye      #数据库密码
    driver-class-name: com.mysql.jdbc.Driver  #数据库驱动
    url: jdbc:mysql://localhost:3306/hera?characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&allowMultiQueries=true
## 省略部分

打包部署

2.4.1及以上版本部署方案

[注:2.4.1及以上版本已经集成启动和关闭的sh]

在这里插入图片描述

如果你的 hera 使用的是 2.4.1 版本以上的,使用maven执行 mvn clean package -Dmaven.test.skip=true -Pdev 打包后在根目录会出现如图所示的压缩包 在这里插入图片描述

你可以通过 ssh 把该包上传到服务器,解压该tar.gz包。然后修改 config 目录下的application.yml 配置文件,在 bin 目录里执行 start.sh 脚本即可成功启动hera

2.4.1以下版本部署方案

mvn clean package -Dmaven.test.skip=true -Pdev

打包后可以进入hera-admin/target目录下查看打包后的hera-dev.jar 。此时可以简单使用java -server -Xms4G -Xmx4G -Xmn2G -jar hera.jar 启动项目,此时即可在浏览器中输入

localhost:8080/hera/login/admin

即进入登录界面,账号为hera 密码为biadmin,点击登录即进入系统。

注:目前hera有用户账户和组账户之分,默认跳转的登录地址为用户账户,需要用户注册(用户需要归属于一个组账户),然后hera组账户在用户管理里页面审核通过后即可登录用户账户。

顺便附上我的启动脚本

#!/bin/sh

JAVA_OPTS="-server -Xms4G -Xmx4G -Xmn2G -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=5 -XX:+CMSParallelInitialMarkEnabled -XX:CMSInitiatingOccupancyFraction=80  -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/opt/logs/spring-boot/gc.log -XX:MetaspaceSize=128m -XX:+UseCMSCompactAtFullCollection -XX:MaxMetaspaceSize=128m -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/logs/spring-boot/dump"

log_dir="/opt/logs/spring-boot"
log_file="/opt/logs/spring-boot/all.log"
jar_file="/opt/app/spring-boot/hera.jar"


#日志文件夹不存在,则创建
if [ ! -d "${log_dir}" ]; then
    echo "创建日志目录:${log_dir}"
    mkdir -p "${log_dir}"
    echo "创建日志目录完成:${log_dir}"
fi


#父目录下jar文件存在
if [ -f "${jar_file}" ]; then
    #启动jar包 错误输出的error 标准输出的log
    nohup java $JAVA_OPTS -jar ${jar_file} 1>"${log_file}" 2>"${log_dir}"/error.log &
    echo "启动完成"
    exit 0
else
    echo -e "\033[31m${jar_file}文件不存在!\033[0m"
    exit 1
fi

关闭的脚本

#!/bin/bash
pid=`ps aux| grep java | grep hera | awk '{print $2}'`

[ ! $pid ] && echo "找不到hera的进程,请确认hera已经启动" && exit 0

res=`kill -9 $pid`

echo 关闭hera成功,pid:$pid

测试

默认登陆地址为:http://localhost:8080/hera 下面需要做的是在worker管理这里添加执行任务的机器IP,然后选择一个机器组(组的概念:对于不同的worker而言环境可能不同,可能有的用来执行spark任务,有的用来执行hadoop任务,有的只是开发等等。当创建任务的时候根据任务类型选择一个组,要执行任务的时候会发送到相应的组的机器上执行任务)。 对于执行work的机器ip调试时可以是master,生产环境建议不要让master执行任务。如果要执行map-reduce或者spark任务,要保证你的work具有这些集群的客户端。 那么我们就在work管理页面增加要执行的work地址以及机器组。

在这里插入图片描述

此时有30分钟的缓冲时间,master 才会检测到该 work 加入。为了测试,此时我们可以通过重启 master 来立刻使该 work加入执行组(后面会增加一键刷新work` 信息)。

此时要注意,我们的 work 也一定也要安装 hera 应用并启动。

重启后我们可以进入调度中心 ,在搜索栏里搜索 1 ,然后按回车 在这里插入图片描述

会发现一个 echoTest 任务 ,此时我们还不能执行任务,因为我们的所有任务的执行者登录用户。比如此刻我使用 hera 登录的,那么此时一定要保证你的 work 机器上有 hera 这个用户。 否则执行任务会出现 sudo: unknown user: hera 异常。 在这里插入图片描述

此时可以向我们填写的 work 机器上增加 hera 用户。

useradd hera

如果是 mac 系统 那么可以使用以下命令创建 hera 用户

sudo  dscl . -create /Users/hera
sudo  dscl . -create /Users/hera UserShell /bin/bash
sudo  dscl . -create /Users/hera RealName "hera分布式任务调度"
sudo  dscl . -create /Users/hera UniqueID "1024"
sudo  dscl . -create /Users/hera PrimaryGroupID 80
sudo  dscl . -create /Users/hera NFSHomeDirectory /Users/hera

此时点击手动执行->选择版本->执行。此时该任务会运行,点击右上角的查看日志,可以看到任务的执行记录。

此时如果任务执行失败,error 日志内容为

sudo: no tty present and no askpass program specified

那么此时要使你启动 hera 项目的用户具有 sudo -u hera 的权限(无须输入root密码,即可执行 sudo -u hera echo 1 ,具体可以在 sudo visudo 中配置)。 比如我启动 hera 应用的用户是 wyr 那么首先在终端执行 sudo visudo命令,此时会进入文本编辑 然后在后面追加一行

wyr             ALL=(ALL) NOPASSWD:ALL

如下图: 在这里插入图片描述 这样就会在切换用户的时候无须输入密码。当然如果你使用的是root用户启动,即可跳过这段。

由于在 hera 中还用到了 dos2unix ,需要在执行任务的work上安装 dos2unix 工具。

yum install dos2unix

如果一切配置完成,那么即可看到输出任务执行成功的日志。

在这里插入图片描述 至此 已经完成了 任务的手动执行。

TIPS

当然在部署的时候可能会出现各种状况。 比如:work 无法连接到 master,连接时抛出

java.net.NoRouteToHostException: 没有到主机的路由

这个时候请注意,我们的master使用的端口是:9887。需要在每台 hera 机器上的防火墙开启此端口(最好关闭防火墙 sudo service iptables stop )。

还有一种情况: work 可以连接上 master ,但是在master日志中发现 work 总是一段时间后断开。原因是:hera 各个机器的时间不一致,修改一下

Contributors ✨

Thanks goes to these wonderful people (emoji key):

苏承祥
苏承祥

🎨
凌霄
凌霄

🎨
akong0115
akong0115

🎨
Yizhong Zhang
Yizhong Zhang

🎨
jet2007
jet2007

🎨

This project follows the all-contributors specification. Contributions of any kind welcome!

hera's People

Contributors

dependabot[bot] avatar haozi2015 avatar scxwhite avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

hera's Issues

DAG的疑问

文档中说支持DAG,没找到这部分功能,麻烦提示一下,谢谢

登陆不上

为啥 我这边使用hera 和 biadmin 登陆不上, 项目里 没看到 mapper 文件夹的 xml 文件,就是具体的sql 执行文件?

一键复制任务功能

希望开发一个一键复制任务的功能,以便代码开发时候,能够灵活使用不同代码版本。

sudo: source: command not found

执行echoTest 的例子, 报错。
image
看了一下生成出来的run.sh 脚本, 也看了下代码。问下为啥这边要加一个source命令?

hera_action的description和hera_job的description字段长度不一致导致生产事故

CREATE TABLE hera_action
description varchar(256) DEFAULT NULL COMMENT '版本描述',
CREATE TABLE hera_job
description varchar(2000) DEFAULT NULL COMMENT '任务描述',

hera_job的description输入长度超过256时,任务能保存成功,第二天凌晨批量生成版本时,因为某条版本插入失败影响到其他正常任务的版本生成,导致生产事故。

请求/hera/rerun/status异常

任务重跑页面,新建任务重跑流之后,迟迟没有动静, 点击 状态按钮 , 前端报“请联系管理员”。
报错信息如下

2020-06-10 14:59:30.017 ERROR com.dfire.logs.ErrorLog.error:23 请求/hera/rerun/status异常:
java.lang.NumberFormatException: null
	at java.lang.Integer.parseInt(Integer.java:542)

重启应用后,rerun 进程开始 。。

POST请求异常死循环问题

http外部调用,执行任务时,勿将GET请求写成POST方式,造成系统死循环。
原因:
异常拦截器返回error.index页面,被登录拦截器拦截,重定向至/login请求,但请求方式还是POST,造成POST方式的/login请求不存在,再次进入异常拦截器,不断重复。

依赖+时间

依赖调度的时候只有依赖job_id有些情况不满足需求,新版本中能否支持依赖调度的判断条件为两个 1:依赖任务 2:定时,在满足这两个条件后任务才执行

worker安全下线功能

为方便移除worker,而不影响在此worker上正在执行的job,需要增加worker下线功能,保证任务不在往此worker上分发,所有任务完成后,此worker可以下线。对每个worker上正在执行的job,也应该有可视化页面展示,方便观察此worker上是否所有任务都已经执行完成可以进行下线。

一些建议

首先感谢各位开发者的无私奉献,由于不算非常深度的试用,可能下面提到的建议不是很合理,请见谅!

1、目前查看某任务的整棵依赖树的方式感觉不方便,还得手动点击上游,下游再点所有,才能查看。应该输入任务节点后就显示整棵树,及各节点运行情况(颜色区分即可);
2、一个任务是否可以增加自依赖选择,即可以选择依赖自己上一版本执行情况,如果上一版本执行异常,下一版本就挂起;
3、对于已经产生异常,并错过很多版本的任务,在手动恢复执行完成后,漏跑检测仍然会把之前版本自动调起来跑,这个感觉不是很合理;
4、单任务日志查看的地方也应该增加状态选择,否则只能通过翻页来查找某个版本的执行情况;
5、当资源不够无法执行任务时,所有任务应该挂起,而不应该后续版本也继续跑起来呈报错状态;
6、比如有个任务设置的是1分钟跑一次,那生成的版本确实非常多,然后在手动执行的时候,下拉框里看不到所有版本;
7、假设A任务每日执行一次,B任务每小时执行一次,C任务依赖于A,B, 本意是想要C在B执行完后也跟着每小时自动运行,目前发现不可以,小时级任务无法依赖日任务,只会在日任务后执行一次;
8、是否可增加任务 忽略(指忽略错误)功能。 也就是说,如果某个任务执行失败, 然后可能是手工处理(或者该任务产生的告警或者错误可能实际上对后续影响不是特别大)完成后, 直接用忽略功能,后续的依赖就可以直接跑起来;

产品角度----任务组监控

任务组监控页面:查看大目录或小目录的执行TimeLine
展示列有:任务组,任务名,时间轴,状态,开始时间,结束时间,时长

参考:AZKABAN的flow job list
image

注册名与邮箱名

多人试用时,邮箱名不方便确定负责人,用户名建议取工号字段信息,替代邮箱名字前缀

还有bug啊

我参照了说明导入数据库后,用初始化用户hera密码biadmin登陆,报找不到用户的错误,后来我跟踪了代码,发现是去数据库里查询hera_sso的表,我尝试写入一条hera的记录后,后台爆出异常。。

2019-08-22 18:21:15.008 ERROR com.dfire.logs.ErrorLog.error:23 请求/hera/sso/login异常:
java.lang.NullPointerException: null
at java.util.Objects.requireNonNull(Objects.java:203)
at java.util.Optional.(Optional.java:96)
at java.util.Optional.of(Optional.java:108)
at com.dfire.controller.LoginController.ssoLogin(LoginController.java:123)
at com.dfire.controller.LoginController$$FastClassBySpringCGLIB$$cf490a14.invoke()
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)
at com.dfire.config.HeraAspect.around(HeraAspect.java:69)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
at com.dfire.controller.LoginController$$EnhancerBySpringCGLIB$$c6f2e5c1.ssoLogin()
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:108)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

release2.3.1新建任务手动执行无法选择版本

image

version:release2.3.1
新建任务后,生成版本成功,但是接下来手动执行时,选择版本的时候,下拉框不可用,无法选择版本,提交后也没有任务执行。

测试浏览器:Chrome、Firefox、Safari

产品角度--调度任务中心的若干建议

调度任务中心的定位是作业任务的配置管理,不应包括任务执行或监控;

一、作业任务的配置页面

  1. 删除任务执行功能(手动执行,手动恢复)
  2. 任务的【基本信息】拆分成三个分组[基础信息, 调度信息,告警信息]
  3. 基础信息当中,增加一个项【标签】,类似微信的标签功能,可以0~N个(业务角度);
    若有此项,在任务监控页面,可以根据标签快速搜索定位任务;

二、大目录与小目录
1.任务总览,失败记录,正在运行等功能,删除之;功能整合到任务管理中,见另一个issue[任务组监控]

关于调度任务的一些建议

1、任务日志显示运行成功,且exitCode=0,但是任务状态仍然是running,导致后面的任务只能wait,目前的方案只能去任务详情一个个把任务强制改为成功,后面的任务才会继续运行;
2、强烈建议在任务详情页面增加批量下发任务,即遇到多个任务下发失败,我可以输入这些任务列表,比如换行或都好分割,通过批量下发或者批量恢复来运行任务,而不是一个个恢复;以此类任务重跑页面也能够实现批量任务重跑,比如上游的任务重跑了最近1年的数据,下游的任务也批量重跑最近一年的数据

win系统克隆失败

win10系统在克隆至update/sql时,2.3->2.4创建失败。因为win10的文件系统不允许有特殊字符存在。

完整日志的一个解决方式

当前网页端的日志内容,是被精简的!完整日志的一个解决方式,参考code

主要思路:修改作业实例的tmp脚本
tmp脚本原内容

bash /opt/logs/spring-boot/2019-11-20/manual-7/1574231829198.sh

tmp脚本参考code

curDir=$(cd `dirname $0`; pwd)
scriptName=`basename $0`
cd ${curDir}

log_file=1574231829198.log 
echo "调度作业的日志文件:[${log_file}]"  ## 这里可以设置web服务之类功能,网页端就可下载最明细的日志
bash /opt/logs/spring-boot/2019-11-20/manual-7/1574231829198.sh   2>&1|tee -a ${log_file} 
if [ ${PIPESTATUS[0]}  != 0 ]
then
    runtime=`date '+%Y-%m-%d %H:%M:%S'`
    echo "调度作业执行失败,时间:[$runtime]" 2>&1|tee -a ${log_file} 
    exit -1
fi

多worker不全部显示的问题

您好,我这边碰到了问题,想把不同计算任务的平台放在hera做统一调度,但是发现不能全部显示出来,检查了服务器ip,没问题,在选择worker时ip显示却是为null。

二开后申请软著

请问,在hera的基础上做了二次开发后,想申请一个软著,需要什么授权吗?

Invalid character found in method name. HTTP method names must be tokens

hera2.4.2

bug 触发:

点击左侧【建议&留言】-> 左侧菜单【调度中心】或者左侧其他菜单
WechatIMG81

bug 提示:

2020-06-05 14:35:43.450 INFO o.a.c.http11.Http11Processor.log:181 Error parsing HTTP request header
Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:426)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:687)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)

产品角度--任务管理中心的若干建议

任务管理的定位是所有作业的任务管理中心

一、任务详情
1.1 任务详情,改名成[任务监控]
1.2 任务详情的主页面,
A) “机器”列删除;
B) 增加列[时长]: 总时长
C) 可选:默认时,查询状态为全部时,列“次数”--> 次数(失败),如值10(2), 共10次,失败2次。

1.3 任务详情的2级页面,的"操作"列,增加功能 针对【任务实例】的【手动当前,手动后续,取消,强制成功】;(说明,把调度中心的手动恢复,手动执行功能删除;)
操作:【手动当前,手动后续,取消,强制成功】的功能,注意根据当前状态,有些功能是不可用;比如状态=succ, 取消功能不可用;状态=runing, 手动当前+手动后续+强制成功--不可用
1.4 可选:日志功能;
A) 可整合到“操作”列中,第1列删除;且在新标签页打开明细日志,而非当前
B)日志内容中增加一行日志文件的地址;再可选,可下载日志文件
1.5 新增功能:查看当前版本号的“任务依赖关系图”
A) 整合到“操作”列中,新标签页打开;
1.6 主页面+2级页面: 增加一列功能:任务标签(从多年的业务角度的功能),详细介绍见另一个issue

二、任务依赖关系
1.展示: 展示任务名称,不要是id,冷冰冰的数字;业务开发者不喜欢;
2. 过滤条件:任务+版本号; 图中的任务状态的颜色,参考任务详情里面的颜色;

bin/start.sh不能在任何位置执行

bin目录
start.sh/restart 不能在任何位置执行;
stop.sh的命令:[ps aux | grep java | grep hera | awk '{print $2}] 不太严格,增加更多条件,避免 [ps aux | grep java | grep hera | grep jar |grep server | awk '{print $2}]

参考code
curDir=$(cd dirname $0; pwd)
scriptName=basename $0
cd ${curDir}

WorkHandler中的问题

com.dfire.core.netty.worker.WorkHandler中removeListener方法和addListener方法一样,这个removeListener方法是写错了还是特意这样写的:
public void removeListener(ResponseListener listener) {
listeners.add(listener);
}

同学,您这个项目引入了8个开源组件,存在1个漏洞,辛苦升级一下

检测到 scxwhite/hera 一共引入了8个开源组件,存在1个漏洞

漏洞标题:FasterXML jackson-databind 代码问题漏洞
漏洞编号:CVE-2020-25649
漏洞描述:FasterXML jackson-databind是一个基于JAVA可以将XML和JSON等数据格式与JAVA对象进行转换的库。Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。
FasterXML Jackson Databind存在代码问题漏洞,攻击者可利用该漏洞可以将恶意的XML数据传输到FasterXML Jackson Databind,以读取文件、扫描站点或触发拒绝服务。
影响范围:[2.10.0, 2.10.5.1)
最小修复版本:2.10.5.1
缺陷组件引入路径:com.dfire.hera:[email protected]>com.fasterxml.jackson.core:[email protected]

另外还有几个漏洞,详细报告:https://mofeisec.com/jr?p=if6d2d

/hera/rerun/add异常

rerun 界面如果不选择截止时间,会报请联系管理员 。并且后台出现
`
insert into hera_rerun ( job_id,name,start_millis,gmt_create,sso_name,extra ) values ( ?,?,?,?,?,? )

Cause: java.sql.SQLException: Field 'end_millis' doesn't have a default value

`
加个前端校验吧 。 体验会好一点 。

关于master如何获取可用worker机器的建议

 当前版本中,master持有可用worker节点是通过LostJobCheck,半小时的周期,从配置表中读取master可选用的worker。如果发生了worker下线了,master内存中持有的worker信息又不能够及时更新,会导致master在分发任务的时候,选取下线的worker进行任务分发。
 能否将刷新master中worker信息的功能做在master接收worker心跳的时候,将worker信息更新,用一个线程周期性的判断worker信息的时间,超过心跳时间的worker进行移除。

worker 是否可用问题

大家好,有个问题想请教下:
我部署了三台机器,ip分别是
image
计划是把100作为master,另两台作为worker,但master也作为worker执行任务。
其中78这台机器由于8080端口被占用,所以我用的8081,但是9887是可以的。
我的问题是:
1、如何查看目前哪些worker节点可用?
2、机器组监控 只能看到68这台机器的监控
3、在调度中心,执行任务只能随机选择某个worker执行吗,能不能这个机器组的机器全部执行?
4、调度中心执行任务时,我看到执行任务的机器是100或者68,没有78,是因为端口的原因吗

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.