调度系统Airflow1.10.4调研与介绍和docker安装
Airflow1.10.4介绍与安装
现在是9102年,8月中旬。airflow当前版本是1.10.4.
随着公司调度任务增大,原有的,基于crontab和mysql的任务调度方案已经不太合适了,需要寻找一个可以支持分布式扩容的调度系统解决方案。
最初瞄准azkaban来着,想着基于这个的二次开发。对比功能和社区热度之后,Airflow比较符合我们寻找的调度系统。
什么是Airflow
Airflow是一个以编程方式创作,安排和监控工作流程的平台。对比crontab来看,它是一个可以定时调度任务的系统,只不过,airflow的调度更容易管理。
- airflow支持任务依赖pipeline, 这是crontab以及quartz所不支持的。
- airflow调度系统和业务系统解耦。业务单独编写流程,支持任务热加载。
- airflow支持crontab定时格式
- airflow通过Python来定义task,可以实现复杂的逻辑,支持分支条件等
- airflow有一套完整的UI和管理系统
- airflow有强大的插件扩展方式,各种插件很丰富,很容易二次开发,添加新功能
- airflow是分布式设计,支持水平扩容
- airflow支持task实例,并支持数据业务日期bizdate, 也叫 execution_date.
- airflow支持任务补录backfill
- airflow支持任务之间数据传递(这个任务依赖于上个任务的变量)
- airflow支持序列执行(这个周期的任务依赖于上一个周期的执行结果是否成功)
Airflow 于 2014 年 10 月由 Airbnb 的 Maxime Beauchemin 开始。它是第一次提交的开源,并在 2015 年 6 月宣布正式加入 Airbnb Github。
该项目于 2016 年 3 月加入了 Apache Software Foundation 的孵化计划。
关于airflow具体使用细节,后面再详细介绍,这里就是一些在调度系统选型过程中查找的资料。
阿里基于airflow二次开发了调度平台Maat:
有赞基于airflow二次开发了大数据任务调度平台:
Google cloud提供了基于airflow的数据分析产品:

微软Azure支持airflow的运行:

当然,这些云厂商很可能是为了让你使用他们的数据产品,比如对象存储,lambda等。
社区异常活跃,star破万,更新频繁, Apache背书。据说作者早期在Facebook搞过一套调度系统,到airbnb就开源了airflow。大公司背书。

slack群组也很活跃

虽然是Python开发的,我也没玩过Python web, 但调研结果就是: 用Airflow吧。
Airflow的安装
官方文档有非常详细的安装教程。这里不再赘述。
想要记录的是基于docker安装airflow,以及做了一些特定的修改。
最终docker镜像为: https://github.com/Ryan-Miao/docker-airflow
使用方式很简单:
- clone 项目
- 构建airflow镜像
make build
- 启动
docker-compose -f docker-compose-CeleryExecutor.yml up -d
- 浏览器访问localhost:8089可以查看dag

- 浏览器访问localhost:5555可以查看worker
扩容3个worker
docker-compose -f docker-compose-CeleryExecutor.yml scale worker=3

