Azkaban
发表于|更新于
|浏览量:
坦诚是最明智的策略。——富兰克林
分享一个工作流框架
https://github.com/azkaban/azkaban
官方文档
Azkaban documentation! — Azkaban documentation
Azkaban是一个分布式工作流管理器,在LinkedIn上实现,以解决Hadoop作业依赖性的问题。我们的作业需要按顺序运行,从 ETL 作业到数据分析产品。
Features 特征
- 与任何版本的 Hadoop 兼容
- 易于使用的 Web UI
- 简单的 Web 和 http 工作流上传
- 项目工作区
- 工作流的调度
- 模块化和可插件化
- 身份验证和授权
- 跟踪用户操作
- 有关失败和成功的电子邮件警报
- SLA告警和自动杀伤
- 重试失败的作业
阿兹卡班的设计主要考虑了可用性。它已经在LinkedIn上运行了好几年,并驱动了他们的许多Hadoop和数据仓库流程。
相关推荐
2024-01-11
ClassPathResource踩坑
不要对一切人都以不信任的眼光看待,但要谨慎而坚定。——德谟克里特 今天看到一个问题 12345678910111213static { try { ClassPathResource resource = new ClassPathResource("ip2region.xdb"); //获取真实文件路径 String path = resource.getURL().getPath(); byte[] cBuff = Searcher.loadContentFromFile(path); SEARCHER = Searcher.newWithBuffer(cBuff); log.info("加载了ip2region.xdb文件,Searcher初始化完成!"); } catch (Exception e) { log.error("初始化ip2region.xdb文件失败,报错...
2021-01-06
Date转换
一个人成为他自己了,那就是达到了快乐的顶点。——德西得乌·伊拉斯谟 相信大家都用过SimpleDateFormat去转换时间,但它是线程不安全的 阿里开发手册也有讲 【强制】SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果定义为 static, 必须加锁,或者使用 DateUtils 工具类。 正例:注意线程安全,使用 DateUtils。亦推荐如下处理: 123456private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() { @Override protected DateFormat initialValue() { return new SimpleDateFormat("yyyy-MM-dd"); }}; 说明:如果是 JDK8 的应用,可以使用 Instant 代替 Date,LocalDateTime...
2023-01-25
Cacheable CacheEvict CachePut
看书和学习是思想的经常营养,是思想的无穷发展——冈察洛夫 昨天写了spring caching简单入门 今天把省下俩注解也说了 一共是 @Cacheable加缓存(缓存获取不到就调用方法获取结果再放入缓存) @CachePut更新缓存,我下方的用法有误,应该和其余俩注解应用的方法参数保持一致,见后续博客 @CacheEvict删缓存 我们在Repository实现类加上这几个缓存注解 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950package com.ruben.simplecache;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.cache.annotation.CacheEvict;import org.springframework.cache.annotation.CachePut;import org.spring...
2021-03-05
避免list中remove导致ConcurrentModificationException
凡不是就着泪水吃过面包的人是不懂得人生之味的人——歌德 我们在list循环中调用remove函数删除自身元素可能会导致java.util.ConcurrentModificationException 例如 1234// 构造从0到20的listList<Integer> list = Stream.iterate(0, i -> ++i).limit(20).collect(Collectors.toList());// 删除list.forEach(list::remove); 首先我们可以使用removeIf代替 1list.removeIf(i -> i.equals(i)); 其次我们可以使用迭代器 我们可以看到removeIf的源码正是使用了迭代器 如下 12345Iterator<Integer> iterator = list.iterator();while (iterator.hasNext()) { Integer nowNumber = iterator.next(); iterator....
2020-06-17
Optional进行优雅非空判断
又到了阿超说博客时间 今日给小伙伴们带来的是如何用Optional这个类 近日,国外一小哥因为不写注释和括号换行,以及用git经常覆盖掉同事的代码被揍 在这里阿超也顺便提醒一下大家:代码不规范,同事两行泪 那么进入今天的正题吧~今天带来的是1.8的这个类Optional,Optional在英文中是可选的意思,他在java中可以作为非空判断,是妥妥的炫技哦! 首先是进行字符串的长度取值 123456789101112/** * 获取一个字符串的长度 * * @param str * @return */Integer strLength(String str) { if (str == null) { return 0; } return str.length();} 相信有不少小伙伴看出来了,这段代码是大家经常写的,这种逻辑代码,传入的字符串为空,如果调用它的方法,会报NullPointerException 所以我们给她加了个非空判断 现在展示新写法: 12345678910/** * 获取一个字符串的长...
2020-09-14
java获取当前运行类名、方法名、行号
使人疲惫的不是远方的高山,而是鞋子里的一粒沙子。——伏尔泰 转载,原文戳我 码住,这个确实感觉不错 12345678910111213141516171819202122//获取方法名:public static String getCurrentMethodName() { int level = 1; StackTraceElement[] stacks = new Throwable().getStackTrace(); String methodName = stacks[level].getMethodName(); return methodName;}//获取类名:public static String getCurrentClassName() { int level = 1; StackTraceElement[] stacks = new Throwable().getStackTrace(); String className = stacks[level].getClassNam...

阿超
我的名字叫阿超 年龄25岁 家在北京市 职业是软件开发 每天最晚也会在八点前回家 不抽烟 酒浅尝辄止 晚上十二点上床 保证睡足八个小时 睡前写一篇博客 再做二十分钟俯卧撑暖身 然后再睡觉 基本能熟睡到天亮 像婴儿一样不留下任何疲劳和压力 就这样迎来第二天的早晨 健康检查结果也显示我很正常 我想说明我是一个不论何时都追求内心平稳的人 不拘泥于胜负 不纠结于烦恼 不树立使我夜不能寐的敌人 这就是我在这社会的生活态度
Follow Me公告
This is my Blog