所做的一些修改
修改时区为utc+8
Docker容器的时区
ENV LANGUAGE zh_CN.UTF-8
ENV LANG zh_CN.UTF-8
ENV LC_ALL zh_CN.UTF-8
ENV LC_CTYPE zh_CN.UTF-8
ENV LC_MESSAGES zh_CN.UTF-8
sed -i 's/^# zh_CN.UTF-8 UTF-8$/zh_CN.UTF-8 UTF-8/g' /etc/locale.gen \
&& locale-gen \
/bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
web server ui显示的时区,以及任务运行时的ds等时区:
参考https://blog.csdn.net/Crazy__Hope/article/details/83688986,
airflow.cfg
default_timezone = Asia/Shanghai
/usr/local/lib/python3.7/site-packages/airflow/utils/timezone.py
在 utc = pendulum.timezone(‘UTC’) 这行(第27行)代码下添加,
from airflow import configuration as conf
try:
tz = conf.get("core", "default_timezone")
if tz == "system":
utc = pendulum.local_timezone()
else:
utc = pendulum.timezone(tz)
except Exception:
pass
修改utcnow()函数 (在第69行)
原代码 d = dt.datetime.utcnow()
修改为 d = dt.datetime.now()
/usr/local/lib/python3.7/site-packages/airflow/utils/sqlalchemy.py
在utc = pendulum.timezone(‘UTC’) 这行(第37行)代码下添加
from airflow import configuration as conf
try:
tz = conf.get("core", "default_timezone")
if tz == "system":
utc = pendulum.local_timezone()
else:
utc = pendulum.timezone(tz)
except Exception:
pass
/usr/local/lib/python3.7/site-packages/airflow/www/templates/admin/master.html
把代码 var UTCseconds = (x.getTime() + x.getTimezoneOffset()*60*1000);
改为 var UTCseconds = x.getTime();
把代码 "timeFormat":"H:i:s %UTC%",
改为 "timeFormat":"H:i:s",
webserver查看日志,中文乱码问题
容器编码设置没问题,进去看日志文件也没问题,但是webserver查看的时候日志中文乱码。原因是http请求的mime
没设置编码。
/usr/local/lib/python3.7/site-packages/airflow/bin/cli.py
修改mime
mimetype="application/json;charset=utf-8",
Hive beeline认证
airflow支持beeline, 在connection里填写beeline的配置后,使用HiveOperator进行hive操作。我们的hive
没有使用kerberos, 而是ldap的账号密码认证。需要对后台的hvie任务做认证的修改。
修改hive_hooks.py的认证部分即可。Dockerfile注释掉的部分就是。
添加hive的支持
github的airflow docker没有hive相关的lib。我在Dockerfile里添加了hive的环境,这个后面再做优化,针对
不同的pool,安装不同的依赖。
ldap配置
参见https://www.cnblogs.com/woshimrf/p/ldap.html 配置我们的ldap服务。
然后修改airflow.cfg. 找到263行
authenticate = False
# 设置为True并打开ldap即可使用ldap配置
# auth_backend = airflow.contrib.auth.backends.ldap_auth
以及518行
[ldap]
# set this to ldaps://<your.ldap.server>:<port>
uri = ldap://192.168.2.2:389
user_filter = objectClass=inetOrgPerson
user_name_attr = sn
group_member_attr = memberOf
superuser_filter = memberOf=cn=g-admin,ou=group,dc=demo,dc=com
data_profiler_filter = memberOf=cn=g-users,ou=group,dc=demo,dc=com
bind_user = cn=admin,dc=demo,dc=com
bind_password = admin
basedn = dc=demo,dc=com
cacert =
search_scope = SUBTREE
参考
- airflow官方文档: https://airflow.apache.org/
- airflow中文文档: http://airflow.apachecn.org/#/zh/howto/operator
- airflow源码: https://github.com/apache/airflow
- airflow docker: https://github.com/Ryan-Miao/docker-airflow
调度系统Airflow1.10.4调研与介绍和docker安装的更多相关文章
- Prometheus介绍及docker安装方式
一.介绍 Prometheus是主要基于Go编写,最初在SoundCloud上构建的开源系统监视和警报工具包,它启发于 Google 的 borgmon 监控系统,由工作在 SoundCloud 的 ...
- Pinpoint介绍及docker安装方式
一.介绍 Pinpoint是用Java编写的大型分布式系统的APM(Application Performance Management应用程序性能管理)工具,受Dapper论文的启发,Pinpoin ...
- ElasticSearch 介绍、Docker安装以及基本检索第三篇
一.简介 1.1 什么是Elasticsearch? Elasticsearch是一个分布式的开源搜索和分析引擎, 适用于所有类型的数据,包括文本.数字.地理空间.结构化和啡结构化数据.Elastic ...
- Hadoop 开源调度系统zeus(二)
紧跟之前Hadoop 开源调度系统zeus(一) 本节主要介绍一下zeus的架构: 先给一个zeus的架构图 无论Master还是Worker都有一套WEB UI,无论从哪个上面去看,看到的结果都是一 ...
- [转帖]单集群10万节点 走进腾讯云分布式调度系统VStation
单集群10万节点 走进腾讯云分布式调度系统VStation https://www.sohu.com/a/227223696_355140 2018-04-04 08:18 云计算并非无中生有的概念, ...
- 开源分布式Job系统,调度与业务分离-HttpJob.Agent组件介绍以及如何使用
项目介绍: Hangfire:是一个开源的job调度系统,支持分布式JOB!! Hangfire.HttpJob 是我针对Hangfire开发的一个组件,该组件和Hangfire本身是独立的.可以独立 ...
- 调度系统Airflow的第一个DAG
Airflow的第一个DAG 考虑了很久,要不要记录airflow相关的东西, 应该怎么记录. 官方文档已经有比较详细的介绍了,还有各种博客,我需要有一份自己的笔记吗? 答案就从本文开始了. 本文将从 ...
- 又一道软通动力7K月薪面试题——银行业务调度系统
后期补充:网友对我诟病最多的就是我帮学生做面试题,说这是小偷和骗子行为,在此,我对自己给学员做面试题做出例如以下解释: (1)学员拿着面试题来找老师,学生也事先思考和尝试后实在没有办法,又求职心切才 ...
- 美团集群调度系统HULK技术演进
本文根据美团基础架构部/弹性策略团队负责人涂扬在2019 QCon(全球软件开发大会)上的演讲内容整理而成.本文涉及Kubernetes集群管理技术,美团相关的技术实践可参考此前发布的<美团点评 ...
随机推荐
- UVA101 The Blocks Problem 题解
题目链接:https://www.luogu.org/problemnew/show/UVA101 这题码量稍有点大... 分析: 这道题模拟即可.因为考虑到所有的操作vector可最快捷的实现,所以 ...
- 反⑨baka拖更大队:临时约法
本团队中将不时发起团队讨论报道⑨baka无良~ 某无良⑨baka一直拖更引起广大人民群众不满 文文新闻:https://www.luogu.org/discuss/show/52654 反⑨baka的 ...
- 将web工程署到Linux简单实现
1,将数据库文件导出并导入到Linux下的数据库中 2,将数据库连接池的连接IP改为Linux所在服务器的 3,将工程文件以war包形式导出 4,利用secureCRT,Xshell等工具远程连接Li ...
- md文档的书写《三》
markdown语法 官网 这是标题 "#加空格" 是标题,通常可以设置六级标题. 内容下 空格是换行 列表 无序列表:使用" - + * "任何一种加空格都可 ...
- vue教程(四)--其他实用用法补充
一.vue生命周期简单介绍 var App={ template:'', data(){ }, beforeCreated:function(){ //不能操作数据,只是初始化了事件等.. }, cr ...
- python取数字、字母
python取数字.字母 有一串字符串“lxa7YzU”,其中有大写字母.小写字母和数字,现编写一脚本使得实现以下功能: 将这串字符串中的数字.大写字母.小写字母分别取出来并进行分类. 脚本如下所示: ...
- linux初学者-CIFS网络文件系统篇
linux初学者-CIFS网络文件系统篇 CIFS是一种通用网络文件系统,主要用于网络设备之间的文件共享.CIFS可以在linux系统和windows系统之间共享文件,因此这种文件系统主要用于客户端是 ...
- [ PyQt入门教程 ] Qt Designer工具的使用
Qt Designer是PyQt程序UI界面的实现工具,Qt Designer工具使用简单,可以通过拖拽和点击完成复杂界面设计,并且设计完成的.ui程序可以转换成.py文件供python程序调用.本文 ...
- Codeforces Round #192 (Div. 2) (330B) B.Road Construction
题意: 要在N个城市之间修建道路,使得任意两个城市都可以到达,而且不超过两条路,还有,有些城市之间是不能修建道路的. 思路: 要将N个城市全部相连,刚开始以为是最小生成树的问题,其实就是一道简单的题目 ...
- 解决微信小程序开发者工具输入框焦点问题
Windows10笔记本上运行微信小程序开发者工具,输入框(input,textarea)没有焦点,只能在真机调试,效率太低.后来发现是Window10对笔记本高分屏支持不好,要DPI缩放,导致兼容性 ...