版本发布说明

Airflow 2.10.5 (2025-02-06)

重大变更

确保当DAG运行设置为失败时执行清理任务 (#45530)

之前当手动将DAG运行设置为"failed"或"success"状态时,所有任务都会被设置为终止状态。 但对于定义了setup和teardown任务的情况存在一个缺陷:如果teardown用于清理基础设施或其他资源,这些任务也会被跳过,从而导致资源可能保持分配状态。

截至目前,当设置任务之前已执行且DAG被手动设置为“失败”或“成功”时,则会执行拆卸任务。如果设置任务被跳过,则拆卸任务也会被跳过。

作为副作用,这意味着如果DAG包含拆卸任务,那么手动将DAG标记为"failed"或"success"时,需要保持DAG处于运行状态,以确保拆卸任务会被调度。如果直接将DAG设置为"failed"或"success",这些拆卸任务将不会被调度。

Bug修复

  • 防止在裸任务中使用trigger_rule=TriggerRule.ALWAYS来生成任务映射(#44751)

  • 修复ShortCircuitOperator映射任务 (#44912)

  • 修复了在映射任务组中某些触发规则(例如 ONE_DONE)导致任务过早评估的问题 (#44937)

  • 修复BaseOperator中的task_id验证 (#44938) (#44938)

  • 允许通过API获取带正斜杠的XCom并在UI中转义显示 (#45134)

  • 修复 FileTaskHandler 仅从默认执行器读取的问题 (#46000)

  • 修复日志中的空任务实例 (#45702) (#45703)

  • 在TaskFlow虚拟环境任务运行前移除skip_ifrun_if装饰器 (#41832) (#45680)

  • 修复事件日志中JSON请求的请求体 (#45546) (#45560)

  • 确保当DAG运行设置为失败时执行拆卸任务 (#45530) (#45581)

  • 任务执行后不更新TI上的DR (#45348)

  • 修复默认值为None的对象和数组DAG参数 (#45313) (#45315)

  • 修复传感器无限重新调度的问题 (#45224) (#45250)

  • 评估SQLAlchemy扩展JSON类型装饰器中的None值 (#45119) (#45120)

  • 允许通过rendered_map_index筛选动态任务 (#45109) (#45122)

  • 在清理URL时处理相对路径 (#41995) (#45080)

  • 在登录表单上设置自动完成关闭 (#44929) (#44940)

  • 添加Web服务器参数 max_form_parts, max_form_memory_size (#46243) (#45749)

  • 修复了在BaseOperators execute安全机制中访问线程局部变量的问题 (#44646) (#46280)

  • 为extra links API添加map_index参数 (#46337)

其他

  • 在发送SIGTERM信号时添加回溯日志输出 (#44880) (#45077)

  • 移除了Operator自定义"调度依赖"的功能 (#45713) (#45742)

  • 弃用任务上下文中的 conf (#44993)

Airflow 2.10.4 (2024-12-09)

重大变更

TaskInstance priority_weight 参数值被限制在32位有符号整数范围内 (#43611)

某些数据库引擎仅支持32位整数值。由于部分用户反馈权重值溢出为负值的问题,我们决定将该值限制在32位整数范围内。尽管Python内部支持更小或更大的64位数值,但priority_weight参数已被限制,仅存储-2147483648至2147483647之间的数值。

Bug修复

  • 修复失败任务自动重试后动态映射任务的统计信息 (#44300)

  • 修复过滤后日志中多行消息显示错误的问题 (#44457)

  • 允许在指标验证器中使用“/” (#42934) (#44515)

  • 修复甘特图闪烁问题 (#44488) (#44517)

  • 修复无法从Connection表单中移除字段的问题 (#40421) (#44442)

  • 在部分任务导入时检查pool_slots而非执行时 (#39724) (#42693)

  • 避免对动态映射任务按尝试次数分组任务实例统计 (#44300) (#44319)

  • 当任务卡在队列中时重新排队 (#43520) (#44158)

  • 在我们检查敏感值时抑制警告 (#44148) (#44167)

  • 修复get_task_instance_try_details以返回正确的模式 (#43830) (#44133)

  • 日志消息来源详情已分组 (#43681) (#44070)

  • 修复UI中任务尝试次数的重复显示问题 (#43891) (#43950)

  • 在OpenAPI规范中添加正确的mime类型 (#43879) (#43901)

  • 如果链接为空或空白,则禁用额外链接按钮 (#43844) (#43851)

  • 禁用按execution_date排序的XCom列表 (#43680) (#43696)

  • 修复venv numpy示例,该示例需要至少1.26版本才能在Python 3.12中正常工作 (#43659)

  • 修复映射任务中索引0处的Try选择器问题 (#43590) (#43591)

  • 防止在动态映射任务中使用trigger_rule="always" (#43810)

  • 防止在裸任务中使用trigger_rule=TriggerRule.ALWAYS来生成任务映射(#44751)

仅文档变更

  • 更新关于容器/Helm的XCom文档 (#44570) (#44573)

其他

  • 当通过字符串访问入口或出口事件时发出弃用警告 (#43922)

Airflow 2.10.3 (2024-11-04)

重大变更

增强BashOperator以将模板化Bash脚本作为临时文件执行 (44641)

启用了Jinja模板的Bash脚本文件(.sh.bash)现在会被渲染到一个临时文件中,然后执行。而不是作为内联命令直接执行。

Bug修复

  • 改进了在设置Airflow变量时的值掩码处理,以增强安全性。(#43123) (#43278)

  • 新增对task_instance_mutation_hook的支持,以处理索引为0的映射操作符。(#42661) (#43089)

  • 修复执行器清理逻辑,确保在任务实例终止时能正确处理僵尸任务。(#43065)

  • 在内部API调用中添加了对HTTP 502和504错误的重试逻辑,以处理webserver启动问题。(#42994) (#43044)

  • 恢复使用单独的会话来写入和删除RTIF数据,以防止StaleDataError错误。(#42928) (#43012)

  • 通过将DAG名称中的连字符替换为下划线来修复PythonOperator错误。(#42993)

  • 改进任务重试的验证逻辑以处理None值 (#42532) (#42915)

  • 修复了在将数据集别名解析为新数据集时数据集管理器中的错误处理 (#42733)

  • 支持在DAG图视图中点击任务名称来正确选择对应的任务。(#38782) (#42697)

  • 修复在/home页面使用标签/最后运行过滤器时出现的重定向循环问题 (#42607) (#42609) (#42628)

  • 支持在OTEL指标中使用host.name以及在指标中使用OTEL_RESOURCE_ATTRIBUTES (#42428) (#42604)

  • 在暗色模式下通过降低对比度和饱和度来减轻眼睛疲劳 (#42567) (#42583)

  • 在触发表单中正确处理ENTER键并允许手动输入JSON (#42525) (#42535)

  • 确保DAG触发表单在键盘提交时使用更新后的参数提交 (#42487) (#42499)

  • 如果启用了pickling,不要尝试通过xcom向UI传递未字符串化的对象 (#42388) (#42486)

  • 修复任务实例的span链接,使其指向scheduler_job_loop中的正确span (#42430) (#42480)

  • 修复Windows中运行器执行任务的Bug (#42426) (#42478)

  • 允许通过环境变量覆盖硬编码的OTEL_SERVICE_NAME (#42242) (#42441)

  • 通过使用selectinload替代joinedload来提升触发器性能 (#40487) (#42351)

  • 在屏蔽敏感配置时抑制警告 (#43335) (#43337)

  • 隐藏与DAG作者无关的配置值 (#43040) (#43336)

  • 在BashOperator中将模板化的bash脚本作为文件执行 (#43191)

  • 修复了 schedule_downstream_tasks 以包含 one_success 触发规则的上游任务 (#42582) (#43299)

  • 在调度器中添加重试逻辑,用于在发生死锁时更新触发超时。(#41429) (#42651)

  • 手动触发dag_run失败时将全部任务标记为跳过 (#43572)

  • 修复日志和详情网格面板中映射任务的TrySelector (#43566)

  • 在处理执行器事件时条件性添加OTEL事件 (#43558) (#43567)

  • 修复损坏的统计指标 scheduler_loop_duration (#42886) (#43544)

  • 确保/api/v1/dags中的total_entries (#43377) (#43429)

  • 在列出任务实例(批量)端点的请求体模式中包含limit和offset参数 (#43479)

  • 当从扩展操作符调用execute时,不要在ExecutorSafeguard中引发警告 (#42849) (#43577)

  • 如果TaskInstance状态与Executor状态不一致,请重新检查TaskInstance状态。(#43063)

其他

  • 弃用会话认证后端 (#42911)

  • 移除了Airflow版本2.8.0及以上提供程序对unicodecsv的依赖 (#42765) (#42970)

  • 移除从Webserver到Scarf的referrer (#42901) (#42942)

  • dompurify 从 2.2.9 升级至 2.5.6 在 /airflow/www (#42263) (#42270)

  • 修正 _get_template_context 中的文档字符串格式 (#42244) (#42272)

  • 向后移植:将Flask-AppBuilder升级至4.5.2 (#43309) (#43318)

  • 检查用于安装pre-commit虚拟环境的Python版本 (#43282) (#43310)

  • 解决数据集别名迁移中的警告问题 (#43425)

仅文档变更

  • 由DAG作者澄清PLUGINS_FOLDER权限 (#43022) (#43029)

  • 为TaskFlow教程添加模板信息 (#42992)

  • Airflow本地设置不再可从dags文件夹导入 (#42231) (#42603)

  • 修复关于CPU和内存使用的文档 (#42147) (#42256)

  • 修复docker compose的指令 (#43119) (#43321)

  • 更新文档以反映返回的是dag_warnings而非import_errors。(#42858) (#42888)

Airflow 2.10.2 (2024-09-18)

重大变更

无重大变更。

Bug修复

  • 回滚“修复:当dags文件夹变更时DAGs未被标记为过时状态” (#42220, #42217)

  • 添加缺失的Open Telemetry跨度并修正计划插槽文档 (#41985)

  • 修复 require_confirmation_dag_change (#42063) (#42211)

  • 仅在渲染XComEntry时将null/undefined视为假值 (#42199) (#42213)

  • 添加额外的renderedTemplates作为键来跳过camelCasing (#42206) (#42208)

  • 不要对xcom条目使用驼峰命名法 (#42182) (#42187)

  • 修复从列表视图中的task_instance和dag_run链接 (#42138) (#42143)

  • 在触发器UI表单中支持字符串类型参数的多行输入 (#40414) (#42139)

  • 修复详情标签日志URL检测问题 (#42104) (#42114)

  • 新增异常类型以捕获超时 (#42064) (#42078)

  • 重写DAG到数据集/数据集别名的存储方式 (#41987) (#42055)

  • 允许数据集别名添加多个数据集事件 (#42189) (#42247)

其他

  • 将universal-pathlib限制在0.2.4以下版本,因为它破坏了我们的集成 (#42101)

  • 使用LibCST自动修复默认可延迟问题 (#42089)

  • 弃用 --tree 标志用于 tasks list 命令行命令 (#41965)

仅文档变更

  • 更新 security_model.rst 以清除未经身份验证的端点异常 (#42085)

  • 在XComs页面添加关于数据类和attrs的说明 (#42056)

  • 改进DAG中markdown文档的文档 (#42013)

  • 添加警告:监听器可能存在风险 (#41968)

Airflow 2.10.1 (2024-09-05)

重大变更

无重大变更。

Bug修复

  • 在检查缺失文件时处理示例dags的情况 (#41874)

  • 修复“无角色”错误页面中的登出链接 (#41845)

  • 为已完成且end_from_trigger设为True的触发器设置end_date和duration。(#41834)

  • 当dags文件夹变更时,DAGs不会被标记为陈旧状态 (#41829)

  • 修复与FAB provider版本<1.3.0的兼容性问题 (#41809)

  • 心跳检测失败时不使LocalTaskJob失败 (#41810)

  • 移除插件管理器中cgitb的弃用警告 (#41793)

  • 修复没有__name__的通知器(实例)的日志 (#41699)

  • 将系统路径准备拆分为多个阶段 (#41694)

  • 为额外链接添加URL净化功能 (#41680)

  • 修复 InletEventsAccessors 类型存根 (#41607)

  • 修复当XCom为INT、FLOAT、BOOL或NULL时的UI渲染问题 (#41605)

  • 修复尝试选择器刷新 (#41503)

  • 错误的尝试次数减法导致OTEL airflow生成无效的span id (#41535)

  • 为触发器页面渲染添加WebEncoder以避免渲染失败 (#41485)

  • 在example_inlet_event_extra示例dag中添加tojson过滤器 (#41890)

  • 为不继承BaseExecutor的执行器添加向后兼容性检查 (#41927)

其他

  • 将 /airflow/www 中的 webpack 从 5.76.0 升级到 5.94.0 (#41879)

  • 在日志中为超链接添加rel属性 (#41783)

  • 编辑连接时的字段删除警告 (#41504)

  • 在主要+次要版本和分桶计数器中实现Scarf使用情况报告 (#41900)

  • 将 universal-pathlib 最低版本降至 0.2.2 (#41943)

  • 防止通用路径库xcom后端出现None组件 (#41938)

仅文档变更

  • 移除对Debian bullseye的支持 (#41569)

  • 添加一个使用keycloak进行认证的示例 (#41791)

Airflow 2.10.0 (2024-08-15)

重大变更

基于Scarf的遥测:Airflow现在收集遥测数据 (#39510)

Airflow 集成了 Scarf 以在运行期间收集基本使用数据。部署时可以通过将 [usage_data_collection]enabled 选项设为 False,或设置环境变量 SCARF_ANALYTICS=false 来选择退出数据收集。

数据集不再触发非活跃的DAG (#38891)

之前,当一个DAG被暂停或删除时,传入的数据集事件仍会触发它,并且当DAG被取消暂停或重新添加到DAG文件中时会运行。这一行为已被更改;现在,DAG的数据集调度只能由DAG处于活动状态时发生的事件来满足。虽然这是一个破坏性变更,但之前的行为被视为一个错误。

基于时间的调度行为保持不变,包括DatasetOrTimeSchedule中的时间表部分。

try_number 在任务执行期间不再递增 (#39336)

之前,尝试次数(try_number)是在工作节点上任务执行开始时递增的。这导致了许多问题。 首先,它意味着尝试次数在不应该增加的情况下增加了,比如从重新调度或延迟恢复时。此外,它还导致 任务尚未开始时尝试次数显示"错误"。针对这两个问题的变通方案造成了大量混淆。

现在,任务运行的尝试次数是在任务被调度时确定的,并且在执行过程中不会改变,也永远不会减少。 因此,在任务运行后,观察到的尝试次数与任务运行时保持一致;只有当出现"新的尝试"时,尝试次数才会再次增加。

这一变更的一个后果是,如果用户曾"手动"运行任务(例如直接调用ti.run()或使用命令行airflow tasks run), 尝试次数将不再自动增加。Airflow假定任务总是由调度器调度后运行,因此我们不认为这是一个破坏性变更。

/logout 端点现在在FAB认证管理器中受到CSRF保护 (#40145)

在所有现有的AuthViews(AuthDBViewAuthLDAPViewAuthOAuthViewAuthOIDViewAuthRemoteUserView)中,FAB Auth Manager的/logout端点方法已从GET更改为POST,现在包含CSRF保护以增强安全性并防止未经授权的注销。

Apache Airflow的OpenTelemetry追踪功能 (#37948).

这一新功能为Apache Airflow增加了以下能力:1) 以OpenTelemetry格式输出调度器、触发器、执行器和处理器的airflow系统追踪数据;2) 对已部署DAG运行输出DAG运行追踪数据。此前仅支持以OpenTelemetry格式输出指标数据。 该功能将为用户提供更丰富的数据,使其能够使用OpenTelemetry标准将追踪数据发送至兼容OTLP协议的端点。

任务流装饰器 (@skip_if, @run_if) 用于简化判断是否跳过任务的逻辑。(#41116)

该功能添加了一个装饰器,使跳过任务变得简单。

同时使用多个执行器 (#40701)

之前被称为混合执行器,这一新功能允许Airflow同时使用多个执行器。可以配置DAG(甚至单个任务)使用最适合其需求的特定执行器。单个DAG可以包含使用不同执行器的任务。更多详情请参阅Airflow文档。注意:此功能仍处于实验阶段。有关更详细的描述,请参见Executor文档

新功能

  • AIP-61 混合执行 (AIP-61)

  • AIP-62 从Hook工具获取数据血缘 (AIP-62)

  • AIP-64 TaskInstance 尝试历史 (AIP-64)

  • AIP-44 内部API (AIP-44)

  • 支持直接从触发器结束任务,无需经过工作节点。(#40084)

  • 扩展数据集依赖关系 (#40868)

  • 特性/为内部API添加令牌认证 (#40899)

  • 新增DatasetAlias以支持动态数据集事件发射和数据集创建 (#40478)

  • 为 inlet_events 添加示例 DAGs (#39893)

  • 实现accessors来读取定义为入口的数据集事件(#39367)

  • Task Flow的装饰器,用于简化是否跳过某个Task的配置。(#41116)

  • 为动态任务映射添加从触发器启动执行的支持 (#39912)

  • 向日志表添加try_number (#40739)

  • 在宏中添加了ds_format_locale方法,该方法允许使用Babel本地化日期时间格式 (#40746)

  • 添加DatasetAlias以支持动态数据集事件发射和数据集创建 (#40478, #40723, #40809, #41264, #40830, #40693, #41302)

  • 在重新序列化时使用哨兵标记DAG为已移除 (#39825)

  • 在DAG文件处理统计中为数据库查询的最后数量添加参数 (#40323)

  • 为Airflow UI添加原型版本深色模式 (#39355)

  • dag test中添加将某些任务标记为成功的能力 (#40010)

  • 允许在template_fields中使用可调用对象 (#37028)

  • 在主页上筛选运行中/失败以及活跃/暂停的dags (#39701)

  • 添加关于任务CPU和内存使用情况的指标 (#39650)

  • DAG重新解析功能的UI变更 (#39636)

  • 添加基于Scarf的遥测功能 (#39510, #41318)

  • 添加DAG重新解析请求端点 (#39138)

  • 从网格视图触发后重定向到新的DAG运行 (#39569)

  • 在任务实例提示框中显示 endDate。(#39547)

  • 实现accessors来读取定义为入口的数据集事件(#39367, #39893)

  • 基于关键词为UI中的错误和警告日志行添加颜色 (#39006)

  • 在任务实例详情视图中添加渲染后的k8s pod规范标签页 (#39141)

  • 使审计日志的前后过滤功能可用 (#39120)

  • 将网格折叠操作整合为单一全屏切换功能 (#39070)

  • 实现元数据以发出运行时额外信息 (#38650)

  • 向数据库添加执行器字段并作为操作符的参数 (#38474)

  • 为DatasetEvent额外内容实现上下文访问器 (#38481)

  • 向DAG图表添加数据集事件信息 (#41012)

  • 在DAG图中添加切换数据集的开关按钮 (#41200)

  • 添加 run_ifskip_if 装饰器 (#41116)

  • 添加dag_stats REST API端点 (#41017)

  • 为Dag导入错误添加监听器 (#39739)

  • 允许DateTimeSensorAsync、FileSensor和TimeSensorAsync在动态任务映射期间从触发器开始执行 (#41182)

改进

  • 允许在Dag级别权限中设置Dag Run资源:扩展Dag的access_control功能以支持Dag Run资源权限。(#40703)

  • 改进内部API的安全性和错误处理 (#40999)

  • 数据集用户界面改进 (#40871)

  • 将DAG审计日志标签更改为事件日志 (#40967)

  • 使独立的DAG文件处理器在数据库隔离模式下工作 (#40916)

  • 仅在消费者DAG页面显示来源,仅在生产者DAG页面显示触发的DAG运行 (#41300)

  • 更新指标名称以允许多个执行器报告指标 (#40778)

  • 格式化DAG运行计数 (#39684)

  • 更新renderedjson组件的样式 (#40964)

  • 改进 ATTRIBUTE_REMOVED 哨兵以使用类和更多上下文 (#40920)

  • 将XCom显示为react json (#40640)

  • 将任务上下文日志记录器的使用替换为日志表 (#40867)

  • 为所有重试异常回滚 (#40882) (#40883)

  • 支持渲染 ObjectStoragePath 值 (#40638)

  • 为日志事件端点添加try_number和map_index作为参数 (#40845)

  • 分批轮换fernet密钥以限制内存使用 (#40786)

  • 为'last_num_of_db_queries'参数添加计量指标 (#40833)

  • 将并行度日志消息设置为警告级别以提高可见性 (#39298)

  • 为编码DAG运行添加错误处理 (#40222)

  • 在示例DAG中使用params替代dag_run.conf (#40759)

  • 加载带有示例DAG的示例插件 (#39999)

  • 当target_dttm时间已过时,停止延迟TimeDeltaSensorAsync任务 (#40719)

  • 将重要的执行器日志发送到任务日志 (#40468)

  • 在新标签页中打开外部链接 (#40635)

  • 尝试将ReactJSON视图添加到渲染模板中 (#40639)

  • 加速自定义警告的正则表达式匹配时间 (#40513)

  • 将DAG.dataset_triggers重构到timetable类中 (#39321)

  • 将next_kwargs添加到StartTriggerArgs (#40376)

  • 改进用户界面错误处理 (#40350)

  • 当配置值被弃用时,移除CLI中的双重警告 (#40319)

  • 实现XComArg concat() (#40172)

  • 新增了带有嵌套参数的get_extra_dejson方法,允许您指定是否希望将嵌套的json字符串也反序列化(#39811)

  • 向任务实例API添加执行器字段 (#40034)

  • 支持在Windows上检查数据库路径是否为绝对路径 (#40069)

  • 引入StartTriggerArgs并防止调度器中初始化启动触发器 (#39585)

  • 在网格视图的详情标签页中添加任务文档 (#39899)

  • 允许执行器仅通过Executor的类名来指定 (#40131)

  • 移除与try_number相关的过时条件逻辑 (#40104)

  • 允许将任务组ID作为分支传递到BranchMixIn中 (#38883)

  • Javascript连接表单将动态地对所有textarea应用CodeMirror (#39812)

  • 在序列化时确定 needs_expansion (#39604)

  • 在引用表的dag_id列上添加索引以加速dag记录的删除操作 (#39638)

  • 在详情页添加任务失败依赖项 (#38449)

  • 移除webserver的try_number调整 (#39623)

  • 在惰性序列中实现切片功能 (#39483)

  • 统一懒加载数据库序列实现 (#39426)

  • 为任务装饰器存根添加 __getattr__ (#39425)

  • 允许通过插件注册的FAB视图传递标签 (#39444)

  • 使用sqlite进行离线迁移时显示更简单的错误信息 (#39441)

  • 为TriggerDagRunOperator添加soft_fail参数 (#39173)

  • 将上下文中的“dataset event”重命名为使用“outlet”(#39397)

  • airflow task命令中解决RemovedIn20Warning问题 (#39244)

  • 在客户端确定数据库隔离时的fail_stop (#39258)

  • 重构Python操作符/装饰器中的cloudpickle支持 (#39270)

  • 更新触发器 kwargs 迁移以指定 existing_nullable (#39361)

  • 允许任务直接从触发器启动执行,而无需经过工作节点 (#38674)

  • 改进 db migrate 错误提示信息 (#39268)

  • 将stacklevel添加到suppress_and_warn警告中 (#39263)

  • 支持通过dag_display_name进行搜索 (#39008)

  • 允许在MappedInstances.tsx中对所有字段进行排序 (#38090)

  • 在指标中公开计划任务的数量 (#38899)

  • 使用 sqlalchemy.orm 中的 declarative_base 替代 sqlalchemy.ext.declarative (#39134)

  • 添加示例DAG以演示发射方法 (#38821)

  • 允许on_task_instance_failed访问导致失败的错误信息(#38155)

  • 简化数据集序列化 (#38694)

  • 向作业添加心跳恢复消息 (#34457)

  • 移除TaskInstance.get_task_instance中的select_column选项 (#38571)

  • 如果不从数据库读取DAG,则不要在get_dag中创建会话 (#38553)

  • 为加密触发器参数添加迁移脚本 (#38358)

  • 在TaskInstancePydantic上实现render_templates (#38559)

  • 处理 _refresh_from_db 中的可选会话 (#38572)

  • 在task_command.py中减少类型注解的混淆 (#38561)

  • 直接使用fetch_dagrun以避免会话创建 (#38557)

  • BashProcessor 添加了 output_processor 参数 (#40843)

  • 改进数据库隔离模式下的序列化功能 (#41239)

  • 仅孤立非孤立数据集 (#40806)

  • 根据任务历史日期调整甘特图宽度 (#41192)

  • 启用对元素数量较多的图例的滚动功能。(#41187)

Bug修复

  • 修复了使用LocalExecutor运行时get_parsing_context()的bug (#40738)

  • 在视图中显示前验证提供者文档URL (#40933)

  • 将导入移动以使PythonOperator在Windows上工作 (#40424)

  • 修复 dataset_with_extra_from_classic_operator 示例 DAG (#40747)

  • 在任务实例状态变更后调用监听器的on_task_instance_failed()方法 (#41053)

  • 在BaseSensor中添加never_fail (#40915)

  • 修复当DAG没有start_date时的任务API端点 (#40878)

  • 修复并调整UI网格和旧运行记录的URL生成 (#40764)

  • 优化Fernet密钥轮换 (#40758)

  • 修复 validate_database_executor_compatibility() 调用中的类实例与类类型问题 (#40626)

  • 清理暗黑模式 (#40466)

  • 验证DAG、BaseOperator和TaskGroup参数的预期类型 (#40269)

  • BaseSensorOperator 重调度模式中的指数退避功能失效 (#39823)

  • 本地任务作业:添加超时,以避免过早终止on_task_instance_success监听器 (#39890)

  • 将执行后日志分组移至异常打印之后 (#40146)

  • 修复高可用(HA)设置中triggerer的竞态条件 (#38666)

  • 将触发或现有的DAG运行逻辑日期传递给DagStateTrigger (#39960)

  • external_task_group_id 传递给 WorkflowTrigger (#39617)

  • ECS Executor: 任务一旦激活即设置为RUNNING状态 (#39212)

  • 仅在回填循环中必要时发送心跳 (#39399)

  • 修复触发器关键字参数加密迁移 (#39246)

  • 修复降级时触发器 kwargs 的解密问题。(#38743)

  • 修复TriggeredDagRuns中的错误链接 (#41166)

  • 为外部日志系统向LogLink组件传递MapIndex (#41125)

  • 为工作器任务添加NonCachingRotatingFileHandler (#41064)

  • 在方法resolve中添加参数include_xcom作为可选值 (#41062)

  • 在example_bash_decorator DAG中清理文件名 (#40949)

  • 在依赖关系图中显示数据集别名 (#41128)

  • 在DAG图视图中渲染数据集条件 (#41137)

  • 添加跨Dag运行的任务持续时间图表 (#40755)

  • 为现有核心传感器添加从触发器启动执行的支持 (#41021)

  • 为 dataset_alias 添加示例 DAG (#41037)

  • 添加数据集别名唯一约束并移除错误的数据集别名删除逻辑 (#41097)

  • 如果存在"dataset alias",则将"has_outlet_datasets"设置为true (#41091)

  • 让 HookLineageCollector 按数据集分组 (#41034)

  • 增强start_trigger_args的序列化功能 (#40993)

  • 重构 BaseSensorOperator 引入 skip_policy 参数 (#40924)

  • 修复当任务被延迟时从触发器查看日志的问题 (#41272)

  • 重构触发dag运行URL的替换方式 (#41259)

  • 新增了对额外SQL Alchemy会话参数的支持 (#41048)

  • 允许在TriggerDagRun的failed_state中使用空列表 (#41249)

  • 当run_as_user是airflow用户时清理异常处理程序 (#41241)

  • 点击折叠时收起文档 (#41214)

  • 在保存到数据库时更新updated_at,因为session.merge不会触发更新操作 (#40782)

  • 修复解析DAF文件时的查询计数统计问题 (#41149)

  • 没有__init__的operators中的方法解析顺序 (#41086)

  • 确保空操作符的try_number递增 (#40426)

其他

  • OTel追踪中移除实验性标志 (#40874)

  • 将打包版本升级至23.0以修复旧版otel的问题 (#40865)

  • 简化 _auth_manager_is_authorized_map 函数 (#40803)

  • 在调度器作业中使用正确的未知执行器异常 (#40700)

  • 向 pyproject.toml 添加 D1 pydocstyle 规则 (#40569)

  • 在ruff中启用强制执行pydocstyle规则D213。(#40448, #40464)

  • 更新 Dag.test() 以便在需要时使用执行器运行 (#40205)

  • 更新 jest 和 babel 的次要版本 (#40203)

  • 重构BashOperator和Bash装饰器以提高一致性和简洁性 (#39871)

  • 添加 AirflowInternalRuntimeError 用于抛出 non catchable 错误 (#38778)

  • ruff 版本升级至 0.4.5 (#39849)

  • pytest 升级至 8.0+ (#39450)

  • 移除关于TI索引的过时注释 (#39470)

  • DagScheduleDatasetReference.dagDagModel.schedule_dataset_references之间配置back_populates (#39392)

  • 移除 endpoints.py 中的弃用警告 (#39389)

  • 修复Airflow核心中的SQLA弃用问题 (#39211)

  • 直接在SA中使用类绑定属性 (#39198, #39195)

  • 修复TaskContextLogger的stacklevel (#39142)

  • 在收集DAG时捕获警告 (#39109)

  • 修复核心中的 B028 (no-explicit-stacklevel) 问题 (#39123)

  • 将模型 ImportError 重命名为 ParseImportError 以避免与内置异常冲突 (#39116)

  • 为PythonVenv/External Operator添加支持cloudpickle的选项 (#38531)

  • 抑制 SubDagOperator 示例警告 (#39057)

  • 为运行回调添加日志 (#38892)

  • 使用 model_dump 而非 dict 来序列化 Pydantic V2 模型 (#38933)

  • 加宽速查表列宽以避免命令换行 (#38888)

  • 将hatchling更新至最新版本(1.22.5) (#38780)

  • 将 uv 升级至 0.1.29 (#38758)

  • 在修复提供者测试过程中添加缺失的序列化 (#41252)

  • ws 从 7.5.5 升级到 7.5.10 在 /airflow/www 目录 (#40288)

  • 改进TriggerDagRunOperator中allowed_states/failed_states的类型提示 (#39855)

仅文档变更

  • 在“如何创建自己的提供者”页面添加 filesystemsdataset-uris (#40801)

  • 修复Airflow仓库中的(TM)到(R)问题 (#40783)

  • 在示例 airflow.cfg 中将 otel_on 设置为 True (#40712)

  • 为 _AIRFLOW_PATCH_GEVENT 添加警告 (#40677)

  • 根据Airflow 3讨论更新多团队图表提案 (#40671)

  • 添加更强烈的警告,说明MSSQL不再受支持且无法使用 (#40565)

  • 修复了howto中误导性的mac菜单结构 (#40440)

  • 更新文档中支持的k8s版本 (#39878)

  • 为监听器添加兼容性说明 (#39544)

  • 在文档示例中更新边标签图片以适配新版图形视图 (#38802)

  • 更新用户界面文档截图 (#38680)

  • 新增章节“通过REST API操作队列中的数据集事件”(#41022)

  • 添加关于docker compose缺乏安全保障的信息 (#41072)

  • 在使用参数部分添加指向示例DAG的链接 (#41031)

  • taskflow.rst中的task_idsend_email改为send_email_notification (#41060)

  • 从反向代理文档中移除不必要的nginx重定向规则 (#38953)

Airflow 2.9.3 (2024-07-15)

重大变更

scheduled_durationqueued_duration 的时间单位已更改 (#37936)

scheduled_durationqueued_duration 指标现在以毫秒而非秒为单位进行记录。

按照惯例,所有statsd指标应以毫秒为单位发送,这在后续如prometheus statsd-exporter等工具中会用到。

对OpenTelemetry指标的支持不再处于"实验性"阶段 (#40286)

自2.7.0版本起新增了对OpenTelemetry的实验性支持,此后我们不断进行修复和改进,现在宣布该功能已稳定。

Bug修复

  • 修复日历视图滚动问题 (#40458)

  • 验证提供商列表视图中URL的提供商描述 (#40475)

  • 修复与旧版MySQL 8.0的兼容性问题 (#40314)

  • 修复在缺失DAG文件的环境中DAG暂停/取消暂停功能失效的问题 (#40345)

  • 传递给SQLalchemy的额外参数 (#40391)

  • 修复当标签值为整型(job_id)时处理不支持的操作数int + str的问题 (#40407)

  • 修复TriggeredDagRunOperator触发链接 (#40336)

  • [webserver]update_fab_perms 添加到已弃用的配置中 (#40317)

  • 将DAG运行链接从旧版图形视图切换到带有图形标签的网格视图 (#40241)

  • file_task_handler 中的 httpx 改为 requests (#39799)

  • 修复venv jinja模板中的future annotations导入问题 (#40208)

  • 确保无论使用何种后端,DAG参数的顺序都保持一致 (#40156)

  • 在TI批处理API端点中使用连接来处理TI注释 (#40028)

  • 改进字符串数组格式验证的触发器用户界面 (#39993)

  • 禁用doc_md的jinja2渲染 (#40522)

  • 如果任务实例状态为跳过,则跳过检查子DAG列表 (#40578)

  • 在解析日志中的URL时识别引号 (#40508)

仅文档变更

  • 添加关于通过环境变量传递密钥的说明 (#40519)

  • 修改一些令人困惑的日志消息 (#40334)

  • 添加关于屏蔽敏感字段名称的更精确描述 (#40512)

  • 在文档中添加了关于升级的更详细指南 (#40227)

  • Metrics 允许列表完整示例 (#40120)

  • 在弃用的API文档中添加警告,说明未应用访问控制 (#40129)

  • 检查本地调度器是否存活的更简单命令 (#40074)

  • 添加说明和示例以阐明DAG级别参数的用法 (#40541)

  • 修复dags.rst中示例代码的高亮显示 (#40114)

  • 添加关于PostgresOperator将被弃用的警告 (#40662)

  • 将Airflow下载链接更新为基于CDN的链接 (#40618)

  • 修复 DatasetOrTimetable 示例的导入语句 (#40601)

  • 进一步明确问题分类流程 (#40536)

  • 修复PythonOperator文档字符串中的参数顺序 (#40122)

  • 更新serializers.rst文档,注明不支持字节类型 (#40597)

其他

  • 升级构建安装程序和依赖项 (#40177)

  • 将 /airflow/www 中的 braces 从 3.0.2 升级到 3.0.3 (#40180)

  • 升级到另一个版本的trove-classifier(新增CUDA分类器)(#40564)

  • 将与airflow概念无关的"try_number"增量重命名 (#39317)

  • 将构建依赖的trove分类器更新至最新版本 (#40542)

  • 将hatchling升级至最新版本作为构建依赖项 (#40387)

  • 修复SchedulerJobRunner._process_executor_events中的bug (#40563)

  • 移除“blocked”事件的日志记录 (#40446)

Airflow 2.9.2 (2024-06-10)

重大变更

无重大变更。

Bug修复

  • 修复导致AirflowSecurityManagerV2将事务保持在idle in transaction状态的bug (#39935)

  • 修复alembic自动生成和重命名不匹配的约束条件 (#39032)

  • 在迁移的降级操作中添加 existing_nullable 参数 (#39374)

  • 修复当用户缺少权限时标记实例状态按钮保持禁用的问题 (#37451)。 (#38732)

  • 在迷你调度器中使用SKIP LOCKED替代NOWAIT (#39745)

  • 从FAB视图中移除DAG运行添加选项 (#39881)

  • 在API规范中添加max_consecutive_failed_dag_runs (#39830)

  • 修复example_branch_operator在python 3.12中的失败问题 (#39783)

  • 当任务尝试重试且无远程日志可用时,也获取已服务的日志 (#39496)

  • 在Airflow 2.9中将数据集URI验证改为发出警告而非错误 (#39670)

  • 可见的DAG运行未指向相同的dag运行ID (#38365)

  • 重构 SafeDogStatsdLogger 以使用 get_validator 来启用模式匹配 (#39370)

  • 修复安全管理器has_access中的自定义操作 (#39421)

  • 修复当DAG被触发时参数错误导致的HTTP 500内部服务器错误 (#39409)

  • 修复Airflow Webserver中静态文件缓存被禁用的问题。(#39345)

  • 修复了TaskHandlerWithCustomFormatter现在只添加一次前缀的问题 (#38502)

  • 不要在@apply_lineage中提供已弃用的execution_date (#39327)

  • 在ObjectStoragePath的字符串表示中添加缺失的conn_id (#39313)

  • 修复 sql_alchemy_engine_args 配置示例 (#38971)

  • 为所有动态生成的内容添加Cache-Control "no-store" (#39550)

其他

  • 限制 yandex 提供者以避免 mypy 错误 (#39990)

  • 针对迷你调度器故障发出警告而非调试信息 (#39760)

  • 修改provider_info_cache装饰器的类型定义 (#39750)

  • 为BaseOperator defer 提供更好的类型支持 (#39742)

  • 在TimeSensor和TimeSensorAsync中增加更多输入类型 (#39696)

  • 重新抛出严格数据集URI检查中的异常 (#39719)

  • 修复_log_state辅助函数的stacklevel参数 (#39596)

  • 解决迁移脚本中的SA警告 (#39418)

  • 移除dag_run表中未使用的索引idx_last_scheduling_decision (#39275)

仅文档变更

  • 为DynamicTaskMapping的标签提供额外提示 (#39977)

  • 提升配置参考中链接/变量/其他配置的可见性 (#39916)

  • 移除 CronDataIntervalTimetable 的'legacy'定义 (#39780)

  • 将plugins.rst示例更新为使用pyproject.toml替代setup.py (#39665)

  • 修复pg设置文档中的小问题 (#39628)

  • 将Matomo添加到用户活动追踪文档中 (#39611)

  • 修复 Connection.get -> Connection.get_connection_from_secrets (#39560)

  • 为provider依赖项添加说明(#39512)

  • 更新docker-compose命令 (#39504)

  • 更新关于重启triggerer进程的说明 (#39436)

  • 修复了使用无效存储桶链接更新S3LogLink的问题 (#39424)

  • 更新 testing_packages.rst (#38996)

  • 新增多团队图表功能 (#38861)

Airflow 2.9.1 (2024-05-03)

重大变更

Stackdriver日志修复需要Google provider版本10.17.0或更高 (#38071)

如果您使用Stackdriver日志记录,必须使用Google提供程序版本10.17.0或更高。Airflow 2.9.1现在将gcp_log_name传递给StackdriverTaskHandler而不是name,这在早期提供程序版本上会失败。

修复了一个bug,当Airflow配置日志时,[logging] remove_base_log_folder中配置的日志名称被覆盖,导致任务日志被发送到错误的目的地。

Bug修复

  • 使任务日志消息包含 run_id (#39280)

  • 复制导航栏的menu_item href (#39282)

  • 修复触发器参数加密迁移问题 (#39246, #39361, #39374)

  • firefox中的datetime-local输入添加临时解决方案 (#39261)

  • 在任务实例视图中添加网格按钮 (#39223)

  • 当非运行任务尝试的远程或执行器日志不可用时,获取服务日志 (#39177)

  • 修复了菜单过滤导致的菜单消失问题 (#39229)

  • 为任务实例的log_url使用网格视图 (#39183)

  • 改进任务筛选 UX (#39119)

  • 改进React DAG页面中rendered_template ux的用户体验 (#39122)

  • 图表视图改进 (#38940)

  • 在尝试渲染图形之前检查数据集<>任务是否存在 (#39069)

  • 主机名是“redacted”而非“redact”;当没有上下文时移除它 (#39037)

  • 检查AUTH_ROLE_PUBLIC是否在check_authentication中设置 (#39012)

  • map_index_template的渲染逻辑移动位置,使其只要在故障点之前定义过,就能为失败任务进行渲染 (#38902)

  • Undeprecate BaseXCom.get_one 方法暂时保留 (#38991)

  • CreateTableAs自定义SA Clause添加inherit_cache属性 (#38985)

  • 在迷你调度器中不再等待DagRun锁 (#38914)

  • 修复无DAG运行的日历视图 (#38964)

  • 更改了图中外部任务的背景颜色 (#38969)

  • 修复DAG运行选择 (#38941)

  • 修复 SAWarning '将子查询对象强制转换为select()以用于IN()中' (#38926)

  • 修复AirflowSecurityManagerV2中的隐式cartesian笛卡尔积问题 (#38913)

  • 修复旧版日志视图中链接无法点击的问题 (#38882)

  • 修复DAG运行链接参数 (#38873)

  • 在工作流触发器中使用异步数据库调用 (#38689)

  • 修复审计日志事件过滤器 (#38719)

  • 在类方法中使用 methodtools.lru_cache 而非 functools.lru_cache (#37757)

  • 仅当提供-I / --ignore-first-depends-on-past参数时,在airflow dags backfill中触发弃用警告 (#38676)

其他

  • TriggerDagRunOperator 弃用 execution_date 改用 logical_date (#39285)

  • 强制在@deprecated装饰器上使用Airflow弃用警告类别 (#39205)

  • 添加关于在Windows下运行/导入Airflow的警告 (#39196)

  • 更新认证管理器中的is_authorized_custom_view以处理自定义操作(#39167)

  • 在Trove分类器中添加Python 3.12支持 (#39004)

  • minischeduler跳过使用调试级别 (#38976)

  • /airflow/www中的undici5.28.3 升级到 5.28.4 (#38751)

  • 从Airflow Webserver中移除Scarf分析功能 (#43346) (#43348)

仅文档变更

  • 修复文档中支持的k8s版本 (#39172)

  • 动态任务映射 PythonOperator 操作参数 (#39242)

  • 添加链接到userrole命令(#39224)

  • 在文档中添加k8s 1.29作为支持的版本 (#39168)

  • 数据感知调度文档编辑 (#38687)

  • 更新 DagBag 类的文档字符串以包含所有参数 (#38814)

  • 修正一个示例任务流示例 (#39015)

  • 从渲染字段示例中移除装饰器 (#38827)

Airflow 2.9.0 (2024-04-08)

重大变更

以下监听器API方法被视为稳定版本,可用于生产系统(在旧版Airflow中是实验性功能)(#36376):

生命周期事件:

  • on_starting

  • before_stopping

DagRun状态变更事件:

  • on_dag_run_running

  • on_dag_run_success

  • on_dag_run_failed

任务实例状态变更事件:

  • on_task_instance_running

  • on_task_instance_success

  • on_task_instance_failed

Airflow元数据库对Microsoft SQL-Server的支持已被移除 (#36514)

经过讨论投票流程, Airflow的PMC成员和提交者已达成决议,不再将MsSQL作为受支持的数据库后端进行维护。

自Airflow 2.9.0版本起,已取消对MsSQL作为Airflow数据库后端的支持。

在升级到Airflow 2.9.0之前,可帮助迁移数据库的迁移脚本可在 Github上的airflow-mssql-migration仓库中找到。 请注意,该迁移脚本不提供支持与质量保证。

这不会影响现有的provider包(操作符和钩子),DAG仍然可以访问和处理来自MsSQL的数据。

Dataset URI现在在输入时进行验证 (#37005)

数据集必须使用符合AIP-60规定规则的URI,当DAG文件被解析时该值将自动规范化。有关规则的更详细说明,请参阅数据集文档

如果您的数据集标识符看起来像URI,但使用方式较为非主流(例如依赖于URI的认证部分或具有区分大小写的协议名称),则可能需要更改这些标识符。

方法 get_permitted_menu_itemsBaseAuthManager 中已更名为 filter_permitted_menu_items (#37627)

将REST API操作添加到审计日志事件 (#37734)

REST API事件的审计日志event名称将以api.ui.开头,具体取决于该事件是来自Airflow UI还是外部。

官方支持Python 3.12 (#38025)

不过需要注意以下几点:

  • Pendulum2 不支持 Python 3.12。如需在 Python 3.12 中使用,您需要使用 Pendulum 3

  • 当为Python 3.12安装Pandas时,支持的最低SQLAlchemy版本是2022年4月发布的1.4.36。Airflow 2.9.0将所有Python版本的最低支持SQLAlchemy版本提升至1.4.36

并非所有Providers都支持Python 3.12。在Airflow 2.9.0初始发布时,以下providers版本尚未支持Python 3.12:

防止在渲染模板字段中存储大型字符串对象 (#38094)

现在对存储在Rendered Template Fields中的数据长度设置了限制。该限制设为4096个字符。如果数据超过此限制,将被截断。您可以通过在airflow配置中设置[core]max_template_field_length配置选项来更改此限制。

将MySQL后端的xcom表列值类型更改为longblob (#38401)

Xcom表的value列类型已从blob更改为longblob。这将允许您在Xcom中存储相对较大的数据,但如果您在Xcom中存储了大量大型数据,处理过程可能会花费大量时间。

要从修订版本降级:b4078ac230a1,请确保您没有超过65,535字节的Xcom值。否则,您需要清理这些行或运行airflow db clean xcom来清理Xcom表。

任务流上下文变量中关键参数默认值的更强验证 (#38015)

关于任务流实现与上下文变量默认值结合时可能生成无效参数顺序的问题,现在不再接受(并会验证)任务流函数定义时使用除None以外的默认值。如果您之前这样做过,很可能会看到一个损坏的DAG和类似Error message: Context key parameter my_param can't have a default other than None的错误消息。

新功能

  • 允许用户使用本国字符编写dag_id和task_id,为dag/task(v2)添加了显示名称(#38446)

  • 防止大型对象被存储在RTIF中 (#38094)

  • 当结束日期不存在时,使用当前时间计算持续时间。(#38375)

  • 在任务和DAG运行时长图表中添加平均持续时间标记线。(#38214, #38434)

  • 添加按钮以手动创建数据集事件 (#38305)

  • Matomo添加为analytics_tool的一个选项。(#38221)

  • 实验性:支持自定义 weight_rule 实现来计算 TI 的 priority_weight (#38222)

  • 新增功能:在连续失败X次后自动将DAG设置为关闭状态 (#36935)

  • 在下一次运行数据集模态中添加数据集条件 (#38123)

  • 在用户界面中添加任务日志分组功能 (#38021)

  • 将dataset_expression添加到网格DAG详情中 (#38121)

  • 引入机制以支持多执行器配置 (#37635)

  • 为任务执行日志中的ANSI字符添加颜色格式化功能 (#37985)

  • 将dataset_expression作为DagModel和DAGDetailSchema的一部分添加 (#37826)

  • 允许更长的渲染地图索引 (#37798)

  • 为DatasetOrTimeSchedule继承DatasetTriggeredTimetable中的run_ordering (#37775)

  • 实现AIP-60数据集URI格式 (#37005)

  • 为数据集条件逻辑引入逻辑运算符 (#37101)

  • 为数据集事件添加POST端点 (#37570)

  • 在UI中显示映射任务的自定义实例名称 (#36797)

  • 为get_event_logs API添加排除/包含事件功能 (#37641)

  • 向DAG图中添加数据集 (#37604)

  • 在网格视图中任务/运行详情上方显示数据集事件 (#37603)

  • 引入新的配置变量来控制DAG处理器是否输出到stdout (#37439)

  • 使数据集hashable (#37465)

  • 为数据集触发添加条件逻辑 (#37016)

  • 在React中实现任务时长页面。(#35863)

  • 添加 queuedEvent 端点以获取/删除 DatasetDagRunQueue (#37176)

  • 在BaseOperator中支持多XCom输出 (#37297)

  • AIP-58: 为xcom添加对象存储后端 (#37058)

  • 介绍 DatasetOrTimeSchedule (#36710)

  • BaseOperator添加on_skipped_callback (#36374)

  • 允许覆盖悬停导航栏颜色 (#36631)

  • 创建带标签的新指标 (#36528)

  • 为AFS和common.io添加openlineage支持 (#36410)

  • 引入 @task.bash TaskFlow 装饰器 (#30176, #37875)

改进

  • 为数据库清理提供更人性化的“显示表格”输出 (#38654)

  • 通过合并alive_triggerer_ids和get_sorted_triggers查询来改进trigger assign_unassigned功能 (#38664)

  • 为审计日志添加排除/包含事件过滤器 (#38506)

  • 对所有非MySQL方言的数据库,通过单一查询清理未使用的触发器 (#38663)

  • 更新生产等敏感环境中配置更改的确认逻辑 (#38299)

  • 改进数据集图表用户体验 (#38476)

  • 仅显示上次运行后的最新数据集事件时间戳 (#38340)

  • 添加按钮以仅清除DAG运行中失败的任务。(#38217)

  • 删除所有旧的DAG页面并重定向到网格视图 (#37988)

  • 在sentry.add_tagging()中使用前检查任务属性 (#37143)

  • 为MySQL后端修改xcom值列类型的Mysql变更 (#38401)

  • ExternalPythonOperator 使用来自 sys.version_info 的版本 (#38377)

  • 将过于宽泛的异常替换为核心异常 (#38344)

  • 为DAGs的批量暂停和恢复添加CLI支持 (#38265)

  • 在TaskInstancePydantic和DagRunPydantic上实现方法 (#38295, #38302, #38303, #38297)

  • 使筛选栏可折叠并添加全屏切换功能 (#38296)

  • 加密所有触发器属性 (#38233, #38358, #38743)

  • 升级react-table包。用于审计日志表格 (#38092)

  • 显示DAG页面过滤器是否处于活动状态 (#38080)

  • 为映射实例添加尝试次数 (#38097)

  • 为任务心跳添加重试机制 (#37541)

  • 将REST API事件添加到审计日志 (#37734)

  • 将当前工作目录设为BashOperator中的模板字段 (#37968)

  • 为react添加日历视图 (#37909)

  • 向日志表添加run_id列 (#37731)

  • 在网格任务实例提示框中添加tryNumber (#37911)

  • Session 未在 _do_render_template_fields 中使用 (#37856)

  • 改进MappedOperator属性类型 (#37870)

  • 从TaskInstancePydantic方法中移除provide_session装饰器 (#37853)

  • 确保用于TaskInstancePydantic和TaskInstance的"airflow.task"日志记录器 (#37857)

  • 为内部API调用错误提供更友好的错误提示信息 (#37852)

  • 增加DAG网格视图的工具提示大小 (#37782) (#37805)

  • 使用命名日志记录器而非根日志记录器 (#37801)

  • 在React中添加运行时长 (#37735)

  • 避免使用不推荐的日志记录方式 (#37792)

  • 改进 DateTimeTrigger 类型 (#37694)

  • 确保所有唯一的run_id都能显示任务持续时间条 (#37717)

  • 将Dag审计日志添加到React (#37682)

  • 为自动暂停添加日志事件 (#38243)

  • 为模板化基础操作符字段提供更好的异常消息 (#37668)

  • 清理添加到审计日志的webserver端点 (#37580)

  • 按dag_id筛选数据集图表 (#37464)

  • 为SIGTERM信号使用继承自BaseException的新异常类型 (#37613)

  • 重构数据集类继承 (#37590)

  • 简化对软件包版本的检查 (#37585)

  • 按关联的dag_id筛选数据集 (GET /datasets) (#37512)

  • 启用"airflow tasks test"以运行可延迟操作符 (#37542)

  • 使数据集列表/图表宽度可调整 (#37425)

  • 加速确定ExternalPythonOperator中已安装的airflow版本 (#37409)

  • 从REST API添加更多任务详情 (#37394)

  • 为DAG运行操作添加确认对话框 (#35393)

  • 为STATE_COLORS添加了关机状态颜色 (#37295)

  • 移除旧版DAG详情页面并重定向到网格视图 (#37232)

  • 在API中按映射索引排序XCom条目 (#37086)

  • 在dagrun创建API端点中添加data_interval_start和data_interval_end (#36630)

  • Making links in task logs as hyperlinks by preventing HTML injection (#36829)

  • 改进 ExternalTaskSensor 异步实现 (#36916)

  • 使数据集路径化 Pathlike (#36947)

  • 简化对孤立任务的查询 (#36566)

  • 在FileSensor中添加deferrable参数 (#36840)

  • 运行触发器页面:可配置的最近配置数量 (#36878)

  • nowait 和 skip_locked 合并到 with_row_locks 中 (#36889)

  • 在REST API中获取dag/dagRun时返回指定字段 (#36641)

  • 仅当为DagFileProcessorManager启用调试时才对项目进行迭代 (#36761)

  • 为指标允许列表和阻止列表添加模糊/正则表达式模式匹配功能 (#36250)

  • 允许在CLI DAG列表中添加自定义列 (#35250)

  • 使更改默认cron时间表成为可能 (#34851)

  • 对Airflow IO代码的一些改进 (#36259)

  • 改进TaskInstance的类型提示 (#36487)

  • 从认证管理器接口移除对Connexion的依赖 (#36209)

  • 重构ExternalDagLink以避免创建临时TaskInstances (#36135)

Bug修复

  • 在gunicorn工作进程启动时加载providers配置 (#38795)

  • 修复网格标题渲染问题 (#38720)

  • 为映射依赖添加任务实例依赖 (#37498)

  • 提升remove_task_decorator函数的稳定性 (#38649)

  • 在API上将更多字段标记为仅转储 (#38616)

  • 修复事件日志端点上的total_entries计数问题 (#38625)

  • 在日志块底部添加内边距。(#38610)

  • 正确序列化嵌套的attrs类 (#38591)

  • 修复下一个运行ID信息中的tz时区问题 (#38482)

  • 在网格视图中显示被放弃的任务 (#38511)

  • 一致应用任务实例突变钩子 (#38440)

  • 覆盖chakra样式以保持筛选栏中的dropdowns (#38456)

  • 以秒为单位存储持续时间,并缩放以处理序列中某个值的单位大于前一个持续时间的情况。(#38374)

  • 不允许在上下文参数中使用除None之外的默认值,并改进错误消息 (#38015)

  • 使postgresql默认引擎参数符合SA 2.0标准 (#38362)

  • 在触发器中的while循环内添加返回语句以yield (#38389)

  • 确保在装饰器上下文管理器中调用__exit__ (#38383)

  • 将方法 BaseAuthManager.is_authorized_custom_view 设为抽象方法 (#37915)

  • 为计划日历事件计算添加上限 (#38310)

  • 修复守护进程模式下调度程序未在指定位置创建PID的问题 (#38117)

  • 正确序列化TaskInstancePydantic和DagRunPydantic (#37855)

  • 修复图形任务状态边框颜色 (#38084)

  • 重新添加在安全管理器中移除的方法 (#37997)

  • 不要将来自工作节点服务日志的"403"错误记录为"未知错误"。(#37933)

  • 修复/get_logs_with_metadata端点中的执行数据验证错误 (#37756)

  • 修复任务持续时间选择 (#37630)

  • 避免在SQLAlchemy v2中将encoding传递给SQL引擎 (#37545)

  • 修复最新DAG运行语句中'隐式将SELECT对象强制转换为标量子查询'的问题 (#37505)

  • 使用max_execution_date查询构建器清理类型 (#36958)

  • 优化单DAG情况下的max_execution_date查询 (#33242)

  • 修复当get_dagmodel为None时的列表dags命令问题 (#36739)

  • 在数据集监听器之前预先加载consuming_dags属性 (#36247)

其他

  • 从用户界面移除参数的显示 (#38660)

  • 将关于scheduled_duration指标的日志级别从warning更新为debug (#38180)

  • 使用importlib_metadata兼容Python 3.10/3.12的stdlib标准库 (#38366)

  • 重构了BaseOperatorMeta的__new__魔术方法,以避免经典操作符和装饰操作符的错误混合 (#37937)

  • 使用 sys.version_info 来确定 Python 主版本.次版本 (#38372)

  • 添加缺失的已弃用Fab认证管理器 (#38376)

  • 从airflow包中移除未使用的循环变量 (#38308)

  • 在用户界面中添加最大连续失败DAG运行次数的信息 (#38229)

  • blinker的最低版本要求提升至指定版本 (#38140)

  • 将 /airflow/www 中的 follow-redirects 从 1.15.4 版本升级至 1.15.6 版本 (#38156)

  • 将Cryptography升级至> 39.0.0 (#38112)

  • 新增对Python 3.12的支持 (#36755, #38025, #36595)

  • 避免在测试之外使用 assert (#37718)

  • 为 universal_pathlib>=v0.2.2 更新 ObjectStoragePath (#37930)

  • 修复 G004:日志语句使用 f-string (#37873)

  • 更新构建和安装依赖项。(#37910)

  • Bump sanitize-html from 2.11.0 to 2.12.1 in /airflow/www (#37833)

  • 更新至最新安装程序版本。(#37754)

  • 弃用airflow设置/local_settings中的smtp配置 (#37711)

  • 将PY*常量弃用至airflow模块 (#37575)

  • 移除对已弃用的 flask._request_ctx_stack 的使用 (#37522)

  • 移除airflow.__init__.py中冗余的login属性 (#37565)

  • 升级至 FAB 4.3.11 (#37233)

  • 移除自2.0.0版本后不再使用的SCHEDULED_DEPS (#37140)

  • 将核心代码中的 datetime.datetime.utcnow 替换为 airflow.utils.timezone.utcnow (#35448)

  • 将aiohttp最低版本升级以避免CVE-2024-23829和CVE-2024-23334漏洞 (#37110)

  • 将与FAB认证管理器相关的配置移至FAB提供程序 (#36232)

  • 从Airflow核心移除MSSQL支持 (#36514)

  • 从认证管理器中移除 is_authorized_cluster_activity (#36175)

  • 创建FAB提供程序并将FAB认证管理器移至其中 (#35926)

仅文档变更

  • 改进时间表文档 (#38505)

  • 按字母顺序重新排列OpenAPI规范标签 (#38717)

  • 更新文档中的UI界面截图 (#38680, #38403, #38438, #38435)

  • 移除该部分内容,因为随着数据集表达式PR (#38370)的合并,这部分已不再适用

  • 重构 DatasetOrTimeSchedule 时间表文档 (#37771)

  • 将执行器文档迁移到相应的提供者 (#37728)

  • 添加指令以渲染URI方案列表 (#37700)

  • 添加包含提供者弃用信息的文档页面 (#37075)

  • 添加对安全策略的交叉引用 (#37004)

  • 改进 AIRFLOW__WEBSERVER__BASE_URL 文档 (#37003)

  • 更新faq.rst文件,提供(希望是)更清晰的start_date描述 (#36846)

  • 更新关于操作符的公共接口文档 (#36767)

  • exception 添加到模板引用列表 (#36656)

  • 将认证管理器接口添加为公共接口 (#36312)

  • 在Airflow文档中参考fab提供者文档 (#36310)

  • 创建认证管理器文档 (#36211)

  • 更新权限文档 (#36120)

  • 改进 _covers_every_hour 函数的文档字符串 (#36081)

  • 添加说明:任务实例、DAG和生命周期监听器已脱离实验性阶段 (#36376)

Airflow 2.8.4 (2024-03-25)

重大变更

无重大变更。

Bug修复

  • 修复了FixedTimezone的错误序列化问题 (#38139)

  • 修复日志任务处理程序过度更改权限的问题 (#38164)

  • 修复任务实例列表链接 (#38096)

  • 修复了调度器心跳速率参数未被使用的bug (#37992)

  • 添加内边距以防止网格水平滚动时任务重叠 (#37942)

  • 修复ObjectStoragePath中的哈希缓存问题 (#37769)

其他

  • 限制importlib_resources的使用,因为它会破坏pytest_rewrites (#38095, #38139)

  • pandas 限制为 <2.2 (#37748)

  • 升级 croniter 以修复2月29日cron表达式的问题 (#38198)

仅文档变更

  • 告知用户如果扫描器在镜像中发现问题该如何处理 (#37652)

  • 添加一个关于在Docker Compose中使用PyCharm进行调试的章节 (#37940)

  • 更新可延迟文档以阐明触发器恢复操作符时的kwargs (#38122)

Airflow 2.8.3 (2024-03-11)

重大变更

安装Airflow时,smtp提供程序现已预装。(#37713)

Bug修复

  • 在认证管理器中添加“MENU”权限 (#37881)

  • 修复external_executor_id被覆盖的问题 (#37784)

  • 使更多MappedOperator成员可修改 (#37828)

  • 在dag测试命令中设置解析上下文dag_id (#37606)

其他

  • 从安全管理器中移除无用方法 (#37889)

  • 提升TriggerRuleDep的代码覆盖率 (#37680)

  • 安装Airflow时,SMTP提供程序现已预装 (#37713)

  • 提升openapi验证器的最低版本要求 (#37691)

  • 正确包含airflow_pre_installed_providers.txt构件 (#37679)

仅文档变更

  • 澄清工作节点与调度器之间缺乏同步的问题 (#37913)

  • 简化了airflow_local_settings的一些文档 (#37835)

  • 新增关于本地设置配置的章节 (#37829)

  • 修复 BranchDayOfWeekOperator 的文档 (#37813)

  • 根据设计不支持写入密钥存储 (#37814)

  • ERD 生成文档改进 (#37808)

  • 更新错误的配置值 (#37706)

  • 更新安全模型以明确连接编辑用户的能力 (#37688)

  • 修复示例DAG中的ImportError错误 (#37571)

Airflow 2.8.2 (2024-02-26)

重大变更

allowed_deserialization_classes 标志现在支持通配符模式 (#36147)。

例如,如果用户想将类airflow.tests.custom_class添加到 allowed_deserialization_classes列表中,可以通过写入完整类名 (airflow.tests.custom_class)或使用类似glob搜索中的模式(例如 airflow.*airflow.tests.*)来实现。

如果您当前使用自定义正则表达式路径,请确保将其重写为通配符模式。

或者,如果您仍希望将其作为正则表达式模式进行匹配,请将其添加到新的列表allowed_deserialization_classes_regexp中。

audit_logs权限已更新以增强安全性 (#37501).

这一调整基于我们的政策:除管理员外,我们不希望查看者、运维等其他用户拥有访问审计日志的权限。此次变更的目的是限制权限较低的用户在未经许可的情况下,通过审计日志查看用户详细信息(如姓名、邮箱等)。

这一变更的影响是,现有非管理员权限的用户将无法查看或访问audit_logs,无论是在浏览标签页还是DAG运行中。

AirflowTimeoutError 默认不再通过 Exception 捕获 except (#35653).

The AirflowTimeoutError is now inheriting BaseException instead of AirflowException->``Exception``. See https://docs.python.org/3/library/exceptions.html#exception-hierarchy

这可以防止代码捕获Exception时意外捕获AirflowTimeoutError并继续运行。 AirflowTimeoutError是明确意图取消任务,不应在尝试处理错误并返回某些默认值时被捕获。

Catching AirflowTimeoutError is still possible by explicitly except``ing ``AirflowTimeoutError or BaseException. This is discouraged, as it may allow the code to continue running even after such cancellation requests. Code that previously depended on performing strict cleanup in every situation after catching Exception is advised to use finally blocks or context managers. To perform only the cleanup and then automatically re-raise the exception. See similar considerations about catching KeyboardInterrupt in https://docs.python.org/3/library/exceptions.html#KeyboardInterrupt

Bug修复

  • 按last_runtime对DAG处理统计进行排序 (#37302)

  • 允许通过URL参数预填充触发器表单值 (#37497)

  • 获取DAG网格视图的基准日期必须包含选定的run_id (#34887)

  • 检查 ImportError 的权限 (#37468)

  • IMPORT_ERROR从DAG相关权限移至视图相关权限 (#37292)

  • AirflowTaskTimeout 改为继承 BaseException (#35653)

  • 回退“修复当max_active_runs达到上限时,由于竞争条件导致未来DagRun很少被触发的问题 (#31414)” (#37596)

  • 将边距改为内边距,以便可以选择第一个任务 (#37527)

  • 修复Airflow对namedtuple的序列化问题 (#37168)

  • 修复点击URL不安全标签的bug (#37395)

  • Treeview函数设置确定性新getter (#37162)

  • 修复日志文件处理程序的父文件夹权限问题 (#37310)

  • 修复当指定access_entity时对DAG的权限检查 (#37290)

  • 修复常量dateTimeAttrFormat的值 (#37285)

  • 在触发器关闭时解决处理程序关闭的竞态条件 (#37206)

  • 修复多个视图中的状态图标对齐问题 (#36804)

  • 移除多余的 @Sentry.enrich_errors (#37002)

  • 使用execution_date=参数作为网格视图基础日期的备用选项 (#37018)

  • 处理任务中引发的SystemExit异常。(#36986)

  • 撤销除管理员外所有用户的audit_log权限 (#37501)

  • 修复了allowed_deserialization_classes的正则表达式问题 (#36147)

  • 修复了影响DAG结束日期的错误。(#36144)

  • 根据任务名称长度调整节点宽度 (#37254)

  • 修复:如果任何python_callable函数与DAG定义在同一源文件中,PythonVirtualenvOperator会崩溃 (#37165)

  • 修复折叠网格宽度,将选定条与甘特图对齐 (#37205)

  • 调整图形节点布局 (#37207)

  • 恢复初始化配置默认值的顺序 (#37155)

  • 在TaskInstance视图中显示“实际”尝试次数 (#34635)

  • Bugfix 当启用show_trigger_form_if_no_params时,必须使用参数触发DAG (#37063)

  • Secret masker 忽略含有特殊字符的密码 (#36692)

  • 修复了带有UPSTREAM_FAILED任务的DagRuns在回填时卡住的问题。(#36954)

  • 禁用 dryrun 自动获取 (#36941)

  • 修复DAG运行配置上的复制按钮 (#36855)

  • 修复了在run_id中用+替换空格引入的错误 (#36877)

  • 修复如果用户未登录时webserver总是重定向到首页的问题 (#36833)

  • REST API 在 POST 请求到 /variables 端点时设置描述 (#36820)

  • 对conn_id进行清理以防止潜在的脚本执行 (#32867)

  • 修复任务ID复制按钮复制错误ID的问题 (#34904)

  • 修复fab提供程序中的安全管理器继承问题 (#36538)

  • 避免使用 pendulum.from_timestamp (#37160)

其他

  • 安装最新的docker CLI而不是特定的版本 (#37651)

  • /airflow/www中的undici5.26.3升级到5.28.3 (#37493)

  • providers/pyproject.toml中添加Python 3.12排除项 (#37404)

  • 从核心依赖中移除markdown (#37396)

  • 移除未使用的pageSize方法。(#37319)

  • 将more-itertools添加为common-sql的依赖项 (#37359)

  • 替换其他Python 3.113.12的弃用项(#37478)

  • airflow_pre_installed_providers.txt包含到sdist分发中 (#37388)

  • 将Pydantic设为可选依赖项 (#37320)

  • 限制 universal-pathlib to < 0.2.0 (#37311)

  • 允许在测试中使用sqlite内存数据库运行airflow (#37144)

  • queue_when添加描述 (#36997)

  • 更新了环境变量 sql_alchemy_connect_argsconfig.yml 文件 (#36526)

  • Alembic 的最低版本提升至 1.13.1 (#36928)

  • flask-session 限制为 <0.6 (#36895)

仅文档变更

  • 修复升级文档以反映实际可用的CLI标志 (#37231)

  • 修复基础文档中的一个bug (#37440)

  • 为已弃用页面添加重定向 (#37384)

  • 修复 otel 配置描述 (#37229)

  • 更新Objectstore教程,增加prereqs前置条件章节 (#36983)

  • 添加更精确的描述以避免使用通用的package/module名称 (#36927)

  • 将Airflow版本替换添加到Docker Compose指南中 (#37177)

  • 在安全模型中增加关于DAG作者权限的说明 (#37141)

  • 将关于cron基础知识的文档移至"编写与调度"章节 (#37049)

  • 升级文档中的发布说明链接 (#36923)

  • 自动防止操作符__init__中的模板字段逻辑检查 (#33786)

Airflow 2.8.1 (2024-01-19)

重大变更

核心依赖项 pendulum 包的目标版本设置为 3 (#36281)。

对pendulum 2.1.2的支持将保留一段时间,预计直到Airflow的下一个功能版本。建议用户尽快升级代码以使用pendulum 3。

Pendulum 3引入了一些细微的不兼容性,可能会影响您的代码依赖项 - 例如默认日期渲染在输出日期表示中缺少T分隔符,这不符合ISO8601标准。如果您依赖默认的日期渲染方式,可能需要调整代码使用isoformat()方法来以ISO8601格式呈现日期。

Airflow 打包规范遵循现代 Python 打包标准 (#36537)。

我们通过采用pyproject.toml标准化了Airflow的依赖配置,以遵循Python打包的最新发展。Airflow现已符合以下公认的PEP标准:

此外,我们实现了来自草案(尚未被接受但已被hatchling支持的PEP)的多许可证文件支持: * PEP 639 通过改进包元数据提升许可证清晰度

如果用户使用的是现代Python打包和开发工具,这几乎不会对他们产生明显影响。一般来说,Airflow的行为应该与之前从PyPI安装时相同,并且使用pip install -e ".[devel]"进行开发安装会变得容易得多。

从用户角度来看的区别是:

  • Airflow的附加组件现在统一使用-进行标准化(遵循PEP-685规范),而不再使用_. (某些附加组件之前使用这些符号)。当您安装带有此类附加组件的airflow时(例如dbt.coreall_dbs),您应该使用-而不是_.

在大多数现代工具中,这将以向后兼容的方式工作,但在这些工具的某些旧版本中,您可能需要将_.替换为-。您可能还会收到警告,提示您正在安装的额外组件不存在——但通常这个警告是无害的,额外组件仍然会被安装。不过,建议在您的依赖项规范中为所有Airflow额外组件改用-

  • 发布的airflow包不包含develdevel-*docdoc-gen这些额外组件。 这些额外组件仅在从源代码以--editable模式安装Airflow时可用。这是因为 这些组件仅用于开发和文档构建目的,在生产环境中安装Airflow时并不需要。 这些依赖项在已发布的包中行为未明且多变,您不应该在已发布的包中使用它们。

  • 在使用约束条件安装Airflow时,allall-*附加包之前并不总是能正常工作,因为它们也被视为仅开发依赖项。通过这次变更,这些依赖项现在能正确处理约束条件,在使用约束时将正确安装,并拉取适当的提供者和依赖项集合。

Graphviz 依赖项现在是可选的,不再是必需的 (#36647).

graphviz依赖作为Airflow的必要依赖一直存在问题——特别是在基于ARM架构的安装环境中。Graphviz软件包需要二进制graphviz库——这本身就是一个限制,但它们还需要安装graphviz的Python绑定并进行构建安装。这不仅在较旧的Linux系统上无法工作,更重要的是——当你尝试为ARM M1 MacBook安装Python 3.8、3.9版本的Graphviz库时,这些软件包会安装失败,因为针对M1芯片的Python绑定编译仅支持Python 3.10及以上版本。

从技术上讲这不是一个破坏性变更 - 用于渲染DAG的CLI仍然存在,而且如果你已经安装了graphviz,它将继续像以前一样工作。唯一的问题是当你没有安装graphviz时会出现错误,并提示你需要安装它。

对于大多数用户来说,Graphviz 仍然需要安装:

  • Airflow镜像仍将包含graphviz库,因为它是作为额外组件添加的

  • 当已安装旧版Airflow时,graphviz库已预先安装,Airflow将继续保持原有工作状态

唯一的改变是需要全新安装新版本的Airflow,其中需要将graphviz指定为额外组件或单独安装,以启用DAG渲染选项。

Bug修复

  • 修复airflow-scheduler在异常时以代码0退出的问题 (#36800)

  • 修复当被移除的任务是taskinstance列表中最后一个时出现的回调异常问题 (#36693)

  • 当设置AUTH_ROLE_PUBLIC=admin时,允许匿名用户编辑/查看资源 (#36750)

  • 当sqlite URL使用相对路径时提供更好的错误提示信息 (#36774)

  • 需要显式字符串转换,以强制将整数类型的run_id作为字符串而非整数传递(#36756)

  • 为空的 op 子类型添加日志查找异常 (#35536)

  • 移除任务实例上未使用的索引 (#36737)

  • 修复针对Python 3.10+版本中_infer_multiple_outputs函数内typing.Union子类检查的问题 (#36728)

  • 确保即使在使用TypedDict时,multiple_outputs也能被正确推断 (#36652)

  • 在传统安全管理器中添加回FAB常量 (#36719)

  • 修复使用Dagrun.update_state时出现的AttributeError错误 (#36712)

  • 如果catchup=False,不要让EventsTimetable调度过去的事件 (#36134)

  • 支持对触发器参数进行加密 (#36492)

  • 修复_process_executor_eventstis_query的类型提示 (#36655)

  • 当用户无权访问页面时重定向至首页 (#36623)

  • 避免在call_regular_interval中使用字典作为默认值 (#36608)

  • 移除在UI中将任务实例设置为运行状态的选项 (#36518)

  • 修复使用动态任务映射时详情标签页不显示的问题 (#36522)

  • 当运行dag testDagRun失败则抛出错误 (#36517)

  • 通过批量刷新任务实例(TIs)来重构_manage_executor_state (#36502)

  • 添加Flask配置:MAX_CONTENT_LENGTH (#36401)

  • 修复嵌套组中拆卸操作的get_leaves计算 (#36456)

  • 停止将无时区信息的日期时间序列化为带UTC时区的日期时间 (#36379)

  • 使kubernetes装饰器的类型注解与操作符保持一致 (#36405)

  • 修复Web服务器对匿名用户发送到api/dag/*/dagrun的POST请求返回500错误的问题 (#36275)

  • 修复get_variable端点所需的访问权限 (#36396)

  • 修复 DAG.is_fixed_time_schedule 中的日期时间引用 (#36370)

  • 修复BashOperator引发的AirflowSkipException消息 (#36354)

  • 允许PythonVirtualenvOperator.skip_on_exit_code设置为零 (#36361)

  • Increase width of execution_date input in trigger.html (#36278)

  • 修复暂停DAG的日志记录问题 (#36182)

  • 当enable_xcom_pickling为False时停止反序列化pickle (#36255)

  • 在访问DAG代码前检查DAG读取权限 (#36257)

  • 启用始终将任务标记为失败/成功的功能 (#36254)

  • 创建最新的日志目录符号链接作为相对链接 (#36019)

  • 修复基于Python的装饰器模板问题 (#36103)

其他

  • 将并发标签重命名为最大活动任务数 (#36691)

  • 在file_task_handler中恢复函数作用域的httpx导入以提高性能 (#36753)

  • 添加对 Pendulum 3 的支持 (#36281)

  • 标准化airflow构建流程并切换到Hatchling构建后端 (#36537)

  • 移除针对pyarrow-hotfixCVE-2023-47248修复 (#36697)

  • 使 graphviz 依赖变为可选 (#36647)

  • 宣布在Airflow 2.9.0中终止对MSSQL的支持,并添加迁移脚本提示 (#36509)

  • 将所有提供程序和airflow的最小pandas依赖版本设置为1.2.5 (#36698)

  • /airflow/www 中的 follow-redirects 从 1.15.3 升级到 1.15.4 (#36700)

  • 为基类钩子提供logger_name参数以覆盖日志记录器名称 (#36674)

  • 修复运行类型图标与运行类型文本的对齐问题 (#36616)

  • 在FSHook中遵循BaseHook连接字段方法签名 (#36444)

  • 移除冗余的docker装饰器类型注解 (#36406)

  • 修正工作日时间表中的打字问题 (#36296)

  • 使用 batch_is_authorized_dag 检查用户是否有读取DAGs的权限 (#36279)

  • 替换已弃用的get_accessible_dag_ids方法,在get_dag_warnings中使用get_readable_dags (#36256)

仅文档变更

  • 指标标签文档 (#36627)

  • 在文档中使用 logical_date 替代已弃用的 execution_date (#36654)

  • 新增关于Airflow实时升级的章节 (#36637)

  • numpy示例替换为展示顶层代码的实践练习 (#35097)

  • 改进并添加更完整的架构图描述 (#36513)

  • 改进当webserver出现错误时显示的错误信息 (#36570)

  • 更新 dags.rst 文件,添加关于DAG暂停功能的信息 (#36540)

  • 升级到 Debian Bookworm 后更新安装先决条件 (#36521)

  • 添加关于用户应如何进行数据库监控的描述 (#36483)

  • 在dynamic-task-mapping.rst中添加基于映射任务组示例的分支逻辑 (#36480)

  • 在替换文档中添加更多详细信息 (#36485)

  • 在描述优先级权重方法时使用卡片 (#36411)

  • 更新参数 dagrun.schedule_delaymetrics.rst 文档 (#36404)

  • 更新Python操作符文档中的警告说明以反映情感 (#36340)

  • 改进 audit_logs.rst (#36213)

  • 从托管的Postgres后端列表中移除Redshift的提及 (#36217)

Airflow 2.8.0 (2023-12-18)

重大变更

Raw HTML code in DAG docs and DAG params descriptions is disabled by default (#35460)

To ensure that no malicious javascript can be injected with DAG descriptions or trigger UI forms by DAG authors a new parameter webserver.allow_raw_html_descriptions was added with default value of False. If you trust your DAG authors code and want to allow using raw HTML in DAG descriptions and params, you can restore the previous behavior by setting the configuration value to True.

To ensure Airflow is secure by default, the raw HTML support in trigger UI has been super-seeded by markdown support via the description_md attribute. If you have been using description_html please migrate to description_md. The custom_html_form is now deprecated.

新功能

  • AIP-58: 添加Airflow对象存储(AFS) (AIP-58)

  • 在网格中添加XCom选项卡 (#35719)

  • 添加“literal”包装器以禁用字段模板化 (#35017)

  • 添加任务上下文日志功能,允许将消息转发到任务日志 (#32646, #32693, #35857)

  • 为数据集添加监听器钩子 (#34418, #36247)

  • 允许覆盖导航栏文字颜色 (#35505)

  • 为deltalake表添加轻量级序列化功能 (#35462)

  • 添加对iceberg表序列化的支持 (#35456)

  • prev_end_date_success 方法访问 (#34528)

  • 添加任务参数以设置自定义日志记录器名称 (#34964)

  • 添加pyspark装饰器 (#35247)

  • 将触发器添加为数据库清理命令的有效选项 (#34908)

  • 为外部和虚拟环境Python分支操作符添加装饰器 (#35043)

  • 允许PythonVenvOperator使用其他索引网址 (#33017)

  • 添加Python Virtualenv Operator缓存功能 (#33355)

  • 为容器化执行器日志引入通用导出功能 (#34903)

  • List Task Instances视图中添加清除下游任务实例的功能 (#34529)

  • 属性 clear_number 用于追踪被清除的DAG运行 (#34126)

  • 新增 BranchPythonVirtualenvOperator (#33356)

  • 允许PythonVenvOperator使用其他索引网址 (#33017)

  • 向providers添加CLI通知命令 (#33116)

  • 当日志选项卡中的重试次数超过10次时,使用下拉菜单替代按钮 (#36025)

改进

  • 在网格视图中添加multiselect以运行状态 (#35403)

  • 修复Connection.get_hook中遇到ImportError时的警告信息 (#36005)

  • 在import_error表中添加processor_subdir以支持多DAG处理器 (#35956)

  • 在核心执行器中整合change_state调用以处理失败或成功状态 (#35901)

  • 当schedule=None时放宽对start_date的强制要求 (#35356)

  • 使用ExitStack管理dag.test中secrets_backend_list的变更 (#34620)

  • 改进了taskinstance在ActionModal中的任务可见性 (#35810)

  • 根据AIRFLOW_CONFIG路径创建目录 (#35818)

  • 实现JSON-string连接表示生成器(#35723)

  • BaseOperatorLink 移动到单独的模块 (#35032)

  • 在设置上下文后设置mark_end_on_close (#35761)

  • 将外部日志链接移至React日志页面顶部 (#35668)

  • execute_interactive中将终端模式更改为cbreak并处理SIGINT (#35602)

  • Make raw HTML descriptions configurable (#35460)

  • 允许电子邮件字段使用模板 (#35546)

  • 在触发UI表单中隐藏逻辑日期和运行ID (#35284)

  • 改进了在TaskFlow中添加依赖项的说明 (#35406)

  • 添加可选的退出代码以列出导入错误 (#35378)

  • synchronize_log_template函数中限制数据库而非客户端的查询结果 (#35366)

  • 在使用变量CLI时允许传入描述 (#34791)

  • 允许在手动触发的DAG中为必填字段设置可选默认值 (#31301)

  • 允许airflow kerberos以不同模式运行 (#35146)

  • 重构命令以统一守护进程上下文处理 (#34945)

  • 向插件端点添加额外字段 (#34913)

  • 为池视图添加描述 (#34862)

  • 将cli的连接导出和变量导出命令的打印逻辑移至单独的函数 (#34647)

  • 从get_kerberos_principle中提取并复用get_kerberos_principle函数 (#34936)

  • 修改 BaseOperatorLink.operators 的类型注解 (#35003)

  • 优化并迁移至SA2兼容语法的TaskReschedule (#33720)

  • 在SlaMissModelView中统一权限名称 (#34949)

  • EventScheduler中添加调试日志,显示正在运行的内容 (#34808)

  • 将日志读取器流循环睡眠时长增加至1秒 (#34789)

  • 解决关于update_forward_refs的pydantic弃用警告 (#34657)

  • 统一映射任务组的查找逻辑 (#34637)

  • 允许按属性筛选事件日志 (#34417)

  • 将连接登录名和密码设为TEXT类型 (#32815)

  • 禁止在代码库中从airflow包导入Dataset (#34610)

  • 在示例和测试中使用 airflow.datasets.Dataset (#34605)

  • 增强任务状态可见性 (#34486)

  • 简化DAG触发界面 (#34567)

  • 禁止从airflow导入AirflowException (#34512)

  • 为airflow资源配置参数添加描述 (#34438)

  • 简化触发器名称表达式 (#34356)

  • 将Pod*Exceptions的定义移至pod_generator (#34346)

  • 将延迟任务添加到集群活动视图 Pools Slots (#34275)

  • 心跳失败日志消息修复 (#34160)

  • 重命名DAG运行的变量 (#34049)

  • 在OpenAPI规范中澄清new_state (#34056)

  • 从docker compose文件中移除顶级元素version (#33831)

  • 移除通用的触发器取消错误日志 (#33874)

  • 使用 NOT EXISTS 子查询替代 tuple_not_in_condition (#33527)

  • 允许上下文键参数不提供默认值 (#33430)

  • 按TI priority_weight排序触发器 - 当分配未分配的触发器时 (#32318)

  • 添加指标 triggerer_heartbeat (#33320)

  • 允许airflow variables export打印到标准输出(#33279)

  • 修复运行回填时出现的死锁问题 (#32991)

  • 为批量任务实例API端点添加dag_run_ids和task_ids筛选功能 (#32705)

  • 可配置触发器健康检查阈值 (#33089)

  • 重构provider管理器,将Airflow核心钩子与其他provider钩子同等对待 (#33051)

  • 确保在取消映射时填充DAG级别的引用 (#33083)

  • 将webserver访问拒绝警告设为可配置项 (#33022)

  • 在Trigger Form UI中添加对不同数据类型数组的支持 (#32734)

  • 添加一个机制,当执行器覆盖现有CLI命令时发出警告 (#33423)

Bug修复

  • 在计算下次调度时考虑UTC偏移量的变化 (#35887)

  • 为查看者角色添加对资源池的读取权限 (#35352)

  • 修复当延迟任务的queued_dttm大于start_date时甘特图队列持续时间显示问题 (#35984)

  • 修复当目录未找到时删除操作导致容器崩溃的问题 (#36050)

  • 更新 reset_user_sessions 使其可通过命令行界面或网页进行操作 (#36056)

  • 修复当DAG被移除时UI网格显示错误的问题。(#36028)

  • 在Web界面中将触发器UI更改为使用HTTP POST (#36026)

  • 修复airflow db shell需要额外按键才能退出的问题 (#35982)

  • 将DAG网格的overscroll行为更改为自动 (#35717)

  • 在DAG测试中内联运行触发器 (#34642)

  • 为Firefox的scrollbar添加borderWidthRight到网格 (#35346)

  • 修复由于secrets_masker导致的无限递归问题 (#35048)

  • 修复在serialized_dag表中写入processor_subdir的问题 (#35661)

  • 为独立DAG文件处理器重新加载配置 (#35725)

  • 图形视图中长自定义操作符名称溢出 (#35382)

  • 在额外链接查询中添加try_number (#35317)

  • 防止将非JSON可序列化的值分配给DagRun.conf字典 (#35096)

  • DAG详情中的数值被错误地渲染为时间戳 (#35538)

  • 修复当启用statsd指标时,Scheduler和triggerer在守护进程模式下的崩溃问题 (#35181)

  • 停用活跃用户后出现无限UI重定向循环问题 (#35486)

  • 修复了部分子集DAG的fetch_callback问题 (#35256)

  • 修复DeltaDataIntervalTimetable的DagRun数据间隔问题 (#35391)

  • 修复get_dag_by_pickle工具函数中的查询问题 (#35339)

  • 修复当reset_dag_run=True时TriggerDagRunOperator无法触发后续运行的问题 (#35429)

  • 修复mappedoperator中的weight_rule属性类型 (#35257)

  • Bug修复/防止与缓存虚拟环境并发问题 (#35258)

  • 修复DAG序列化问题 (#34042)

  • 通过使用get_redirect()替换request.referrer来修复py/url-redirection问题 (#34237)

  • 修复变量导入过程中更新变量的问题 (#33932)

  • 在Airflow核心中使用airflow.typing_compat中的Literal (#33821)

  • 始终使用来自 typing_extensionsLiteral (#33794)

其他

  • 将默认的MySQL客户端更改为MariaDB (#36243)

  • 将daskexecutor提供程序标记为已移除 (#35965)

  • 将FAB升级至4.3.10 (#35991)

  • 将daskexecutor提供程序标记为已移除 (#35965)

  • Connection.to_json_dict重命名为Connection.to_dict (#35894)

  • 升级至Pydantic v2 (#35551)

  • moto 版本升级至 >= 4.2.9 (#35687)

  • 使用 pyarrow-hotfix 来缓解 CVE-2023-47248 (#35650)

  • axios0.26.0 升级至 1.6.0/airflow/www/ 目录 (#35624)

  • 使docker装饰器的类型注解与操作符保持一致 (#35568)

  • 在样式(#35553)中为navbar_text_colorrm条件添加默认值

  • 避免在dag_next_execution中重复初始化会话 (#35539)

  • 修复示例和提供程序中的类型问题 (#35494)

  • 启用 TCH004TCH005 规则 (#35475)

  • 优化关于检索到的DAG(s)的日志输出人性化显示 (#35338)

  • 将格式化工具从Black切换为Ruff (#35287)

  • 升级至Flask Application Builder 4.3.9 (#35085)

  • D401 支持 (#34932, #34933)

  • 使用requires_access来检查对DAG的读取权限,而不是显式检查(#34940)

  • 弃用从airflow中延迟导入AirflowException的功能 (#34541)

  • 查看映射用例上的工具重构 (#34638)

  • /airflow/www中的postcss8.4.25 升级到 8.4.31 (#34770)

  • 将Sqlalchemy查询重构为2.0风格 (#34763, #34665, #32883, #35120)

  • 修改pandas序列化器中io的延迟加载方式 (#34684)

  • 在示例中使用 airflow.models.dag.DAG (#34617)

  • 在核心代码中使用 airflow.exceptions.AirflowException (#34510)

  • 检查请求中传入的dag_ids是否一致 (#34366)

  • 重构代码以提升质量 (#34278, #34113, #34110, #33838, #34260, #34409, #34377, #34350)

  • 暂停qubole供应商 (#33889)

  • 为Google ADS生成Python API文档 (#33814)

  • 改进模块中的导入功能 (#33812, #33811, #33810, #33806, #33807, #33805, #33804, #33803, #33801, #33799, #33800, #33797, #33798, #34406, #33808)

  • 将Elasticsearch升级到8版本 (#33135)

仅文档变更

  • 为文档添加对标签页(及其他UX组件)的支持 (#36041)

  • 将Airflow的架构图替换为由diagrams生成的版本 (#36035)

  • 添加描述DAG作者权限安全模型的部分 (#36022)

  • 增强僵尸任务的文档 (#35825)

  • 在文档中反映数据库后端版本的增减支持情况 (#35785)

  • 关于强制任务参数的更多详情 (#35740)

  • 在.airflowignore文档中注明使用re2正则表达式引擎。(#35663)

  • 更新 best-practices.rst (#35692)

  • 更新 dag-run.rst 以提及Airflow通过croniter支持扩展的cron语法 (#35342)

  • 更新 webserver.rst 以包含支持的 OAuth2 提供商信息 (#35237)

  • 将dag_run添加回文档 (#35142)

  • 修复 rst 代码块格式 (#34708)

  • 为具体任务流示例添加类型标注 (#33417)

  • 为从TaskFlow任务访问上下文变量添加具体示例 (#33296)

  • 修复安全文档中的链接 (#33329)

Airflow 2.7.3 (2023-11-06)

重大变更

无重大变更。

Bug修复

  • 修复映射任务组中任务的过早评估问题 (#34337)

  • 在REST API中添加TriggerRule缺失值 (#35194)

  • 修复当DagRun创建失败时调度器崩溃循环的问题 (#35135)

  • 修复与codemirror及额外的测试连接问题 (#35122)

  • 修复自v1.3.0版本以来cron-descriptor的BC使用问题 (#34836)

  • 修复基于类监听器的get_plugin_info功能。(#35022)

  • 针对dag_run和task_instance端点的一些改进/修复 (#34942)

  • 修复了webserver主页中的dags计数过滤器 (#34944)

  • 当提供~作为dag_id时,仅返回可读dags的TIs (#34939)

  • 修复守护进程模式下triggerer线程崩溃的问题(#34931)

  • 修复错误的插件模式 (#34858)

  • 在TimeSensorAsync中使用DAG时区 (#33406)

  • 如果任何任务处于upstream_failed状态,则将带有all_skipped触发规则的任务标记为skipped (#34392)

  • 为只读字段添加只读验证 (#33413)

杂项/内部

  • 改进测试框架以分离数据库和非数据库测试 (#35160, #35333)

  • 为我们的测试添加 pytest db_test 标记 (#35264)

  • 添加pip缓存以加速构建 (#35026)

  • 上限要求 pendulum 需小于 <3.0 (#35336)

  • sentry_sdk 限制为 1.33.0 (#35298)

  • 修复测试中模拟processor_agent的细微错误 (#35221)

  • /airflow/www中的@babel/traverse7.16.0 升级至 7.23.2 (#34988)

  • /airflow/www中的undici5.19.1 升级至 5.26.3 (#34971)

  • SchedulerJobRunner中移除未使用的集合 (#34810)

  • 移除关于max_tis per query > parallelism的警告 (#34742)

  • 通过将部分模块移至类型检查块来优化Airflow核心中的模块导入 (#33755)

  • 修复测试以适配Python 3.12对sentry-sdk中utcnow的处理方式 (#34946)

  • 添加 connexion<3.0 上限 (#35218)

  • 将Airflow限制在< 3.12版本以下 (#35123)

  • 更新moto版本 (#34938)

  • 将WTForms限制在3.1.0以下版本 (#34943)

仅文档变更

  • 修复Airflow文档中的变量替换问题 (#34462)

  • conn.extras中添加了默认值的示例 (#35165)

  • 修复 datasets.rst 中运行示例代码的问题 (#35035)

  • 从推荐的MySQL驱动中移除mysql-connector-python (#34287)

  • 修复任务依赖关系set_downstream示例中的语法错误 (#35075)

  • 更新文档以启用测试连接 (#34905)

  • 更新文档 errors.rst - 提及 sentry "transport" 配置选项 (#34912)

  • 更新dags.rst文件,将SubDag弃用说明直接放在SubDag章节标题之后 (#34925)

  • 添加关于在自定义密钥后端中获取变量和配置的信息 (#34834)

  • 更详细地记录BaseExecutor接口,以帮助用户编写自定义执行器 (#34324)

  • 修复指向airflow_local_settings.py模板的损坏链接 (#34826)

  • 修复了params.rst中python_callable函数赋值上下文kwargs的示例 (#34759)

  • 在TaskFlow示例中添加缺失的multiple_outputs=True参数 (#34812)

  • 移除提供者章节名称中多余的'>'符号 (#34813)

  • 修复额外链接文档中的导入问题 (#34547)

Airflow 2.7.2 (2023-10-12)

重大变更

无重大变更

Bug修复

  • 检查配置端点中提供的较低值是否敏感 (#34712)

  • 添加对ZoneInfo和通用UTC的支持以修复日期时间序列化问题 (#34683, #34804)

  • 修复在运行airflow db migrate命令时出现的AttributeError: 'Select'对象没有'count'属性的问题 (#34348)

  • 使修补任务实例的试运行变为可选 (#34568)

  • 修复非确定性的日期时间反序列化问题 (#34492)

  • 使用迭代循环查找映射的父级 (#34622)

  • 通过检查是否有父级taskgroup被映射来修复is_parent_mapped值 (#34587)

  • 避免顶层airflow导入以防止循环依赖 (#34586)

  • 在冗长的指标列表中添加更多豁免项 (#34531)

  • 修复DAG警告端点权限问题 (#34355)

  • 修复批量端点中的任务实例访问问题 (#34315)

  • 修正网格视图中显示错误时间的问题 (#34179)

  • 修复由于standaloneDagProcessor模板化导致cluster_activity视图无法加载的问题 (#34274)

  • 在‘未同步DAG-level权限’中设置loglevel=DEBUG (#34268)

  • 使DAG验证和触发的参数验证保持一致 (#34248)

  • 确保选择任何标签页时显示详情面板 (#34136)

  • 修复与access_control={}相关的问题 (#34114)

  • 修复了CLI会话中未找到ab_user表的问题 (#34120)

  • 修复与FAB相关的日志格式插值问题 (#34139)

  • 修复 next_run_datasets_summary 端点中的查询错误 (#34143)

  • 修复了重复标签的TaskGroup切换问题 (#34072)

  • 修复从用户界面清除TI所需的权限 (#34123)

  • 在映射的render_template_fields中复用_run_task_session (#33309)

  • 修复调度器逻辑,通过忽略手动运行来计划新的DAG运行 (#34027)

  • 为Flask操作添加、编辑和删除添加缺失的审计日志 (#34090)

  • 在集群活动页面隐藏不相关的Dag处理器 (#33611)

  • 移除风车图标的无限旋转动画,改为旋转1.5秒 (#34020)

  • 恢复带有version_added的供应商配置渲染 (#34011)

仅文档变更

  • 明确审计日志权限 (#34815)

  • 为审计日志用户添加说明 (#34814)

  • 在WSGI中间件示例中从FAB导入AUTH_REMOTE_USER (#34721)

  • 添加关于未来将不再支持MsSQL作为数据库后端的信息 (#34375)

  • 记录如何使用系统时区数据库 (#34667)

  • 在文档中明确着陆时间的含义 (#34608)

  • 修复动态任务映射文档中的截图 (#34566)

  • 修复公共接口文档中的类引用 (#34454)

  • 阐明 var.value.get 和 var.json.get 的用法 (#34411)

  • 计划默认值描述 (#34291)

  • triggered_dataset_event的文档 (#34410)

  • 添加DagRun事件 (#34328)

  • 提供关于触发器表单参数类型的表格概览 (#34285)

  • 在核心文档中添加指向Amazon Provider配置的链接 (#34305)

  • 在安全模型中添加“安全基础设施”段落 (#34301)

  • 将链接更改为SQLAlchemy 1.4 (#34288)

  • 在安全文档中添加SBOM条目 (#34261)

  • 为XCom的推送和拉取添加了更多示例代码 (#34016)

  • 将状态工具添加到公共Airflow接口 (#34059)

  • 将markdown风格的链接替换为rst风格的链接 (#33990)

  • 修复指向“UPDATING.md”文件的损坏链接 (#33583)

杂项/内部

  • 更新min-sqlalchemy版本以支持使用的最新功能 (#34293)

  • 修复 SesssionExemptMixin 拼写错误 (#34696)

  • 限制 astroid 版本 < 3 (#34658)

  • 如果没有触发器则推迟执行时使DAG测试失败 (#34619)

  • 修复导出的连接输出 (#34640)

  • 创建新的alembic迁移时不要运行isort (#34636)

  • 弃用PythonVirtualEnvOperator中的数字类型python版本 (#34359)

  • os.path.splitext 重构为 Path.* (#34352, #33669)

  • 将类型比较中的 = 替换为 is (#33983)

  • 重构整数除法 (#34180)

  • 重构:简化比较操作 (#34181)

  • 重构:简化字符串生成 (#34118)

  • 在核心代码中用dict()替换不必要的字典推导式 (#33858)

  • 将"not all"改为"any"以提高可读性 (#34259)

  • 在代码中用if…raise替换assert (#34250, #34249)

  • 将默认时区移至except块 (#34245)

  • 合并核心中相似的if逻辑 (#33988)

  • 重构:整合随机模块的导入和使用 (#34108)

  • 整合对os.path.*的导入 (#34060)

  • 在Airflow核心中用解包替换序列连接 (#33934)

  • 重构仓库中不必要的 'continue' 跳转 (#33849, #33845, #33846, #33848, #33839, #33844, #33836, #33842)

  • pyproject.toml中移除[project]部分 (#34014)

  • 在Airflow核心中可能的情况下,将try移到循环外部 (#33975)

  • 在核心代码中寻找正值时用any替换循环 (#33985)

  • 不要创建我们不需要的列表 (#33519)

  • 从核心移除无用的字符串连接 (#33969)

  • 将TCH001和TCH002规则添加到pre-commit中,用于检测和移动类型检查模块 (#33865)

  • 在批量取消队列中添加 cancel_trigger_ids (#33944)

  • 在解析统计datadog标签时避免创建不必要的列表 (#33943)

  • 当核心代码中未使用键时,将dict.items替换为dict.values (#33940)

  • 将lambda表达式替换为列表推导式 (#33745)

  • 通过将部分模块导入类型检查块来优化Airflow核心模块的导入方式 (#33755)

  • 重构:移除未使用的状态 - SHUTDOWN (#33746, #34063, #33893)

  • 重构:使用原地.sort() (#33743)

  • 在Airflow核心中使用字面量字典而非调用dict() (#33762)

  • 在Airflow核心中移除不必要的map并使用list重写 (#33764)

  • 在Airflow核心中用def方法替换lambda (#33758)

  • 在fab_security管理器中将类型func替换为isinstance (#33760)

  • 在所有Airflow模块中将单引号替换为双引号 (#33766)

  • 将同一对象的多个isinstance调用合并为单个调用 (#33767)

  • 在核心代码中使用单个语句配合多个上下文,而非嵌套语句 (#33769)

  • 重构:使用f-字符串 (#33734, #33455)

  • 重构:使用random.choices (#33631)

  • 使用 str.splitlines() 来分割行 (#33592)

  • 重构:移除无用的 str() 调用 (#33629)

  • 重构:改进重复项检测和列表排序功能 (#33675)

  • 简化对len()的条件判断 (#33454)

Airflow 2.7.1 (2023-09-07)

重大变更

CronTriggerTimetable 现在在尝试跳过运行时会更加谨慎 (#33404)

当设置catchup=False时,如果调度程序没有在前一次运行触发后立即查询时间表,CronTriggerTimetable将不再跳过运行。

在大多数情况下,这不会影响调度,但如果通过暂停-恢复DAG来手动跳过某次运行,则可能改变行为。此前,时间表(使用catchup=False)只会在DAG恢复后开始运行,但经过此变更后,调度器会尝试稍微回溯以安排覆盖DAG暂停期间的部分前次运行。这意味着您需要将DAG保持暂停状态更长时间(即等待整个cron周期结束)才能真正跳过某次运行。

请注意,这也是其他基于cron的调度工具(如anacron)所表现出的行为。

conf.set() 变为大小写不敏感以匹配 conf.get() 的行为 (#33452)

此外,如果使用非字符串参数,conf.get()现在将会报错。

conf.set(section, key, value) 过去是区分大小写的,也就是说 conf.set("SECTION", "KEY", value)conf.set("section", "key", value) 会被存储为两个不同的配置。 这与 conf.get(section, key) 的行为不一致,后者总是将 section 和 key 转换为小写。

因此,在配置节或键中使用大写字母设置的配置选项将无法访问。 这就是为什么我们现在也要在conf.set中将配置节和键转换为小写。

我们还稍微修改了conf.get()的行为。它过去允许在配置节或键中使用非字符串对象。现在这样做会导致异常。例如,conf.get("section", 123)需要替换为conf.get("section", "123")

Bug修复

  • 确保任务等待正在运行的间接设置 (#33903)

  • 尊重核心异步传感器的“soft_fail”设置 (#33403)

  • 将0和未设置值区分为默认参数值 (#33965)

  • 如果未找到变量,则从变量PATCH API抛出404错误 (#33885)

  • 修复 MappedTaskGroup 任务未遵循上游依赖的问题 (#33732)

  • 如果需要从查询结果中获取第一个值,则添加 limit 1 (#33672)

  • 修复UI中DAG计数包含已删除DAG的问题 (#33778)

  • 修复清理僵尸RESTARTING任务 (#33706)

  • SECURITY_MANAGER_CLASS 应该是一个类的引用,而不是字符串 (#33690)

  • 在安全管理器中添加回get_url_for_login (#33660)

  • 修复 2.7.0 db 迁移作业错误 (#33652)

  • 在模板内设置上下文 (#33645)

  • 如果定义了dag定义的access_control,则将其视为权威(#33632)

  • 在尝试删除归档表之前绑定引擎 (#33622)

  • 添加一个回退机制,以防未设置名字和姓氏的情况 (#33617)

  • 在TIS持续时间计算中对groupby前的数据进行排序 (#33535)

  • 在没有DAG运行时停止向渲染模板UI添加值 (#33516)

  • 在解析webserver视图中的日期时,将strict设置为True (#33512)

  • 在自定义SA类型中使用dialect.name (#33503)

  • end_date小于utcnow时,不返回正在运行的dagrun (#33488)

  • 修复formatDuration方法中的一个bug (#33486)

  • 使 conf.set 不区分大小写 (#33452)

  • 允许时间表略微错过追赶截止时间 (#33404)

  • 当调用poke时遵守soft_fail参数 (#33401)

  • 创建一个新方法用于恢复任务,以实现操作符的特定逻辑 (#33424)

  • 修复DagFileProcessor干扰其processor_subdir之外的dags的问题 (#33357)

  • 移除Providers视图中不必要的
    文本 (#33326)

  • 当ExternalTaskSensor以可延迟模式运行时,尊重soft_fail参数 (#33196)

  • 修复Param类的默认值处理和序列化问题 (#33141)

  • 在添加前检查动态添加的索引是否在表结构中 (#32731)

  • 修复在使用expand_kwargs方法时映射参数的渲染问题 (#32272)

  • 修复了Python 3.8下celery和opentelemetry的依赖问题 (#33579)

杂项/内部

  • 恢复对 Pydantic 1 版本的兼容性 (#34081, #33998)

  • 为PyPI使用精简版的README.md (#33637)

  • 升级至 Pydantic 2 (#33956)

  • 重新组织Airflow的setup.py中的devel_only额外配置 (#33907)

  • FAB升级到4.3.4以修复过滤器问题 (#33931)

  • sqlalchemy to 1.4.24添加最低要求 (#33892)

  • 更新配置文件中的configs的version_added字段 (#33509)

  • OrderedDict 替换为普通字典 (#33508)

  • 整合 itertools 的导入和使用 (#33479)

  • 静态检查修复 (#33462)

  • 从datetime导入utc并规范化其导入方式 (#33450)

  • D401 支持 (#33352, #33339, #33337, #33336, #33335, #33333, #33338)

  • 修复一些缺失的类型提示 (#33334)

  • D205 支持 - 滞后任务 (#33301, #33298, #33297)

  • 重构:简化代码 (#33160, #33270, #33268, #33267, #33266, #33264, #33292, #33453, #33476, #33567, #33568, #33480, #33753, #33520, #33623)

  • 修复关于orm_mode重命名的Pydantic警告 (#33220)

  • 将MySQL 8.1添加到支持的版本中。(#33576)

  • 移除对版本小于2的Pydantic的限制 (#33507)

仅文档变更

  • 添加文档说明template_ext(以及如何重写它)(#33735)

  • 说明用户如何检查python代码是否为顶层代码 (#34006)

  • 明确说明DAG作者也可以在DAG文件处理器中运行代码 (#33920)

  • 修复模块管理页面中的损坏链接 (#33499)

  • 修复 secrets 后端文档 (#33471)

  • 修复 base_log_folder 的配置描述 (#33388)

Airflow 2.7.0 (2023-08-18)

重大变更

移除对Python 3.7的支持 (#30963)

截至目前,Python社区已不再支持Python 3.7版本。 因此,要使用Airflow 2.7.0,您必须确保Python版本为 3.8、3.9、3.10或3.11。

旧版图形视图已被移除 (#32958)

旧版图形视图已被移除。新版图形视图现在是默认视图。

如果在DAG中未定义参数,则Web界面中会跳过触发器UI表单 (#33351)

如果您正在使用dag_run.conf字典和网页用户界面的JSON输入来运行您的DAG,您应该:

“db init”、“db upgrade”命令以及“[database] load_default_connections”配置选项已被弃用(#33136)。

相反,您应该使用“airflow db migrate”命令来创建或升级数据库。此命令不会创建默认连接。 为了创建默认连接,您需要在运行“airflow db migrate”后显式地运行“airflow connections create-default-connections”。

对于SMTP SSL连接的情况,上下文现在使用“default”上下文 (#33070)

“default”上下文是Python的default_ssl_contest,而非之前使用的“none”。default_ssl_context在安全性和兼容性之间提供了平衡,但在某些情况下,当证书过期、自签名或配置错误时,可能无法正常工作。这可以通过在Airflow的“email”配置中设置“ssl_context”来进行配置。

将其设置为“none”会恢复Airflow 2.6及之前版本使用的“none”设置,但由于安全原因不建议这样做,因为此设置会禁用证书验证并允许中间人攻击。

禁用默认允许在UI、API和CLI中测试连接的功能(#32052)

出于安全考虑,Airflow UI、API和CLI默认禁用了测试连接功能。该功能的可用性可以通过Airflow配置(airflow.cfg)中core部分的test_connection标志来控制。也可以通过环境变量AIRFLOW__CORE__TEST_CONNECTION来控制。

该配置参数接受以下值: 1. Disabled: 禁用测试连接功能,并在用户界面中禁用"测试连接"按钮。

这也是Airflow配置中设置的默认值。 2. Enabled: 启用测试连接功能,并在用户界面中激活"测试连接"按钮。

3. Hidden: 禁用测试连接功能,并在用户界面中隐藏"测试连接"按钮。

For more information on capabilities of users, see the documentation: https://airflow.apache.org/docs/apache-airflow/stable/security/security_model.html#capabilities-of-authenticated-ui-users It is strongly advised to not enable the feature until you make sure that only highly trusted UI/API users have “edit connection” permissions.

xcomEntries API 默认禁用对 deserialize 标志的支持 (#32176)

出于安全考虑,/dags/*/dagRuns/*/taskInstances/*/xcomEntries/* API端点现已禁用deserialize选项来反序列化webserver中的任意 XCom值。为保持向后兼容性,服务器管理员可以设置 [api] enable_xcom_deserialize_support配置为True来启用该 标志并恢复向后兼容性。

然而,强烈建议不要启用该功能,改为在客户端执行反序列化操作。

默认Celery应用名称变更 (#32526)

Celery应用的默认名称已从airflow.executors.celery_executor更改为airflow.providers.celery.executors.celery_executor

You should change both your configuration and Health check command to use the new name:
  • 在配置中(celery部分的celery_app_name配置)使用airflow.providers.celery.executors.celery_executor

  • 在你的健康检查命令中使用 airflow.providers.celery.executors.celery_executor.app

scheduler.max_tis_per_query 的默认值从 512 更改为 16 (#32572)

这一变更预计将使调度器响应更加迅速。

scheduler.max_tis_per_query 需要设置为低于 core.parallelism。 如果之前两者都保持默认值,那么 scheduler.max_tis_per_query 的实际默认值为32 (因为它被限制在 core.parallelism 的值)。

为了尽可能保持与旧配置行为一致,可以设置scheduler.max_tis_per_query = 0, 这种情况下将始终使用core.parallelism的值。

部分执行器已迁移至对应的providers (#32767)

为了使用执行器,您需要安装提供者:

  • 对于Celery执行器,您需要安装apache-airflow-providers-celery包,版本需≥3.3.0

  • 对于Kubernetes执行器,您需要安装apache-airflow-providers-cncf-kubernetes包,版本需≥7.4.0

  • 对于Dask执行器,您需要安装apache-airflow-providers-daskexecutor包(任何版本均可)

你也可以通过分别安装带有[celery][cncf.kubernetes][daskexecutor]扩展的airflow来实现。

基于apache/airflow参考镜像(非精简版)构建镜像的用户不会受到影响——基础参考镜像已预装所有三个提供程序。

改进变更

仅PostgreSQL的改进:在taskinstance表上添加了索引 (#30762)

该索引在包含数千万行数据的配置中似乎具有显著的积极效果。

新功能

  • 为Airflow添加OpenTelemetry支持 (AIP-49)

  • 触发按钮 - 实现AIP-50的第二部分 (#31583)

  • 从核心Airflow中移除执行器耦合 (AIP-51)

  • 自动设置和拆卸任务 (AIP-52)

  • Airflow中的OpenLineage (AIP-53)

  • 实验性功能:在DAG解析时调用Variable和Connection时添加缓存 (#30259)

  • 启用资源池以考虑延迟任务 (#32709)

  • 允许为SMTP连接选择SSL上下文 (#33070)

  • 新增甘特图标签页 (#31806)

  • 从providers加载插件 (#32692)

  • 新增 BranchExternalPythonOperator (#32787, #33360)

  • 为提供者添加存储配置描述的选项 (#32629)

  • 引入心跳参数以支持Per-LocalTaskJob配置 (#32313)

  • 添加执行器发现和文档 (#32532)

  • 为作业状态常量添加JobState (#32549)

  • 添加配置以禁用 'deserialize' XCom API 标志 (#32176)

  • 通过自定义操作符名称在网页界面显示任务实例 (#31852)

  • 添加 default_deferrable 配置 (#31712)

  • 引入 AirflowClusterPolicySkipDag 异常 (#32013)

  • 使用 reactflow 处理数据集图形 (#31775)

  • 为命令任务运行添加从数据库加载dags的选项 (#32038)

  • 添加不需要匹配列表的chain版本 (#31927)

  • 在用户界面中使用operator_name替代task_type (#31662)

  • airflow db check添加--retry--retry-delay参数 (#31836)

  • 允许跳过任务状态 task_instance_schema.py (#31421)

  • 为celery result_backend引擎选项添加新配置 (#30426)

  • UI 添加集群活动页面 (#31123, #32446)

  • 为常用操作添加键盘快捷键 (#30950)

  • 向kubernetes执行器日志中添加更多信息 (#29929)

  • 添加支持配置自定义alembic文件 (#31415)

  • 在用户界面上为DAG添加运行中和失败状态标签页 (#30429)

  • 为触发器表单添加多选、提案和标签功能 (#31441)

  • 使webserver配置可自定义 (#29926)

  • 在网格视图中将DAGCode渲染为一个标签页 (#31113)

  • 添加REST端点以获取配置选项 (#31056)

  • 在获取配置的REST API中添加section查询参数 (#30936)

  • 创建指标以追踪Scheduled->Queued->Running任务状态转换时间(#30612)

  • 将任务组标记为成功/失败 (#30478)

  • 添加CLI命令以列出provider触发器信息 (#30822)

  • 为DAG添加快速失败功能 (#29406)

改进

  • 改进图形嵌套逻辑 (#33421)

  • 可配置的触发器健康检查阈值 (#33089, #33084)

  • 为批量任务实例API端点添加dag_run_ids和task_ids筛选功能 (#32705)

  • 确保在取消映射时填充DAG级别的引用 (#33083)

  • 在Trigger Form UI中添加对不同数据类型数组的支持 (#32734)

  • 始终显示甘特图和代码选项卡 (#33029)

  • 将监听器成功钩子移至SQLAlchemy提交之后 (#32988)

  • db upgrade 重命名为 db migrate 并添加 connections create-default-connections (#32810, #33136)

  • 移除旧的甘特图并重定向到网格视图的甘特图标签 (#32908)

  • 根据所选任务调整图形缩放比例 (#32792)

  • 在渲染模板后调用监听器on_task_instance_running (#32716)

  • 在图表视图的任务实例提示框中显示执行日期。(#32527)

  • 允许供应商提供配置 (#32604, #32755, #32812)

  • 减少每次查询的最大任务实例(TIs)默认值,强制<=并行度 (#32572)

  • 在Airflow配置对象中存储配置描述 (#32669)

  • 使用 isdisjoint 而非 not intersection (#32616)

  • 加速计算任务组的叶节点和根节点 (#32592)

  • Kubernetes Executor 加载时间优化 (#30727)

  • 如果DAG不可调度,则保存DAG解析时间 (#30911)

  • 更新健康检查端点以包含dag_processor状态。(#32382)

  • 禁用默认允许在UI、API和CLI中测试连接的功能 (#32052, #33342)

  • 修复调度器部分下的配置变量类型 (#32132)

  • 允许按字母顺序排序网格视图 (#32179)

  • 将主机名添加到触发器指标 [triggers.running] (#32050)

  • 改进DAG ORM清理代码 (#30614)

  • TriggerDagRunOperator: 将wait_for_completion添加到template_fields (#31122)

  • 在新标签页中打开链接,避免离开Airflow用户界面 (#32088)

  • 仅当未选择任务时显示代码选项卡 (#31744)

  • 为celery和dask证书配置添加描述 (#31822)

  • PythonVirtualenvOperator 告警中的终止日志 (#31747)

  • 将所有DAG详情迁移至现有网格视图的DAG详情面板 (#31690)

  • 添加图表以帮助可视化计时器指标 (#30650)

  • Celery Executor 加载时间优化 (#31001)

  • airflow db命令的代码风格更新为SQLAlchemy 2.0风格 (#31486)

  • Mark在FIPS环境中将md5的使用标记为"not-used-for-security" (#31171)

  • 为serde添加pydantic支持 (#31565)

  • 在DagRun和TaskInstance中启用备注列的搜索功能 (#31455)

  • 通过为dag_run添加新的索引思路来节省调度器执行时间 (#30827)

  • 通过缓存DAGs节省调度器执行时间 (#30704)

  • 支持在网页界面中按最后运行日期对DAG进行排序 (#31234)

  • 为Job和JobRunners改进类型定义 (#31240)

  • 添加按created_date排序的逻辑以获取触发器 (#31151)

  • 在访问控制文档中移除DAGs.can_create,调整测试夹具 (#30862)

  • 将Celery日志分割为标准输出/标准错误输出 (#30485)

  • 将指标客户端和验证器解耦到各自的模块中 (#30802)

  • get_log API中的分页功能添加了描述 (#30729)

  • 优化调度映射任务的性能 (#30372)

  • 添加Sentry传输配置选项 (#30419)

  • 反序列化错误时显示更友好的提示信息 (#30588)

Bug修复

  • 重置密码时移除用户会话 (#33347)

  • Gantt chart: 如果与DAG运行的开始/结束时间不同,则使用最早/最晚时间日期 (#33215)

  • 修复Python virtualenv操作符中对virtualenv的检测问题 (#33223)

  • 修复了在尝试对chmod airflow.cfg时出现问题的日志记录 (#33118)

  • 将应用上下文传递给webserver_config.py (#32759)

  • 跳过非运行任务尝试的服务日志 (#32561)

  • 修复重新加载gunicorn工作进程 (#32102)

  • 修复当max_active_runs达到上限时,由于竞态条件导致未来DagRun很少被触发的问题。(#31414)

  • 修复BaseOperator中的get_task_instances查询 (#33054)

  • 修复在日志中使用各种状态枚举值的问题 (#33065)

  • 使用字符串拼接为log_url前置基础URL (#33063)

  • 使用操作符样式属性更新图形节点 (#32822)

  • 将webserver访问拒绝警告设为可配置项 (#33022)

  • 仅当用户可编辑时才加载任务操作模态框 (#32992)

  • 修复OpenAPI规范中与$ref并行的nullable问题 (#32887)

  • 使PythonOperator子类的装饰器扩展其装饰器 (#32845)

  • 修复检查virtualenv是否安装在PythonVirtualenvOperator中的问题 (#32939)

  • 在检查is_container()中的__iter__之前解包Proxy (#32850)

  • 通过使用任务处理器的base_log_folder覆盖基础日志文件夹 (#32781)

  • 捕获run_job中的任意异常以防止僵尸调度器 (#32707)

  • 修复动态任务的depends_on_past功能 (#32397)

  • 对extra_links进行排序以确保UI中的顺序可预测。(#32762)

  • 修复前缀组错误图表 (#32764)

  • 修复dagruns的错误删除逻辑 (#32684)

  • 修复了prune_dict中的一个bug,该bug导致即使在严格模式下空字典和列表也会被移除 (#32573)

  • 添加显式浏览器列表并修正空白目标链接的rel属性 (#32633)

  • 修复了当multiple_outputs为True时Handle返回None的问题 (#32625)

  • 修复当ShortCircuitOperator条件为假且没有下游任务时的返回值 (#32623)

  • 修复当ShortCircuitOperator条件为假时返回的值 (#32569)

  • 修复 dagRunTimeout 的渲染问题 (#32565)

  • 修复/blocked端点的权限问题 (#32571)

  • Bug修复,防止在触发DAG时强制取消暂停 (#32456)

  • 修复cli.dags.trigger命令输出中的数据间隔问题 (#32548)

  • 去除airflow连接表单中的空白字符 (#32292)

  • 为传感器的适用参数添加timedelta支持 (#32515)

  • 修复了我们API中readonly属性的错误默认值 (#32510)

  • 将xcom的map_index添加为xcom端点的过滤器 (#32453)

  • 修复使用自定义时间表时的CLI命令问题 (#32118)

  • 在DagRun的列表视图中使用WebEncoder对DagRun.conf进行编码 (#32385)

  • 修复skip_all_except方法的逻辑 (#31153)

  • 确保动态任务组内的动态任务仅标记 (#32354)

  • 处理webserver.expose_config设置为non-sensitive-only而非布尔值的情况 (#32261)

  • 新增重试功能,用于处理因数据库网络问题导致的进程终止 (#31998)

  • 为 sla_miss_callback 适配 Notifier (#31887)

  • 修复XCOM视图 (#31807)

  • Fix for “Filter dags by tag” flickering on initial load of dags.html (#31578)

  • 修复了展开resizer时无法扩展网格视图的问题 (#31581)

  • 修复 MappedOperator-BaseOperator 属性同步检查 (#31520)

  • 始终传递命名的 type_ 参数给 drop_constraint (#31306)

  • 修复迁移中错误的 drop_constraint 调用 (#31302)

  • 解决重新设计的网格视图问题 (#31232)

  • 支持 requirepass redis哨兵 (#30352)

  • 修复调用获取 /config 时 webserver 崩溃的问题 (#31057)

杂项/内部

  • 修改pathspec版本限制 (#33349)

  • 重构:简化dag_processing中的代码 (#33161)

  • 目前将 Pydantic 限制在 < 2.0.0 版本 (#33235)

  • 重构:简化模型中的代码 (#33181)

  • 将elasticsearch组添加到2.7之前的默认配置中 (#33166)

  • 重构:简化airflow/cli中的字典操作 (#33159)

  • 移除冗余的dict.keys()调用 (#33158)

  • 在预提交中将ruff升级到最新的0.0.282版本 (#33152)

  • 将openlineage配置迁移至provider (#33124)

  • 在Airflow执行器中用TaskInstanceState替换State (#32627)

  • 移除Python 2的数字遗留问题 (#33050)

  • 移除遗留的dag代码 (#33058)

  • 移除遗留的任务实例模态框 (#33060)

  • 移除旧的图形视图 (#32958)

  • 将CeleryExecutor迁移到celery提供程序 (#32526, #32628)

  • 将所有k8S类迁移至cncf.kubernetes提供程序 (#32767, #32891)

  • 将存在检查的SQL重构为辅助函数 (#32790)

  • 将Dask执行器提取到新的daskexecutor提供程序 (#32772)

  • 移除atlas配置定义 (#32776)

  • 添加Redis任务处理器 (#31855)

  • 将webserver的配置写入移至主配置(webserver受限)(#32766)

  • 改进在Airflow API端点中获取查询计数的方法 (#32630)

  • 移除点击次数上限 (#32634)

  • 添加 D400 pydocstyle 检查 - 仅限核心 Airflow (#31297)

  • D205 支持 (#31742, #32575, #32213, #32212, #32591, #32449, #32450)

  • /airflow/www中的word-wrap从1.2.3 升级到 1.2.4 (#32680)

  • 对所有单状态枚举值进行强类型化 (#32537)

  • 更严格的类型状态转换 (#32521)

  • utils/db.py 中的 SQL 查询改进 (#32518)

  • /airflow/www 中的语义化版本从 6.3.0 升级至 6.3.1 (#32506)

  • 将jsonschema版本升级至4.18.0 (#32445)

  • stylelint13.13.1 升级至 15.10.1/airflow/www (#32435)

  • /airflow/www中的tough-cookie从4.0.0 升级到 4.1.3 (#32443)

  • 升级flask-appbuilder (#32054)

  • 支持 Pydantic 2 (#32366)

  • 在修复mypy问题之前限制点击 (#32413)

  • 一些小的清理工作 (#31890)

  • 将State用法替换为强类型的enums (#31735)

  • 将ruff升级至0.272 (#31966)

  • 在序列化没有名称的可调用对象时提供更好的错误消息 (#31778)

  • 稍微改进视图模块 (#31661)

  • 移除 asynctest (#31664)

  • 将sqlalchemy查询重构为2.0风格 (#31569, #31772, #32350, #32339, #32474, #32645)

  • 移除对Python 3.7的支持 (#30963)

  • 为预安装的providers恢复min-airflow-version (#31469)

  • 文档字符串改进 (#31375)

  • 改进 SchedulerJobRunner 中的类型提示 (#31285)

  • 将ruff升级至0.0.262 (#30809)

  • 升级到 MyPy 1.2.0 (#30687)

仅文档变更

  • 在安全模型中明确UI用户类型 (#33021)

  • 在templates-ref.rst中添加指向DAGRun / DAG / Task的链接 (#33013)

  • 添加关于如何测试DAG导入错误的文档 (#32811)

  • 清理我们的新安全页面 (#32951)

  • 清理Extras参考页面 (#32954)

  • 更新Dag触发API和命令文档 (#32696)

  • 向Airflow模块和类文档字符串添加弃用信息 (#32635)

  • 格式化安装文档以提高可读性 (#32502)

  • 修复triggerer高可用文档 (#32454)

  • 为代码示例添加类型注解 (#32422)

  • 记录cron和delta时间表 (#32392)

  • 更新index.rst文档以修正语法 (#32315)

  • 修复python.py中的小拼写错误 (#31474)

  • 分离并明确提供者的策略 (#30657)

  • 修复文档:在pip install前添加"apache"前缀 (#30681)

Airflow 2.6.3 (2023-07-10)

重大变更

run_id的默认允许模式已更改为^[A-Za-z0-9_.~:+-]+$ (#32293).

之前,对run_id字符串没有验证。现在可以通过在scheduler部分配置allowed_run_id_pattern来设置验证正则表达式。

Bug修复

  • 使用线性时间正则表达式 (#32303)

  • 修复触发器存活检查并新增触发器心跳频率配置项 (#32123)

  • 捕获触发初始化失败的异常 (#31999)

  • 在连接编辑表单中隐藏extra中的敏感值 (#32309)

  • 清理 DagRun.run_id 并允许灵活性 (#32293)

  • 添加触发器取消日志 (#31757)

  • 修复任务视图中显示的尝试次数 (#32361)

  • 对渲染字段偶尔出现的死锁进行事务重试 (#32341)

  • 修复 LazyDictWithCache 在导入失败时的行为 (#32248)

  • 从Job中移除executor_class - 修复自定义执行器的回填功能 (#32219)

  • 修复错误的单例实现 (#32218)

  • 使用 mapIndex 为每个映射任务显示额外链接。(#32154)

  • 确保主触发器线程在异步线程失败时退出 (#32092)

  • 使用 re2 来匹配不可信的正则表达式 (#32060)

  • 在渲染字段视图中渲染列表项 (#32042)

  • 修复序列化DAG中dag_dependencies的哈希问题 (#32037)

  • 如果XComArg在多输出任务中解析失败,则返回None (#32027)

  • 检查URL查询参数以及kwargs中的DAG ID (#32014)

  • 当找不到映射索引时,在rendered-templates中显示错误消息而不是失败 (#32011)

  • 修复当当前执行日期没有任务组TIs时ExternalTaskSensor的问题 (#32009)

  • Fix number param html type in trigger template (#31980, #31946)

  • 修复嵌套变量字段的掩码问题 (#31964)

  • 修复映射任务中operator_extra_links属性的序列化问题 (#31904)

  • 解码旧式嵌套的Xcom值 (#31866)

  • 在webserver的base_url中添加对尾部斜杠的检查 (#31833)

  • 修复当主机包含方案时连接URI解析的问题 (#31465)

  • 修复了使用xcom_pullinlets时的数据库会话关闭问题 (#31128)

  • 修复在测试DAG时任务失败未触发DAG的on_failure_callback回调函数的问题。(#30965)

  • 修复在使用ExternalPythonOperator和调试日志级别时的airflow模块版本检查问题 (#30367)

杂项/内部

  • 修复类型存根中的task.sensor注解 (#31954)

  • Pydantic 限制在 < 2.0.0 版本,直到我们解决 2.0.0 版本的兼容性问题 (#32312)

  • 修复 Pydantic 2 对模型定义的挑剔问题 (#32307)

仅文档变更

  • 添加关于标签创建和清理的说明 (#32406)

  • 文档的小幅更新 (#32369, #32315, #32310, #31794)

  • 澄清Listener API的行为 (#32269)

  • 为请求需求的用户添加信息 (#32262)

  • 在模板参考中添加指向DAGRun/DAG/Task的链接 (#32245)

  • 添加注释以警告潜在的错误修复 (#32230)

  • 添加说明:我们需要重启triggerer以反映任何触发器变更 (#32140)

  • 为教程文档添加缺失的超链接 (#32105)

  • 新增了可延迟操作符与不可延迟操作符之间的区别 (#31840)

  • 添加注释说明特殊“触发结束”日志消息的必要性 (#31812)

  • 关于插件更新的文档更新。(#31781)

  • 修复安全文档中的SemVer链接 (#32320)

  • 更新Airflow的安全模型 (#32098)

  • 更新对Airflow核心重构文档的引用 (#32282)

  • 分离出高级日志配置 (#32131)

  • 在Airflow的显著位置添加标记 (#31977)

Airflow 2.6.2 (2023-06-17)

重大变更

无重大变更。

Bug修复

  • TaskInstance到TaskMap表的级联更新 (#31445)

  • 修复Kubernetes执行器对已删除pod的检测 (#31274)

  • 为mssql的迁移方法使用关键字参数 (#31309)

  • 控制从airflow.cfg额外配置中驱动配置的许可性 (#31754)

  • 修复openapi/v1.yaml中的损坏链接 (#31619)

  • 在测试不同值的连接时隐藏旧警告框 (#31606)

  • 在OpenAPI规范中添加TriggererStatus (#31579)

  • 修复了当Details折叠时Grid无法展开的问题 (#31561)

  • 修复标签排序问题 (#31553)

  • 在跳过下游任务时,将缺失的map_index添加到xcom键中 (#31541)

  • 修复airflow users delete CLI命令 (#31539)

  • 在Airflow的/health端点中包含触发器健康状态 (#31529)

  • 移除此任务已注册依赖项的警告 (#31502)

  • 在删除pod时使用kube_client替代默认的CoreV1Api (#31477)

  • 确保基础传感器中的最小退避时间至少为1 (#31412)

  • 修复动态任务映射中的max_active_tis_per_dagrun参数 (#31406)

  • 修复DAG中预导入模块时的错误处理 (#31401)

  • 修复下拉菜单默认值并将教程调整为使用42作为默认证明值 (#31400)

  • 修复了当将运行任务从普通状态切换到映射状态时清除导致的崩溃问题 (#31352)

  • 将BaseJobRunner设为作业类的泛型 (#31287)

  • 修复 DAG 审计日志中的 url_for_asset 回退和 404 问题 (#31233)

  • 不要显示未定义的执行日期 (#31196)

  • 在日志加载时添加了旋转动画活动 (#31165)

  • 将rediss添加到支持的URL方案列表中 (#31028)

  • 通过跳过“不可调度”的DAG来优化调度器 (#30706)

  • 在搜索队列中的dag_runs时节省调度器执行时间 (#30699)

  • 修复ExternalTaskSensor以正确与任务组配合工作 (#30742)

  • 修复当清理access_control时DAG.access_control无法同步的问题 (#30340)

  • 修复在最新Python 3.8和3.9版本中失败的get_safe_url测试 (#31766)

  • 修复POST用户端点的类型问题 (#31767)

  • 修复嵌套组默认参数的错误更新 (#31776)

  • 修复嵌套任务组中覆盖default_args的问题 (#31608)

  • [secrets] backend_kwargs 标记为敏感配置 (#31788)

  • Executor 事件在此处并不总是"退出"状态 (#30859)

  • 验证连接ID (#31140)

杂项/内部

  • 新增对Python 3.11的支持 (#27264)

  • 将unicodecsv替换为标准csv库 (#31693)

  • 将unicodecsv重新作为Airflow的依赖项 (#31814)

  • 从 get_flat_relative_ids 中移除 found_descendents 参数 (#31559)

  • 修复外部任务触发器中的类型问题 (#31490)

  • 优化下一个和最后一次运行DAG列的表述 (#31467)

  • 使用 :meta private: 跳过自动文档功能 (#31380)

  • 为sql_alchemy_connect_args配置添加示例 (#31332)

  • 将dask上限绑定转换为排除项 (#31329)

  • 将FAB升级至4.3.1版本 (#31203)

  • 在airflow dags list-jobs命令行界面中为--state标志添加了metavar和choices参数,用于提示有效的状态参数。(#31308)

  • 仅对临时目录日志使用单行 (#31170)

  • 重新表述setup.py中的注释 (#31312)

  • 在日志记录中添加所有者的全名 (#30185)

  • 使连接ID验证在界面间保持一致 (#31282)

  • 对敏感配置项使用单一真实来源 (#31820)

仅文档变更

  • 为_read_remote_logs添加文档字符串和签名 (#31623)

  • 移除关于triggerer仅支持3.7+版本的说明 (#31483)

  • 修复版本支持信息 (#31468)

  • 为文档示例添加缺失的BashOperator导入 (#31436)

  • 修复由初始参数错误导致的task.branch错误 (#31265)

  • 更新回调文档(错误和上下文)(#31116)

  • 为非TaskFlow操作符添加动态任务映射的示例 (#29762)

  • 少量文档修复 - 链接、语法和措辞 (#31719)

  • 在更多位置添加关于将airflow添加到pip安装的描述 (#31448)

  • 修复docker构建文档中的表格格式问题 (#31472)

  • 更新约束安装的文档 (#31882)

Airflow 2.6.1 (2023-05-16)

重大变更

关于外部健康检查机制及使用Job类的说明 (#31277).

过去,SchedulerJob和其他*Job类曾被用于对Airflow组件执行外部健康检查。然而,这些是与Airflow数据库ORM相关的类。根据公共接口的约定,Airflow的数据库模型和结构被视为内部实现细节。

因此,它们不应被用于外部健康检查。相反,您应该使用airflow jobs check CLI命令(在Airflow 2.1中引入)来实现此目的。

Bug修复

  • 修复 SchedulerJob 的健康检查阈值计算问题 (#31277)

  • 修复k8s执行器pod日志尾部时间戳解析失败问题 (#31175)

  • 确保DAG处理器作业行在job_type列中填写了值 (#31182)

  • 修复了api_client_retry_configuration的章节名称引用 (#31174)

  • 确保KPO正确运行pod变异钩子 (#31173)

  • 移除OpenLineage插件中关于数据脱敏的警告日志信息 (#31149)

  • interleave_timestamp_parser配置移至日志记录部分 (#31102)

  • 确保在未找到本地或远程日志时检查工作节点是否有服务日志 (#31101)

  • 修复taskinstance文件中MappedTaskGroup的导入问题 (#31100)

  • 格式化 DagBag.dagbag_report() 的输出 (#31095)

  • 在任务详情视图中隐藏任务属性 (#31125)

  • 修复当迭代None值时的模板错误并修复参数文档 (#31078)

  • 修复 apache-hive 额外包使其安装正确的软件包 (#31068)

  • 修复在预导入Airflow模块时DAGs文件夹中zip文件的问题 (#31061)

  • 将TaskInstanceKey移动到单独的文件中以解决循环导入问题 (#31033, #31204)

  • 修复删除带有备注的DagRuns和TaskInstances的问题 (#30987)

  • 修复 airflow providers get 命令输出 (#30978)

  • 修复OpenAPI规范中的Pool模式 (#30973)

  • 增加对包含pandas.DataFrame模板字段的动态任务的支持 (#30943)

  • 如果有的话,使用显式传递给'partial'的任务组 (#30933)

  • 修复列表DAG REST API中的order_by请求 (#30926)

  • 在任务居中逻辑中包含节点高度/宽度 (#30924)

  • 从dag触发命令中移除打印 (#30921)

  • 在新版图中改进任务组用户界面 (#30918)

  • 修复网格视图中的映射状态 (#30916)

  • 修复图形显示问题 (#30765)

  • 修复当try_number不同步时出现的backfill KeyError问题 (#30653)

  • 在TaskInstance用户界面中重新启用清除和设置状态功能 (#30415)

  • 防止在清除运行中的DagRun任务时重置DagRun的state状态和start_date开始日期 (#30125)

杂项/内部

  • 在Dask解决其测试套件中的副作用问题之前,暂时限制其版本上限 (#31259)

  • 在表格中显示受清除影响的任务实例 (#30633)

  • 修复API文档中缺失的模型 (#31021)

仅文档变更

  • 改进关于dag_processing.processes指标的描述 (#30891)

  • 改进快速入门指南 (#30820)

  • 在FAQ中添加关于缺失任务日志的部分 (#30717)

  • 在docker compose中挂载config目录 (#30662)

  • 更新 version_added 配置字段,针对 might_contain_dagmetrics_allow_list (#30969)

Airflow 2.6.0 (2023-04-30)

重大变更

文件任务处理器日志目录和文件的默认权限已更改为"所有者+组"可写 (#29506)。

默认设置处理需要模拟且两个用户(airflow和被模拟用户)拥有相同主组的情况。之前的默认设置也是其他用户可写,用户可以通过在logging部分配置file_task_handler_new_folder_permissionsfile_task_handler_new_file_permissions来选择使用其他用户可写设置。

SLA回调不再向DAG处理器管理器的队列添加文件 (#30076)

这可以防止SLA回调持续占用DAG处理器管理器的资源。这意味着CPU使用率降低,并解决了SLA阻止系统检测现有DAG文件更改的问题。新增了额外指标来帮助跟踪队列状态。

BaseTrigger中的cleanup()方法现在被定义为异步方法(遵循async/await模式)(#30152)。

对于任何自定义触发器实现来说,这都可能是一个破坏性变更,特别是那些重写了cleanup() 方法并使用同步代码的实现。然而从技术上讲,在清理操作中使用同步操作本来就是错误的, 因为该方法是在触发器主循环中执行的,会引入不必要的延迟从而影响其他触发器。这个变更不太可能影响现有的触发器实现。

仪表盘 scheduler.tasks.running 已不再存在 (#30374)

该仪表从未正常工作,其值始终为0。获取此指标的准确值非常复杂,因此决定移除该仪表比修复它更有意义,因为无法确保其值的正确性。

整合处理任务在新配置task_queued_timeout下卡在队列中的情况 (#30375)

处理处于排队状态任务的逻辑已统一整合,所有负责对卡在排队状态任务进行超时处理的配置项已被弃用,并合并至[scheduler] task_queued_timeout。被弃用的配置项包括[kubernetes] worker_pods_pending_timeout[celery] stalled_task_timeout[celery] task_adoption_timeout。若设置了这些配置项中的任意一个,系统将采用最长的超时时间。例如,若[celery] stalled_task_timeout设为1200,而[scheduler] task_queued_timeout设为600,Airflow会将[scheduler] task_queued_timeout调整为1200。

改进变更

在配置视图中仅显示运行中的配置 (#28892)

配置视图现在仅显示运行中的配置。之前会在顶部显示默认配置,但不明确该默认配置是否已被覆盖。因此,未在文档中记录的端点/configuration?raw=true已被弃用,并将在Airflow 3.0中移除。HTTP响应现在会额外返回一个Deprecation头部。REST API上的/config端点是编程方式获取Airflow配置的标准方法。

ExternalTaskSensor显式跳过状态列表 (#29933)

ExternalTaskSensor现在有一个明确的skipped_states列表

其他变更

处理next_run_calculation中指数退避时的OverflowError错误 (#28172)

默认情况下,最大任务重试延迟设置为24小时(86400秒)。您可以通过core.max_task_retry_delay参数全局修改此设置。

将Hive宏迁移到provider (#28538)

Hive宏命令(hive.max_partition, hive.closest_ds_partition)仅在安装Hive Provider时可用。使用这些宏时请安装Hive Provider > 5.1.0版本。

更新应用以支持为FIPS v2配置缓存哈希方法 (#30675)

针对在Python 3.9+环境中运行Airflow时的FIPS合规性进行了多项更新。这包括新增了一个webserver选项caching_hash_method,用于更改默认的flask缓存方法。

新功能

  • AIP-50 带灵活用户表单概念的Trigger DAG UI扩展 (#27063,#29376)

  • 当PythonVirtualenvOperator任务返回指定退出代码时跳过该任务 (#30690)

  • 将 skip_exit_code 重命名为 skip_on_exit_code 并允许提供多个代码 (#30692)

  • 在ExternalPythonOperator中也添加skip_on_exit_code (#30738)

  • 为动态任务映射添加 max_active_tis_per_dagrun 参数 (#29094)

  • 为pandas dataframe添加序列化器 (#30390)

  • 可延迟的 TriggerDagRunOperator (#30292)

  • 添加通过CLI获取DAG详情的命令 (#30432)

  • 添加ContinuousTimetable并支持@continuous schedule_interval (#29909)

  • 允许自定义规则来检查文件是否包含dag (#30104)

  • 新增一个Airflow配置项,用于指定Kubernetes客户端的SSL CA证书 (#30048)

  • Bash传感器具有显式的重试代码(#30080)

  • 在网格视图中添加上游/下游过滤器任务 (#29885)

  • 新增通过Airflow CLI测试连接的功能 (#29892)

  • 支持在使用远程日志记录时删除本地日志文件 (#29772)

  • Blocklist 用于禁用特定的指标标签或指标名称 (#29881)

  • 在网格视图中添加新图表 (#29413)

  • 添加数据库 check_migrations 配置 (#29714)

  • cli.dags.trigger添加输出格式参数 (#29224)

  • 使json和yaml在模板中可用 (#28930)

  • 为现有的Statsd指标发布事件启用带标签的指标名称 | 支持influxdb-statsd (#29093)

  • db export-archived命令添加--yes参数。(#29485)

  • 使策略函数可插拔 (#28558)

  • 新增 airflow db drop-archived 命令 (#29309)

  • 启用单个触发器日志记录 (#27758)

  • 在图表视图中实现新的筛选选项 (#29226)

  • 为ExternalTask添加触发器 (#29313)

  • 添加将清除的记录导出为CSV文件的命令 (#29058)

  • 添加 FileTrigger (#29265)

  • 使用元数据标签发送DataDog statsd指标 (#28961)

  • 为数据集添加一些statsd指标 (#28907)

  • connections import CLI命令添加–overwrite选项 (#28738)

  • 向DAG添加通用"通知器"概念 (#28569)

  • 新增一个配置项,用于在跳过任务前等待过去依赖项 (#27710)

  • 添加 Flink on K8s Operator (#28512)

  • 允许用户通过配置禁用SwaggerUI (#28354)

  • 在图中显示映射的任务组 (#28392)

  • Log FileTaskHandler 支持 KubernetesExecutor 的多命名空间模式 (#28436)

  • 新增一个配置项用于适配掩码机密信息,以便更轻松地防止日志中的机密信息泄露 (#28239)

  • 使用命令行界面列出特定配置节及其值 (#28334)

  • KubernetesExecutor 的多命名空间模式可以使用命名空间列表来避免需要集群角色 (#28047)

  • 自动保存并允许恢复最近的DAG运行配置 (#27805)

  • 在cli中添加了exclude_microseconds参数 (#27640)

改进

  • 在KubernetesExecutor中将大部分pod_id的使用重命名为pod_name (#29147)

  • 更新了关于无效使用仅poke类型传感器的错误提示信息 (#30821)

  • 在调度器关键部分边缘情况下更新日志级别 (#30694)

  • AIP-51 从核心Airflow中移除执行器耦合 (AIP-51)

  • 在BashOperator的跳过逻辑中添加多退出码处理 (#30739)

  • 更新应用程序以支持为FIPS v2配置缓存哈希方法 (#30675)

  • 在DAG解析前预加载airflow导入以节省时间 (#30495)

  • 改进网格视图中的任务和运行操作用户体验 (#30373)

  • 通过group_id的缓存属性加速TaskGroups (#30284)

  • 使用会话中提供的引擎 (#29804)

  • 针对执行器的类型相关导入优化 (#30361)

  • 为代码库添加更多类型提示 (#30503)

  • 在安全管理器中始终使用self.appbuilder.get_session (#30233)

  • 将SQLAlchemy的select()更新为新样式 (#30515)

  • 从模型中重构出xcom常量 (#30180)

  • 将异常类名称添加到DAG解析错误消息中 (#30105)

  • 将statsd_allow_list和statsd_block_list重命名为metrics_*_list (#30174)

  • 改进元组和集合的序列化 (#29019)

  • 将触发器中的清理方法改为异步方式 (#30152)

  • 延迟加载序列化模块 (#30094)

  • SLA回调不再向dag_processing管理器队列添加文件 (#30076)

  • 向grid_data添加任务触发规则 (#30130)

  • 通过避免ORM加速日志模板同步 (#30119)

  • 将cli_parser.py拆分为两个模块 (#29962)

  • 为ExternalTaskSensor显式跳过状态列表 (#29933)

  • 在新版图表中添加任务状态悬停高亮功能 (#30100)

  • 将网格标签存储在URL参数中 (#29904)

  • 使用自定义Connexion解析器实现懒加载 (#29992)

  • 在密钥掩码器中延迟Kubernetes导入 (#29993)

  • 延迟ConnectionModelView初始化直到被访问 (#29946)

  • 调度器,将过时DAG停用阈值设为可配置项,而非使用DAG处理超时时间 (#29446)

  • 改进网格视图高度计算 (#29563)

  • 避免在配置验证期间导入执行器 (#29569)

  • 使FileTaskHandler的权限可组写入并可配置 (#29506)

  • 在Airflow CLI命令的帮助输出中添加颜色 #28789 (#29116)

  • 为get_dags端点添加参数,仅列出未暂停的dags (#28713)

  • 为DAG运行和任务实例端点暴露updated_at过滤器 (#28636)

  • 增加用户标识符列的长度 (#29061)

  • 更新甘特图界面以显示任务的排队状态 (#28686)

  • 在log.dttm上添加索引 (#28944)

  • 在配置视图中仅显示运行中的配置 (#28892)

  • 动态限制下拉菜单大小 (#28736)

  • 在连接编辑/添加界面的extra字段中增加了JSON语法检查功能。在连接编辑页面,现有的extra数据将以缩进格式显示 (#28583)

  • 在k8s exec中使用标签而非pod名称来读取pod日志 (#28546)

  • 对排队中和运行中的重新检查使用时间而非尝试次数。(#28586)

  • CustomTTYColoredFormatter 应继承 TimezoneAware 格式化器 (#28439)

  • 改进Airflow CLI中tasks.run命令对历史依赖项的处理 (#28113)

  • 支持在on_*_callback/sla_miss_callbacks中使用回调函数列表 (#28469)

  • 针对数据库清理的更好表名验证 (#28246)

  • 在config.yml配置模板中使用对象而非数组 (#28417)

  • 为任务备注添加Markdown渲染功能。(#28245)

  • 在网格视图中显示映射任务组 (#28208)

  • 在配置部分添加 renamedprevious_name (#28324)

  • 加速大多数用户/角色CLI命令 (#28259)

  • 加速Airflow角色列表命令 (#28244)

  • 重构序列化 (#28067, #30819, #30823)

  • 允许k8s执行器/KPO使用更长的pod名称 (#27736)

  • 更新健康检查端点以包含triggerer状态 (#27755)

Bug修复

  • 修复cli应用的static_folder (#30952)

  • 为cli appbuilder初始化插件 (#30934)

  • 修复DAG文件处理器心跳仅在必要时运行 (#30899)

  • 修复KubernetesExecutor向调度器发送状态的问题 (#30872)

  • 仅在所有上游映射完成时计数 (#30641)

  • ExternalTaskSensor:将external_task_group_id添加到template_fields (#30401)

  • 改进任务实例详情的URL检测功能 (#30779)

  • 使用Material图标显示DAG导入错误横幅 (#30771)

  • 修复杂项网格/图表视图UI错误 (#30752)

  • 添加一个折叠网格按钮 (#30711)

  • 修复d3依赖项 (#30702)

  • 简化逻辑以解决任务因stalled_task_timeout而卡在队列中的问题 (#30375)

  • 在清理任务实例时,尝试从数据库获取关联的DAGs (#29065)

  • 修复当提供DAG默认参数时映射任务的部分参数问题 (#29913)

  • 停用从zip文件中删除的DAGs (#30608)

  • 通过获取最新的resource_versiontoo old resource version exception中恢复 (#30425)

  • 修复刷新DAG时可能出现的竞态条件 (#30392)

  • 为OpenAPI请求体使用自定义验证器 (#30596)

  • 修复带有可延迟参数的TriggerDagRunOperator (#30406)

  • 加速DAG运行删除 (#30330)

  • Do not use template literals to construct html elements (#30447)

  • 修复example_sensor_decorator DAG中的弃用警告 (#30513)

  • 避免在触发器作业日志中记录敏感信息 (#30110)

  • 为基础传感器添加一个新参数,用于捕获poke方法中的异常 (#30293)

  • 修复了非JSON可序列化值的DAG运行配置编码问题 (#28777)

  • 添加了修复以使Airflow可在Windows Dask-Worker上使用 (#30249)

  • 强制将DAG最后修改时间设为UTC (#30243)

  • 修复示例DAG中的EmptySkipOperator (#30269)

  • 使webserver启动时遵循update_fab_perms (#30246)

  • 修改日志文件夹权限时忽略错误 (#30123)

  • 禁用按注释排序 DagRuns (#30043)

  • 修复从已完成的KubernetesExecutor工作pod读取日志的问题 (#28817)

  • 在比较文件模式时屏蔽非访问位 (#29886)

  • 从用户界面移除"运行任务"操作 (#29706)

  • 修复旧版日志视图的日志追踪问题 (#29496)

  • 修复了DebugExecutor处理传感器的方式 (#28528)

  • 确保在记录pod名称之前调用pod_mutation_hook (#28534)

  • 修复了在next_run_calculation中使用指数退避时出现的OverflowError问题 (#28172)

杂项/内部

  • 将eager升级的额外依赖项设为可选 (#30811)

  • 升级到 pip 23.1.1 (#30808)

  • 移除protobuf在eager升级中的限制 (#30182)

  • 移除protobuf对强制升级的限制 (#30182)

  • 弃用 BashOperator 中的 skip_exit_code 参数 (#30734)

  • 移除指标 scheduler.tasks.running (#30374)

  • /airflow/www中的json5升级至1.0.2版本,eslint-plugin-import升级至2.27.5版本 (#30568)

  • 为PythonOperator添加测试 (#30362)

  • 将asgiref添加为核心依赖项 (#30527)

  • 发现安全模式切换注释说明 (#30459)

  • 升级 moment-timezone 包以修复德黑兰时区问题 (#30455)

  • /airflow/www中的loader-utils从2.0.0升级到2.0.4 (#30319)

  • /airflow/www中的babel-loader从8.1.0升级到9.1.0 (#30316)

  • DagBag: 在异常消息中使用 dag.fileloc 替代 dag.full_filepath (#30610)

  • 更改序列化信息的日志级别 (#30239)

  • 次要的DagRun辅助方法清理 (#30092)

  • 改进 stats.py 中的类型提示 (#30024)

  • importlib-metadata 后向移植版本限制为 < 5.0.0 (#29924)

  • 将cncf提供者文件名与AIP-21对齐 (#29905)

  • 将FAB升级至4.3.0版本 (#29766)

  • 在测试中清除ExecutorLoader缓存 (#29849)

  • 在用户界面中延迟加载任务实例日志 (#29827)

  • 添加了超过最大页面限制API调用的警告日志 (#29788)

  • 在进程中积极缓存入口点 (#29625)

  • 不要使用 importlib.metadata 来获取版本以提高速度 (#29723)

  • 将Mypy升级到1.0版本 (#29468)

  • db export-cleaned 重命名为 db export-archived (#29450)

  • 监听器:通过直接调用替换SQLAlchemy事件监听来简化API (#29289)

  • 修复了bash环境变量日志条目不换行的问题 (#28881)

  • 切换至ruff以进行更快的静态检查 (#28893)

  • 移除TI日志中的水平线 (#28876)

  • 使allowed_deserialization_classes更加直观 (#28829)

  • 当在k8s执行器pod中运行时将日志传播到标准输出 (#28440, #30860)

  • 修复代码可读性问题,为json_client添加文档字符串 (#28619)

  • AIP-51 - 其他兼容性检查 (#28375)

  • 修复LocalKubernetesExecutor中的is_local问题 (#28288)

  • 将Hive宏移动到provider (#28538)

  • 重新运行不稳定的PinotDB集成测试 (#28562)

  • 添加pre-commit钩子来检查会话默认值 (#28007)

  • 为Web界面重构get_mapped_group_summaries (#28374)

  • 添加对k8s 1.26的支持 (#28320)

  • freezegun 替换为 time-machine (#28193)

  • 已完成 airflow/kubernetes/* 的 D400 任务 (#28212)

  • 为多个文件夹完成了D400 (#27969)

  • 移除对k8s 1.21和1.22版本的支持 (#28168)

  • 从k8s调度器类中移除未使用的task_queue属性 (#28049)

  • 为多个文件夹完成了D400 (#27767, #27768)

仅文档变更

  • 添加关于如何避免意外升级/降级airflow的说明 (#30813)

  • 添加关于如何编写任务日志的明确信息 (#30732)

  • 更好地解释如何从任务中记录日志 (#30746)

  • 为 Dataset 使用正确的导入路径 (#30617)

  • 创建 audit_logs.rst (#30405)

  • 为传感器添加taskflow API示例 (#30344)

  • 添加关于时区感知DAG的说明 (#30467)

  • 明确参数文档 (#30345)

  • 修复任务持续时间指标的计量单位 (#30273)

  • 更新 dag-run.rst 中关于 CLI 命令的死链 (#30254)

  • 在"减少DAG复杂度"部分新增编写高效Python代码章节 (#30158)

  • 允许通过*_lookup_pattern参数指定在后端查找哪个连接、变量或配置 (#29580)

  • 为通知功能扩展添加文档 (#29191)

  • 明确说明执行器接口是公开的,但实例不是 (#29200)

  • 将公共接口描述添加到Airflow文档中 (#28300)

  • 为任务组映射添加文档 (#28001)

  • 对指标文档的一些修复 (#30290)

Airflow 2.5.3 (2023-04-01)

重大变更

无重大变更。

Bug修复

  • 修复独立DAG处理器的DagProcessorJob集成问题 (#30278)

  • 修复gunicorn挂起时的正确终止问题 (#30188)

  • 修复 XCom.get_one 中仅出现一次的异常文本 (#30183)

  • 将VARCHAR大小修正为250。(#30178)

  • 恢复针对任务接收SIGTERM信号时on_failure_callback的修复 (#30165)

  • 将只读属性移至DagState以修复生成文档 (#30149)

  • 确保 dag.partial_subset 不会改变任务组属性 (#30129)

  • 修复airflow dags next-execution命令行命令返回值不一致的问题(#30117)

  • 修复 www/utils.dag_run_link 重定向问题 (#30098)

  • 修复当映射任务计数为0时的TriggerRuleDep问题 (#30084)

  • DAG处理器管理器,将retry_db_transaction添加到_fetch_callbacks (#30079)

  • 修复针对MySQL数据库的db clean命令 (#29999)

  • 避免在迷你调度器中考虑EmptyOperator (#29979)

  • 修复一些长期存在的Graph View界面问题 (#29971, #30355, #30360)

  • 修复DAG文档切换图标的初始角度 (#29970)

  • 修复DAGs界面中的标签选择问题 (#29944)

  • 在MANIFEST.in中包含airflow/example_dags/sql/sample.sql (#29883)

  • 修复 /taskinstance/list 视图中的过滤器问题 (#29850)

  • 允许通用的参数字典 (#29782)

  • 修复变量路由中的update_mask补丁问题 (#29711)

  • 如果 instance_name_has_markup = True,则从 app_name 中去除标记 (#28894)

杂项/内部

  • 回退"Also limit importlib on Python 3.9 (#30069)" (#30209)

  • 为@task.sensor任务添加custom_operator_name参数 (#30131)

  • 将/airflow/www中的webpack从5.73.0升级到5.76.0 (#30112)

  • 格式化配置 (#30103)

  • 移除astroid的上限限制 (#30033)

  • 移除意外合并的供应商守护进程补丁代码 (#29895)

  • 修复了airflow tasks test命令中关于缺少data_interval的警告 (#27106)

仅文档变更

  • 添加关于顶层代码的更多信息 (#30040)

  • 更新工作日示例 (#30026)

  • 修复DAGs文档中的一些拼写错误 (#30015)

  • 更新 set-up-database.rst (#29991)

  • 修复Kubernetes文档中的一些拼写错误 (#29936)

  • 修复部分标点符号和语法问题 (#29342)

Airflow 2.5.2 (2023-03-15)

重大变更

作为API参数或Params传递的日期时间字段应符合RFC3339标准 (#29395)

在API调用情况下,日期时间字段中传递的"+"可能未被URL编码,这些日期时间字段可能通过验证。现在这类日期时间参数应当进行URL编码(如%2B)。

对于参数,我们仍然允许符合IS8601标准的日期时间格式(例如可能使用空格而非T来分隔日期和时间,且未指定时区),但会发出弃用警告。

[webserver] expose_hostname 的默认值更改为 False (#29547)

[webserver] expose_hostname 的默认值已设置为 False,而不是 True。这意味着管理员必须选择是否向最终用户公开webserver主机名。

Bug修复

  • 修复API和参数模式中日期时间字段的验证问题 (#29395)

  • 修复大型日志的网格日志显示问题 (#29390)

  • 修复任务收到SIGTERM信号时on_failure_callback的回调问题 (#29743)

  • 更新python-daemon的最低版本以修复containerd文件限制 (#29916)

  • 如果DAG未激活,POST /dagRuns API应返回404 (#29860)

  • 切换页面时DAG列表排序丢失 (#29756)

  • 修复当清除一个之前是普通任务而现在是被映射任务的先前运行时,调度器崩溃的问题 (#29645)

  • 将带有时区的时间转换为UTC时间,而不是抛出异常 (#29606)

  • 通过添加额外的返回类型修复清除DAG运行的openapi规范响应 (#29600)

  • 在任务实例详情页面不显示空的渲染属性 (#29545)

  • 从get-value命令中移除section检查 (#29541)

  • 对于未认证用户,不在UI回溯中显示版本/节点信息 (#29501)

  • 使prev_logical_date变量具有时区意识 (#29454)

  • 修复映射操作器中嵌套字段的渲染问题 (#29451)

  • 数据集(Datasets)、下次运行数据集(next_run_datasets),移除不必要的时间戳过滤器 (#29441)

  • Edgemodifier 在TaskGroup边界情况下使用标签进行重构 (#29410)

  • 修复Rest API更新用户输出 (#29409)

  • 确保删除序列化的DAG (#29407)

  • 如果明确设置,在TaskFlow API中持久化DAG和任务文档值 (#29399)

  • 重定向到包含所有参数的原始页面 (#29212)

  • 修复仅手动运行DAG时的任务持续时间视图 (#22015) (#29195)

  • 移除poke方法以回退到父类实现 (#29146)

  • PR: 引入了在Windows系统上运行任务的修复 (#29107)

  • 修复迁移过程中关于旧配置的警告。(#29092)

  • 当超时时发出dagrun失败持续时间 (#29076)

  • 处理集群策略本身的错误 (#29056)

  • 修复REST API的kerberos认证问题。(#29054)

  • 修复通过V1EnvVar在异常情况下泄露敏感字段的问题 (#29016)

  • 在传递url_for参数之前对其进行清理 (#29039)

  • 修复带有注释的DAG运行触发器。(#29228)

  • 当通过API触发DAG运行时将操作日志写入数据库 (#28998)

  • 解析pickled XCom迭代器中的所有变量 (#28982)

  • 允许在airflow connections add中使用无授权和主机块的URI (#28922)

  • 在使用KubernetesExecutor时更谨慎地选择pod (#28899)

  • KubenetesExecutor 即使在成功时也会发送状态 (#28871)

  • 为不删除的KubernetesExecutor pods添加注释 (#28844)

  • 限制流式日志读取速率 (#28818)

  • 引入DAG处理器任务 (#28799)

  • 修复 #28391 从用户界面手动触发任务在k8s执行器中失败的问题 (#28394)

  • 当外部DAG不为空且task_id和task_ids为空时记录poke信息 (#28097)

  • 修复检查DAG编辑权限时的不一致问题 (#20346)

杂项/内部

  • 添加对不可模板化字段的检查 (#29821)

  • 移除了不在(#29791)中的continue

  • 在网格视图中调整额外链接的位置 (#29703)

  • undici5.9.1 升级到 5.19.1 (#29583)

  • 将 expose_hostname 默认值改为 false (#29547)

  • 修改由airflow创建的config/password文件的权限 (#29495)

  • 使用较新的setuptools v67.2.0 (#29465)

  • 增加网格视图元素的最大高度 (#29367)

  • 澄清关于worker控制配置的描述 (#29247)

  • /airflow/www中的ua-parser-js0.7.31升级到0.7.33 (#29172)

  • 移除对 pytest 的上限限制 (#29086)

  • 在链接到graph/gantt视图时检查run_id url参数 (#29066)

  • 优化图表视图中动态任务标签的显示 (#29042)

  • 修复数据集导入错误 (#29007)

  • 更新PythonSensor如何从python_callable返回值 (#28932)

  • 为依赖上下文描述添加更清晰的日志信息 (#28875)

  • swagger-ui-dist3.52.0升级到4.1.3/airflow/www目录中 (#28824)

  • importlib-metadata 的向后移植版本限制为 < 5.0.0 (#29924, #30069)

仅文档变更

  • 更新 pipeline.rst - 修复 merge_data() 任务中的查询 (#29158)

  • 修正了timetable.rst中Workday时间表的参数名称 (#29896)

  • 更新连接操作文档中环境变量链接的引用锚点 (#29816)

  • 优化了API中limit参数的描述 (#29773)

  • dag_processing.last_duration的描述 (#29740)

  • 更新文档:关于template_fields类型和子类 (#29725)

  • 修复TaskFlow概念中Dataset入口/出口注释的格式问题 (#29678)

  • 特定用例:通过compose中的requirements.txt添加包 (#29598)

  • 检测是否存在 'docker-compose' (#29544)

  • 在UI文档中添加着陆时间条目 (#29511)

  • 改进示例docker-compose中的健康检查并明确用法 (#29408)

  • 从TriggerDagRunOperator文档字符串中移除notes参数 (#29298)

  • 在时间表文档中使用schedule参数而非timetable (#29255)

  • 向Airflow Docker文档添加触发流程 (#29203)

  • 更新 set-up-database.rst 文档 (#29104)

  • 对Params文档的多项改进 (#29062)

  • 邮件配置文档中更明确的环境变量示例 (#28845)

  • 新增了监听器插件示例 (#27905)

Airflow 2.5.1 (2023-01-20)

重大变更

通过环境变量触发gevent monkeypatching (#28283)

如果您在webserver部署中使用gevent,并使用了本地设置来monkeypatch gevent, 您可能希望用_AIRFLOW_PATCH_GEVENT环境变量替换本地设置补丁, 在webserver中将其设置为1。这样可以确保gevent补丁尽可能早地完成。

Bug修复

  • 修复非敏感环境变量的掩码问题 (#28802)

  • 从connexion中移除swagger-ui额外内容并通过npm包安装swagger-ui-dist (#28788)

  • 修复当AUTH_ROLE_PUBLIC设置时UIAlert的should_show问题 (#28781)

  • 采用pod时仅修补单个标签 (#28776)

  • 更新CSRF令牌使其随会话过期 (#28730)

  • 修复针对映射任务实例的“airflow tasks render”命令行命令 (#28698)

  • 允许在ExternalTaskSensor的external_task_ids中使用XComArgs (#28692)

  • 在映射任务扩展期间移除行锁事务隔离级别 (#28689)

  • 在Executor清理中处理ConnectionReset异常 (#28685)

  • 修复gunicorn访问日志输出重定向的描述 (#28672)

  • 重新添加在#28198中被删除的僵尸查询连接 (#28544)

  • 修复 CronTriggerTimeTable DAGs 的日历视图 (#28411)

  • 运行DAG后,employees表为空。(#28353)

  • 修复在Dag解析过程中查找僵尸任务时出现的DetachedInstanceError错误 (#28198)

  • Nest header blocks in divs to fix dagid copy nit on dag.html (#28643)

  • 修复UI插入符号方向问题 (#28624)

  • 在触发规则依赖中保护尚未展开的任务实例 (#28592)

  • 将OpenAPI中TI的setNote端点移至TaskInstance下 (#28566)

  • CronTriggerTimetable中考虑之前的运行 (#28532)

  • 确保文件任务处理器中的日志目录正确 (#28477)

  • 修复执行器配置中错误序列化的pod (#28454)

  • 在触发DAG运行的API中添加ensure_ascii=False (#28451)

  • 为MappedOperator添加on_*_callbacks的setter方法 (#28313)

  • 修复延迟任务和待重新调度任务的ti._try_number (#26993)

  • callModal从dag.js中分离出来 (#28410)

  • 手动运行不能看起来像计划运行 (#28397)

  • 当没有start_date时不显示任务/运行时长 (#28395)

  • 在任务日志中保持手动滚动位置 (#28386)

  • 正确选择映射任务的"前一个"任务 (#28379)

  • 通过环境变量触发gevent monkeypatching (#28283)

  • 修复数据库清理警告 (#28243)

  • 将参数 'offset' 和 'length' 设为非必填项 (#28234)

  • 使实时日志读取功能适用于"其他"k8s执行器 (#28213)

  • LazyXComAccess添加自定义pickling钩子 (#28191)

  • 修复下次运行数据集错误 (#28165)

  • 确保在dag文件中报告来自@dag装饰器的警告 (#28153)

  • 使用airflow dags测试命令时不发出警告 (#28138)

  • 确保删除文件时dagbag_size指标下降 (#28135)

  • 改进运行/任务网格视图操作 (#28130)

  • 使BaseJob.most_recent_job优先选择"运行中"的任务 (#28119)

  • 当代码未调用旧键时不发出FutureWarning警告(#28109)

  • 在compose中添加airflow.api.auth.backend.session到后端会话中 (#28094)

  • 修复关于在移动项上调用conf.get的误报警告 (#28075)

  • 返回将被更改的任务列表 (#28066)

  • 在解析DAGs时优雅处理损坏的zip文件。(#28011)

  • 防止从本地路径重复加载providers (#27988)

  • 修复链式多个空映射任务时的死锁问题 (#27964)

  • 修复:TaskInstance上的current_state方法未按map_index过滤 (#27898)

  • 如果数据库未初始化则不记录CLI操作 (#27851)

  • 确保我们能够从错误的调度程序状态中恢复 (#27834)

  • dagrun, next_dagruns_to_examine, 添加MySQL索引提示 (#27821)

  • 处理在DAG验证过程中DAG中途消失的问题 (#27720)

  • 修复:继续检查SLA (#26968)

  • 允许在没有连接类型时生成连接URI (#26765)

杂项/内部

  • 在eventlet修复后移除对dnspython的限制 (#29004)

  • 在解决eventlet不兼容问题之前,将dnspython限制在< 2.3.0版本 (#28962)

  • 在示例DAG索引中添加自动版本替换功能 (#28090)

  • 使用插件示例进行清理和日常维护 (#28537)

  • SQLAlchemy限制在2.0以下版本 (#28725)

  • /airflow/www中的json51.0.1升级到1.0.2 (#28715)

  • 修复了一些关于在任务流中使用传感器的文档 (#28708)

  • 将Architecture和OperatingSystem类改为Enums (#28627)

  • 为邮件工具添加文档字符串和小改进 (#28634)

  • 修复 Connection.get_extra 类型 (#28594)

  • 导航栏,限制下拉菜单大小,并添加滚动条 (#28561)

  • 从正确的源位置为conf.get*发出警告 (#28543)

  • 将我们的MyPY插件移动到dev文件夹 (#28498)

  • purge_inactive_dag_warnings添加重试功能 (#28481)

  • 在ARM架构上重新启用Plyvel,因为它现在可以干净地构建 (#28443)

  • 为LocalTaskJob和工作节点添加SIGUSR2信号处理器以辅助调试 (#28309)

  • test_task_command转换为Pytest并解除隔离其中的测试 (#28247)

  • 使无效字符异常更易读 (#28181)

  • /airflow/www中的decode-uri-component从0.2.0升级到0.2.2 (#28080)

  • 使用断言而非异常来处理执行器未启动的情况 (#28019)

  • 简化数据集 subgraph 逻辑 (#27987)

  • map_index排序TIs (#27904)

  • 关于LocalTaskJob中分段错误的附加信息 (#27381)

仅文档变更

  • 在集群策略文档中提及映射操作符 (#28885)

  • 略微改进动态DAG生成序言的描述 (#28650)

  • 重构文档 (#27235)

  • 更新调度器文档中关于低优先级任务的内容 (#28831)

  • 明确版本约束在发布时已固定 (#28762)

  • 澄清关于docker compose的内容 (#28729)

  • 为动态任务映射添加示例DAG (#28325)

  • 使用docker compose v2命令 (#28605)

  • 在docker-compose示例中添加AIRFLOW_PROJ_DIR (#28517)

  • 移除过时的可选提供者功能文档 (#28506)

  • 为[core] mp_start_method配置添加文档 (#27993)

  • LocalTaskJob返回代码计数器的文档 (#27972)

  • 注意支持的Python版本 (#27798)

Airflow 2.5.0 (2022-12-02)

重大变更

airflow dags test 不再执行回填任务 (#26400)

为了使airflow dags test作为测试和调试工具更加实用,我们不再运行回填作业,而是运行"本地任务运行器"。用户仍然可以使用airflow dags backfill命令来回填他们的DAG。

Airflow配置部分kubernetes已重命名为kubernetes_executor (#26873)

KubernetesPodOperator不再考虑任何核心kubernetes配置参数,因此本节现在仅适用于kubernetes执行器。重命名可以减少混淆的可能性。

AirflowException 现在会在 ExternalTaskSensor 的任何依赖任务失败时立即抛出 (#27190)

ExternalTaskSensor 在设置failed_states并使用execute_date_fn时,如果部分(非全部)依赖任务失败,将不再无限期挂起。 相反,当任何依赖任务失败时,会立即抛出AirflowException异常。 除了处理超时外,任何需要处理此失败的代码都应改为缓存AirflowExceptionBaseClass基类,而不仅仅是AirflowSensorTimeout子类。

Airflow配置选项scheduler.deactivate_stale_dags_interval已更名为scheduler.parsing_cleanup_interval (#27828)。

旧选项将继续有效,但会发出弃用警告,并将在Airflow 3中完全移除。

新功能

  • TaskRunner: 通知组件开始和结束 (#27855)

  • 将DagRun状态变更添加到Listener插件系统(#27113)

  • 原始任务返回码的指标 (#27155)

  • 为XComArg添加逻辑以拉取特定映射索引 (#27771)

  • 清除任务组 (#26658, #28003)

  • 添加关键部分查询持续时间指标 (#27700)

  • 新增: #23880 :: 为AirflowModelViews(变量/连接)添加审计日志 (#24079, #27994, #27923)

  • 添加对PostgreSQL 15的支持 (#27444)

  • 在运行时展开映射组中的任务 (#27491)

  • 重置提交,清理子模块 (#27560)

  • scheduler_job,为调度器循环计时器添加指标 (#27605)

  • 允许在任务流中使用数据集 (#27540)

  • 将expanded_ti_count添加到ti上下文中 (#27680)

  • 向任务实例和DAG运行添加用户评论 (#26457, #27849, #27867)

  • 启用将DagRun JSON复制到剪贴板的功能 (#27639)

  • 为SLAs实施额外控制 (#27557)

  • 在DAG视图中添加DAG解析时间 (#27573)

  • 在BaseSensor中为exponential_backoff添加max_wait参数 (#27597)

  • 在解析时展开映射组中的任务 (#27158)

  • 在回填操作上添加禁用重试标志 (#23829)

  • 添加传感器装饰器 (#22562)

  • API端点更新任务实例 (#26165)

  • 按最近更新事件筛选数据集 (#26942)

  • 支持在webui上对值为None的情况使用Is /not空值过滤器 (#26584)

  • 在数据集列表中添加搜索功能 (#26893)

  • 在映射操作符中拆分并处理'params' (#26100)

  • 为TaskGroup映射添加创作API (#26844)

  • 添加 one_done 触发规则 (#26146)

  • 创建一个更高效的airflow dag测试命令,同时具备更好的本地日志记录功能 (#26400)

  • 支持添加/移除角色权限的命令 (#26338)

  • 在Web界面中自动跟踪文件日志 (#26169)

  • 在API中向任务实例添加触发器信息 (#26249)

  • 用于在自定义XCom后端上反序列化值的标志 (#26343)

改进

  • 允许深度优先执行 (#27827)

  • 用户界面:如果数据变更则更新偏移高度 (#27865)

  • 改进TriggerRuleDep的类型提示和可读性 (#27810)

  • 使视图需要会话,仅关键字参数 (#27790)

  • 优化 TI.xcom_pull() 通过显式指定 task_ids 和 map_indexes (#27699)

  • 允许在k8s执行器使用的pod id中使用连字符 (#27737)

  • 优化任务实例筛选功能 (#27102)

  • 使用上下文管理器简化日志服务管理 (#27756)

  • 修复格式遗留问题 (#27750)

  • 改进任务死锁消息提示 (#27734)

  • 改进“传感器超时”消息提示 (#27733)

  • 将urlparse替换为urlsplit (#27389)

  • 将TaskGroup语义与AbstractOperator对齐 (#27723)

  • 在每次DAG处理循环中将新文件添加到解析队列 (#27060)

  • 增强Kubernetes Executor和Scheduler在执行PMH过程中的容错能力 (#27611)

  • 将数据集依赖分离为独立的图表 (#27356)

  • 在比log.error更经济的情况下使用log.exception (#27517)

  • 将验证 branch_task_ids 移至 SkipMixin (#27434)

  • 当推送到XCom时,强制将LazyXComAccess转换为列表 (#27251)

  • 更新集群策略文档 (#27362)

  • 如果连接类型已在提供程序中注册,则添加警告 (#27520)

  • 使用–verbose选项在命令中激活调试日志 (#27447)

  • 为Python Operators添加经典示例 (#27403)

  • .first() 改为 .scalar() (#27323)

  • 改进 reset_dag_run 的描述 (#26755)

  • 添加关于传感器的示例和howtos (#27333)

  • 使网格视图宽度可调整 (#27273)

  • 在按名称排序前,先按类别对插件自定义菜单链接进行排序 (#27152)

  • 简化 DagRun.verify_integrity (#26894)

  • 在序列化中添加映射任务组信息 (#27027)

  • 修正了网格视图中运行配置使用的JSON样式 (#27119)

  • UI行为不再需要extra__conn_type__前缀 (#26995)

  • 改进数据集更新说明 (#26878)

  • 将kubernetes配置部分重命名为kubernetes_executor (#26873)

  • 解码数据集搜索的参数 (#26941)

  • 移除DAG运行详情页面 & 完全依赖网格视图 (#26837)

  • 修复使用hostname_callable时调度器crashloopbackoff的问题 (#24999)

  • 降低KubernetesExecutor中的日志详细程度。(#26582)

  • 不要无故两次遍历此列表 (#26740)

  • 优化了 PodGenerator.deserialize_model_file 的代码清晰度 (#26641)

  • 除非你有一个V1Pod,否则不要导入kubernetes (#26496)

  • 向DagRun和Ti表添加updated_at列 (#26252)

  • 将自定义XCom Backend的反序列化移至2.4.0版本 (#26392)

  • 当只需要一个元素时避免计算所有元素 (#26377)

  • 通过isort自动添加__future__.annotations (#26383)

  • 在序列化expand_kwargs时处理列表 (#26369)

  • 将PEP-563(延迟注解评估)应用于核心airflow (#26290)

  • 添加更多工作日操作符和传感器示例 #26071 (#26098)

  • 将TaskGroup语义与AbstractOperator对齐 (#27723)

Bug修复

  • 优雅处理整个配置部分的重命名 (#28008)

  • 在反序列化过程中添加导入允许列表 (#27887)

  • 软删除不再被DAG调度或任务出口引用的数据集 (#27828)

  • 当URL中没有有效标签时重定向到首页视图 (#25715)

  • 在DAGs视图中刷新下次运行数据集信息 (#27839)

  • 使MappedTaskGroup依赖于其扩展输入 (#27876)

  • 加快暂停DAG的DagRun状态更新 (#27725)

  • 在任务运行命令中不要显式将include_examples设置为False (#27813)

  • 修复菜单边框颜色 (#27789)

  • 修复回填队列任务被重置为调度状态的问题。(#23720)

  • 修复从父DAG中清除子DAG映射任务的问题 (#27501)

  • 处理任务回调中V1Pod的json编码 (#27609)

  • 修复 ExternalTaskSensor 无法检查压缩的 dag 问题 (#27056)

  • 避免在TriggerDagRunOperator中重复获取DAG运行 (#27635)

  • 在获取元数据时遇到异常继续执行 (#27665)

  • 修复外部任务传感器故障 (#27190)

  • 在弹出操作时添加默认的None (#27537)

  • 在触发DAG视图中显示序列化DAG的参数值。(#27482, #27944)

  • 将TriggerDagRun的配置检查移至execute (#27035)

  • 解决触发器分配竞争条件 (#27072)

  • Update google_analytics.html (#27226)

  • 修复了网页界面DAG列表页面的一些bug(自动刷新和跳转搜索空状态)(#27141)

  • 修复了docker-compose.yaml的损坏URL (#26721)

  • 修复xcom arg.py中的.zip错误 (#26636)

  • 修复404 taskInstance错误并拆分为两个表格 (#26575)

  • 修复浏览器关于线程使用不当的警告 (#26551)

  • 模板渲染问题修复 (#26390)

  • 如果有任何导入错误,清除autoregistered DAGs (#26398)

  • 修复 from airflow import version 的延迟导入问题 (#26239)

  • 允许在触发的DAG运行模态框中滚动 (#27965)

杂项/内部

  • 移除 is_mapped 属性 (#27881)

  • 简化FAB表重置功能 (#27869)

  • 修复Base Sensor中的旧式类型标注 (#27871)

  • 切换回延迟导入 (#27730)

  • 为多个文件夹完成了D400 (#27748)

  • 简化笔记手风琴测试 (#27757)

  • 已完成 airflow/callbacks/* airflow/cli/* 的 D400 任务 (#27721)

  • 已完成针对airflow/api_connexion/* 目录的D400任务 (#27718)

  • 已完成针对 airflow/listener/* 目录 的 D400 任务 (#27731)

  • 已完成针对airflow/lineage/* 目录的D400任务 (#27732)

  • 更新API和Python客户端版本 (#27642)

  • 已完成 airflow/api/* 目录下的 D400 和 D401 检查 (#27716)

  • 为多个文件夹完成了D400 (#27722)

  • /airflow/www中的minimatch3.0.4 升级到 3.0.8 (#27688)

  • 将loader-utils从1.4.1 升级到 1.4.2 ``在 ``/airflow/www (#27697)

  • 暂时禁用嵌套任务映射功能 (#27681)

  • 升级alembic最低版本 (#27629)

  • remove unused code.html (#27585)

  • 在所有地方启用Python字符串规范化 (#27588)

  • 升级依赖以避免回溯 (#27531)

  • 加强并明确问题分类的重要性 (#27262)

  • 去重类型提示 (#27508)

  • BaseTrigger.run添加存根'yield' (#27416)

  • 移除dask的上限限制 (#27415)

  • 将Dask限制在2022.10.1以下 (#27383)

  • 更新旧式类型标注 (#26872)

  • 为文档启用字符串规范化 (#27269)

  • 略微加快升级/降级测试 (#26939)

  • 弃用在 PodManager 中使用核心 get_kube_client (#26848)

  • memray文件添加到gitignore / dockerignore (#27001)

  • 升级 sphinx 和 sphinx-autoapi (#26743)

  • 简化 RTIF.delete_old_records() (#26667)

  • 将最后的react文件迁移到typescript (#26112)

  • 解决 pyupgrade 的边缘情况 (#26384)

仅文档变更

  • 将dag_file_processor_timeouts指标标记为已弃用 (#27067)

  • 放弃对PostgreSQL 10的支持 (#27594)

  • 更新 index.rst (#27529)

  • 添加关于将惰性XCom代理推送到XCom的说明 (#27250)

  • 修复 BaseOperator 链接 (#27441)

  • [文档] 最佳实践 添加使用变量与模板示例。(#27316)

  • 使用插件自定义视图的文档 (#27244)

  • 在概览页面上更新图形视图和网格视图 (#26909)

  • 文档修复 (#26819)

  • 在标记标题字符串级别实现一致性 (#26696)

  • 为DAG测试函数添加文档 (#26713)

  • 修复docker-compose.yaml的损坏URL (#26726)

  • 添加关于在时间表中使用顶层代码的注意事项 (#26649)

  • 修复example_datasets dag名称 (#26495)

  • 更新文档:现在可以在任务映射中实现类似zip的效果 (#26435)

  • 在文档中将经典操作符用法改为任务装饰器 (#25711)

Airflow 2.4.3 (2022-11-14)

重大变更

使RotatingFilehandlerDagProcessor中禁用缓存 (#27223)

如果你想在CONFIG_PROCESSOR_MANAGER_LOGGER=True时减少缓存内存,并且之前已经创建了本地设置, 你可以将processor_manager_handler更新为使用airflow.utils.log.non_caching_file_handler.NonCachingRotatingFileHandler处理器,而不是logging.RotatingFileHandler

Bug修复

  • 修复某些任务日志处理程序导致的双重日志记录问题 (#27591)

  • 将FAB URL过滤功能替换为Airflow的 (#27576)

  • 修复映射任务的小型调度器扩展问题 (#27506)

  • SLAMiss 可为空,且在拉取任务实例时并不总是返回 (#27423)

  • 修复在搜索DAGs时_的行为 (#27448)

  • 修复从BaseExecutor获取dag/task ID的问题 (#27550)

  • 修复DDRQ上SQLAlchemy主键黑屏错误 (#27538)

  • 修复webserver启动时的IntegrityError问题 (#27297)

  • 为用户名添加不区分大小写的约束 (#27266)

  • 修复Python外部模板键 (#27256)

  • 减少多余的任务日志请求 (#27233)

  • 使RotatingFilehandlerDagProcessor中使用时不缓存 (#27223)

  • 监听器:在SQLAlchemy TaskInstance对象上设置任务 (#27167)

  • 修复DAG列表页面自动刷新和跳转搜索空状态问题 (#27141)

  • executor.job_id设置为BackfillJob.id用于回填操作(#27020)

杂项/内部

  • 将loader-utils从1.4.0升级到1.4.1/airflow/www目录下 (#27552)

  • 降低k8s TCP_KEEPALIVE等警告的日志级别 (#26981)

仅文档变更

  • 在docker compose文档中使用正确的可执行文件 (#27529)

  • 修复DAG运行描述中的措辞问题 (#27470)

  • 记录KubernetesExecutor覆盖容器参数的情况 (#27450)

  • 修复 BaseOperator 链接 (#27441)

  • 将计时器单位从毫秒修正为秒。(#27360)

  • 在触发器规则示例中添加缺失的导入 (#27309)

  • 更新SLA的措辞以表明它是相对于Dag Run开始时间而言的。(#27111)

  • 在文档中添加kerberos环境变量 (#27028)

Airflow 2.4.2 (2022-10-23)

重大变更

[webserver] expose_stacktrace 的默认值已更改为 False (#27059)

[webserver] expose_stacktrace 的默认值已从 True 改为 False。这意味着管理员需要主动选择是否向最终用户显示堆栈跟踪信息。

Bug修复

  • 将回溯追踪设为可选功能 (#27059)

  • 为FAB表添加缺失的AUTOINC/SERIAL功能 (#26885)

  • 为405(方法不允许)错误添加独立的错误处理程序 (#26880)

  • 不要重新修补已经被当前worker控制的pods (#26778)

  • 在任务持续时间图表中处理映射任务 (#26722)

  • 修复任务持续时间累积图表 (#26717)

  • 避免在DAG重定向时出现500错误 (#27064)

  • 在webserver上过滤数据集依赖数据 (#27046)

  • airflow dags reserialize中移除DAG的双重收集 (#27030)

  • 修复图表视图的自动刷新功能 (#26926)

  • 不要用无效的JSON覆盖连接额外信息 (#27142)

  • 修复下次运行数据集模态链接 (#26897)

  • 将DAG审计日志的排序方式从升序改为降序 (#26895)

  • 提升jinja2的最低版本要求 (#26866)

  • state_color_mapping jinja全局变量添加缺失的颜色 (#26822)

  • 修复在airflow tasks test中运行调试器的问题 (#26806)

  • 修复使用xcomarg依赖项时的警告 (#26801)

  • 降低Removed状态在任务摘要显示中的优先级 (#26789)

  • 确保解析期间来自操作符的日志消息能够被记录 (#26779)

  • 在REST API的TaskState枚举中添加重启状态 (#26776)

  • 允许从data.detail中获取错误信息 (#26762)

  • 简化原始字符串清理 (#27143)

  • 从StandardTaskRunner中移除DAG解析功能 (#26750)

  • 修复持续时间视图中未隐藏的累积图表 (#26716)

  • 移除TaskFail重复检查 (#26714)

  • 修复当dags_folder与处理器不同时,airflow任务运行–local的问题(#26509)

  • 修复来自d3-color的yarn警告 (#27139)

  • 修复几个配置的版本问题 (#26491)

  • 回滚“回填DAG运行时不自动刷新网格 (#25042)” (#26463)

  • 在Airflow调度DAG运行数据库死锁时重试 (#26347)

杂项/内部

  • 围绕任务映射代码的清理工作 (#26879)

  • 将面向用户的字符串移至模板 (#26815)

  • 为数据集图表添加图标图例 (#26781)

  • 升级 sphinxsphinx-autoapi (#26743)

  • 简化 RTIF.delete_old_records() (#26667)

  • 将FAB升级至4.1.4 (#26393)

仅文档变更

  • 修复了任务组示例中的三引号问题 (#26829)

  • 文档修复 (#26819)

  • 在标记标题字符串级别实现一致性 (#26696)

  • 添加关于在时间表中使用顶层代码的注意事项 (#26649)

  • 修复docker-compose.yaml的损坏URL (#26726)

Airflow 2.4.1 (2022-09-30)

重大变更

无重大变更。

Bug修复

  • 渲染模板时,取消上下文中的任务映射 (#26702)

  • 修复 ConfirmDialog 的滚动溢出问题 (#26681)

  • 解决关于Table.exists()的弃用警告 (#26616)

  • 修复XComArg压缩bug (#26636)

  • 在排序运行时使用 COALESCE 处理 NULL 值 (#26626)

  • 检查用户是否处于活跃状态 (#26635)

  • 公共管理员不再显示缺失用户警告 (#26611)

  • 允许 MapXComArg 在序列化后解析 (#26591)

  • 修复关于dags视图上DISTINCT ON查询的警告 (#26608)

  • 当密钥后端参数无效时记录警告 (#26580)

  • 修复网格视图日志尝试次数 (#26556)

  • templates_dict传递给任务装饰器时的模板渲染问题 (#26390)

  • 修复在回填过程中Deferrable卡在scheduled状态的问题 (#26205)

  • 在数据库初始化中抑制SQLALCHEMY_TRACK_MODIFICATIONS警告 (#26617)

  • 正确设置Flask应用上的json_provider_class,使其使用我们的编码器(#26554)

  • 修复WSGI根应用 (#26549)

  • 修复当重新运行具有已移除上游的映射任务时出现的死锁问题 (#26518)

  • ExecutorConfigType 应该是 cacheable (#26498)

  • 修复从Celery工作节点获取日志路径的正确连接方式 (#26493)

  • DAG 依赖项扩展了 base_template (#26439)

  • 不要从调度程序更新回填运行 (#26342)

仅文档变更

  • 明确所有者链接文档 (#26515)

  • 修复数据集概念文档中无效的RST (#26434)

  • expose_confignon-sensitive-only选项添加文档说明 (#26507)

  • 修复 example_datasets DAG名称 (#26495)

  • 现在可以在任务映射中实现类似Zip的效果 (#26435)

  • 在文档中使用任务装饰器替代经典操作符 (#25711)

Airflow 2.4.0 (2022-09-19)

重大变更

数据感知调度和Dataset概念加入Airflow

本次Airflow版本发布引入了数据集(Datasets)的新概念,随之而来的是一种新的DAG调度方式:数据感知调度。

这允许DAG运行由于任务"产出"数据集而自动创建。从某些方面来看,这可以被视为TriggerDagRunOperator的反向操作,在这里不是由产出DAG控制哪些DAG被创建,而是消费DAG可以"监听"变化。

数据集由URI标识:

from airflow import Dataset

# The URI doesn't have to be absolute
dataset = Dataset(uri="my-dataset")
# Or you can use a scheme to show where it lives.
dataset2 = Dataset(uri="s3://bucket/prefix")

要创建一个在数据集更新时运行的DAG,请使用新的schedule参数(见下文)并传入一个或多个数据集的列表:

with DAG(dag_id='dataset-consumer', schedule=[dataset]):
    ...

要将任务标记为生成数据集,请将数据集传递给outlets属性:

@task(outlets=[dataset])
def my_task(): ...


# Or for classic operators
BashOperator(task_id="update-ds", bash_command=..., outlets=[dataset])

如果生产者和消费者位于不同的文件中,你不需要使用相同的Dataset对象,两个使用相同URI创建的Dataset()是相等的。

数据集代表数据集的抽象概念,目前还不具备任何直接的读取或写入能力 - 在此版本中,我们正在添加我们将构建的基础功能。

有关数据集的更多信息,请参阅数据感知调度

扩展的动态任务映射支持

动态任务映射现在支持expand_kwargszipmap

有关动态任务映射的更多信息,请参阅Dynamic Task Mapping

在上下文管理器中使用的DAG不再需要分配给模块变量 (#23592)

之前您必须将DAG分配给模块级变量,Airflow才能识别它。例如这个

with DAG(dag_id="example") as dag:
    ...


@dag
def dag_maker(): ...


dag2 = dag_maker()

可以成为

with DAG(dag_id="example"):
    ...


@dag
def dag_maker(): ...


dag_maker()

如果您出于任何原因想要禁用该行为,请在dag上设置auto_register=False

# This dag will not be picked up by Airflow as it's not assigned to a variable
with DAG(dag_id="example", auto_register=False):
    ...

弃用 schedule_intervaltimetable 参数 (#25410)

我们新增了DAG参数schedule,它可以接受cron表达式、timedelta对象、timetable对象或数据集对象列表。参数schedule_intervaltimetable已被弃用。

如果你之前使用过@daily这个cron预设,你的DAG可能看起来是这样的:

with DAG(
    dag_id="my_example",
    start_date=datetime(2021, 1, 1),
    schedule_interval="@daily",
):
    ...

今后,您应该使用schedule参数来代替:

with DAG(
    dag_id="my_example",
    start_date=datetime(2021, 1, 1),
    schedule="@daily",
):
    ...

如果您使用了自定义时间表,情况也是如此。以前您会使用 timetable 参数:

with DAG(
    dag_id="my_example",
    start_date=datetime(2021, 1, 1),
    timetable=EventsTimetable(event_dates=[pendulum.datetime(2022, 4, 5)]),
):
    ...

现在你应该使用 schedule 参数:

with DAG(
    dag_id="my_example",
    start_date=datetime(2021, 1, 1),
    schedule=EventsTimetable(event_dates=[pendulum.datetime(2022, 4, 5)]),
):
    ...

移除实验性智能传感器 (#25507)

智能传感器(Smart Sensors)在2.0版本中引入,在2.2版本中已被弃用,转而推荐使用可延迟操作符(Deferrable operators),现已被移除。

airflow.contrib 包和已弃用的模块是动态生成的 (#26153, #26179, #26167)

来自Airflow 1.10的airflow.contrib包以及airflow.hooksairflow.operatorsairflow.sensors包中的已弃用模块现在都是动态生成的模块。虽然用户可以继续使用这些已弃用的contrib类,但它们对静态代码检查工具不可见,会被报告为缺失。建议用户迁移到未弃用的类。

DBApiHookSQLSensor 已迁移 (#24836)

DBApiHookSQLSensor 已被移至 apache-airflow-providers-common-sql 提供者。

网格视图中DAG运行排序逻辑已更改 (#25090)

网格视图中DAG运行的排序已更改为更"自然"的方式。 新逻辑通常按数据间隔排序,但可以通过将DAG设置为使用自定义时间表来应用自定义排序。

新功能

  • 新增数据感知调度功能 (AIP-48)

  • 添加 @task.short_circuit TaskFlow 装饰器 (#25752)

  • tasks test命令中将execution_date_or_run_id设为可选参数 (#26114)

  • 自动注册在上下文管理器中使用的DAGs (#23592, #26398)

  • 添加将DAG解析器日志输出到stdout的选项。(#25754)

  • 支持多个DagProcessors从不同位置解析文件。(#25935)

  • 实现 ExternalPythonOperator (#25780)

  • 使命令 dags test 中的 execution_date 变为可选参数 (#26111)

  • 针对字面量列表实现expand_kwargs() (#25925)

  • 添加触发器规则提示框 (#26043)

  • 为airflow dags test CLI添加conf参数 (#25900)

  • 在资源池视图中包含计划槽位 (#26006)

  • MappedOperator添加output属性 (#25604)

  • 向cli添加角色删除命令 (#25854)

  • 添加Airflow特定的警告类 (#25799)

  • ExternalTaskSensor中添加对TaskGroup的支持 (#24902)

  • 添加 @task.kubernetes 任务流装饰器 (#25663)

  • 添加一种无副作用导入Airflow的方法 (#25832)

  • 让时间表控制生成的run_ids。(#25795)

  • 允许在网格视图中按时间表顺序覆盖 (#25633)

  • 为映射实例的网格日志 (#25610, #25621, #25611)

  • 将多个参数合并为一个schedule参数 (#25410)

  • 回填命令中的DAG正则表达式标志 (#23870)

  • 在Dags视图界面中添加对所有者链接的支持 (#25280)

  • 能够通过REST API清除特定DAG运行的任务实例 (#23516)

  • 支持使用单独的markdown文件记录DAG (#25509)

  • 为DAG解析添加解析上下文 (#25161)

  • 实现 CronTriggerTimetable (#23662)

  • 在UI配置页面添加敏感数据屏蔽选项 (#25346)

  • 从ORM创建新数据库 (#24156)

  • 实现 XComArg.zip(*xcom_args) (#25176)

  • 引入 sla_miss 指标 (#23402)

  • 实现 map() 语义 (#25085)

  • 为TaskGroupDecorator添加重写方法 (#25160)

  • 实现 expand_kwargs() (#24989)

  • 添加参数以关闭SQL查询日志记录 (#24570)

  • 添加DagWarning模型,并增加对缺失池的检查(#23317)

  • 将任务日志添加到网格详情面板 (#24249)

  • 在调度器中添加了小型健康检查服务器和端点(#23905)

  • ExternalTaskMarker操作符添加内置外部链接 (#23964)

  • 添加默认任务重试延迟配置 (#23861)

  • 添加清除DagRun的端点。(#23451)

  • 在cron间隔时间表中添加对字符串时区的支持 (#23279)

  • 为DAGs主页添加自动刷新功能 (#22900, #24770)

改进

  • 添加更多工作日操作符和传感器示例 #26071 (#26098)

  • 向dags重新序列化命令添加子目录参数 (#26170)

  • 更新僵尸任务消息使其更具描述性 (#26141)

  • 仅当DAG被调度时才发送SlaCallbackRequest (#26089)

  • 增强 Operator.output 功能 (#25617)

  • 将API文件升级至TypeScript (#25098)

  • 在映射任务中减少hacky双重渲染防护 (#25924)

  • 改进审计日志 (#25856)

  • 移除映射操作符验证代码 (#25870)

  • 更多 DAG(schedule=...) 改进 (#25648)

  • 减少序列化JSON中的operator_name重复 (#25819)

  • 使网格视图分组/映射摘要UI更加一致 (#25723)

  • 移除task_group_to_grid中的无用语句 (#25654)

  • CronTriggerTimetable添加可选数据间隔 (#25503)

  • 移除/grid端点中未使用的代码 (#25481)

  • 添加并记录描述字段 (#25370)

  • 改进Airflow操作符Jinja模板处理的日志记录功能 (#25452)

  • 更新核心示例DAG以使用@task.branch装饰器 (#25242)

  • 更新DAG audit_log路由 (#25415)

  • 将标准输出和标准错误输出的访问模式更改为追加模式 (#25253)

  • 从网格视图中移除 getTasks (#25359)

  • 使用ParamSpec改进taskflow的类型提示 (#25173)

  • 在网格详情窗格中使用表格 (#25258)

  • 明确列出 @dag 参数 (#25044)

  • SchedulerJobTaskInstance中增加更多类型定义 (#24912)

  • 使用更健壮的版本修补 getfqdn (#24981)

  • 将所有NBSP字符替换为whitespaces (#24797)

  • airflow db upgrade时重新序列化所有DAG (#24518)

  • 重构try_adopt_task_instances方法的合约 (#23188)

  • 使expand()的错误信息更模糊,以避免误导 (#24018)

  • [webserver]analytics_tool添加枚举验证 (#24032)

  • 在审计日志中添加可搜索字段 dttm (#23794)

  • 允许通过execute_in_subprocess传递更多参数 (#23286)

  • 使用 func.count 统计行数 (#23657)

  • 移除过期的序列化DAG (#22917)

  • AIP45 移除airflow run local中的dag解析 (#21877)

  • 在DagRun更新端点中添加对排队状态的支持。(#23481)

  • 向dagrun端点添加字段 (#23440)

  • 当未设置result_backend时,使用sql_alchemy_conn作为celery结果后端 (#24496)

Bug修复

  • 确保ORM与迁移文件之间的类型一致性 (#24044, #25869)

  • 禁止任何超过100字符的dag标签 (#25196)

  • 将dag_id添加到AirflowDagCycleException消息中 (#26204)

  • 正确构建URL以独立于系统检索日志 (#26337)

  • 仅当支持双栈时,worker日志服务器才绑定到IPV6 (#26222)

  • 修复在handle_failure之前未定义TaskInstance.task的问题 (#26040)

  • 撤销 secrets 后端配置缓存 (#26223)

  • 修复错误的执行器配置序列化逻辑 (#26191)

  • 根据角色权限显示DAGsDatasets菜单链接 (#26183)

  • 允许通过函数文档字符串设置TaskGroup工具提示 (#26028)

  • 修复包含大量任务的DAG在图形视图中的递归错误 (#26175)

  • 修复回填偶尔出现的死锁问题 (#26161)

  • 修复在使用--reset-dagruns参数为True时,DagRun.start_date未在回填过程中设置的问题 (#26135)

  • 在图表中使用标签(label)替代ID来实现动态任务标签 (#26108)

  • 当叶子节点mapped_task被跳过时,不要使DagRun失败 (#25995)

  • 为装饰映射任务添加组前缀 (#26081)

  • 修复触发重复逻辑日期时UI闪烁的问题 (#26094)

  • 修复使TaskInstance相关端点的项目可为空,以避免API错误(#26076)

  • 修复 BranchDateTimeOperator 使其成为 时区不敏感 (#25944)

  • 修复遗留时间表调度间隔参数 (#25999)

  • 修复list-mapped-task-instance的响应模式 (#25965)

  • 正确检查缺失映射TIs的存在性 (#25788)

  • 修复网格视图中的自动刷新问题 (#25950)

  • 在网格UI中使用按时间表排序 (#25880)

  • 在解析DAG时用迭代重写递归逻辑 (#25898)

  • iter_mapped_dependants中查找跨组任务 (#25793)

  • 如果映射上游失败则任务失败 (#25757)

  • 支持变量获取端点中的/ (#25774)

  • 使用cfg的default_wrap值作为网格日志的默认设置 (#25731)

  • 在触发运行时添加原始请求参数 (#25729)

  • 操作符名称与类分离 (#22834)

  • 修复由于输入时间对齐假设导致的数据间隔对齐错误 (#22658)

  • 如果XComArg解析失败则返回None (#25661)

  • 修正了json参数在airflow variables set命令中的帮助说明 (#25726)

  • find_zombies查询中添加了MySQL索引提示以使用ti_state (#25725)

  • 仅从渲染中排除实际展开的字段 (#25599)

  • 网格,修复axios错误的toast提示 (#25703)

  • 修复UI重定向问题 (#26409)

  • 为dags list-runs命令添加dag_id参数要求 (#26357)

  • 检查DAG自动刷新时的排队状态 (#25695)

  • 修复 dag_owner_attributes 表的升级代码 (#25579)

  • 为任务日志API添加映射索引 (#25568)

  • 确保清理存在错误的dags中的僵尸任务 (#25550)

  • 使UI中的额外链接正常工作 (#25500)

  • 同步插件API架构和定义 (#25524)

  • 名字/姓氏可以为空 (#25476)

  • 重构DAG页面以保持一致性 (#25402)

  • 在解映射前检查expand_kwargs()的输入类型 (#25355)

  • 在计算映射长度时按关键字过滤XCOM (#24530)

  • 修复 ExternalTaskSensor 无法与动态任务配合使用的问题 (#25215)

  • 添加了异常捕获功能,当模板文件引发任何异常时发送默认邮件 (#24943)

  • MappedOperator成员与BaseOperator保持同步 (#24034)

杂项/内部

  • MetaData数据库添加自动生成的ERD架构 (#26217)

  • 将序列化函数标记为内部 (#26193)

  • 移除剩余的已弃用类并用PEP562替换它们 (#26167)

  • dag_edgestask_group_to_dict 移动到对应的工具模块 (#26212)

  • 延迟导入多个模块以提高导入速度 (#24486, #26239)

  • 修复错误的类型信息 (#26077)

  • 将缺失的contrib类添加到已弃用的字典中 (#26179)

  • 在分叉后重新配置/连接ORM以运行DAG处理器 (#26216)

  • 从血缘关系处理中移除cattrs。(#26134)

  • 移除了已弃用的contrib文件,并用PEP-562 getattr替换它们 (#26153)

  • BaseSerialization.serialize方法对其他类设为"public"公开。(#26142)

  • 修改模板以使用人类可读的task_instance描述 (#25960)

  • moment-timezone0.5.34 升级到 0.5.35/airflow/www 目录下 (#26080)

  • 修复Flask弃用警告 (#25753)

  • 为生成的operations类型添加CamelCase (#25887)

  • 修复迁移问题并加强CI升级/降级测试 (#25869)

  • 修复 SkipMixin 中的类型注解 (#25864)

  • 解决setuptools可编辑包路径问题 (#25848)

  • 将/airflow/www中的undici5.8.0 升级至 5.9.1 (#25801)

  • _BranchPythonDecoratedOperator添加custom_operator_name属性 (#25783)

  • 澄清 filename_template 的弃用消息 (#25749)

  • 使用 ParamSpec 替换 Callable 中的 ... (#25658)

  • 移除已弃用的模块 (#25543)

  • 关于任务映射新增功能的文档 (#24489)

  • 移除智能传感器 (#25507)

  • 修复 elasticsearch 测试配置以避免弃用模板的警告 (#25520)

  • terser4.8.0 升级至 4.8.1 在 /airflow/ui 目录 (#25178)

  • 从REST API文档生成typescript类型 (#25123)

  • 将工具文件升级至 typescript (#25089)

  • 将剩余的上下文文件升级到 typescript。(#25096)

  • 将文件迁移至ts (#25267)

  • 将网格表格组件升级至ts. (#25074)

  • 如果返回None,则跳过对映射ti的映射操作 (#25047)

  • 重构 js 文件结构 (#25003)

  • 将映射kwargs内省移动到单独的类型 (#24971)

  • 仅在类型检查时为mypy进行断言(#24937)

  • moment2.29.3 升级至 2.29.4/airflow/www 目录 (#24885)

  • 从我们的代码库中移除"不良字符" (#24841)

  • BashOperator中移除xcom_push标志 (#24824)

  • 将Flask钩子注册移到文件末尾 (#24776)

  • 将更多javascript文件升级为typescript (#24715)

  • 清理任务装饰器的类型提示和文档字符串 (#24667)

  • 在UI中保留提供者连接额外字段的原始顺序 (#24425)

  • charts.css 重命名为 chart.css (#24531)

  • grid.css 重命名为 chart.css (#24529)

  • 杂项:通过set_new_process_group工具创建新的进程组 (#24371)

  • Airflow UI修复原型污染问题 (#24201)

  • 升级 moto 版本 (#24222)

  • 从参考文档中移除未使用的 [github_enterprise] (#24033)

  • 清理日志调用中的f-strings (#23597)

  • JPype1 添加限制 (#23847)

  • 简化JSON响应 (#25518)

  • 添加最小属性版本 (#26408)

仅文档变更

  • Celery Flower添加URL前缀设置 (#25986)

  • 更新示例中已弃用的配置 (#26037)

  • 修复任务流教程的错误链接 (#26007)

  • 将教程重新组织到一个章节中 (#25890)

  • 修复动态任务映射的概念文档 (#26002)

  • 将代码示例从“经典”操作符更新为任务流 (#25845, #25657)

  • 添加关于手动修复MySQL字符集问题的说明 (#25938)

  • 优先使用文档中的本地快速入门 (#25888)

  • 修复指向Trigger Rules的失效链接 (#25840)

  • 改进docker文档 (#25735)

  • 在文档中正确链接到Dag解析上下文 (#25722)

  • 添加关于task_instance_mutation_hook用法的说明 (#25607)

  • 请注意TaskFlow API会自动在任务之间传递数据 (#25577)

  • 更新DAG运行以明确DAG实际运行的时间 (#25290)

  • 更新教程文档以包含操作符的定义 (#25012)

  • 重写Airflow文档首页 (#24795)

  • 修复 task-generated mapping 示例 (#23424)

  • 2.2.0版本中添加关于逻辑日期细微变更的说明 (#24413)

  • 在最佳实践代码示例中添加缺失的导入 (#25391)

Airflow 2.3.4 (2022-08-23)

重大变更

新增配置项 [logging]log_formatter_class 用于修复UI界面日志时区显示问题 (#24811)

如果您在[logging]logging_config_class中使用自定义的Formatter子类,请继承airflow.utils.log.timezone_aware.TimezoneAware而不是logging.Formatter。 例如,在您的custom_config.py中:

from airflow.utils.log.timezone_aware import TimezoneAware


# before
class YourCustomFormatter(logging.Formatter): ...


# after
class YourCustomFormatter(TimezoneAware): ...


AIRFLOW_FORMATTER = LOGGING_CONFIG["formatters"]["airflow"]
AIRFLOW_FORMATTER["class"] = "somewhere.your.custom_config.YourCustomFormatter"
# or use TimezoneAware class directly. If you don't have custom Formatter.
AIRFLOW_FORMATTER["class"] = "airflow.utils.log.timezone_aware.TimezoneAware"

Bug修复

  • MappedOperator上禁用attrs状态管理 (#24772)

  • 在pickle executor_config之前,将pod_override序列化为JSON (#24356)

  • 修复 pid 检查 (#24636)

  • 在登录时轮换会话ID (#25771)

  • 修复了使用reschedule模式的映射传感器问题 (#25594)

  • 缓存自定义密钥后端,以便重复使用同一实例 (#25556)

  • 添加右侧内边距 (#25554)

  • 修复在清除后运行时减少映射任务映射长度的问题 (#25531)

  • 修复当存在悬空表时airflow db reset的问题 (#25441)

  • 修改 disable_verify_ssl 的行为 (#25023)

  • 在dag.add_task方法中设置默认任务组 (#25000)

  • 移除了索引的干扰力。(#25404)

  • 移除无用的日志行 (#25347)

  • 在关键部分查询中添加mysql索引提示以使用task_instance.state上的索引 (#25673)

  • 为所有守护进程配置可设置的umask。(#25664)

  • 修复当None传递给模板过滤器时引发的错误 (#25593)

  • 允许使用通配符的CORS来源 (#25553)

  • 修复“此会话的事务已回滚”问题 (#25532)

  • 修复TaskCallbackRequest中的序列化错误 (#25471)

  • 修复 - 通过绝对路径解决bash问题 (#25331)

  • 为ParamsDict类添加__repr__方法 (#25305)

  • 仅加载一次名称的分布 (#25296)

  • 在调用时将TimeSensorAsynctarget_time转换为UTC时间 (#25221)

  • expandGroup之后调用updateNodeLabels (#25217)

  • 停止SLA回调抢占其他回调并对DagProcessorManager队列造成拒绝服务攻击(#25147)

  • 修复 invalidateQueries 调用 (#25097)

  • airflow/www/package.json: 添加名称和版本字段。(#25065)

  • 回填DAG运行时不自动刷新网格 (#25042)

  • 修复DAG详情页面的标签链接 (#24918)

  • 修复多调度器情况下的僵尸任务处理问题 (#24906)

  • 将工作节点上的日志服务器绑定到 IPv6 地址 (#24755) (#24846)

  • %(asctime)s 添加 %z 以修复 UI 上日志的时区问题 (#24811)

  • TriggerDagRunOperator.operator_extra_links 是一个属性 (#24676)

  • prohibit_commit之外发送DAG超时回调给处理器 (#24366)

  • 不要依赖当前的ORM结构来执行数据库清理命令 (#23574)

  • 在清除TIs时清除next方法 (#23929)

  • 两处类型修复 (#25690)

仅文档变更

  • 更新 set-up-database.rst (#24983)

  • 修复mysql设置文档中的语法 (#24893 (#24939)

  • 注意DAG策略如何与default_args一起工作 (#24804)

  • 更新PythonVirtualenvOperator使用指南 (#24782)

  • 文档:为发布说明添加指向Github PR的超链接 (#24532)

杂项/内部

  • 移除使用默认远程任务日志处理程序时的弃用警告 (#25764)

  • scheduler_job.py 中更清晰的方法名称 (#23702)

  • 升级cattrs版本 (#25689)

  • sql_engine_collation_for_ids文档中补充了对external_executor_id的说明 (#25197)

  • 重构 DR.task_instance_scheduling_decisions (#24774)

  • 排序操作符额外链接 (#24992)

  • 扩展了resolve_xcom_backend函数级别的文档 (#24965)

  • 将FAB升级至4.1.3版本 (#24884)

  • 由于2.2版本破坏了我们的测试,将Flask限制在<2.3版本 (#25511)

  • 将astroid版本限制在2.12以下 (#24982)

  • 将javascript编译移至主机 (#25169)

  • 为ParamSpec更新typing-extensions和mypy (#25088)

Airflow 2.3.3 (2022-07-09)

重大变更

我们已将Flask App Builder升级至主版本4.* (#24399)

Flask App Builder是Airflow Webserver的重要组件之一,因为它使用了大量对运行Web服务器并将其集成到企业环境中至关重要的依赖项 - 特别是身份验证。

FAB 4.*版本将多个依赖项升级至主版本发布,这些升级版本修复了若干安全问题。我们进行了大量测试以确保依赖项升级保持向后兼容性,但由于依赖项内部实现存在破坏性变更,若用户自行使用这些库,某些变更可能会对其产生影响。

您可能需要对Oauth配置进行的一个重要更改是添加 server_metadata_urljwks_uri,您可以在此问题中了解更多相关信息。

以下是随FAB 4一起发布的依赖项中的重大变更列表:

Bug修复

  • 修复迷你任务调度器中的异常 (#24865)

  • 修复将标签附加到任务组时的循环错误 (#24847)

  • 修复sensorinstance的时间戳默认值 (#24638)

  • 将易出错的 ti.task.dag 赋值移回 try/except 代码块内 (#24533) (#24592)

  • FSHook添加缺失的类型 (#24470)

  • stdout中隐藏敏感信息,适用于airflow tasks test (#24362)

  • DebugExecutor 使用 ti.run() 而非 ti._run_raw_task (#24357)

  • 修复MySQL连接中URI构造函数的错误 (#24320)

  • openapi中添加了可空为true的缺失scheduleinterval (#24253)

  • 统一任务运行器的return_code接口 (#24093)

  • 通过重试机制处理触发器中的偶发死锁问题 (#24071)

  • 移除针对映射op_kwargs的特殊序列化逻辑 (#23860)

  • ExternalTaskSensor 在外部任务进入 failed_state 状态时会遵循 soft_fail 参数设置 (#23647)

  • 修复 StatD 计时指标单位 (#21106)

  • 向sqlalchemy的TypeDecorators添加cache_ok标志。(#24499)

  • 允许设置 LOGGING_LEVEL=DEBUG (#23360)

  • 修复网格日期刻度 (#24738)

  • 在网格视图(Grid view)中防抖状态高亮显示 (#24710)

  • 修复网格垂直滚动问题 (#24684)

  • 不要尝试为已关闭的组渲染子行 (#24637)

  • 不计算网格根实例 (#24528)

  • 在上游过滤时保持网格视图选择 (#23779)

  • grid_data 端点的速度提升10倍 (#24284)

  • 为日志处理器应用每次运行的日志模板 (#24153)

  • 如果执行配置包含旧的k8s对象,不要让调度程序崩溃 (#24117)

  • 修复了TI.log_url中关于map_index的问题 (#24335)

  • 修复迁移 0080_2_0_2 - 在设置列非空之前替换空值 (#24585)

  • 如果使用了旧的Postgres方案,则修补sql_alchemy_conn (#24569)

  • 初始化 log_template 表 (#24511)

  • 修复已弃用的 log_id_template 值 (#24506)

  • 修复 toast 消息 (#24505)

  • task_instance的级联删除添加索引 (#24488)

  • 如果Pod JSON编码失败则返回空字典 (#24478)

  • 通过自定义工具提示提升网格渲染性能 (#24417, #24449)

  • 检查网格组摘要中的run_id (#24327)

  • 优化针对cron调度的DAGs的日历视图 (#24262)

  • 使用 get_hostname 替代 socket.getfqdn (#24260)

  • 检查边缘节点是否实际存在 (#24166)

  • 修复 useTasks 错误导致的崩溃 (#24152)

  • 不要使重新排队的任务实例失败 (#23846)

  • 减少网格视图API调用次数 (#24083)

  • 将"Permissions"重命名为"Permission Pairs"。(#24065)

  • use_task_execution_date 替换为 use_task_logical_date (#23983)

  • 网格修复详情按钮截断问题及小幅UI调整 (#23934)

  • 将任务实例状态 REMOVED 添加到已完成状态和成功状态 (#23797)

  • 修复清除后映射任务不可变的问题 (#23667)

  • 修复名称中包含点的dag的权限问题 (#23510)

  • 修复关闭连接 dbapi.get_pandas_df (#23452)

  • 检查DAG包schedule_interval是否与时间表匹配 (#23113)

  • 修复了任务被添加到多个组时出现的解析错误 (#23071)

  • 修复返回的DAG运行顺序不稳定的问题 (#24405)

  • 将影响运行/任务选择的jsx文件迁移至tsx (#24509)

  • 修复示例中的源链接 (#24386)

  • grid_data 端点设置正确的 Content-Typechartset (#24375)

仅文档变更

  • 更新模板文档以提及extras并格式化Airflow Vars / Conns (#24735)

  • 文档内建时间表 (#23099)

  • 对两个表格进行字母排序 (#23923)

  • 明确用户不应使用Maria DB (#24556)

  • 添加导入以延迟代码示例 (#24544)

  • 添加关于2022年6月图像再生的说明 (#24524)

  • get_current_context()章节进行了小清理 (#24482)

  • 修复默认2.2.5版本的log_id_template (#24455)

  • 更新了关于独立于核心安装提供程序的描述 (#24454)

  • 提及上下文变量和日志记录 (#24304)

杂项/内部

  • 移除对Internet Explorer的支持 (#24495)

  • api_connexion中移除魔法状态码数字 (#24050)

  • 将FAB升级至4.1.2 (#24619)

  • 将Markdown引擎切换为markdown-it-py (#19702)

  • 全面更新 rich 至最新版本。(#24186)

  • 移除 TimedJSONWebSignatureSerializer (#24519)

  • 更新flask-appbuilder的authlib/oauth依赖项 (#24516)

  • 升级到 webpack 5 (#24485)

  • 添加 typescript (#24337)

  • 用于检索日志的请求中的JWT声明已标准化:我们使用nbfaud声明来表示请求的有效期和目标受众。同时使用"filename"载荷字段来保存日志名称。(#24519)

  • 解决所有yarn测试警告 (#24722)

  • 升级到 react 18 和 chakra 2 (#24430)

  • 重构 DagRun.verify_integrity (#24114)

  • 将FAB升级至4.1.1 (#24399)

  • 我们现在至少需要 Flask-WTF 0.15 (#24621)

Airflow 2.3.2 (2022-06-04)

无重大变更。

Bug修复

  • 至少运行一次check_migration循环

  • 修复映射任务的网格视图 (#24059)

  • 网格视图中不同DAG运行类型的图标 (#23970)

  • 更快的网格视图 (#23951)

  • 禁止无参数调用expand (#23463)

  • 在任务响应中添加缺失的is_mapped字段。(#23319)

  • DagFileProcessorManager: 仅在当前进程不是会话领导者时启动新的进程组 (#23872)

  • 为尚未运行的任务实例(TIs)屏蔽敏感值 (#23807)

  • 将级联操作添加到dag_tagdag的外键关系中 (#23444)

  • 为独立的DAG处理器使用--subdir参数值。(#23864)

  • 通过悬停在图例行上高亮显示任务状态 (#23678)

  • 修复并加速网格视图 (#23947)

  • 如果网格任务实例为空,防止UI崩溃 (#23939)

  • dag-processor命令中移除冗余的注册退出信号 (#23886)

  • _TaskDecorator 添加 __wrapped__ 属性 (#23830)

  • 修复当DbApiHook中的sql为空列表时出现的UnboundLocalError错误 (#23816)

  • 启用点击自动完成下拉菜单中的DAG所有者 (#23804)

  • 简化 _airflow_moved 表的闪存消息 (#23635)

  • 从甘特图中排除缺失的任务 (#23627)

仅文档变更

  • 为数据库迁移参考添加列名 (#23853)

杂项/内部

  • 取消对xmltodict的固定依赖 (#23992)

Airflow 2.3.1 (2022-05-25)

重大变更

无重大变更。

Bug修复

  • 自动重新调度CeleryExecutor中停滞的排队任务 (#23690)

  • 修复展开/折叠全部按钮 (#23590)

  • 网格视图状态筛选器 (#23392)

  • 展开/折叠所有分组 (#23487)

  • 修复已弃用非配置值的检索问题 (#23723)

  • 修复任务未执行时在UI中渲染的secrets问题。(#22754)

  • 修复提供者导入错误匹配问题 (#23825)

  • 修复忽略符号链接时的回归问题 (#23535)

  • 修复 dag-processor 获取元数据数据库配置的问题 (#23575)

  • 修复在展开非模板字段时自动上游依赖的问题 (#23771)

  • 修复任务日志未被捕获的问题 (#23684)

  • BaseSensorOperator的序列化字段添加reschedule (#23674)

  • 修改数据库清理功能以同时捕获ProgrammingError异常 (#23699)

  • 移除链接按钮的标题 (#23736)

  • 修复网格详情头部文字重叠问题 (#23728)

  • 确保execution_timeout作为时间增量 (#23655)

  • 降级时不运行迁移前检查 (#23634)

  • 为日志表中的事件列添加索引 (#23625)

  • CeleryKubernetesExecutorLocalKubernetesExecutor实现send_callback方法 (#23617)

  • 修复 PythonVirtualenvOperator 的模板字段 (#23559)

  • root_dag_id也应用特定的ID排序规则 (#23536)

  • 修复 KubernetesJobWatcher 因资源过旧而卡住的问题 (#23521)

  • 修复当使用返回none的映射任务扩展时调度器崩溃的问题 (#23486)

  • 修复当多个运行同时启动时损坏的dagrun链接 (#23462)

  • 修复:解析日志 #20966 时的异常 (#23301)

  • 修复了webserver视图中无效日期解析的问题。(#23161)

  • 具有负开放槽位的池不应阻塞其他池 (#23143)

  • 调整溢出、定位和内边距 (#23044)

  • 将查找错误行的方法改为左外连接(LEFT OUTER JOIN)。(#23528)

  • 仅当moved表存在时才统计错误引用 (#23491)

  • 视觉上区分任务组摘要 (#23488)

  • 移除高度嵌套组的颜色变化 (#23482)

  • 优化2.3.0版本升级前的检查查询 (#23458)

  • core__sql_alchemy_conn__cmd添加向后兼容性 (#23441)

  • 修复字面量交叉乘积扩展问题 (#23434)

  • 修复xcom列表中损坏的任务实例链接 (#23367)

  • 修复连接测试按钮 (#23345)

  • 修复了映射操作符的 airflow dags show 命令行界面问题 (#23339)

  • 隐藏部分任务实例属性 (#23338)

  • Don’t show grid actions if server would reject with permission denied (#23332)

  • 使用 run_id 作为 ti.mark_success_url (#23330)

  • 修复更新用户授权统计 (#23314)

  • 在映射实例表中使用 /> (#23313)

  • 修复重复的Kubernetes弃用警告 (#23302)

  • 将网格视图选择存储在URL参数中 (#23290)

  • 移除Triggerer中的自定义信号处理 (#23274)

  • 当从命令行传入pool参数时,为TaskInstance覆盖池配置。(#23258)

  • 如果在DAG运行ID中使用'/'则显示警告 (#23106)

  • 在try代码块内添加标签。(#21784)

仅文档变更

  • dag_processing.processor_timeouts移至计数器部分(#23393)

  • 明确说明PyPi安装不应使用bundle extras (#23697)

  • 在文档中同步支持Postgres和K8S (#23673)

  • 替换文档中对DummyOperator的引用 (#23502)

  • expand()partial()的关键字参数添加文档注释 (#23373)

  • 修复了2.3.0+版本升级后elasticsearch日志损坏的文档问题 (#23821)

杂项/内部

  • 为airflow/configuration.py添加类型标注 (#23716)

  • 默认在docker-compose中禁用Flower (#23685)

  • 在支持版本(包括breeze)中添加了postgres 14 (#23506)

  • 添加对K8S 1.24的支持 (#23637)

  • 将代码引用从树状结构重构为网格结构 (#23254)

Airflow 2.3.0 (2022-04-30)

有关生产环境Docker镜像的变更,请参阅Docker镜像变更日志

重大变更

XCom.set()XCom.clear()XCom.get_one()XCom.get_many()传递execution_date参数已被弃用 (#19825)

为了继续将TaskInstance绑定到DagRun,现在XCom条目也与DagRun关联。请使用run_id参数来指定DagRun。

任务日志模板现在从元数据库读取,而非airflow.cfg (#20165)

之前,任务的日志是在运行时根据[core] log_filename_template[elasticsearch] log_id_template配置值动态生成的。这导致了一些不利的特性,例如:在Airflow实例运行一段时间后修改配置值是不切实际的,因为所有现有的任务日志都已按照之前的格式保存,无法通过新的配置值找到。

引入了一个新的log_template表来解决这个问题。每次Airflow启动时,该表都会与上述配置值同步,并且每个DAG运行都会添加一个新字段log_template_id,用于指向任务使用的格式(NULL表示为了兼容性而保留的首条记录)。

Kubernetes库最低版本从3.0.0提升至21.7.0 (#20759)

注意

这仅涉及更改kubernetes库,而非Kubernetes集群。Airflow对Kubernetes版本的支持说明详见安装前提条件

预计行为不会发生变化。这一变更是为了利用一个关于EKS中Kubernetes API令牌刷新的bug修复,从而可以移除一些临时解决方案代码

XCom 现在由 run_id 而非 execution_date 定义 (#20975)

作为Airflow 2.2中启动的TaskInstance-DagRun关系变更的延续,XCom中的execution_date列已从数据库中移除,并在ORM层替换为association proxy字段。如果您直接访问Airflow的元数据库,应重写实现以改用run_id列。

请注意,Airflow在数据库和ORM层面的元数据库定义被视为实现细节,不提供严格的向后兼容性保证。

非JSON可序列化参数已弃用 (#21135).

之前可以使用非JSON可序列化的dag或任务参数默认值。

例如这在之前是可行的:

@dag.task(params={"a": {1, 2, 3}, "b": pendulum.now()})
def datetime_param(value):
    print(value)


datetime_param("{{ params.a }} | {{ params.b }}")

注意setdatetime类型的使用,它们不可被JSON序列化。这种行为会带来问题,因为要在DAG运行配置中覆盖这些值时必须使用JSON,这可能导致这些参数无法被覆盖。另一个问题是参数验证的支持基于JSON。在Airflow 3.0中将移除对非JSON可序列化参数的支持,在此之前使用它们会在解析时产生警告。

对于SQLAlchemy 1.4.0+版本,您必须在sql_alchemy_conn中使用postgresql://而非postgres:// (#21205)

当您使用SQLAlchemy 1.4.0+版本时,需要在sql_alchemy_conn中使用postgresql://作为连接方案。 在SQLAlchemy的早期版本中可以使用postgres://,但在SQLAlchemy 1.4.0+版本中使用会导致:

>       raise exc.NoSuchModuleError(
            "Can't load plugin: %s:%s" % (self.group, name)
        )
E       sqlalchemy.exc.NoSuchModuleError: Can't load plugin: sqlalchemy.dialects:postgres

如果您无法立即更改URL方案,Airflow仍可继续与SQLAlchemy 1.3版本兼容,您也可以降级SQLAlchemy,但我们建议更新方案。 详情请参阅SQLAlchemy变更日志

auth_backends 替换了 auth_backend 配置设置 (#21472)

过去,仅使用一个后端来授权REST API的使用。在2.3版本中,这一机制被修改为支持多个后端(以逗号分隔)。系统将依次尝试每个后端,直到返回成功响应。

此设置也用于已弃用的实验性API,即使提供了多个选项,它也只使用第一个选项。

airflow.models.base.Operator 已被移除 (#21505)

之前存在一个名为airflow.models.base.Operator的空类用于"类型提示"。这个类实际上从未发挥过任何实际作用(它的所有功能都可以通过airflow.models.baseoperator.BaseOperator更好地实现),现已被移除。如果您依赖该类的存在,请使用BaseOperator(用于具体操作符)、airflow.models.abstractoperator.AbstractOperator(作为BaseOperator和AIP-42MappedOperator的共同基类),或者airflow.models.operator.Operator(一个用于类型注解的联合类型BaseOperator | MappedOperator)。

DAGs文件夹中的Zip文件不能再使用.py扩展名 (#21538)

之前可以在DAGs文件夹中使用任意扩展名的zip文件。现在.py文件将被作为模块加载而不会检查是否是zip文件,因为这样可以减少IO操作。如果DAGs文件夹中的.py文件实际上是zip压缩文件,解析时会抛出异常。

auth_backends 包含会话 (#21640)

为了让Airflow UI能够使用API,原先的默认授权后端airflow.api.auth.backend.deny_all已被更改为airflow.api.auth.backend.session,当设置了非默认值时,该后端会自动添加到API授权后端列表中。

日志文件名和elasticsearch log_id的默认模板已更改 (#21734)

为了支持动态任务映射(Dynamic Task Mapping),每个任务实例日志的默认模板已更改。如果您的配置包含旧的默认值,它们将被原地升级。

如果您对新配置值感到满意,应该移除airflow.cfg中的设置,让默认值生效。旧的默认值为:

  • [core] log_filename_template: {{ ti.dag_id }}/{{ ti.task_id }}/{{ ts }}/{{ try_number }}.log

  • [elasticsearch] log_id_template: {dag_id}-{task_id}-{execution_date}-{try_number}

[core] log_filename_template 现在默认使用 dag_id=/run_id= 的"hive分区风格",这可能会在一些较旧的FAT文件系统上造成问题。如果这对您有影响,那么您需要更改日志模板。

如果您自定义了模板,并且希望使用动态映射任务,应确保模板中包含 {{ ti.map_index }}

如果在升级后发现无法访问任务日志,请尝试在log_template表中添加一行,其中id=0包含您之前的log_id_templatelog_filename_template。例如,如果您使用了2.2.5版本中的默认值:

INSERT INTO log_template (id, filename, elasticsearch_id, created_at) VALUES (0, '{{ ti.dag_id }}/{{ ti.task_id }}/{{ ts }}/{{ try_number }}.log', '{dag_id}-{task_id}-{execution_date}-{try_number}', NOW());

ReadyToRescheduleDep 现在仅在 rescheduleTrue 时运行 (#21815)

当运行ReadyToRescheduleDep时,它现在会检查操作器上的reschedule属性,除非该属性被设置为True,否则始终报告自身为通过。如果您在自定义操作器上使用此依赖类,则需要将此属性添加到操作器类中。使用此依赖类的内置操作器类(包括传感器及其所有子类)已具备此属性,因此不受影响。

操作符类中的deps属性应该是一个类级别属性 (#21815)

为了支持操作符映射(AIP 42),操作符类上的deps属性必须在类级别定义为集合。这意味着如果自定义操作符将其实现为实例级变量,则无法用于操作符映射。这不会影响现有代码,但我们强烈建议您重构操作符的依赖逻辑以支持新功能。

弃用说明:Connection.extra 必须为JSON编码的字典 (#21816)

太长不看版

从Airflow 3.0开始,airflow连接中的extra字段必须是一个JSON编码的Python字典。

是什么、为什么以及何时使用?

Airflow的Connection用于存储凭证。对于不适合存储在用户/密码/主机/模式/端口中的信息,我们提供了extra字符串字段。其设计初衷始终是为了存储任意键值对,例如SSH钩子中的no_host_key_check,或GCP中的keyfile_dict

但由于该字段是字符串类型,从技术上讲允许存储任何字符串值。例如,有人可能存储了字符串值'my-website.com'并在hook中使用它。但这是非常糟糕的做法。一个原因是可理解性:当你查看extra的值时,你完全不知道它的用途是什么。更好的做法是存储{"api_host": "my-website.com"},这样至少能告诉你关于这个值的一些信息。另一个原因是可扩展性:如果将API主机存储为简单的字符串值,当你需要添加更多信息(如API端点或凭据)时会发生什么?那时你将需要将字符串转换为字典,这将是一个破坏性变更。

基于这些原因,从Airflow 3.0开始,我们将要求Connection.extra字段存储一个JSON编码的Python字典。

我会受到什么影响?

对于使用Airflow代码库中包含的提供程序的用户,您无需进行任何更改,因为在Airflow代码库中,我们不允许钩子以这种方式滥用Connection.extra字段。

但是,如果您有任何自定义钩子存储的不是JSON字典,您将需要更新它。 如果这样做,每当检索或实例化此连接时(例如,它应该出现在任务日志中),您应该会看到警告。

要查看是否有需要更新的连接,可以运行以下命令:

airflow connections export - 2>&1 >/dev/null | grep 'non-JSON'

这将捕获任何关于连接存储非JSON编码的Python字典到extra字段中的警告。

默认视图设置中的tree已更名为grid (#22167)

如果将配置选项dag_default_viewDAG()default_view参数设置为tree,您需要更新部署。旧名称仍可使用但会发出警告。

数据库配置已移至新章节 (#22284)

以下配置已从[core]迁移至新的[database]部分。但在读取新选项时,系统仍会检查旧选项是否存在。若发现旧选项,将发出DeprecationWarning警告并继续使用旧选项。

  • sql_alchemy_conn

  • sql_engine_encoding

  • sql_engine_collation_for_ids

  • sql_alchemy_pool_enabled

  • sql_alchemy_pool_size

  • sql_alchemy_max_overflow

  • sql_alchemy_pool_recycle

  • sql_alchemy_pool_pre_ping

  • sql_alchemy_schema

  • sql_alchemy_connect_args

  • load_default_connections

  • 最大数据库重试次数

移除自定义连接UI字段必须添加前缀的要求 (#22607)

钩子可以通过实现方法get_connection_form_widgets为其连接类型定义自定义连接字段。这些自定义字段在Web界面中显示为额外的连接属性,但在内部它们存储在连接的extra字典字段中。由于技术原因,以前当存储在extra字典中时,自定义字段的字典键必须采用extra__ type>__ name>的形式。这导致在UI之外定义连接更加繁琐,因为前缀extra__ type>__使其更难阅读和使用。通过#22607,我们现在可以让您定义自定义字段,使得它们可以在没有前缀的情况下从extra中读取和存储。

要实现这一点,请更新get_connection_form_widgets方法返回的字典,从键名中移除前缀。在内部,providers管理器仍会使用前缀来确保每个自定义字段全局唯一,但返回的widget字典中不包含前缀将向Web UI发出信号,使其读取和存储不带前缀的自定义字段。请注意,这只是Web UI行为的改变;当以这种方式更新您的hook时,必须确保您的hook在读取extra字段时,也会检查带前缀的值以保持向后兼容性。

webserver.X_FRAME_ENABLED 配置现在按照描述正常工作 (#23222)。

在Airflow 2.0.0 - 2.2.4版本中,webserver.X_FRAME_ENABLED参数的功能与其描述相反, 将值设为"true"会导致"X-Frame-Options"头设置为"DENY"(不允许Airflow在iframe中使用)。 当设为"false"时,该头不会被添加,因此Airflow可以被嵌入iframe中。默认情况下Airflow不能被嵌入iframe。

在Airflow 2.2.5版本中引入了一个bug,导致无法禁用Airflow在iframe中运行。无论配置如何设置,都可以将Airflow嵌入到iframe中。

Airflow 2.3.0 恢复了该参数的原始含义。如果设置为"true"(默认值),Airflow可以嵌入iframe中(不添加头部信息);当设置为"false"时,将添加头部信息且Airflow无法嵌入iframe。

新功能

  • 添加动态任务映射 (AIP-42)

  • 新的网格视图(Grid View)取代了树状视图(Tree View) (#18675)

  • Python操作符中的模板化requirements.txt (#17349)

  • 允许重用装饰过的任务 (#22941)

  • 将数据库配置移至新章节 (#22284)

  • 添加 SmoothOperator (#22813)

  • 使操作器的execution_timeout可配置 (#22389)

  • 事件时间表 (#22332)

  • 支持使用自定义ti_deps规则进行dag序列化 (#22698)

  • 支持在任务日志视图中下载日志 (#22804)

  • 支持在失败时继续回填 (#22697)

  • 添加 dag-processor 命令行命令 (#22305)

  • 增加在LDAP模式下创建用户的功能 (#22619)

  • 为定时任务添加 ignore_first_depends_on_past 参数 (#22491)

  • 更新基础传感器操作器以支持XCOM返回值 (#20656)

  • 在UI触发界面中添加运行ID选项 (#21851)

  • 为连接启用JSON序列化 (#19857)

  • 为DAG批量更新添加REST API端点 (#19758)

  • 在点击DagRun界面添加队列按钮。(#21555)

  • list-import-errors添加到airflow dags命令中 (#22084)

  • 如果standalone_dag_processor配置为True,则将回调存储在数据库中。(#21731)

  • 添加 LocalKubernetesExecutor (#19729)

  • 添加 celery.task_timeout_error 指标 (#21602)

  • Airflow db downgrade 命令行界面命令 (#21596)

  • 添加 ALL_SKIPPED 触发规则 (#21662)

  • 新增 db clean CLI 命令用于清理旧数据 (#20838)

  • 添加 celery_logging_level (#21506)

  • 支持为DAG文件解析设置不同的超时值 (#21501)

  • 支持生成用于升级的SQL脚本 (#20962)

  • 添加压缩序列化DAG数据的选项 (#21332)

  • 分支Python操作符装饰器 (#20860)

  • 向Dag视图添加审计日志视图 (#20733)

  • 为失败的SLA回调通知添加缺失的StatsD指标 (#20924)

  • ShortCircuitOperator添加可配置性以支持下游触发规则 (#20044)

  • 允许在Web服务器页面标题中使用Markup (#20888)

  • 新增监听器插件API,用于追踪TaskInstance状态变更 (#20443)

  • 添加上下文变量钩子以注入更多环境变量 (#20361)

  • 添加一个按钮将所有任务设置为跳过状态 (#20455)

  • 清理待处理的pod (#20438)

  • 在用户界面中添加配置以警告公开部署暴露问题 (#18557)

  • 日志文件名模板记录 (#20165)

  • 新增了Windows扩展支持 (#16110)

  • 显示Airflow中下一次dag_run的预估时间 (#20273)

  • 在用户界面上扩展配置窗口 (#20052)

  • 向CLI添加显示DAG依赖关系功能 (#19985)

  • 为 'airflow dags reserialize' 添加命令行界面命令 (#19471)

  • 为Pool模式(REST API)添加缺失的描述字段 (#19841)

  • 引入DagRun操作,将状态更改为排队中。(#19353)

  • 添加DAG运行详情页面 (#19705)

  • 为CLI工具添加角色导出/导入功能 (#18916)

  • /dags端点添加dag_id_pattern参数 (#18924)

改进

  • 在UI中显示schedule_interval/timetable的描述 (#16931)

  • 在DAG运行视图中新增了duration列 (#19482)

  • 支持使用不带前缀的自定义连接额外字段 (#22607)

  • 将完成计数器初始化为零 (#23080)

  • 改进可选provider功能消息的日志记录 (#23037)

  • 在resolve_template_files中提供更有意义的错误信息 (#23027)

  • 更新ImportError条目而非删除并重新创建它们 (#22928)

  • 为数据库重置命令添加选项 --skip-init (#22989)

  • 支持从扩展名为“.yml”的文件导入连接 (#22872)

  • 支持在.airflowignore文件中使用glob语法 (#21392) (#22051)

  • 当数据为单页时隐藏分页 (#22963)

  • 支持在网页界面中对DAG进行排序 (#22671)

  • has_access装饰器的速度提升约200毫秒 (#22858)

  • 将XComArg添加到Airflow模块的延迟导入列表 (#22862)

  • 向REST API dags/dag_id/details端点添加更多字段 (#22756)

  • 在用户界面中不显示无关/重复/“内部”任务属性 (#22812)

  • 无需在当前状态加载整个ti (#22764)

  • 修复Pickle dag异常字符串问题 (#22760)

  • 改进对LocalExecutor并行度选项的验证 (#22711)

  • 将回填异常日志记录到Sentry (#22704)

  • 在回填期间对MySQL死锁进行重试提交 (#22696)

  • 向REST API获取DAG(dags/dag_id)端点添加更多字段 (#22637)

  • 使用时间表生成当前年份的计划天数 (#22055)

  • 禁用Celery工作器的连接池 (#22493)

  • 在触发DAG视图中使日期选择器标签可见 (#22379)

  • 在airflow变量中暴露try_number (#22297)

  • 新增通用连接类型 (#22310)

  • 在任务实例完成日志消息中添加更多字段 (#22262)

  • 如果调度程序未运行,则暂停自动刷新 (#22151)

  • 显示DagModel详情。(#21868)

  • 为PythonVirtualenvOperator添加pip_install_options参数 (#22158)

  • 显示airflow dags list CLI命令的导入错误 (#21991)

  • 当页面隐藏时暂停自动刷新 (#21904)

  • 默认参数类型检查 (#21809)

  • 增强XComArg上的魔术方法以提升用户体验 (#21882)

  • py文件在refresh_dag中不需要检查is_zipfiles (#21926)

  • 修复 TaskDecorator 的类型提示 (#21881)

  • 为变量添加"显示记录"选项 (#21342)

  • 尽可能使用数据库以加快airflow dag子命令的执行速度 (#21793)

  • REST API: 在任务实例中添加渲染字段。(#21741)

  • 将默认认证后端更改为会话 (#21640)

  • 在解析时不检查py DAG文件是否被压缩 (#21538)

  • 将XCom实现切换为使用run_id (#20975)

  • 浏览视图上的操作日志 (#21569)

  • 实现多个API认证后端 (#21472)

  • 修改get_connection()中连接信息的日志级别详情 (#21162)

  • 在airflow数据库shell中支持mssql (#21511)

  • 支持为celery配置worker_enable_remote_control (#21507)

  • CgroupTaskRunner中记录内存使用情况 (#21481)

  • 现代化DAG相关的URL路由,并将"tree"重命名为"grid" (#20730)

  • 将僵尸检测功能移至 SchedulerJob (#21181)

  • 将运行airflow的速度提升6倍 (#21438)

  • 添加更多SQL模板字段渲染器 (#21237)

  • 简化 fab 的访问查询 (#19294)

  • 仅为默认方法记录日志上下文 (#21244)

  • 仅当至少有一个触发器运行时才记录触发器状态 (#21191)

  • 在提供者中添加可选功能。(#21074)

  • 改进@task.python的多重输出推断功能 (#20800)

  • 改进对字符串类型和非属性 template_fields 的处理 (#21054)

  • 移除不必要的依赖项/版本要求 (#20979)

  • 正确为TaskFlow API指定类型提示的重载 (#20933)

  • 在SlaMiss视图中引入notification_sent (#20923)

  • 将任务装饰器重写为组合形式 (#20868)

  • 在浏览视图中添加“大于/小于或等于”筛选条件 (#20602) (#20798)

  • 在任务命令中重写DAG运行检索 (#20737)

  • 通过优化DagRun的创建流程,将大型DAG(5000+任务)的处理速度提升25%-130%(#20722)

  • 使原生环境具有类似沙箱的Airflow风格 (#20704)

  • 当参数值类型不符合预期时提供更友好的错误提示 (#20648)

  • 在DagRun REST API(列出Dag运行)中添加按状态筛选功能 (#20485)

  • 防止使用自定义日志处理器的任务中出现内存指数级增长问题 (#20541)

  • 在logging Mixin中设置默认日志记录器 (#20355)

  • 减少来自www的弃用警告 (#20378)

  • 在所有使用nvd3.lineChart的图表x轴上添加小时和分钟的时间格式 (#20002)

  • 当任务请求的槽数超过池定义时添加特定警告 (#20178)

  • 用户界面:更新持续时间列以提升可读性 (#20112)

  • 以Viewer角色为例说明公共角色 (#19215)

  • 正确实现DAG参数字典复制 (#20216)

  • ShortCircuitOperator 通过返回python_callable结果推送XCom (#20071)

  • 为因Dagrun超时而被终止的任务添加清晰的日志记录 (#19950)

  • 修改僵尸进程检测消息的日志级别 (#20204)

  • 改进确认提示 (#20183)

  • 仅执行运行中DagRun的TIs (#20182)

  • 检查并在必要时运行命令中的迁移 (#18439)

  • 仅当存在僵尸进程时记录日志 (#20118)

  • 增加电子邮件和用户名的长度 (#19932)

  • 在用户界面中为TI添加更多筛选选项 (#19910)

  • 根据连接类型动态启用"测试连接"按钮 (#19792)

  • 避免HA调度器在Postgres服务器日志中产生"无法获取锁"的杂乱信息 (#19842)

  • Connection.get_hook参数重命名,使其与SqlSensorSqlOperator中的命名保持一致。(#19849)

  • 在SqlSensor中使用PR #18718的最新更改添加hook_params参数。(#18431)

  • 通过延迟provider初始化来加速webserver启动时间 (#19709)

  • 在PythonOperator中可配置XCOM值的日志记录 (#19378)

  • 最小化生产环境的js文件 (#19658)

  • BaseSqlOperator中添加hook_params (#18718)

  • 向哈希组件添加缺失的“end_date” (#19281)

  • 优化airflow插件命令的输出显示 + 添加时间表功能 (#19298)

  • 添加传感器默认超时配置 (#19119)

  • 更新taskinstance REST API模式以包含dag_run_id字段 (#19105)

  • 在bash操作符中添加功能,将用户定义的环境变量追加到系统环境变量中 (#18944)

  • 重复连接:在创建连接前添加了检查连接ID是否已存在的逻辑 (#18161)

Bug修复

  • 使用继承的 'trigger_tasks' 方法 (#23016)

  • 在DAG依赖检测器中,使用类类型而非类名称 (#21706)

  • 修复了schedule_after_task_execution错误跳过任务的问题 (#23181)

  • 修复X-Frame启用行为 (#23222)

  • 根据模式(REST API),允许连接负载中的extra可为空。(#23183)

  • 修复网页界面中用于DAG级别访问检查的dag_id提取问题 (#23015)

  • 修复UI界面上日志的时区显示问题 (#23075)

  • 在图形错误中包含消息 (#23021)

  • 更改触发器下拉菜单左侧位置 (#23013)

  • 不要为遗留的DAG运行添加计划任务 (#23007)

  • 为TaskInstance引用添加悬空行检查 (#22924)

  • 在连接CLI命令中验证输入参数 (#22688)

  • 修复触发器事件负载未持久化到数据库的问题 (#22944)

  • 在命令 db reset 中删除"airflow moved"表 (#22990)

  • 为任务组工具提示添加最大宽度 (#22978)

  • external_task_ids添加模板支持。(#22809)

  • 允许 DagParam 保存假值 (#22964)

  • 修复池指标中的回归问题 (#22939)

  • 即使在使用资源池时也能优先排序任务 (#22483)

  • 从延迟恢复时不清除XCom (#22932)

  • 处理get_logs_with_metadata endpoint中的无效JSON元数据。(#22898)

  • 修复与dag_run相关的悬挂行预升级检查 (#22850)

  • 修复了回填与调度程序的干扰问题 (#22701)

  • 支持为回填运行配置参数覆盖 (#22837)

  • PoolSlotsAvailableDep状态中正确插值池名称 (#22807)

  • 修复 email_on_failurerender_template_as_native_obj 的问题 (#22770)

  • 修复DagFileProcessorManager上的处理器清理问题 (#22685)

  • 防止任务实例的元名称冲突 (#22783)

  • 移除甘特图的JSON解析 (#22780)

  • 检查缺失的dagrun应知晓版本 (#22752)

  • 修复 ScheduleInterval 规范 (#22635)

  • 修复非运行中和未提交任务的任务状态 (#22410)

  • 即使在DEBUG级别也不记录hook连接详细信息 (#22627)

  • 修复当从kubernetes客户端接收到空日志时导致崩溃的问题 (#22566)

  • 修复时区变更相关的bug (#22525)

  • 修复当某个任务有结束日期时整个DAG停止运行的问题 (#20920)

  • 在任务执行期间使用logger打印消息。(#22488)

  • 确保在异常处理期间不会跳过终结器 (#22475)

  • 更新智能传感器文档并对is_smart_sensor_compatible()进行小修复 (#22386)

  • 修复 run_id 在k8s和elasticsearch中与Airflow 2.1的兼容性问题 (#22385)

  • 允许在except_skip上为None,适用于BranchPythonOperator (#20411)

  • 修复错误的日期时间详情(DagRun视图)(#21357)

  • 移除密钥后端中不正确的弃用警告 (#22326)

  • 移除针对K8s令牌刷新的RefreshConfiguration临时解决方案 (#20759)

  • 在GET /connections/ 端点中屏蔽额外信息 (#22227)

  • 在将任务直接提交给执行器时设置queued_dttm (#22259)

  • 修复了讨论 #22233 中提到的教程中的一些问题 (#22236)

  • 将docker装饰器的默认python可执行文件更改为python3 (#21973)

  • 当参数未设置时,不验证Params是否为JSON (#22000)

  • 为每个DAG添加删除权限 (#21938)

  • 修复了在Kubernetes 23库中处理某些None参数的问题。(#21905)

  • 修复了在bulk_write_to_db中处理空(None)标签的问题 (#21757)

  • 修复DAG日期范围错误 (#20507)

  • 从 views.py 中移除了 request.referrer (#21751)

  • DbApiHook使用来自Connection的get_uri (#21764)

  • 修复部分迁移问题 (#21670)

  • 正确地在任务上[反]序列化资源 (#21445)

  • 将参数 dag_id, task_id 等添加到 XCom.serialize_value (#19505)

  • 更新测试连接功能以使用自定义表单字段 (#21330)

  • 修复所有“高危”npm漏洞 (#21526)

  • 修复错误地从角色中移除操作而非权限的bug。(#21483)

  • 修复了FAB/SecurityManager与SQLA 1.4的关系连接错误 (#21296)

  • 在SQLAlchemy 1.4中对MSSQL使用Identity替代Sequence (#21238)

  • 确保on_task_instance_running监听器能够获取任务(#21157)

  • 触发DAG时返回同一位置 (#20955)

  • 修复@task_group中的任务ID去重问题 (#20870)

  • 为部分FAB迁移添加降级功能 (#20874)

  • 仅在触发DAG时验证参数 (#20802)

  • 修复 airflow trigger 命令行界面 (#20781)

  • 修复任务实例在池中的迭代以防止阻塞 (#20816)

  • 允许将整个@task_group作为依赖项 (#20671)

  • 如果任务在延迟后继续执行,则使用原始任务的start_date (#20062)

  • 在任务实例列表视图页面禁用编辑按钮 (#20659)

  • 修复了一个包名导入错误 (#20519) (#20519)

  • 在获取清理pod列表时移除execution_date标签 (#20417)

  • 移除不必要的FAB REST API端点 (#20487)

  • 修复包含斜杠的Cloudwatch日志组ARN的解析问题 (#14667) (#19700)

  • MySQL的TIMESTAMP列完整性检查 (#19821)

  • 允许使用默认的celery命令组与基于Celery的执行器子类。(#18189)

  • class_permission_name移至mixin以便应用于所有类(#18749)

  • 调整trimmed_pod_id并将'.'替换为'-' (#19036)

  • 将custom_headers传递给send_email和send_email_smtp (#19009)

  • 确保在示例DAG中使用catchup=False (#19396)

  • 编辑OpenApi描述文件中的永久链接 (#19244)

  • 从搜索类型提前输入列表中选择时直接导航到DAG (#18991)

  • [次要] 修复主页上的内边距问题 (#19025)

仅文档变更

  • 更新DAG文件处理的文档 (#23209)

  • 将变更日志/更新替换为发布说明,并使用towncrier (#22003)

  • 修复 tracking-user-activity.rst 中的错误引用 (#22745)

  • 从文档中移除对rbac = True的引用 (#22725)

  • 文档:更新执行器绑定依赖项的说明 (#22601)

  • 更新 check-health.rst (#22372)

  • 关于Docker Compose可定制性的更强烈措辞 (#22304)

  • 更新日志任务文档 (#22116)

  • 添加sql_alchemy_connect_args的示例配置 (#22045)

  • 更新最佳实践文档 (#22053)

  • 添加关于DAG暂停/停用/删除的信息 (#22025)

  • 添加您可能需要的集成测试DAG的简要示例 (#22009)

  • 对CHANGELOG运行包容性语言检查 (#21980)

  • 为Sendgrid添加详细的电子邮件文档 (#21958)

  • db upgrade / db downgrade添加文档 (#21879)

  • 更新 modules_management.rst (#21889)

  • 修复关于SqlAlchemy 1.4架构变更的UPDATING章节 (#21887)

  • 更新TaskFlow教程文档,展示如何传递"操作符级别"参数。(#21446)

  • 修复文档 - 将 decreasing 替换为 increasing (#21805)

  • 在文档中添加另一种动态生成DAG的方法 (#21297)

  • 添加关于时间同步所需的额外信息 (#21685)

  • 更新 debug.rst 文档 (#21246)

  • postgres:// 的使用替换为 postgresql:// (#21205)

  • 修复CeleryExecutor文档中的任务执行流程 (#20783)

杂项/内部

  • 恢复已弃用的安全管理器功能 (#23243)

  • DummyOperator的使用替换为EmptyOperator (#22974)

  • 弃用 DummyOperator 改用 EmptyOperator (#22832)

  • 移除不必要的python 3.6条件判断 (#20549)

  • moment 从 2.29.1 升级到 2.29.2 在 /airflow/www (#22873)

  • prismjs 从 1.26.0 升级到 1.27.0 版本于 /airflow/www 目录 (#22823)

  • nanoid 从 3.1.23 升级到 3.3.2 版本于 /airflow/www (#22803)

  • 将/airflow/www中的minimist从1.2.5版本升级至1.2.6 (#22798)

  • 从数据库初始化命令中移除DAG解析 (#22531)

  • 更新我们对执行器绑定依赖的方法 (#22573)

  • 在FAB模型中使用Airflow.Base.metadata (#22353)

  • 限制docutils以使我们的文档再次美观 (#22420)

  • 新增对 Python 3.10 的支持 (#22050)

  • [功能] 添加对K8S 1.22和1.23版本的支持 (#21902)

  • 由于SQLA已升级至1.4+版本,现移除pandas的上限限制 (#22162)

  • 如果使用了旧的postgres方案,则修补sql_alchemy_conn (#22333)

  • 防止意外误用 XCom.get_value() (#22244)

  • 为迁移排序文件名 (#22168)

  • 不要尝试为Celery表自动生成迁移 (#22120)

  • 需要SQLAlchemy 1.4 (#22114)

  • 升级 sphinx-jinja (#22101)

  • 为SQLAlchemy添加兼容性垫片以避免警告 (#21959)

  • xcom.dagrun_id 重命名为 xcom.dag_run_id (#21806)

  • 弃用非JSON格式的conn.extra (#21816)

  • jsonschema的上限版本提升至5.0 (#21712)

  • 弃用辅助工具 days_ago (#21653)

  • 移除`:type`行,现在sphinx-autoapi支持类型提示 (#20951)

  • 在测试中静默弃用警告 (#20900)

  • 在更新任务实例(TIs)状态时(UI和REST API),使用DagRun.run_id替代execution_date (#18724)

  • 向Airflow包添加Context存根 (#20817)

  • 更新Kubernetes库版本 (#18797)

  • PodLauncher 重命名为 PodManager (#20576)

  • 移除了对Python 3.6的支持 (#20467)

  • 为不可JSON序列化的参数添加弃用警告 (#20174)

  • 将TaskMixin重命名为DependencyMixin (#20297)

  • 弃用将execution_date传递给XCom方法 (#19825)

  • 移除 get_readable_dagsget_editable_dagsget_accessible_dags。(#19961)

  • 移除对PostgreSQL 9.6的支持 (#19987)

  • 移除了硬编码的连接类型。检查钩子是否为DbApiHook的实例。(#19639)

  • 添加对Kubernetes 1.21的支持 (#19557)

  • 添加FAB基类并显式设置import_name。(#19667)

  • 移除未使用的状态转换以处理自动变更的视图权限。(#19153)

  • 杂务:使用枚举类型处理 __var__type 成员 (#19303)

  • 使用 fab 模型 (#19121)

  • 统一Airflow安全管理器与FAB默认配置之间的方法名称 (#18726)

  • 移除对Python 3.10中distutils的使用 (#19064)

  • 移除SchedulerJob中冗余的max_tis_per_query初始化 (#19020)

  • 从API中移除已弃用的init_role()用法 (#18820)

  • 移除dbapi钩子中的重复代码 (#18821)

Airflow 2.2.5, (2022-04-04)

重大变更

无重大变更。

Bug修复

  • 检查并禁止sqlite使用相对路径 (#22530)

  • 修复了dask执行器和测试 (#22027)

  • 修复指向Celery文档的损坏链接 (#22364)

  • 修复提供给尝试次数和着陆时间图表的不正确数据 (#21928)

  • 修复未分配触发器的分配问题 (#21770)

  • 修复triggerer --capacity 参数 (#21753)

  • 修复页面加载时的图形自动刷新问题 (#21736)

  • 修复针对目录的文件系统传感器 (#21729)

  • 修复杂散的order_by(TaskInstance.execution_date) (#21705)

  • 正确处理LocalFileSystem密钥中的多个'='符号。(#21694)

  • 在本地执行器中记录异常 (#21667)

  • 在网页界面上禁用default_pool的删除功能 (#21658)

  • 扩展typing-extensions以在python 3.8+中安装 #21566 (#21567)

  • 清理未使用的连接池 (#21565)

  • 修复任务失败时记录JDBC SQL错误的问题 (#21540)

  • 当存在覆盖配置时过滤掉默认配置。(#21539)

  • 修复资源 __eq__ 检查 (#21442)

  • 修复当min_file_process_interval值较高时,max_active_runs=1不调度运行的问题 (#21413)

  • 减少由过时DAG停用导致的数据库负载 (#21399)

  • 修复触发器与调度器之间的竞态条件 (#21316)

  • 修复从任务实例日志视图触发DAG的重定向问题 (#21239)

  • 记录触发异常时的回溯日志 (#21213)

  • 触发器可能会使用连接;请确保我们对密码进行掩码处理 (#21207)

  • 更新 ExternalTaskSensorLink 以处理模板化的 external_dag_id (#21192)

  • 确保 clear_task_instances 设置有效的运行状态 (#21116)

  • 修复:更新自定义连接字段处理 (#20883)

  • 在执行过程中引发的异常将堆栈跟踪截断至DAG用户代码 (#20731)

  • 修复重复触发器创建时的竞态条件 (#20699)

  • 修复任务卡在调度状态的问题 (#19747)

  • 修复:不渲染未定义的图形边 (#19684)

  • 仅当X_FRAME_ENABLED设置为true时,将X-Frame-Options标头设置为DENY。(#19491)

仅文档变更

  • 在回调文档中添加on_execute_callback (#22362)

  • 添加关于指定数据库模式的文档。(#22347)

  • 修复教程中pipeline示例的postgres部分 (#21586)

  • 扩展关于DAG和任务状态的文档,并更新触发规则文档 (#21382)

  • 更新Airflow时需要升级数据库 (#22061)

  • 从文档中移除误导性的MSSQL信息 (#21998)

杂项

  • 将新的Airflow Trove分类器添加到setup.cfg (#22241)

  • 将TriggerRunner中的to_delete重命名为to_cancel (#20658)

  • 将Flask-AppBuilder更新至3.4.5版本 (#22596)

Airflow 2.2.4, (2022-02-22)

重大变更

智能传感器已弃用

智能传感器(Airflow 2中新增的"早期体验"功能)现已弃用,并将在Airflow 2.4.0版本中移除。该功能已被Airflow 2.2.0引入的可延迟操作符所取代。

详情请参阅迁移到可延迟操作器了解如何迁移。

Bug修复

  • 从Flask-Appbuilder添加缺失的登录提供者相关方法 (#21294)

  • 修复由于任务表缺少dag_id索引导致的DAG删除缓慢问题 (#20282)

  • 添加一个会话后端,用于在数据库中存储会话数据 (#21478)

  • 仅显示正在运行的DAG或最近完成的DAG的任务状态 (#21352)

  • 在日志处理器中使用兼容数据间隔垫片 (#21289)

  • 修复生成的run_id与DAG运行逻辑日期不匹配的问题 (#18707)

  • 修复TriggerDagRunOperator额外链接 (#19410)

  • 增加在远程用户模式下创建用户的可能性 (#19963)

  • 避免在重新调度任务时出现死锁 (#21362)

  • 修复DAG首次运行时的错误调度时间 (#21011)

  • 修复当执行缺失DAG的任务实例时调度器崩溃的问题 (#20349)

  • 当DAG标记为失败时,延迟任务不会被取消 (#20649)

  • 移除了Dag.get_task_instances()中重复的dag_run连接 (#20591)

  • 删除DAG时避免意外数据丢失 (#20758)

  • 修复/rendered-k8s视图中的会话使用问题 (#21006)

  • 修复当运行两次时airflow dags backfill --reset-dagruns的错误 (#21062)

  • 不要在refresh_from_task中设置TaskInstance.max_tries (#21018)

  • 在dagrun REST API端点中不再要求body中包含dag_id (#21024)

  • 在内部安全管理器中从Azure OAUTH响应添加角色 (#20707)

  • 如果用户具有DAG“读取”权限,则允许查看DagRuns和TIs (#20663)

  • 修复运行airflow dags test 命令时,重复执行会导致错误的问题 (#21031)

  • 切换到非供应商的最新连接库 (#20910)

  • 将flask-appbuilder升级至>=3.3.4 (#20628)

  • 将celery升级至5.2.3 (#19703)

  • 将croniter从<1.1升级到<1.2 (#20489)

  • 避免在TaskInstance.get_template_context()中调用DAG.following_schedule() (#20486)

  • 修复(standalone): 移除硬编码的Webserver端口 (#20429)

  • 移除实验性API中不必要的日志记录 (#20356)

  • 取消忽略 DeprecationWarning (#20322)

  • 深度复制Kubernetes Secrets属性导致的问题 (#20318)

  • 修复(dag依赖关系): 修复箭头样式 (#20303)

  • 在任务实例检索锁上添加重试机制 (#20030)

  • 在使用dogstatsd时正确发送时间指标(修复schedule_delay指标)(#19973)

  • 增强multiple_outputs对字典类型的推断功能 (#19608)

  • 修复Amazon SES邮件后端(#18042)

  • 在能够升级Flask/Jinja之前固定MarkupSafe版本 (#21664)

仅文档变更

  • 在DAG运行文档中增加了关于逻辑日期概念的说明 (#21433)

  • 添加关于环境变量优先级的说明 (#21568)

  • 更新错误文档以包含 before_send 选项 (#21275)

  • 增强xcom文档 (#20755)

  • 添加关于“latest”约束的文档和发布策略 (#21093)

  • 在Python API参考中添加指向DAG模型的链接 (#21060)

  • 添加了一个枚举参数示例 (#20841)

  • 比较taskgroup和subdag (#20700)

  • 添加关于保留关键字 params 的说明 (#20640)

  • 改进关于Params的文档 (#20567)

  • 修复MySQL数据库创建代码中的拼写错误(设置数据库文档)(#20102)

  • 添加requirements.txt描述 (#20048)

  • 清理文档中default_args的使用方式 (#19803)

  • 在连接本地主机时添加docker-compose说明 (#19076)

  • 更新教程中的CSV导入代码 (#18960)

  • 添加了Pendulum 1.x -> 2.x 的升级文档 (#18955)

  • 清理文档中的动态start_date值 (#19607)

  • 多池槽位的文档 (#20257)

  • 更新upgrading.rst文件,添加详细的代码示例说明如何解决升级后的警告 (#19993)

杂项

  • 弃用实验性API中的部分函数 (#19931)

  • 弃用智能传感器 (#20151)

Airflow 2.2.3, (2021-12-21)

重大变更

无重大变更。

Bug修复

  • 惰性Jinja2上下文(#20217)

  • 排除 snowflake-sqlalchemy v1.2.5 (#20245)

  • 弃用旧的 importlib.resources API (#19091)

  • setgid作为在分叉任务运行器中执行的第一个命令 (#20040)

  • 修复启动DagProcessorAgent时的竞争条件问题 (#19935)

  • httpx 限制为 <0.20.0 (#20218)

  • 将日志提供程序的导入错误记录为调试警告 (#20172)

  • 提升最低要求的 alembic 版本 (#20153)

  • 修复甘特视图中的日志链接 (#20121)

  • 通过将 chown 移动到使用 sudo 来修复 #19028 (#20114)

  • 解除MarkupSafe的上限限制 (#20113)

  • 修复日志脱敏时的无限递归问题 (#20039)

  • 修复数据库降级问题 (#19994)

  • Context类处理弃用功能 (#19886)

  • 修复可能引用未声明变量的问题 (#19933)

  • 验证DagRun状态在分配时是否有效 (#19898)

  • 修复MSSQL偶发性死锁问题 (#19856)

  • 启用任务运行设置以能够重新初始化 (#19845)

  • 修复相同任务的日志端点 (#19672)

  • 显式转换宏日期时间字符串输入 (#19592)

  • 当任务实例缺失时,不要因堆栈跟踪而崩溃 (#19478)

  • 修复任务日志视图中的日志时区问题 (#19342) (#19401)

  • 修复:在图形视图中添加任务组提示框 (#19083)

  • 在表单和表格中重命名执行日期 (#19063)

  • 简化“无效TI状态”消息 (#19029)

  • 在准备文件路径队列时处理文件不存在的情况 (#18998)

  • 对于存在导入错误的DAG,不要创建dagruns (#19367)

  • 修复在连接类型切换时的字段重新标记问题 (#19411)

  • KubernetesExecutor 如果使用的话应该默认使用模板镜像 (#19484)

  • 修复任务实例API无法列出状态为None的任务实例的问题 (#19487)

  • 修复DagFileProcessor.manage_slas中的IntegrityError (#19553)

  • 将数据间隔字段声明为可序列化 (#19616)

  • 放宽时间表类验证 (#19878)

  • 修复用于查找排队KubernetesExecutor pods的标签 (#19904)

  • 修复了使用MySQL复制时数据迁移检查的问题 (#19999)

仅文档变更

  • 当example_dags缺少依赖时发出无回溯警告 (#20295)

  • 可延迟操作符文档说明 (#20150)

  • 确保示例DAG都能正常运行 (#19355)

  • 在适用的情况下更新核心示例DAG以使用TaskFlow API (#18562)

  • 在任务重试时添加xcom清理行为 (#19968)

  • 新增一个简短章节,重点介绍如何适配连接(connections)的密钥格式(#19859)

  • 添加关于Apache Airflow支持的操作系统信息 (#19855)

  • 更新文档以反映修改base_log_folder需要同步更新其他配置 (#19793)

  • KubernetesExecutor pod模板文档中的免责声明 (#19686)

  • 添加关于execution_date -> run_id的升级说明 (#19593)

  • 在TaskFlow教程文档中扩展.output操作符属性信息 (#19214)

  • 添加示例SLA DAG (#19563)

  • 为修补DAG添加一个合适的示例 (#19465)

  • 将DAG文件处理描述添加到调度器概念 (#18954)

  • 更新TaskFlow API教程文档中的显式参数示例 (#18907)

  • 添加回关于在Python/@task中使用上下文的文档 (#18868)

  • 在REST API中添加端点/字段时增加发布日期 (#19203)

  • 更好的 pod_template_file 示例 (#19691)

  • 添加关于如何自定义镜像入口点的描述 (#18915)

  • Dags-in-image pod模板示例不应包含dag挂载 (#19337)

Airflow 2.2.2 (2021-11-15)

重大变更

无重大变更。

Bug修复

  • 修复检查变量是否存在时的bug (#19395)

  • 修复当relativedelta作为schedule_interval传递时的序列化问题 (#19418)

  • 修复SQL Server中悬挂TaskInstance行的移动问题 (#19425)

  • 修复甘特视图中的任务实例模态框 (#19258)

  • 修复带有集合数据类型的Params序列化问题 (#19267)

  • 在调用.is_alive()前检查job对象是否为None (#19380)

  • 当Pod无法处理时,任务应立即失败 (#19359)

  • 修复数据库迁移的降级问题 (#19390)

  • 仅将SchedulerJobs标记为失败,不包括其他任务 (#19375)

  • 修复“标记为”确认页面上的消息 (#19363)

  • Bug修复:在读取数据间隔前检查下次运行是否存在 (#19307)

  • 修复MySQL数据库迁移时的默认编码/排序问题 (#19268)

  • 修复隐藏工具提示位置 (#19261)

  • sqlite_default 连接已被硬编码为 /tmp,请改用 gettempdir (#19255)

  • 修复DAG代码页面的切换换行功能 (#19211)

  • 在CLI中澄清“未找到DAG”的错误信息 (#19338)

  • 关于schedule_interval添加SLA备注 (#19173)

  • 使用 execution_date 来检查 TriggerDagRunOperator 是否存在现有的 DagRun (#18968)

  • PoolSlotsAvailableDep中添加显式会话参数 (#18875)

  • FAB仍然需要WTForms<3.0 (#19466)

  • 修复当catchup=True时缺失的dagruns问题 (#19528)

仅文档变更

  • 为“timetable”添加缺失的参数文档 (#19282)

  • 改进Kubernetes执行器文档 (#19339)

  • 更新docker文档中使用的镜像标签

Airflow 2.2.1 (2021-10-29)

重大变更

Paramdefault默认值已被移除

Param,在Airflow 2.2.0中引入,意外地将默认值设置为None。该默认值已被移除。如果您希望使用None作为默认值,请明确设置。例如:

Param(None, type=["null", "string"])

现在,如果你解析一个没有默认值的Param且不传递值,将会得到一个TypeError。例如:

Param().resolve()  # raises TypeError

max_queued_runs_per_dag 配置已被移除

max_queued_runs_per_dag 配置选项已从 [core] 部分移除。此前,该选项用于控制调度程序在一个DAG中可创建的排队dagrun数量。现在,最大数量由DAG内部的 max_active_runs 参数控制。

Bug修复

  • 修复 SchedulerJob 中的意外提交错误 (#19213)

  • 将DagRun.logical_date添加为属性 (#19198)

  • 在任务完成时清除 ti.next_methodti.next_kwargs (#19183)

  • 更快的PostgreSQL数据库迁移到Airflow 2.2 (#19166)

  • 移除Swagger2Specification._set_defaults类方法中错误的类型注释 (#19065)

  • 将TriggererJob添加到jobs检查命令中 (#19179, #19185)

  • 当下次运行时为None时隐藏工具提示 (#19112)

  • 创建带有数据间隔兼容层的TI上下文 (#19148)

  • 修复排队中的DAG运行改变了catchup=False行为的问题 (#19130, #19145)

  • 当DAG或任务完成时,向日志添加详细信息。(#19097)

  • 关于不支持Python 3.10的警告 (#19060)

  • 通过使用max_active_runs限制排队dagrun的创建来修复catchup (#18897)

  • 防止当序列化的DAG缺失时调度器崩溃 (#19113)

  • 不要为其他数据库安装SQLAlchemy/Pendulum适配器 (#18745)

  • 解决 libstdcpp 的 TLS 错误 (#19010)

  • dsts等改回使用逻辑日期(#19088)

  • 确保任务状态在被标记为失败/成功/跳过时不会改变 (#19095)

  • 放宽打包要求 (#19087)

  • 将触发器页面标签重命名为逻辑日期 (#19061)

  • 允许Param支持默认值为None (#19034)

  • 从数据库反序列化时升级旧的DAG/任务参数格式 (#18986)

  • 不要将ENV和_cmd硬编码到非sudo的临时配置中 (#18772)

  • CLI: 如果缺少参数,在加载DAGs之前使backfill命令失败 (#18994)

  • Bug修复:插入到task_fail时执行日期为空值违反NOT NULL约束 (#18979)

  • 尝试在数据库升级中移动"悬挂"行 (#18953)

  • SchedulerJob._process_executor_events中的行锁TI查询 (#18975)

  • Sentry发送前的回退机制 (#18980)

  • 修复Airflow 2.2.0中的XCom.delete错误 (#18956)

  • 在启动触发器之前检查Python版本 (#18926)

仅文档变更

  • 更新TaskInstances和DagRuns的访问控制文档 (#18644)

  • 添加关于托管Postgres的keepalives信息 (#18850)

  • 文档:为日志记录与监控添加回调函数章节 (#18842)

  • 将PATCH DAGrun与其他DAGRun端点分组 (#18885)

Airflow 2.2.0 (2021-10-11)

重大变更

注意:将数据库升级至2.2.0或更高版本可能需要较长时间才能完成,特别是当您拥有庞大的task_instance表时。

worker_log_server_port 配置已移至 logging 部分。

配置选项 worker_log_server_port 已从 [celery] 部分移至 [logging] 部分,以便在不同执行器之间复用。

pandas 现在是可选依赖项

之前pandas是一个核心依赖项,因此当你运行pip install apache-airflow时,它会检查pandas库是否存在,如果不存在则会安装它。

如果您想安装与Airflow兼容的pandas,可以在安装Airflow时使用[pandas]扩展包,以下是Python 3.8和Airflow 2.1.2的示例:

pip install -U "apache-airflow[pandas]==2.1.2" \
  --constraint https://raw.githubusercontent.com/apache/airflow/constraints-2.1.2/constraints-3.8.txt"

none_failed_or_skipped 触发规则已被弃用

TriggerRule.NONE_FAILED_OR_SKIPPED 已被 TriggerRule.NONE_FAILED_MIN_ONE_SUCCESS 替代。 这仅是名称变更,功能未作任何改动。 此变更向后兼容,但 TriggerRule.NONE_FAILED_OR_SKIPPED 将在下一个主要版本中被移除。

Dummy触发规则已被弃用

TriggerRule.DUMMY 已被 TriggerRule.ALWAYS 取代。 这仅是名称变更,功能未作任何修改。 该变更向下兼容,但 TriggerRule.DUMMY 将在下一个主要版本中移除。

DAG并发设置已重命名

[core] dag_concurrency 配置项在 airflow.cfg 中已更名为 [core] max_active_tasks_per_dag,以便更易于理解。

这是每个DAG中允许并发运行的最大任务实例数。要计算一个DAG当前并发运行的任务数,需要将该DAG所有运行实例中正在执行的任务数相加。

这可以在DAG级别通过max_active_tasks进行配置,并且可以在airflow.cfg中设置默认值,如 [core] max_active_tasks_per_dag

之前:

[core]
dag_concurrency = 16

当前时间:

[core]
max_active_tasks_per_dag = 16

类似地,DAG.concurrency已被重命名为DAG.max_active_tasks

之前:

dag = DAG(
    dag_id="example_dag",
    start_date=datetime(2021, 1, 1),
    catchup=False,
    concurrency=3,
)

当前:

dag = DAG(
    dag_id="example_dag",
    start_date=datetime(2021, 1, 1),
    catchup=False,
    max_active_tasks=3,
)

如果您正在使用DAGs详情API端点,请使用max_active_tasks而非concurrency

任务并发参数已被重命名

BaseOperator.task_concurrency 已被弃用并重命名为 max_active_tis_per_dag 以便更好地理解。

该参数控制每个任务在dag_runs中并发运行的任务实例数量。

之前:

with DAG(dag_id="task_concurrency_example"):
    BashOperator(task_id="t1", task_concurrency=2, bash_command="echo Hi")

之后:

with DAG(dag_id="task_concurrency_example"):
    BashOperator(task_id="t1", max_active_tis_per_dag=2, bash_command="echo Hi")

processor_poll_interval 配置已更名为 scheduler_idle_sleep_time

[scheduler] processor_poll_interval 配置项在 airflow.cfg 中已更名为 [scheduler] scheduler_idle_sleep_time,以便更易于理解。

它控制在SchedulerJob内部没有安排任何任务时,调度器循环结束时的"休眠时间"。

之前:

[scheduler]
processor_poll_interval = 16

当前:

[scheduler]
scheduler_idle_sleep_time = 16

标记成功/失败会自动清除下游失败任务

在图形视图中将任务标记为成功/失败时,其处于失败/上游失败状态的下游任务会自动被清除。

[core] store_dag_code 已被移除

虽然DAG序列化是自Airflow 2以来的严格要求,但我们允许用户控制在显示代码视图时Webserver的查找位置。

如果[core] store_dag_code设置为True,调度器会将DAG文件中的代码以纯文本形式存储在数据库的dag_code表中,而网页服务器则从同一表中读取。如果该值设为False,网页服务器会直接从DAG文件中读取。

虽然这个设置在Airflow 2之前的版本中是有意义的,但它给一些用户带来了困惑,他们认为这个设置控制了DAG序列化。

从 Airflow 2.2 开始,Airflow 仅在用户点击 DAG 的代码视图时才会查找数据库。

清除正在运行的任务会将其状态设置为 RESTARTING

之前,清除正在运行的任务会将其状态设置为SHUTDOWN。该任务会被终止并进入FAILED状态。在#16681之后,清除正在运行的任务会将其状态设置为RESTARTING。该任务有资格重试而无需进入FAILED状态。

移除 TaskInstance.log_filepath 属性

该方法长期以来返回的值不正确,因为它没有考虑不同的日志配置和任务重试。我们还开始支持不使用文件的更高级工具,因此在某些情况下无法确定正确的文件路径,例如Stackdriver不使用文件而是基于标签识别日志。出于这个原因,我们决定删除此属性。

如果需要读取日志,可以使用airflow.utils.log.log_reader.TaskLogReader类,它没有上述限制。

如果传感器超时,将不会重试

之前,当传感器超时时会进行重试,直到retries重试次数耗尽。因此传感器的有效超时时间为timeout * (retries + 1)。现在这一行为已更改。如果达到timeout超时时间,传感器将立即失败而不会重试。如果需要让传感器运行更长时间,请设置更大的timeout超时值。

默认任务池槽位数可通过 [core] default_pool_task_slot_count 设置

默认情况下,任务在default_pool中运行。default_pool初始化为128个槽位,用户可以通过UI/CLI/API为现有部署更改槽位数量。

对于新部署,您可以在[core]部分使用default_pool_task_slot_count设置。该设置在已存在default_pool的现有部署中将不会产生任何效果。

之前这是由non_pooled_task_slot_count[core]部分控制的,但该参数未被记录在文档中。

Webserver DAG刷新按钮已移除

由于DAG解析器现在同步DAG权限,不再需要手动刷新DAG。因此,从用户界面中移除了刷新DAG的按钮。

此外,/refresh/refresh_all 这两个网页服务器端点也已被移除。

TaskInstances 现在需要一个 DagRun

在正常操作下,数据库中的每个TaskInstance行都应该有一个对应的DagRun行,但有可能手动删除DagRun后,Airflow仍会调度这些TaskInstances。

在Airflow 2.2中我们对此进行了更改,现在有一个数据库级的外键约束确保每个TaskInstance都有一条DagRun记录。

在升级到2.2版本之前,如果您有任何"悬空"的TaskInstance记录,您需要手动解决任何不一致问题(重新添加DagRun行,或删除TaskInstances)。

作为此次变更的一部分,[scheduler] 配置节下的 clean_tis_without_dagrun_interval 配置选项已被移除且不再生效。

TaskInstance 和 TaskReschedule 现在定义 run_id 而不是 execution_date

作为TaskInstance-DagRun关系变更的一部分,TaskInstance和TaskReschedule中的execution_date列已从数据库中移除,并在ORM层替换为association proxy字段。如果您直接访问Airflow的元数据库,应该重写实现以改用run_id列。

请注意,Airflow在数据库和ORM层面的元数据库定义被视为实现细节,不提供严格的向后兼容性保证。

DaskExecutor - Dask工作器资源与队列

如果dask工作节点启动时未配置与指定队列相匹配的补充资源,现在将引发AirflowException异常,而在此之前系统会直接忽略queue参数。

从网页界面触发的DAG运行逻辑日期现在将其亚秒级部分设置为零

由于手动触发DAG运行时逻辑日期(execution_date)生成方式的变更,手动触发的DAG运行其逻辑日期可能与实际触发时间不完全匹配,而是会将毫秒部分归零。例如,在2021-10-11T12:34:56.78901触发的DAG运行,其逻辑日期会被设置为2021-10-11T12:34:56.00000

这可能会影响某些依赖此特性来判断运行是手动触发还是自动触发的逻辑。请注意,dag_run.run_type是用于此目的的更权威值。此外,如果您需要在"下次执行日期"计算中区分自动触发和手动触发的运行,请考虑改用新的数据间隔变量,这些变量在两种运行类型之间提供了更一致的行为。

新功能

  • AIP-39: 为Airflow添加(可自定义的)Timetable类以实现更丰富的调度行为 (#15397, #16030, #16352, #17030, #17122, #17414, #17552, #17755, #17989, #18084, #18088, #18244, #18266, #18420, #18434, #18421, #18475, #18499, #18573, #18522, #18729, #18706, #18742, #18786, #18804)

  • AIP-40: 添加可延迟的"异步"任务 (#15389, #17564, #17565, #17601, #17745, #17747, #17748, #17875, #17876, #18129, #18210, #18214, #18552, #18728, #18414)

  • 添加Docker Taskflow装饰器 (#15330, #18739)

  • 添加Airflow Standalone命令 (#15826)

  • 在仪表盘上显示来自本地设置的警报消息 (#18284)

  • 使用json-schema的高级参数(#17100)

  • 能够通过UI界面或API测试连接 (#15795, #18750)

  • 在用户界面中添加下次运行时间 (#17732)

  • 添加默认权重规则配置选项 (#18627)

  • 添加一个日历字段,用于在触发DAG时选择执行日期 (#16141)

  • 允许为BashOperator设置特定的cwd (#17751)

  • 在DAG视图中显示导入错误 (#17818)

  • 添加执行前后钩子 [实验性] (#17576)

  • 在Airflow界面的管理员选项卡下新增了查看提供商的表格 (#15385)

  • 在provider yaml中添加了secrets后端/日志记录/认证信息 (#17625)

  • 向Jinja环境添加日期格式过滤器 (#17451)

  • 引入 RESTARTING 状态 (#16681)

  • Webserver: 手动触发时取消暂停DAG (#16569)

  • 创建新用户的API端点 (#16609)

  • 添加 insert_args 以支持传输替换 (#15825)

  • 为文件系统传感器中的glob添加递归标志 (#16894)

  • 将连接添加到jinja模板上下文 (#16686)

  • TaskGroup 添加 default_args (#16557)

  • 允许从用户界面添加重复连接 (#15574)

  • 允许通过CORS配置选项指定多个URL (#17941)

  • 实现用于DAG删除的API端点 (#17980)

  • 添加用于标记DAG运行成功或失败的DAG运行端点(#17839)

  • 新增支持 kinit 选项 [-f|-F][-a|-A] (#17816)

  • 支持使用Dask Worker资源为DaskExecutor提供队列功能 (#16829, #18720)

  • 使自动刷新间隔可配置 (#18107)

改进

  • Airflow UI的小幅改进 (#18715, #18795)

  • processor_poll_interval 重命名为 scheduler_idle_sleep_time (#18704)

  • 检查日志级别的允许值 (#18651)

  • 修复了使用dagrun_conf触发不存在的dag时出现的错误 (#18655)

  • TaskInstanceModelView添加批量删除操作 (#18438)

  • 在清理数据库安装期间避免导入DAGs (#18450)

  • 需要具备DAG的can_edit权限才能修改TaskInstances和DagRuns (#16634)

  • 使Kubernetes作业描述适配单行日志显示 (#18377)

  • 如果任务实例状态为null或未定义,始终绘制边框 (#18033)

  • 包容性语言 (#18349)

  • 改进僵尸任务的日志处理 (#18277)

  • 添加 Variable.update 方法并改进变量键冲突检测 (#18159)

  • 在触发DAG页面添加关于参数的说明 (#18166)

  • TaskInstanceTaskReschedule 的主键从 execution_date 改为 run_id (#17719)

  • BaseOperator.chain()中添加对TaskGroup的支持 (#17456)

  • 允许在REST API中通过标签筛选DAGS (#18090)

  • 优化Providers Manager的导入 (#18052)

  • 增加了对不兼容社区提供者的警告功能 (#18020)

  • 序列化 template_ext 属性以在用户界面中显示 (#17985)

  • 添加 robots.txtX-Robots-Tag 头信息 (#17946)

  • 重构 BranchDayOfWeekOperator, DayOfWeekSensor (#17940)

  • 更新错误信息以引导用户主要进行自助解决 (#17929)

  • 升级至 Celery 5 (#17397)

  • 添加指向提供商文档的链接 (#17736)

  • 移除Marshmallow模式警告 (#17753)

  • 将触发器规则 none_failed_or_skipped 重命名为 none_failed_min_one_success (#17683)

  • 移除 [core] store_dag_code 并使用数据库获取DAG代码 (#16342)

  • task_concurrency 重命名为 max_active_tis_per_dag (#17708)

  • 在providers管理器中延迟单独导入Hooks (#17682)

  • 为外部任务传感器添加对多个任务ID的支持 (#17339)

  • 在airflow任务运行命令中将execution_date替换为run_id (#16666)

  • 使用户命令行工具的输出更加一致 (#17642)

  • 在原位置打开相对额外链接 (#17477)

  • worker_log_server_port选项移至日志记录部分 (#17621)

  • 使用gunicorn来提供由worker生成的日志 (#17591)

  • 改进Group id的验证 (#17578)

  • 简化404页面 (#17501)

  • 添加XCom.clear功能,使其可在自定义XCom后端中挂接 (#17405)

  • SubDagOperator添加弃用通知 (#17488)

  • 支持在调度器和运行器上DAGS文件夹位于不同位置 (#16860)

  • 移除/dagrun/create并禁用由F.A.B生成的编辑表单 (#17376)

  • 支持在template_fields_renderers中指定字典路径 (#17321)

  • 如果缺少virtualenv则提前报错 (#15788)

  • 处理添加到Extra和自定义字段的连接参数(#17269)

  • 修复 airflow celery stop 以接受 pid 文件。(#17278)

  • 移除DAG刷新按钮 (#17263)

  • 弃用 dummy trigger 规则,改用 always (#17144)

  • 详细说明导入airflow_local_settings失败的原因 (#17195)

  • BashOperator失败时,在AirflowException字符串中包含退出代码。(#17151)

  • 为chain()添加EdgeModifier支持 (#17099)

  • 仅允许在自定义连接中使用受支持的字段类型 (#17194)

  • Secrets 后端故障转移 (#16404)

  • 当使用 SQLiteSequentialExecutor 时在Webserver上发出警告 (#17133)

  • 扩展在pod_override中定义的init_containers (#17537)

  • 客户端过滤DAG依赖项 (#16253)

  • 改进CLI中的执行器验证 (#17071)

  • 防止并行运行 airflow db init/upgrade 迁移和设置。(#17078)

  • 更新 chain()cross_downstream() 以支持 XComArgs (#16732)

  • 改进图形视图刷新功能 (#16696)

  • 当任务实例因异常失败时,记录日志 (#16805)

  • serve-logsLocalExecutor设置进程标题 (#16644)

  • test_cycle 重命名为 check_cycle (#16617)

  • 将schema添加为DbApiHook实例属性 (#16521, #17423)

  • 提升与MSSQL的兼容性 (#9973)

  • 为不支持的连接类型增加透明度 (#16220)

  • 基于资源调用fab方法 (#16190)

  • 格式化更多带时区的日期 (#16129)

  • 将已弃用的 dag.sub_dag 替换为 dag.partial_subset (#16179)

  • AirflowSensorTimeout视为立即失败而不重试 (#12058)

  • 标记成功/失败状态会自动清除下游失败任务 (#13037)

  • 为导入DAG错误添加关闭/打开指示器 (#16073)

  • 添加可折叠的导入错误 (#16072)

  • 始终在TI的action_clear视图中返回响应 (#15980)

  • 新增通过邮箱删除用户的命令行接口命令 (#15873)

  • 为FAB权限使用资源和操作名称 (#16410)

  • 重命名DAG并发设置([core] dag_concurrency)以便于理解(#16267, #18730)

  • 日历界面改进 (#16226)

  • 重构:SKIPPED状态不应再次记录为SUCCESS (#14822)

  • 移除对dnspython的版本限制 (#18046, #18162)

  • 在TriggerDagRunOperator中接受自定义运行ID (#18788)

Bug修复

  • 使REST API的用户补丁端点与UI的工作方式一致 (#18757)

  • 为已清除的任务正确设置 start_date (#18708)

  • 在运行状态更新前确保task_instance存在(REST API) (#18642)

  • AirflowDateTimePickerWidget设为必填字段 (#18602)

  • 在删除旧渲染任务字段时重试死锁事务 (#18616)

  • 修复当重试延迟为零时retry_exponential_backoff除以零的错误 (#17003)

  • 改进用户界面处理日期时间的方式 (#18611, #18700)

  • Bug修复:dag_bag.get_dag 应该返回 None,而不是抛出异常 (#18554)

  • 仅当是有效实例时才显示任务模态框 (#18570)

  • 修复从模板中访问渲染的 {{ task.x }} 属性的问题 (#18516)

  • 添加缺失的电子邮件类型连接 (#18502)

  • 不要使用flash显示“同页面”UI消息。(#18462)

  • 修复任务组工具提示 (#18406)

  • 正确修复dagrun更新状态端点(#18370)

  • 正确处理执行器与调度器之间的任务实例状态差异 (#17819)

  • 修复KubernetesExecutor中卡在"queued"状态的任务 (#18152)

  • 不要永久性地将zip DAGs添加到sys.path (#18384)

  • 修复MSSQL数据库中的随机死锁问题 (#18362)

  • 停用已从文件中移除的DAGs (#17121)

  • 在同步dags到数据库时,移除现在未使用的dag_tag行 (#8231)

  • 错误时优雅地关闭调度程序 (#18092)

  • 修复迷你调度器未遵守wait_for_downstream依赖的问题 (#18338)

  • 将异常传递给run_finished_callback用于Debug Executor (#17983)

  • 使XCom.get_one返回完整值而非缩写值 (#18274)

  • 在task_runner中关闭临时文件时使用try/except (#18269)

  • 如果非空则显示下次运行 (#18273)

  • 修复XCom.set中的数据库会话处理问题 (#18240)

  • 修复手动运行作业时未设置external_executor_id的问题 (#17207)

  • 修复序列化DAG表中压缩DAG的删除问题 (#18243)

  • 在用户添加重复邮箱时返回明确错误 (#18224)

  • 即使最后运行数据为空也移除加载点 (#18230)

  • 交换DAG导入错误下拉图标 (#18207)

  • 迁移配置时自动创建部分 (#16814)

  • 在读取任务日志时默认将编码设置为utf-8 (#17965)

  • 将父DAG权限应用到子DAG (#18160)

  • 将MySQL的id排序规则修改为区分大小写 (#18072)

  • StandardTaskRunner中记录任务启动异常 (#17967)

  • 已对self._error_file应用权限 (#15947)

  • 修复空白DAG依赖视图 (#17990)

  • 为DAG依赖和配置页面添加缺失的菜单访问权限 (#17450)

  • 修复在DateTimeSensor中传递Jinja模板的问题 (#17959)

  • 修复了限制ImportErrors可见性的bug (#17924)

  • Fix grammar in traceback.html (#17942)

  • 修复针对MySQLdb驱动程序的DagRunState枚举查询 (#17886)

  • 修复了“操作”组中的按钮大小问题。(#17902)

  • 仅显示用户可访问的DAG的导入错误 (#17835)

  • 显示所有来自zip文件的import_errors (#17759)

  • 修复EXTRA_LOGGER_NAMES参数及相关文档 (#17808)

  • 为Airflow和gunicorn使用同一个解释器 (#17805)

  • 修复:Mysql 5.7 id utf8mb3 (#14535)

  • 修复 dag_processing.last_duration 指标随机缺失问题 (#17769)

  • 自动为MySQL使用utf8mb3_general_ci排序规则 (#17729)

  • 修复: TaskInstance的过滤条件不生效的问题 #17535 (#17548)

  • 不要在CeleryExecutor.trigger_tasks中使用TaskInstance (#16248)

  • 移除MSSQL升级时的锁定 (#17213)

  • 通过Python调用创建virtualenv (#17156)

  • 确保在运行DAG.cli()时DAG是无环的 (#17105)

  • Translate non-ascii characters (#17057)

  • 修改Nonemodel_list模板中的比较逻辑 (#16893)

  • 确保UI界面和POST /task_instances_state API端点的行为保持一致 (#16539)

  • 确保在缺少SLA时跳过任务 (#16719)

  • 修复直接使用 cached_property 模块的问题 (#16710)

  • 修复TI成功确认页面 (#16650)

  • 修改Python虚拟环境Jinja模板中的返回值检查 (#16049)

  • 修复DAG依赖搜索问题 (#15924)

  • 使自定义JSON编码器支持Decimal (#16383)

  • Bug修复:允许仅使用dag_id和空的subdir来清除任务 (#16513)

  • 在调用测试连接前将端口值转换为数字 (#16497)

  • 处理缺失/空序列化的DAG依赖项 (#16393)

  • 在使用@dag装饰器时正确设置dag.fileloc (#16384)

  • 修复任务实例(TI)成功/失败链接 (#16233)

  • airflow/www/views.py中正确实现自动补全的早期返回 (#15940)

  • 向后移植修复以允许在Python 3.6中对Logger进行pickle操作 (#18798)

  • 修复了当任务进入reschedule状态时,回填作业无法运行的bug (#17305, #18806)

仅文档变更

  • 更新 dagbag_size 文档 (#18824)

  • 更新关于bundle extras的文档 (#18828)

  • 修复错误的Postgres search_path设置说明(#17600)

  • 从Docker镜像中移除AIRFLOW_GID (#18747)

  • 改进BranchPythonOperator在没有后续task_id时的错误提示信息 (#18471)

  • 改进对用户的引导,告知他们在导入超时时应该做什么 (#18478)

  • 更好地解释调度器微调 (#18356)

  • 新增了airflow pools导入的JSON示例 (#18376)

  • 在文档中添加sla_miss_callback章节 (#18305)

  • 解释子进程钩子中sentry默认环境变量的作用 (#18346)

  • 重构安装页面 (#18282)

  • 改进快速启动docker-compose的警告信息和文档 (#18164)

  • 为MSSQL提供生产级支持 (#18382)

  • 更新文档中的非工作示例 (#18067)

  • 移除default_args模式 + 为Core Airflow示例DAG添加了get_current_context()用法 (#16866)

  • 更新max_tis_per_query以在网页上更好地呈现 (#17971)

  • 添加了基于团队授权的Github Oauth示例 (#17896)

  • 更新 docker.rst (#17882)

  • 示例xcom更新(#17749)

  • 添加关于通过环境变量添加连接的文档警告 (#17915)

  • 修复了关于upgrade-check.rst的错误文档 (#17903)

  • 将Brent添加到Committers列表 (#17873)

  • 改进了关于模块管理的文档 (#17757)

  • 从 metrics.rst 中移除已弃用的指标 (#17772)

  • 确保docker-compose的"生产就绪"状态得到充分说明 (#17731)

  • 文档:更新升级至v2文档,包含Airflow 1.10.x终止支持日期 (#17710)

  • 文档:从文档字符串中替换已弃用的参数 (#17709)

  • 更详细地描述DAG所有者 (#17699)

  • 更新注释以避免误解 (#17701)

  • 文档:在API中将DAG.is_active设为只读 (#17667)

  • 更新关于Python 3.9支持的文档 (#17611)

  • 修复MySQL数据库字符集设置说明 (#17603)

  • 文档覆盖 XCom.clear 用于数据生命周期管理 (#17589)

  • 修正了airflow核心文档中的路径问题 (#17567)

  • 文档(celery): 重新措辞, 添加了实际的多队列示例 (#17541)

  • 文档:添加FAQ以加速解析大量DAG文件 (#17519)

  • 为新用户改进镜像构建文档 (#17409)

  • 文档:从MariaDB JIRA URL中移除不必要的参数 (#17296)

  • 更新关于MariaDB和多调度器的警告 (#17287)

  • 文档:建议在所有Airflow组件上使用相同的配置 (#17146)

  • 将有关掩码的文档移至新页面 (#17007)

  • 建议在最佳实践文档中使用环境变量而非Airflow变量 (#16926)

  • 文档:为pod_template_file提供更好的描述 (#16861)

  • 新增Aneesh Joseph为Airflow提交者 (#16835)

  • 文档:为教程文档新增了管道示例 (#16548)

  • 从文档中移除upstart (#16672)

  • 新增提交者:JedTP (#16671)

  • 文档:在升级文档中将flask-ouathlib修正为flask-oauthlib (#16320)

  • 文档:修复创建连接文档的问题 (#16312)

  • 文档:修复Elasticsearch的网址 (#16275)

  • README.md 文件的小改进 (#16244)

  • 修复关于dag_concurrency的文档 (#16177)

  • 检查代码片段的语法正确性 (#16005)

  • 在文档中为wheel包添加正确的链接。(#15999)

  • default_pool插槽添加文档 (#15997)

  • 在快速入门文档中添加内存使用警告 (#15967)

  • 更新示例 KubernetesExecutor git-sync pod模板文件 (#15904)

  • 文档:修复Taskflow API文档 (#16574)

  • 为教程文档新增了管道示例 (#16084)

  • 更新DAG文档字符串以包含render_template_as_native_obj (#16534)

  • 更新关于设置SMTP的文档 (#16523)

  • 文档:将API动词从POST修正为PATCH (#16511)

杂项/内部

  • 将变量重命名以保持与代码逻辑一致 (#18685)

  • 简化之前跨行分割的字符串 (#18679)

  • 修复BranchPythonOperator的异常字符串 (#18623)

  • 在创建用户时添加多个角色 (#18617)

  • 将FABs基础安全管理器迁移到Airflow中。(#16647)

  • 移除不必要的CSS状态颜色 (#18461)

  • 更新 boto3<1.19 (#18389)

  • 提升airflow.security.kerberos module的覆盖率 (#18258)

  • 修复Amazon Kinesis测试 (#18337)

  • 修复提供者测试访问 importlib-resources (#18228)

  • 在使用SubDagOperator的测试中静默警告 (#18275)

  • 修复使用range(len())改为enumerate的问题 (#18174)

  • 自动完成视图的测试覆盖率 (#15943)

  • 将“packaging”添加到核心需求中 (#18122)

  • 为BaseTrigger添加LoggingMixins (#18106)

  • 修复在main构建中的文档构建问题 (#18035)

  • 移除tenacity的上限 (#17593)

  • 移除冗余的 numpy 依赖 (#17594)

  • mysql-connector-python 升级至最新版本 (#17596)

  • pandas 设为可选的核心依赖项 (#17575)

  • 为airflow.utils.helpers添加更多类型提示 (#15582)

  • 杂务: 在airflow/utils/db.py中进行了一些代码清理 (#17090)

  • 重构:从DAG处理中移除processor_factory (#16659)

  • 从DAG处理中移除AbstractDagFileProcessorProcess (#16816)

  • 更新TaskGroup类型定义 (#16811)

  • click 更新至 8.x 版本 (#16779)

  • 移除剩余的Pylint禁用项 (#16760)

  • 移除重复的try语句,create_session中已经有一个try了 (#16701)

  • 从我们的工具链中移除了pylint (#16682)

  • 重构不必要的函数调用用法 (#16653)

  • 为setup.py添加类型注解 (#16658)

  • 移除SQLAlchemy <1.4的限制 (#16630) (注意:我们的依赖项仍然要求版本低于1.4)

  • 重构 dag.clear 方法 (#16086)

  • 使用 DAG_ACTIONS 常量 (#16232)

  • 使用更新后的_get_all_non_dag_permissions方法 (#16317)

  • 为内置FAB方法添加更新名称包装器 (#16077)

  • 移除 TaskInstance.log_filepath 属性 (#15217)

  • 移除了airflow/www/app.py中不必要的函数调用 (#15956)

  • plyvel 移至 google provider extra (#15812)

  • 更新权限迁移以使用新的命名方案 (#16400)

  • 为FAB使用资源和操作名称 (#16380)

  • 将调用 find_permission_view_menu 替换为 get_permission 包装器 (#16377)

  • fab_logging_level的默认值从弃用状态修复为WARNING (#18783)

  • 允许在使用CeleryKubernetesExecutor时从UI界面运行任务 (#18441)

Airflow 2.1.4 (2021-09-18)

重大变更

无重大变更。

Bug修复

  • 修复弃用错误消息而不是静默它 (#18126)

  • 限制由Scheduler创建的排队dagruns数量 (#18065)

  • 修复 DagRun 从排队状态转为运行状态时执行顺序未正确遵循的问题 (#18061)

  • 修复 max_active_runs 不允许将排队的dagruns移动到运行状态的问题 (#17945)

  • 避免无权限用户的重定向循环 (#17838)

  • 修复当用户没有角色时导致的无限重定向循环问题 (#17613)

  • 修复图表TI模态上的日志链接 (#17862)

  • 如果用户缺少权限,则隐藏变量导入表单 (#18000)

  • 改进DAG/任务并发检查 (#17786)

  • 修复了清除任务实例端点重置所有DAG运行的错误 (#17961)

  • 修复了传递给视图的错误参数 (#18083) (#18085)

  • 修复了来自LocalTaskJob的Sentry处理器导致的错误 (#18119)

  • 限制 colorlog 版本(6.x 不兼容) (#18099)

  • 仅在悬停时显示暂停/继续提示框 (#17957)

  • 针对带有开放组的dags优化图视图加载时间 (#17821)

  • 增加运行列的宽度 (#17817)

  • 修复运行tis时的错误查询 (#17631)

  • 将根节点添加到树刷新URL (#17633)

  • 不要从UI界面删除正在运行的DAG (#17630)

  • 提升Provider包功能的可发现性

  • 不要让 create_dagrun 覆盖显式的 run_id (#17728)

  • 修复了pid重置的回归问题,允许心跳后启动任务 (#17333)

  • 当Pod在运行时被删除时,将任务状态设置为失败 (#18095)

  • 建议内核不要缓存由Airflow生成的日志文件 (#18054)

  • _check_for_stalled_adopted_tasks方法中对已采用任务进行排序 (#18208)

仅文档变更

  • 更新airflow/config_templates/config.yml中添加的版本字段 (#18128)

  • 改进关于如何处理动态任务生成的描述 (#17963)

  • 改进到操作符和钩子参考的交叉链接 (#17622)

  • 文档:修复Docker堆栈中替换Airflow版本的问题 (#17711)

  • 使提供者操作符/钩子参考更加易用 (#17768)

  • 更新关于新的connection-types提供者元数据的描述

  • 建议当变量包含敏感数据时使用 secrets backend (#17319)

  • 将"从源码安装"部分单独列出并添加更多细节 (#18171)

  • 文档:使用 closer.lua 脚本来下载源代码 (#18179)

  • 文档:改进从源码安装 (#18194)

  • 改进所有组件的源码安装页面 (#18251)

Airflow 2.1.3 (2021-08-23)

重大变更

无重大变更。

Bug修复

  • 修复任务在接收到sigkill信号并具有重试机制时的问题,并正确处理sigterm信号 (#16301)

  • 修复上下文异常中的敏感信息脱敏问题。(#17618)

  • 修复了dagrun回调的竞态条件问题 (#16741)

  • 将'queued'状态添加到DagRunState (#16854)

  • 为DagRun添加'queued'状态 (#16401)

  • 修复外部elasticsearch日志链接 (#16357)

  • 当记录的PID与当前PID不同时添加适当的警告信息 (#17411)

  • 修复使用default_impersonation配置运行任务的问题 (#17229)

  • 如果DagRun的DAG从数据库中被移除则进行救援 (#17544)

  • 修复了损坏的json_client (#17529)

  • 处理并记录任务回调期间引发的异常 (#17347)

  • 修复CLI命令kubernetes cleanup-pods在遇到无效标签键时失败的问题 (#17298)

  • 在DAG解析日志中显示序列化异常 (#17277)

  • 修复:TaskInstance 未显示 queued_by_job_idexternal_executor_id (#17179)

  • 当未配置SecretsMasker时,增加更多解释性消息 (#17101)

  • 允许在BaseOperator的子类中使用__init_subclass__ (#17027)

  • 修复XCom视图中任务实例检索的问题 (#16923)

  • 在解析过程中验证priority_weight的类型 (#16765)

  • 在DAG序列化过程中正确处理自定义的depstask_group (#16734)

  • 修复Celery工作节点接收慢(已清除)任务的问题。(#16718)

  • 修复树状视图中持续时间计算问题 (#16695)

  • 修复 AttributeErrordatetime.timezone 对象没有属性 name (#16599)

  • 在Web服务器日志中隐藏连接机密信息 (#16579)

  • 将图形焦点改为视图顶部而非中心 (#16484)

  • 当执行器报告任务失败时,在调度器中标记任务为失败状态 (#15929)

  • 修复(smart_sensor): 未绑定变量错误 (#14774)

  • 将缺失的权限添加回UserModelView控件。(#17431)

  • 改进docker-compose的诊断和自愈功能 (#17484)

  • 当用户配置secret_key错误时改进诊断信息 (#17410)

  • 停止在task_instance.refresh_from_db中检查execution_date (#16809)

改进

  • 在任务退出期间在LocalTaskJob中运行迷你调度器 (#16289)

  • 移除 SQLAlchemy<1.4 约束 (#16630)

  • 将Jinja2的上限版本从2.12.0提升至4.0.0 (#16595)

  • 升级 dnspython (#16698)

  • 更新至 FlaskAppBuilder 3.3.2+ (#17208)

  • 为任务和DAG添加状态类型 (#15285)

  • 在使用LocalExecutor时为Worker设置进程标题 (#16623)

  • DagFileProcessorDagFileProcessorProcess移出scheduler_job.py (#16581)

仅文档变更

  • 修复配置文档中的不一致问题 (#17317)

  • 修复了使用SQLite作为元数据数据库的文档链接 (#17308)

杂项

  • 在requests移除LGPL依赖后切换回http提供程序 (#16974)

Airflow 2.1.2 (2021-07-14)

重大变更

无重大变更。

Bug修复

  • 仅允许webserver从worker日志服务器请求日志(#16754)

  • 修复“无效的JSON配置,必须为字典格式”的错误 (#16648)

  • 修复 CeleryKubernetesExecutor (#16700)

  • 如果键是token则屏蔽值 (#16474)

  • 修复了LocalTaskJob的模拟问题 (#16852)

  • 修复所有npm漏洞,包括将jQuery升级至3.5 (#16440)

杂项

  • 新增对Python 3.9的支持 (#15515)

Airflow 2.1.1 (2021-07-02)

重大变更

函数clear_task_instances的参数activate_dag_runs已被替换为dag_run_state

要实现之前clear_task_instancesactivate_dag_runs=True时的默认行为,无需任何更改。若要实现之前activate_dag_runs=False的行为,请改用dag_run_state=False传递。(之前的参数仍被接受,但已弃用)

dag.set_dag_runs_state 已弃用

在PR#15382修复了一个bug后,方法set_dag_runs_state不再需要。该方法现已弃用,将在未来版本中移除。

Bug修复

  • 修复尝试用非字符串键在字典中掩码机密信息时崩溃的问题 (#16601)

  • 始终从PyPI安装sphinx_airflow_theme (#16594)

  • 移除对elasticsearch库的限制 (#16553)

  • 为PROD镜像的构建和运行时添加额外需求。(#16170)

  • Cattrs 1.7.0版本在2021年5月底发布,破坏了lineage功能的使用(#16173)

  • 从setup_requires中移除了不必要的包 (#16139)

  • 将docutils固定到0.17版本以下,直到破坏性行为被修复 (#16133)

  • 改进Docker镜像文档 (#14843)

  • 确保 dag_run.conf 是一个字典 (#15057)

  • 修复CLI连接导入以及将逻辑从secrets迁移到Connection模型 (#15425)

  • 修复Dag详情中的开始日期错误 (#16206)

  • 修复当DAG暂停时DAG运行状态未更新的问题 (#16343)

  • 允许任务实例模式(REST API)中的操作员字段为空值 (#16516)

  • 避免在编辑日志时递归过深 (#16491)

  • 回填:如果没有任务匹配任务正则表达式,则不创建DagRun (#16461)

  • 针对大型DAG的树状视图界面优化 & 树状视图中的间距更加统一 (#16522)

  • 正确处理来自Query.scalar()的None返回值 (#16345)

  • 向/dags端点添加only_active参数 (#14306)

  • 如果序列化的DAG在数据库中被删除,则不显示过期的序列化DAG (#16368)

  • 使REST API的列出DAGs端点与UI/CLI行为保持一致 (#16318)

  • 支持使用 filebeat 7 将远程日志记录到 elasticsearch 中 (#14625)

  • 优先队列任务具有更高优先级和更早的执行日期。(#15210)

  • 使图例中的任务ID具有足够宽度,并将折线图宽度设为100%。(#15915)

  • 修复 normalize-url 漏洞 (#16375)

  • 在初始化时验证重试值以获得更好的错误提示 (#16415)

  • 为树状视图刷新添加num_runs查询参数 (#16437)

  • 修复配置参考文档中的模板化默认/示例值 (#16442)

  • passphraseprivate_key添加到默认敏感字段名称中 (#16392)

  • 修复了无限槽位池中的任务从未被调度的问题 (#15247)

  • 修复卡在CeleryExecutor中显示为运行状态的孤立任务 (#16550)

  • 即使无法编辑某些内容,也不要忘记记录日志 (#16118)

  • 将最大树宽度设置为1200像素 (#16067)

  • 为KubeExecutor填充airflow task run的"job_id"字段,不使用--local/--raw (#16108)

  • 修复了在初始化前使用conf变量的问题 (#16088)

  • 修复任务装饰器的默认值应用问题 (#16085)

  • 即使刚刚解析过,也解析最近修改的文件 (#16075)

  • 确保我们不会尝试在日志中屏蔽空字符串 (#16057)

  • 当没有异常时,在屏蔽log.exception时不要终止运行 (#16047)

  • 在base_sensor_operator中恢复apply_defaults导入 (#16040)

  • 修复树状视图中的自动刷新问题 当webserver ui不在/时 (#16018)

  • 修复dag.clear()在必要时将多个dag设置为运行状态的问题 (#15382)

  • 修复Celery执行器因多进程中的reset_signals而随机卡住的问题 (#15989)

Airflow 2.1.0 (2021-05-21)

重大变更

新增“deprecated_api”额外参数

我们新增了一个名为'[deprecated_api]'的额外组件,当需要使用已弃用的API时,应在安装airflow时选用该组件。这现在是Airflow的一个可选功能,因为它会引入requests库(截至2021年5月14日),而该库会引入LGPL协议的chardet依赖项。

默认情况下未安装http提供程序

http 提供程序现在是可选的且默认不安装,直到 chardet 成为 requests 的可选依赖项。 参见 PR to replace chardet with charset-normalizer

@apply_default 装饰器不再需要

这个装饰器现在通过BaseOperator的元类自动添加到所有操作符中

修改字段掩码的配置选项

我们改进了Web界面和日志中敏感数据的掩码处理。作为改进的一部分,以下配置已变更:

  • admin 部分中的 hide_sensitive_variable_fields 选项已被替换为 core 部分中的 hide_sensitive_var_conn_fields 部分。

  • admin 部分中的 sensitive_variable_fields 选项已被 core 部分中的 sensitive_var_conn_names 部分替代。

已弃用的PodDefaults和airflow.kubernetes.pod_generator中的add_xcom_sidecar

我们已将PodDefaults从airflow.kubernetes.pod_generator.PodDefaults迁移至 airflow.providers.cncf.kubernetes.utils.xcom_sidecar.PodDefaults,并将add_xcom_sidecar 从airflow.kubernetes.pod_generator.PodGenerator.add_xcom_sidecar迁移至 airflow.providers.cncf.kubernetes.utils.xcom_sidecar.add_xcom_sidecar。 这项变更将使我们能够修改KubernetesPodOperator的XCom功能,而无需升级airflow。

从核心airflow中移除了pod_launcher

将 pod 启动器从 airflow.kubernetes.pod_launcher 移至 airflow.providers.cncf.kubernetes.utils.pod_launcher

这将允许用户在不升级airflow的情况下更新KubernetesPodOperator的pod_launcher

默认的 [webserver] worker_refresh_interval 已更改为 6000

对于Airflow <=2.0.1版本,[webserver] worker_refresh_interval的默认值为30秒。然而,由于Airflow 2.0版本强制要求DAG序列化,且Web服务器使用序列化后的DAG,因此不再需要像30秒这样频繁地终止现有工作进程并创建新进程。

该设置可以提高到更大的值,目前设置为6000秒(100分钟),作为DagBag缓存突发时间。

default_queue 配置已移至 operators 部分。

default_queue配置选项已从[celery]部分移至[operators]部分,以便在不同执行器之间复用。

新功能

  • 在Taskflow API中添加PythonVirtualenvDecorator (#14761)

  • 添加 Taskgroup 装饰器 (#15034)

  • 创建DAG日历视图 (#15423)

  • 创建跨DAG依赖关系视图 (#13199)

  • 添加用于查询提供者的REST API (#13394)

  • 在任务日志和用户界面中隐藏密码和敏感信息 (#15599)

  • 添加 SubprocessHook 用于从操作器运行命令 (#13423)

  • 在UI页面"DAG详情"中添加DAG超时设置 (#14165)

  • 新增 WeekDayBranchOperator (#13997)

  • 在DAG触发界面添加JSON语法检查器 (#13551)

  • 在触发器UI页面添加DAG描述文档 (#13365)

  • 将airflow webserver的URL添加到SLA未达标通知邮件中。(#13249)

  • 为用户添加只读REST API端点 (#14735)

  • 添加文件以生成Airflow的Python SDK (#14739)

  • 为Snowflake连接添加动态字段 (#14724)

  • 为角色和权限添加只读REST API端点 (#14664)

  • 新增日期时间分支操作符 (#11964)

  • 添加Google leveldb钩子和操作符 (#13109) (#14105)

  • 在REST API中添加插件端点 (#14280)

  • 添加 worker_pod_pending_timeout 支持 (#15263)

  • 增加对DAG边进行标记的支持 (#15142)

  • 为角色添加CUD REST API端点 (#14840)

  • 从文件导入连接 (#15177)

  • 新增了一堆 template_fields_renderers (#15130)

  • 为部分端点添加REST API查询排序和排序功能 (#14895)

  • 在新UI中添加时区上下文 (#15096)

  • 在新UI中添加查询变更 (#15068)

  • 添加不同模式来排序dag文件以便解析 (#15046)

  • 树视图自动刷新 (#15474)

  • BashOperator 在退出码为99时(默认可配置)抛出 AirflowSkipException (#13421) (#14963)

  • 通过REST API按任务ID清除任务 (#14500)

  • 支持jinja2原生Python类型 (#14603)

  • 允许celery workers不使用gossip或mingle模式 (#13880)

  • 新增 airflow jobs check CLI 命令用于检查作业(调度器等)的健康状态 (#14519)

  • DateTimeBranchOperator 重命名为 BranchDateTimeOperator (#14720)

改进

  • DbApiHook添加可选的结果处理器回调 (#15581)

  • 将Flask App Builder的限制更新至最新发布的3.3版本 (#15792)

  • 防止在REST API请求上创建flask会话 (#15295)

  • 在解析时同步DAG特定权限 (#15311)

  • 将任务池名称的最大长度增加到256个字符 (#15203)

  • 在使用mysql时强制实施READ COMMITTED隔离级别 (#15714)

  • 自动将apply_default应用于BaseOperator的子类 (#15667)

  • 在检测到重复的DAG ID时抛出错误 (#15302)

  • 更新 KubernetesExecutor pod 模板以允许访问 IAM 权限 (#15669)

  • 运行airflow db check-migrations时显示更详细的日志 (#15662)

  • 当 one_success 标记任务时,如果没有成功则标记为失败 (#15467)

  • 添加一个选项,用于在不更改配置的情况下触发DAG (#15591)

  • 添加Airflow UI实例名称配置选项 (#10162)

  • 添加装饰器以重试带有数据库事务的函数 (#14109)

  • 在PythonVirtualenvOperator的execute方法中添加返回 (#14061)

  • 为kubernetes添加verify_ssl配置 (#13516)

  • 添加关于Webserver > 1时secret_key的描述 (#15546)

  • JSONFormatter的LogRecord中添加Traceback (#15414)

  • 添加对conn uri格式中任意json的支持 (#15100)

  • 在变量中添加描述字段 (#12413) (#15194)

  • 在SFTP、FTP和文件系统传感器中添加日志以显示最后修改时间 (#15134)

  • 当接收到SIGTERM信号时执行on_failure_callback (#15172)

  • 允许在突出显示状态时隐藏所有边 (#15281)

  • 当UID没有实际用户名时显示明确错误 (#15212)

  • 在使用本地或顺序执行器时,通过调度程序提供日志服务 (#15557)

  • 在DAG详情视图中停用触发器、刷新和删除控件。(#14144)

  • 关闭连接表单的自动完成功能 (#15073)

  • 将默认的worker_refresh_interval增加到6000秒 (#14970)

  • 仅当用户本地时区不是UTC时才显示 (#13904)

  • 为部分任务CLI抑制LOG/WARNING日志以提升CLI使用体验 (#14567)

  • 可配置的API响应(CORS)头信息 (#13620)

  • 允许查看者查看所有文档链接 (#14197)

  • 更新树状视图日期刻度 (#14141)

  • 使暂停/取消暂停DAG的工具提示更清晰 (#13642)

  • 获取变量时警告环境变量的优先级 (#13501)

  • 将配置项[celery] default_queue迁移至[operators] default_queue以便在不同执行器间复用 (#14699)

Bug修复

  • 修复当未传递dry_run参数时updateTaskInstancesState API端点返回500错误的问题 (#15889)

  • 确保PythonVirtualenvOperator之前的任务不会失败 (#15822)

  • 修复混合大小写环境变量导致worker等进程崩溃的问题 (#14380)

  • 修复了DAG装饰器中的类型注解问题 (#15778)

  • 修复当任务收到SIGKILL信号时on_failure_callback回调函数的问题 (#15537)

  • 修复dags表格溢出问题 (#15660)

  • 修复在子DAG清除时更改父DAG状态的问题 (#15562)

  • 修复从zip包读取时默认使用文本模式的问题 (#13962)

  • Fix wrong parameter for drawDagStatsForDag in dags.html (#13884)

  • 修复QueuedLocalWorker因EOFError崩溃的问题 (#13215)

  • 修复 NotPreviouslySkippedDep 中的拼写错误 (#13933)

  • 修复KubeExecutor pod接管后的并行度问题 (#15555)

  • 修复在Mac上启用keepalive的kube客户端问题 (#15551)

  • 修复了dask在python>3.7版本中的错误限制(应为<3.7)(#15545)

  • 修复KubernetesExecutor中的任务采纳问题 (#14795)

  • 修复使用XCom与KubernetesPodOperator时的超时问题 (#15388)

  • 修复“extras”中已弃用的提供者别名不工作的问题 (#15465)

  • 修复了默认XCom反序列化问题。(#14827)

  • 修复 dag.partial_subset 中的 used_group_ids (#13700) (#15308)

  • 进一步修复了KubernetesPodOperatorpod_id被截断的问题 (#15445)

  • Bug修复:当在KubernetesPodOperator中被修剪的pod_id以连字符结尾时出现无效名称问题 (#15443)

  • 修复当TI pool_slots > 1时插槽统计不正确的问题 (#15426)

  • 修复DAG最后一次运行链接 (#15327)

  • 修复当update_fab_perms = False时sync-perm无法正常工作的问题 (#14847)

  • 修复了Arrow在plexus测试中的限制 (#14781)

  • 修复树状视图中的UI错误 (#14566)

  • 修复 AzureDataFactoryHook 无法实例化其连接的问题 (#14565)

  • 修复非POSIX文件系统上的权限错误 (#13121)

  • 修正“ignorable”的拼写 (#14348)

  • 修复 get_context_data 文档测试导入 (#14288)

  • 修正 GCSObjectsWtihPrefixExistenceSensor 中的拼写错误 (#14179)

  • 修复失败依赖的顺序 (#14036)

  • 修复关键CeleryKubernetesExecutor错误 (#13247)

  • 修复了StackdriverTaskHandler中的四个错误 (#13784)

  • func.sum 可能返回会导致 REST API 中断的 Decimal (#15585)

  • 在分页中持久化标签参数 (#15411)

  • API: 当execution_date相同时抛出AlreadyExists异常 (#15174)

  • 移除在DagFileProcessorManager中对sync_metadata的重复调用 (#15121)

  • 额外更新 docker-py 以解决 docker 操作问题 (#15731)

  • 确保执行器的end方法被调用 (#14085)

  • 从API架构中移除user_id (#15117)

  • 修复分页禁用时的可点击错误链接问题 (#15074)

  • 在迁移期间获取数据库锁 (#10151)

  • 仅当SLA为None时跳过SLA检查 (#14064)

  • 在airflow info命令中打印正确的版本 (#14560)

  • 使airflow info命令支持管道操作 (#14528)

  • 重新设计连接表单的客户端脚本。(#14052)

  • API: 在所有包含 total_entries 的集合中添加 CollectionInfo (#14366)

  • 修复导入airflow.models.dagrun时的task_instance_mutation_hook (#15851)

仅文档变更

  • 修复SqlSensor的文档字符串 (#15466)

  • “DAGs和Tasks文档”中的小改动 (#14853)

  • 添加关于配置选项变更的说明 (#15696)

  • 将文档添加到markdownlintyamllint配置文件中 (#15682)

  • 在文档中将旧的"Experimental" API重命名为已弃用。(#15653)

  • 修复git_sync_template.yaml中的文档错误 (#13197)

  • 修复文档链接权限名称 (#14972)

  • 修复Helm图表文档的链接 (#14652)

  • 修复Kubernetes代码的文档字符串 (#14605)

  • 文档: 首字母大写及小修复 (#14283) (#14534)

  • 修复了从zip包读取时默认使用文本的问题。(#13984)

  • 对"概念"文档的初步重构 (#15444)

  • 改进多个模块的文档字符串 (#15047)

  • 添加关于数据库连接URI的文档 (#14124)

  • 将Helm Chart徽标添加到文档索引 (#14762)

  • 为Helm Chart创建新的文档包 (#14643)

  • 新增关于支持的日志级别的文档 (#14507)

  • 更新关于Tableau和Salesforce提供程序的文档 (#14495)

  • 将已弃用的文档链接替换为正确的链接 (#14429)

  • 重构冗余文档URL逻辑以使用工具类 (#14080)

  • 文档:注意:已将2016-2019更新为2016-至今 (#14248)

  • 如果可能的话,在解析过程中跳过DAG权限同步 (#15464)

  • 为边标签添加图片和示例 (#15310)

  • 添加SQLite的示例DAG和操作指南 (#13196)

  • 为已弃用模块添加新模块的链接 (#15316)

  • 在Updating.md中添加关于FAB数据模型变更的说明 (#14478)

杂项/内部

  • 修复 logging.exception 冗余问题 (#14823)

  • 升级 stylelint 以移除存在漏洞的子依赖项 (#15784)

  • 添加解决方案强制依赖项使用lodash的补丁版本 (#15777)

  • 将croniter更新至1.0.x系列 (#15769)

  • 在Breeze中移除Airflow 1.10 (#15712)

  • 并行运行 helm chart 测试 (#15706)

  • ssri 从 6.0.1 升级到 6.0.2 在 /airflow/www 目录 (#15437)

  • 移除了对Gunicorn依赖的限制 (#15611)

  • 为任务提供更好的"依赖已注册"警告信息 #14613 (#14860)

  • 将pandas-gbq固定到0.15.0以下版本 (#15114)

  • 使用 Pip 21.* 正式安装 airflow (#15513)

  • 将mysqlclient升级以支持1.4.x和2.x系列 (#14978)

  • 完成DAG资源名称助手的重构 (#15511)

  • 重构/清理图形任务和路径高亮显示的呈现方式 (#15257)

  • 标准化默认的fab权限 (#14946)

  • 移除任务实例详情视图中的datepicker (#15284)

  • 将提供者的导入警告转为调试日志 (#14903)

  • 从provider_info模式中移除遗留的必填字段。(#14119)

  • 弃用 tableau 扩展 (#13595)

  • 尽可能在Python 3.8上使用内置的cached_property (#14606)

  • 清理UI模板中的JS代码 (#14019)

  • 将/airflow/www中的elliptic从6.5.3升级到6.5.4 (#14668)

  • 使用 flynt 切换到 f-strings。(#13732)

  • 使用 jquery 的 ready 方法替代原生 js (#15258)

  • 迁移任务实例日志(ti_log)js (#15309)

  • 迁移图形js (#15307)

  • Migrate dags.html javascript (#14692)

  • 移除了不必要的AzureContainerInstance连接类型 (#15514)

  • 将Kubernetes pod_launcher从核心airflow中分离 (#15165)

  • 更新操作符剩余的旧导入路径 (#15127)

  • 移除损坏且无文档记录的“演示模式”功能 (#14601)

  • 简化Webpack条目的配置/可读性 (#14551)

  • 移除内联树形JS (#14552)

  • 针对简单脚本的Js代码检查和内联迁移 (#14215)

  • 移除AirflowConfigParser中重复常量的使用 (#14023)

  • 弃用环境变量中的邮件凭据。(#13601)

  • 移除 task_instance.py 中未使用的 'context' 变量 (#14049)

  • 调试时在cli中禁用suppress_logs_and_warning (#13180)

Airflow 2.0.2 (2021-04-19)

重大变更

默认 [kubernetes] enable_tcp_keepalive 已更改为 True

这允许Airflow默认情况下在某些环境(如Azure)中更可靠地工作。

sync-perm 命令行工具默认不再同步DAG特定权限

sync-perm CLI命令默认将不再同步DAG特定权限,因为这些权限现在会在DAG解析过程中处理。如果您需要或想要旧的行为,可以传递--include-dags参数让sync-perm命令也同步DAG特定权限。

Bug修复

  • Bug修复:序列化和排序DAG的可迭代属性时出现TypeError错误 (#15395)

  • 修复基于文件夹插件缺失的on_load触发器 (#15208)

  • kubernetes cleanup-pods 子命令将仅清理由Airflow创建的Pods (#15204)

  • 修复CLI action_logging中的密码掩码问题 (#15143)

  • 修复TriggerDagRunOperatorLink的URL生成问题 (#14990)

  • 恢复基础血缘后端 (#14146)

  • 无法使用Kubernetes执行器触发回填或手动任务。(#14160)

  • Bug修复:任务实例详情视图中未显示任务文档 (#15191)

  • Bug修复:修复KubernetesExecutor中pod_template_file覆盖问题 (#15197)

  • Bug修复:executor_config中的资源导致UI中的图形视图中断 (#15199)

  • 修复Celery执行器尝试在map上调用len的bug (#14883)

  • 修复了airflow.stats计时中导致dogstatsd模式失效的错误(#15132)

  • 通过使用非阻塞IO避免调度器/解析管理器死锁 (#15112)

  • 重新引入 dagrun.schedule_delay 指标 (#15105)

  • 在Kube执行器中比较字符串值,而非判断字符串是否为同一对象(#14942)

  • 像在airflow 1.10中那样将队列传递给BaseExecutor.execute_async (#14861)

  • 调度器:从关键路径中移除饥饿池中的任务实例(TIs)。(#14476)

  • 从airflow.contrib模块中移除多余/不必要的弃用警告 (#15065)

  • 修复KubernetesExecutor中对长dag_id和task_id的支持 (#14703)

  • 对序列化DAG中的列表、集合和元组进行排序 (#14909)

  • 简化传递给origin参数的字符串清理 (#14738) (#14905)

  • 修复了在启用Sentry集成时运行任务时的错误。(#13929)

  • Webserver: 对传递给origin参数的字符串进行消毒处理 (#14738)

  • 修复树视图中丢失持续时间小于1秒的问题 (#13537)

  • 由于sqlalchemy-utils的破坏性变化,将SQLAlchemy固定到1.4以下版本 (#14812)

  • 修复KubernetesExecutor中关于已删除待处理pod的问题 (#14810)

  • 当后端模型不存在时,默认使用Celery任务模型 (#14612)

  • Bug修复:插件端点未进行身份验证(#14570)

  • Bug修复:修复DAG文档显示问题(特别是针对TaskFlow DAGs)(#14564)

  • Bug修复: airflow.kubernetes.pod_launcher中的monitor_pod出现TypeError (#14513)

  • Bug修复:修复DAG详情API端点中标签和所有者输出错误的问题 (#14490)

  • 修复启用JSON日志记录时任务错误的日志记录问题 (#14456)

  • 修复在使用守护进程模式时StatsD指标未发送的问题 (#14454)

  • 优雅处理DagRun中缺失的start_date和end_date (#14452)

  • Bug修复:将max_retry_delay序列化为timedelta (#14436)

  • 修复当用户点击"任务实例详情"时由于start_date为None导致的崩溃问题 (#14416)

  • Bug修复:修复当任务从运行的DAG中移除时TaskInstance API调用失败的问题 (#14381)

  • 当传入无效的executor_config时,调度器不应失败 (#14323)

  • 修复了当超过dagrun_timeout时任务实例仍能存活的bug (#14321)

  • 修复了DAG时区在UI工具提示中不总是正确显示的问题 (#14204)

  • 当传入空字符串时,将cookie_samesite设为Lax (#14183)

  • [AIRFLOW-6076] 修复 dag.cli() 的 KeyError 错误 (#13647)

  • 修复在清除成功子DAG后运行子任务的问题 (#14776)

改进

  • 移除导致虚假安全警报的未使用JS包 (#15383)

  • 将新安装的[kubernetes] enable_tcp_keepalive默认值更改为True (#15338)

  • Fixed #14270: Add error message in OOM situations (#15207)

  • 改进对docker镜像中任意UID的兼容性/诊断功能 (#15162)

  • 更新了几个最新版本库的3.6限制 (#15209)

  • 添加了Blinker依赖项,该依赖项在最近的更改后缺失 (#15182)

  • 从DagRun视图中移除search_columns中的'conf' (#15099)

  • K8S清理Pod命令行工具中命名空间的更合适默认值 (#15060)

  • 在Web服务器启动期间更快的默认角色同步 (#15017)

  • 当存在大量DAG时加速webserver启动 (#14993)

  • 更易使用且文档更完善的Docker镜像 (#14911)

  • 在可用时使用 libyaml C 库。(#14577)

  • 不在单元测试模式下运行时,不要创建unittest.cfg (#14420)

  • Webserver: 允许按queued_dttm筛选TaskInstances (#14708)

  • 更新Flask-AppBuilder依赖以支持3.2(及所有3.x系列)版本 (#14665)

  • 在浏览器本地存储中记住展开的任务组 (#14661)

  • 为cli表格添加纯文本格式输出 (#14546)

  • 使airflow dags show命令显示TaskGroups (#14269)

  • 增加extra连接字段的最大容量。(#12944)

  • 通过为TaskReschedule执行单次SQL删除来加速clear_task_instances (#14048)

  • 通过FAB菜单链接增加更多灵活性 (#13903)

  • 在sqlite版本不匹配的情况下添加更好的描述和指导 (#14209)

仅文档变更

  • 添加文档创建/更新社区提供者 (#15061)

  • 修复airflow.utils.timezone文档字符串中的错误和拼写问题 (#15180)

  • 为稳定版Airflow文档替换新的URL (#15169)

  • 文档:阐明delete_worker_pods_on_failure的行为 (#14958)

  • 为Docker镜像创建文档包 (#14846)

  • 多个小文档(OpenAPI)修复 (#14917)

  • 将Graph View截图替换为显示自动刷新 (#14571)

杂项/内部

  • 在hooks中延迟导入Connection以避免循环引用 (#15361)

  • 将last_scheduler_run重命名为last_parsed_time,并确保其在数据库中更新 (#14581)

  • 将TaskInstance.pool_slots设置为不可为空,默认值为1 (#14406)

  • 以一致的方式记录迁移日志信息 (#14158)

Airflow 2.0.1 (2021-02-08)

重大变更

查看Airflow配置的权限已从UserViewer角色中移除

此前,具有UserViewer角色的用户能够通过REST API或在Web服务器中获取/查看配置。从Airflow 2.0.1开始,只有具有AdminOp角色的用户才能获取/查看配置。

要允许具有其他角色的用户查看配置,请为该角色添加can read on Configurations权限。

请注意,如果[webserver] expose_config设置为False,即使用户拥有can read on Configurations权限的角色,API也会返回403响应。

默认的 [celery] worker_concurrency 已更改为 16

对于Airflow <2.0.0版本,[celery] worker_concurrency的默认值为16。然而在2.0.0版本中,该值被无意中更改为8

从Airflow 2.0.1开始,我们恢复为旧的默认值16

默认的 [scheduler] min_file_process_interval 已更改为 30

[scheduler] min_file_process_interval的默认值为0, 这导致CPU使用率基本保持在100%左右,因为DAG文件会被持续解析。

从Airflow 2.0.0版本开始,调度决策已从DagFileProcessor移至Scheduler,因此我们可以将默认值设置得稍高一些:30

Bug修复

  • Bug修复:在XCom端点API中返回XCom值 (#13684)

  • Bug修复:当使用自定义后端和sql_alchemy_conn_secret时出现的导入错误 (#13260)

  • 允许PID文件路径在守护进程(调度器、Kerberos等)时使用相对路径 (#13232)

  • Bug修复: 在airflow db upgrade过程中MySQL不支持通用的DROP CONSTRAINT (#13239)

  • Bug修复:在运行sync-perm时同步DAGs中定义的访问控制 (#13377)

  • 如果DAG上没有定义回调,则停止发送回调请求 (#13163)

  • Bug修复:Dag级别的回调请求未运行 (#13651)

  • 停止创建重复的Dag文件处理器 (#13662)

  • 在调度时过滤掉处于移除状态的DagRuns任务实例 (#13165)

  • 在/airflow/www中将datatables.net从1.10.21版本升级到1.10.22版本 (#13143)

  • datatables.net JS 升级至 1.10.23 (#13253)

  • dompurify 从 2.0.12 升级到 2.2.6 版本在 /airflow/www 目录 (#13164)

  • 更新最低 cattrs 版本 (#13223)

  • 移除CLI pools导入/导出中不适用的参数'output' (#13071)

  • Webserver: 修复了禁用身份验证选项的行为并添加文档 (#13191)

  • 修复:添加对无菜单插件视图的支持 (#11742)

  • 为Python 3.8+添加python-daemon限制以修复守护进程崩溃问题 (#13540)

  • 将默认的celery worker_concurrency改为16 (#13612)

  • 如果dag_id为None时,审计日志记录视图不应包含链接 (#13619)

  • 修复清理列表 pods 时无效的 continue_token (#13563)

  • 切换到最新版本的snowflake连接器 (#13654)

  • 修复任务重试或重新调度时的回填崩溃问题 (#13712)

  • max_tis_per_query 设置为 0 现在可以正确移除限制 (#13512)

  • 修复任务回调调用中的竞态条件 (#10917)

  • 修复当gunicorn主进程崩溃时webserver退出的问题 (#13518)(#13780)

  • 修复检查重复连接的SQL语法 (#13783)

  • BaseBranchOperator 默认会推送至xcom (#13704) (#13763)

  • 修复 configuration.getsection 的弃用问题 (#13804)

  • 修复日志端点中的TaskNotFound问题 (#13872)

  • 修复使用动态DAG时的竞争条件问题 (#13893)

  • 修复:Linux/Chrome浏览器在Webserver中的窗口弹跳问题

  • 修复sqlite的数据库shell (#13907)

  • 仅当序列化DAG存在时比较更新时间 (#13899)

  • 修复针对mysqldb驱动程序的dag运行类型枚举查询 (#13278)

  • 为实验性API的lineage端点添加认证 (#13870)

  • 不要向自定义角色添加用户角色权限。(#13856)

  • 不要向默认角色添加Website.can_read访问权限。(#13923)

  • 修复因Kubernetes pod名称过长导致的无效值错误 (#13299)

  • 修复SQLite升级至2.0版本的数据库迁移问题 (#13921)

  • Bug修复:手动触发DagRun不应跳过预定的运行 (#13963)

  • 停止在调度器中加载额外的操作符链接 (#13932)

  • FileTaskHandler的read函数中添加了缺失的返回参数 (#14001)

  • Bug修复:调度器中不再尝试创建重复的Dag Run (#13920)

  • 使v1/config端点遵循webserver的expose_config设置 (#14020)

  • 为MariaDB和MySQL 8以下版本禁用行级锁定 (#14031)

  • Bug修复:修复仅触发特定DAG的权限问题 (#13922)

  • 修复损坏的SLA机制 (#14056)

  • Bug修复:如果在运行时移除任务,调度器会失败 (#14057)

  • 移除User和Viewer角色对配置文件的读取权限 (#14067)

  • 修复从2.0.1rc1版本的数据库迁移问题

改进

  • 增加默认的 min_file_process_interval 值以降低CPU使用率 (#13664)

  • 在使用os.forkCeleryExecutor运行任务时处理连接 (#13265)

  • example_kubernetes_executor示例DAG中使函数用途更清晰 (#13216)

  • 移除未使用的库 - flask-swagger, funcsigs (#13178)

  • 当任务尚未运行时显示替代提示信息(无任务实例)(#13162)

  • 使用werkzeug自身的类型转换来处理请求参数 (#13184)

  • 用户界面:在任务实例视图中新增queued_by_job_idexternal_executor_id列 (#13266)

  • json-merge-patch设为可选库并取消固定版本 (#13175)

  • 为ldap提供程序添加缺失的LDAP"extra"依赖项。(#13308)

  • 重构 setup.py 以更好地反映 providers 中的变更 (#13314)

  • 固定 pyjwt 并为 Apache Pinot 添加集成测试 (#13195)

  • setup.cfg 中移除供应商强加的要求 (#13409)

  • 替换已弃用的装饰器 (#13443)

  • 简化和优化模型Dag和BaseOperator中的__eq__方法 (#13449)

  • 允许在provider模式中添加额外属性 (#13440)

  • 移除未使用的依赖项 - contextdecorator (#13455)

  • 移除 'typing' 依赖项 (#13472)

  • 以一致的方式记录迁移信息 (#13458)

  • 取消固定 mysql-connector-python 以允许 8.0.22 (#13370)

  • 移除thrift作为核心依赖项 (#13471)

  • 在OpenAPI YAML中为DELETE方法添加NotFound响应 (#13550)

  • [core] lazy_load_plugins设为False时停止日志刷屏 (#13578)

  • 当没有加载插件时显示消息和文档链接 (#13599)

  • 解除对colorlog依赖的限制 (#13176)

  • 为示例DAG添加缺失的Dag标签 (#13665)

  • 支持在DAG文档中使用表格 (#13533)

  • 添加 python3-openid 依赖项 (#13714)

  • 为执行器添加 __repr__ (#13753)

  • conn_type缺失时添加描述提示 (#13778)

  • 将Azure blob升级到v12 (#12188)

  • get_connnection REST端点添加额外字段 (#13885)

  • 使智能传感器数据库迁移操作具备幂等性 (#13892)

  • 改进在运行dag暂停命令时DAG不存在时的错误 (#13900)

  • 更新 airflow_local_settings.py 以修复错误消息 (#13927)

  • 仅允许向TriggerDagRunOperator传递JSON可序列化的配置(#13964)

  • Bug修复:允许获取具有空start_date的DAG详情(REST API)(#13959)

  • 向DAG详情端点添加参数 (#13790)

  • 使分配给匿名用户的角色可自定义 (#14042)

  • 在调度器循环中重试关键方法,以防出现OperationalError (#14032)

仅文档变更

  • 在文档中添加缺失的StatsD指标 (#13708)

  • 在配置文档中添加缺失的邮件配置 (#13709)

  • 新增Docker上Airflow的快速入门指南 (#13660)

  • 描述支持哪些Python版本 (#13259)

  • 在2.x迁移文档中添加注释块 (#13094)

  • 添加关于webserver_config.py的文档 (#13155)

  • 为最近新增的配置添加缺失的版本信息 (#13161)

  • API:在UpdateMask组件中使用通用信息 (#13146)

  • 将Airflow 2.0.0添加到需求表中 (#13140)

  • 避免在CeleryKubernetesExecutor的文档中产生混淆 (#13116)

  • 更新REST API规范中的文档链接 (#13107)

  • 在提供者文档中添加PyPI仓库链接 (#13064)

  • 修复指向Airflow主分支文档的链接 (#13179)

  • 传感器文档的小幅改进 (#13381)

  • 在Airflow文档和Breeze中使用2.0.0版本 (#13379)

  • 改进关于providers和自定义connections的文档 (#13375)(#13410)

  • 修复 production-deployment.rst 中的表格格式问题 (#13395)

  • 更新 celery.rst 以修复损坏的链接 (#13400)

  • 移除文档中对调度器 run_duration 参数的引用 (#13346)

  • 设置支持的最低SQLite版本 (#13412)

  • 修复安装文档 (#13462)

  • 添加关于模拟变量和连接的文档 (#13502)

  • 添加关于Flask CLI的文档 (#13500)

  • 修复升级到2指南以使用rbac用户界面 (#13569)

  • 明确文档说明,稳定API无法禁用认证 (#13568)

  • 从文档中移除归档链接 & 添加AIPs链接 (#13580)

  • 升级到2.rst的小修复 (#13583)

  • 修复升级到2.0指南中的链接 (#13584)

  • 修复best-practices.rst中Mocking部分的标题 (#13658)

  • 添加关于如何在插件文件夹中使用自定义操作符的文档 (#13186)

  • 更新文档以注册Operator Extra Links (#13683)

  • 数据库设置文档的改进 (#13696)

  • 将模块路径替换为仅使用类名 (#13719)

  • 更新DAG序列化文档 (#13722)

  • 修复网页服务器中指向Apache Airflow文档的链接 (#13250)

  • 阐明extras和provider包之间的区别 (#13810)

  • 添加关于环境所有访问方法的信息 (#13940)

  • 文档:修复关于调度器延迟的常见问题解答 (#13969)

  • 更新了taskflow api文档以展示与sensor的依赖关系 (#13968)

  • 将已弃用的配置选项添加到文档 (#13883)

  • 在升级到2版本的文档中新增了FAQ(常见问题解答)章节 (#13979)

Airflow 2.0.0 (2020-12-18)

完整的变更日志约有3000行(已排除所有回传到1.10版本的内容),因此请查阅Airflow 2.0.0亮点博客文章替代。

重大变更

Airflow 2.0版本是一次重大升级,包含了大量主要变更,其中部分可能是破坏性变更。为早期版本编写的现有代码可能需要更新才能使用此版本。有时还需要进行必要的配置更改。 本文档描述了已进行的变更,以及您需要如何更新使用方式。

如果您遇到问题或有疑问,请提交问题报告

重大变更

本节描述此版本中的主要变更内容。

实验性REST API默认禁用

实验性REST API默认处于禁用状态。在迁移到稳定版REST API期间如需恢复这些API,请将enable_experimental_api选项在[api]配置节中设为True

请注意,实验性REST API没有访问控制。 认证用户拥有完全访问权限。

SparkJDBCHook 默认连接

对于SparkJDBCHook,默认连接是spark-default,而对于SparkSubmitHook则是spark_default。现在这两个hook都使用spark_default,这是所有provider中连接名称使用的通用模式。

命令中输出参数的变化

从Airflow 2.0开始,我们将用rich替代tabulate来渲染命令输出。由于这一变更,--output参数将不再支持tabulate表格格式。现在它接受以下格式:

  • table - 将以预定义表格形式呈现输出

  • json - 将输出渲染为json格式

  • yaml - 将输出渲染为yaml格式

通过这样做,我们提高了输出的一致性,并让用户能够以编程方式操作输出(当使用json或yaml时)。

受影响的命令:

  • airflow dags list

  • airflow dags report

  • airflow dags list-runs

  • airflow dags list-jobs

  • airflow connections list

  • airflow connections get

  • airflow pools list

  • airflow pools get

  • airflow pools set

  • airflow pools delete

  • airflow pools import

  • airflow pools export

  • airflow role list

  • airflow providers list

  • airflow providers get

  • airflow providers hooks

  • airflow tasks states-for-dag-run

  • airflow users list

  • airflow variables list

Azure Wasb Hook 无法与 Snowflake hook 协同工作

Apache Airflow中的WasbHook使用了旧版本的Azure库。虽然对于大多数Azure钩子来说这个冲突并不严重,但对Wasb Hook来说是个问题,因为两个库的blob文件夹会重叠。同时安装Snowflake和Azure扩展会导致WasbHook无法导入。

all重命名为devel_all额外参数

all 附加包已被缩减为仅包含面向用户的依赖项。这意味着该附加包不再包含开发依赖项。如果您之前依赖 all 附加包,现在应该改用 devel_all 或确认是否需要开发附加包。

上下文变量 prev_execution_date_successprev_execution_date_success 现在是 pendulum.DateTime 类型

将policy重命名为task_policy

由于Airflow引入了DAG级别的策略(dag_policy),我们决定将现有的policy函数重命名为task_policy,以使区分更加明显并避免混淆。

使用集群策略的用户需要将policy函数在airflow_local_settings.py中重命名为task_policy

[celery] operation_timeout的默认值已更改为1.0

从Airflow 2开始,默认情况下Airflow会尝试3次将任务发布到Celery代理。这由 [celery] task_publish_max_retries参数控制。因此我们现在可以设置更低的操作超时时间,这会触发 AirflowTaskTimeout异常。这种情况通常发生在网络波动或间歇性DNS问题时。

通过插件添加Operators和Sensors不再受支持

Operators和Sensors不应再通过Airflow的插件机制进行注册或导入——这些类在Airflow中仅被视为普通的python类,因此无需向Airflow注册它们。

如果你之前有一个plugins/my_plugin.py并且在DAG中这样使用它:

from airflow.operators.my_plugin import MyOperator

您应该改为这样导入:

from my_plugin import MyOperator

airflow.operators.下的名称是插件名称,而在第二个示例中,它是定义操作符的Python模块名称。

See https://airflow.apache.org/docs/apache-airflow/stable/howto/custom-operator.html for more info.

不再支持通过插件导入Hooks

不再支持通过airflow.hooks.导入插件中添加的hooks,hooks应该像常规Python模块一样直接导入。

from airflow.hooks.my_plugin import MyHook

您应该改为这样导入:

from my_plugin import MyHook

仍然可以(但不是必须)在插件中“注册”钩子。这是为了将来支持在用户界面中动态填充连接表单。

See https://airflow.apache.org/docs/apache-airflow/stable/howto/custom-operator.html for more info.

[core] enable_xcom_pickling 的默认值已更改为 False

为了防止RCE攻击,XCom消息的pickle类型默认已被替换为JSON。需要注意的是,JSON序列化比pickle更严格,例如如果你想通过XCom传递原始字节,必须使用base64等编码方式进行编码。如果你了解风险仍希望使用pickling,请在Airflow配置文件的core部分设置enable_xcom_pickling = True

基础路径的Airflow忽略

https://github.com/apache/airflow/pull/11993中修复了一个bug:原先"airflowignore"不仅检查DAG文件夹相对路径中的禁用DAG,还会检查基础路径。这导致如果基础路径包含排除关键词,整个DAG文件夹都可能被排除。例如当airflowignore文件包含x,且DAG文件夹路径是'/var/x/dags'时,该文件夹下所有DAG都会被排除。修复后现在仅匹配相对路径,这意味着如果您之前使用完整路径作为排除项,应该改为相对路径。例如如果您的DAG文件夹是'/var/dags/',而airflowignore中包含'/var/dag/excluded/',现在应改为'excluded/'。

ExternalTaskSensor 会将所有任务上下文变量作为关键字参数提供给 execution_date_fn

context作为字典传递的旧语法将继续有效,但需要注意参数必须命名为context。以下情况会出错。要修复这个问题,请将ctx改为context

def execution_date_fn(execution_date, ctx): ...

execution_date_fn 可以接受任务上下文字典中任意数量的关键字参数。以下形式的 execution_date_fn 都受支持:

def execution_date_fn(dt): ...


def execution_date_fn(execution_date): ...


def execution_date_fn(execution_date, ds_nodash): ...


def execution_date_fn(execution_date, ds_nodash, dag): ...

数据库模式变更

为了迁移数据库,您应该使用命令 airflow db upgrade,但在某些情况下需要手动操作。

连接表中唯一的conn_id

之前,Airflow允许用户添加多个具有相同conn_id的连接,在访问时会随机选择一个连接。当与重试机制结合使用时,这作为一种基本的负载均衡和容错技术。

这种行为给用户带来了一些困惑,并且没有明确证据表明它是否真的有效。

现在 conn_id 将是唯一的。如果您的元数据数据库中已存在重复项,则必须在升级数据库之前处理这些重复的连接。

连接表中不可为空的conn_type列

connection表中的conn_type列必须包含内容。此前,该规则由应用程序逻辑强制执行,但未在数据库模式中强制执行。

如果您直接对表进行了任何修改,请确保conn_type列中没有null值。

配置变更

此版本包含许多变更,需要调整此应用程序或与其集成的其他应用程序的配置。

本节描述了已进行的更改以及您需要采取的措施。

airflow.contrib.utils.log 已被迁移

最初核心代码由Airbnb的创始团队维护。社区负责支持contrib包中的代码。该项目后来移交给了Apache社区,目前所有代码均由社区维护,因此原有的划分已无实际意义,仅出于历史原因保留。在Airflow 2.0中,我们计划重新组织包结构,并将与第三方服务的集成迁移至airflow.providers包。

为了清理,以下软件包已被移动:

旧包

新包

airflow.contrib.utils.log

airflow.utils.log

airflow.utils.log.gcs_task_handler

airflow.providers.google.cloud.log.gcs_task_handler

airflow.utils.log.wasb_task_handler

airflow.providers.microsoft.azure.log.wasb_task_handler

airflow.utils.log.stackdriver_task_handler

airflow.providers.google.cloud.log.stackdriver_task_handler

airflow.utils.log.s3_task_handler

airflow.providers.amazon.aws.log.s3_task_handler

airflow.utils.log.es_task_handler

airflow.providers.elasticsearch.log.es_task_handler

airflow.utils.log.cloudwatch_task_handler

airflow.providers.amazon.aws.log.cloudwatch_task_handler

如果您正在使用logging_config_class选项设置日志配置,则应更新导入路径。 旧的导入路径仍然有效,但可能会被弃用。

SendGrid邮件发送功能已迁移

核心代码最初由Airbnb的创始团队维护。而contrib包中的代码则由社区提供支持。该项目后来移交给了Apache社区,目前所有代码均由社区维护,因此原有的区分已无实际意义,仅出于历史原因保留。

为了清理代码,send_mail函数已从airflow.contrib.utils.sendgrid模块中移出。

如果你的配置文件如下所示:

[email]
email_backend = airflow.contrib.utils.sendgrid.send_email

现在它应该看起来像这样:

[email]
email_backend = airflow.providers.sendgrid.utils.emailer.send_email

旧配置仍然有效但可以弃用。

统一core部分中的hostname_callable选项

之前的选项使用冒号(:)来分隔模块和函数。现在改用点号(.)。

这一变更旨在统一所有引用airflow.cfg文件中对象的选项格式。

自定义执行器通过完整导入路径加载

在Airflow的早期版本中,可以通过插件加载自定义执行器。虽然现在仍然可行,但配置方式已发生变化。如今您无需创建插件来配置自定义执行器,只需在core配置段的executor选项中提供模块的完整路径即可。这项变更的目的是简化插件机制,使执行器配置更加便捷。

如果你的模块路径是 my_acme_company.executors.MyCustomExecutor 并且插件名为 my_plugin,那么你的配置看起来是这样的

[core]
executor = my_plugin.MyCustomExecutor

现在它应该看起来像这样:

[core]
executor = my_acme_company.executors.MyCustomExecutor

旧配置仍然有效,但可能随时被弃用。

对于自定义数据模型,请使用CustomSQLAInterface而非SQLAInterface

从Airflow 2.0开始,如果你想定义自己的Flask App Builder数据模型,需要使用CustomSQLAInterface而不是SQLAInterface。

对于非RBAC替换为:

from flask_appbuilder.models.sqla.interface import SQLAInterface

datamodel = SQLAInterface(your_data_model)

使用RBAC(在1.10版本中):

from airflow.www_rbac.utils import CustomSQLAInterface

datamodel = CustomSQLAInterface(your_data_model)

在2.0版本中:

from airflow.www.utils import CustomSQLAInterface

datamodel = CustomSQLAInterface(your_data_model)
移除对stat_name_handler的插件支持

在之前的版本中,您可以使用插件机制来配置stat_name_handler。现在您应该使用[scheduler]部分中的stat_name_handler选项来实现相同的效果。

如果你的插件看起来像这样,并且可以通过 test_plugin 路径访问:

def my_stat_name_handler(stat):
    return stat


class AirflowTestPlugin(AirflowPlugin):
    name = "test_plugin"
    stat_name_handler = my_stat_name_handler

那么你的 airflow.cfg 文件应该如下所示:

[scheduler]
stat_name_handler=test_plugin.my_stat_name_handler

此变更旨在简化statsd的配置。

日志配置已移至新章节

以下配置已从[core]移至新的[logging]部分。

  • base_log_folder

  • remote_logging

  • remote_log_conn_id

  • remote_base_log_folder

  • encrypt_s3_logs

  • logging_level

  • fab_logging_level

  • logging_config_class

  • colored_console_log

  • colored_log_format

  • colored_formatter_class

  • log_format

  • simple_log_format

  • task_log_prefix_template

  • log_filename_template

  • log_processor_filename_template

  • dag_processor_manager_log_location

  • task_log_reader

指标配置已移至新章节

以下配置已从[scheduler]迁移至新的[metrics]部分。

  • statsd_on

  • statsd_host

  • statsd_port

  • statsd_prefix

  • statsd_allow_list

  • stat_name_handler

  • statsd_datadog_enabled

  • statsd_datadog_tags

  • statsd_custom_client_path

Elasticsearch日志提供程序的变更

当启用JSON标准输出时,日志行现在将包含log_idoffset字段,这应该能让从webserver上的elasticsearch读取任务日志开箱即用。示例配置:

[logging]
remote_logging = True
[elasticsearch]
host = http://es-host:9200
write_stdout = True
json_format = True

请注意,webserver期望日志行数据本身存在于文档的message字段中。

移除airflow.cfg文件中的gcp_service_account_keys选项

此选项已被移除,因为Google Kubernetes Engine不再支持它。新的Google Cloud管理方法推荐使用的服务账户密钥是Workload Identity

Fernet 默认已启用

默认启用了fernet机制以提高默认安装的安全性。为了恢复之前的行为,用户必须明确地在airflow.cfg文件的[core]部分的fernet_key选项中设置一个空密钥。

同时,这意味着apache-airflow[crypto]额外包总是会被安装。 但这要求您的操作系统已安装libffi-dev

Kubernetes工作节点注解传播变更

kubernetes_annotations 配置部分已被移除。 新增了一个键 worker_annotations 到现有的 kubernetes 部分中。 这是为了移除对k8s注解键字符集的限制。 所有来自 kubernetes_annotations 的键/值对现在应该以json格式放入 worker_annotations 中。例如,替换掉原来的配置方式。

[kubernetes_annotations]
annotation_key = annotation_value
annotation_key2 = annotation_value2

应该重写为

[kubernetes]
worker_annotations = { "annotation_key" : "annotation_value", "annotation_key2" : "annotation_value2" }
移除运行时长

我们不应再使用run_duration选项。该选项过去用于定期重启调度器,但目前调度器已变得更加稳定,因此使用此设置被认为是不良实践,可能导致状态不一致。

重命名池统计指标

已使用插槽(Used slot)更名为运行中插槽(running slot),使名称更直观且代码更易于维护。

这意味着指标 pool.used_slots. 已更名为 pool.running_slots.。Pools Web UI 视图中的 Used Slots 列 也已更改为 Running Slots

移除Mesos执行器

Mesos Executor 已从代码库中移除,因为它未被广泛使用且缺乏维护。Mailing List Discussion on deleting it

修改DAG加载时长指标名称

将DAG文件加载时长指标从 dag.loading-duration. 改为 dag.loading-duration.。这一改动是为了 更好地处理一个DAG文件中包含多个DAG的情况。

Sentry默认禁用

Sentry默认是禁用的。要启用这些集成功能,您需要在[sentry]部分中将sentry_on选项设置为"True"

简化的GCSTaskHandler配置

在之前的版本中,为了配置服务账号密钥文件,您必须创建一个连接条目。 在当前版本中,您可以通过在[logging]部分配置google_key_path选项来设置密钥文件路径。

使用应用默认凭据(ADC)的用户无需采取任何操作。

此次变更旨在简化日志配置,防止通过更改用户控制的连接条目值导致实例配置损坏。如果配置了后端密钥,也意味着网页服务器无需连接到它。这简化了多GCP项目设置,因为只需在一个项目中启用Secret Manager API。

核心operators/hooks的变更

我们努力确保不会出现可能影响终端用户和您文件的变更,但此版本可能包含需要您对DAG文件进行修改的变更。

本节描述了所做的更改,以及如果您使用核心操作符或其他任何内容,需要如何更新您的DAG文件。

BaseSensorOperator 现在会遵循下游任务的 trigger_rule 规则

之前,当设置了soft_fail=True的BaseSensorOperator失败时,它会无条件跳过自身及其所有下游任务,即不考虑下游任务的trigger_rule。

在新行为中,下游任务的trigger_rule会被遵循。 用户可以通过将每个下游任务的trigger_rule设置为all_success来保留/实现原始行为。

BaseOperator 使用元类

BaseOperator 类使用 BaseOperatorMeta 作为元类。该元类基于 abc.ABCMeta。如果您的自定义操作符使用不同的元类,则需要进行相应调整。

移除BaseHook中的SQL支持

从BaseHook中移除get_recordsget_pandas_dfrun,这些方法仅适用于类SQL的hook。 如需使用它们,或让自定义hook继承这些方法,请使用airflow.hooks.dbapi.DbApiHook

不再支持使用位运算符(位移运算符)将任务分配给DAG

之前,你可以按照以下方式将任务分配给DAG:

dag = DAG("my_dag")
dummy = DummyOperator(task_id="dummy")

dag >> dummy

不再支持此功能。我们建议改用DAG作为上下文管理器:

with DAG("my_dag") as dag:
    dummy = DummyOperator(task_id="dummy")
移除已弃用的导入机制

已移除废弃的导入机制,使模块的导入更加一致和明确。

例如:from airflow.operators import BashOperator 变为 from airflow.operators.bash_operator import BashOperator

传感器导入变更

传感器现在可以通过airflow.sensors访问,不再通过airflow.operators.sensors访问。

例如:from airflow.operators.sensors import BaseSensorOperator 变为 from airflow.sensors.base import BaseSensorOperator

跳过的任务可以满足wait_for_downstream

之前,带有wait_for_downstream=True的任务实例只有在上一任务实例的下游任务成功时才会运行。同时,带有depends_on_past=True的任务实例在上一任务实例成功或跳过时都会运行。这两个标志是密切相关的,但它们的行为却不同。这种不一致的行为使得API对用户来说不够直观。为了保持行为一致,现在成功或跳过的下游任务都可以满足wait_for_downstream=True标志。

airflow.utils.helpers.cross_downstream
airflow.utils.helpers.chain

chaincross_downstream 方法现已从 airflow.utils.helpers 模块迁移至 airflow.models.baseoperator 模块。

baseoperator模块似乎是保持紧密耦合方法在一起的更好选择。Helpers模块应包含可被所有类导入的独立辅助方法。

chain方法和cross_downstream方法都使用BaseOperator。如果其他包从helpers模块导入任何类或函数,那么它会自动对BaseOperator产生隐式依赖。这通常会导致循环依赖。

更多信息请参阅 AIRFLOW-6392

在Airflow 2.0之前的版本中,您需要这样导入这两个方法:

from airflow.utils.helpers import chain
from airflow.utils.helpers import cross_downstream

在Airflow 2.0中应更改为:

from airflow.models.baseoperator import chain
from airflow.models.baseoperator import cross_downstream
airflow.operators.python.BranchPythonOperator

BranchPythonOperator 现在会返回一个等于所选分支task_id的值, 而之前它返回的是None。由于它继承自BaseOperator,如果do_xcom_push=True, 它会将这个值进行xcom_push。这对下游决策非常有用。

airflow.sensors.sql_sensor.SqlSensor

SQLSensor现在与Python的bool()函数保持一致,并且移除了allow_null参数。

它将在接收到任何被Python bool(value)转换为True的值后解析。这改变了之前接收NULL'0'的响应行为。早期'0'被视为成功标准。NULL的处理取决于allow_null参数的值。但通过将参数success设置为lambda x: x is None or str(x) not in ('0', ''),仍然可以实现所有先前的行为。

airflow.operators.trigger_dagrun.TriggerDagRunOperator

TriggerDagRunOperator 现在接受一个 conf 参数,可以为其提供一个字典作为 DagRun 的配置。 因此,移除了 python_callable 参数。PR: https://github.com/apache/airflow/pull/6317

airflow.operators.python.PythonOperator

provide_context 参数在 PythonOperator 上已被移除。传递给 PythonOperator 的可调用对象的签名现在会被自动推断,参数值总是会自动提供。不再需要显式地提供或不提供上下文。例如:

def myfunc(execution_date):
    print(execution_date)


python_operator = PythonOperator(task_id="mytask", python_callable=myfunc, dag=dag)

注意,您无需设置 provide_context=True,任务上下文中的变量现在会自动检测并提供。

所有上下文变量仍可通过双星号参数提供:

def myfunc(**context):
    print(context)  # all variables will be provided to context


python_operator = PythonOperator(task_id="mytask", python_callable=myfunc)

任务上下文变量名在可调用函数中是保留名称,因此与op_argsop_kwargs冲突会导致异常:

def myfunc(dag):
    # raises a ValueError because "dag" is a reserved name
    # valid signature example: myfunc(mydag)
    print("output")


python_operator = PythonOperator(
    task_id="mytask",
    op_args=[1],
    python_callable=myfunc,
)

这一变更是向后兼容的,设置provide_context会将provide_context变量添加到kwargs中(但不会产生任何实际效果)。

PR: #5990

airflow.sensors.filesystem.FileSensor

FileSensor现在支持通配符模式,而不仅仅是文件名。如果您要查找的文件名中包含*?[,则应将其替换为[*][?][[]

airflow.operators.subdag_operator.SubDagOperator

SubDagOperator 已改为使用 Airflow 调度器而非回填来安排子任务。用户不再需要在 SubDagOperator 中指定执行器。

airflow.providers.google.cloud.operators.datastore.CloudDatastoreExportEntitiesOperator
airflow.providers.google.cloud.operators.datastore.CloudDatastoreImportEntitiesOperator
airflow.providers.cncf.kubernetes.operators.kubernetes_pod.KubernetesPodOperator
airflow.providers.ssh.operators.ssh.SSHOperator
airflow.providers.microsoft.winrm.operators.winrm.WinRMOperator
airflow.operators.bash.BashOperator
airflow.providers.docker.operators.docker.DockerOperator
airflow.providers.http.operators.http.SimpleHttpOperator

do_xcom_push标志(用于控制是否将操作符结果推送到xcom的开关)在不同操作符中存在多种变体。该功能已在BaseOperator上统一使用通用名称(do_xcom_push)。这种方式也便于全局禁用将结果推送到xcom的功能。

以下操作符受到影响:

  • DatastoreExportOperator (向后兼容)

  • DatastoreImportOperator (向后兼容)

  • KubernetesPodOperator (不向后兼容)

  • SSHOperator(不向后兼容)

  • WinRMOperator (不向后兼容)

  • BashOperator (不向后兼容)

  • DockerOperator(不向后兼容)

  • SimpleHttpOperator (不向后兼容)

详情请参见 AIRFLOW-3249

airflow.operators.latest_only_operator.LatestOnlyOperator

在之前的版本中,LatestOnlyOperator会强制跳过所有(直接和间接)下游任务。从这个版本开始,该操作符将仅跳过直接下游任务,调度程序将负责跳过任何更下游的依赖项。

如果仅使用默认触发规则all_success,则无需更改。

如果DAG依赖于被LatestOnlyOperator跳过的其他触发规则(如all_done)的任务,则需要对DAG进行调整以适应行为变化,例如通过添加来自LatestOnlyOperator的额外边。

本次变更的目标是基于BaseBranchOperator实现更一致且可配置的级联行为(参见AIRFLOW-2923AIRFLOW-1784)。

核心Python API的变更

我们努力确保不会影响终端用户的变更,也不会影响您的Python文件,但此版本可能包含需要您修改插件、DAG文件或其他集成的变更。

这里仅描述该提供程序特有的变更。您仍需关注核心(包括核心操作符)所做的更改,因为它们可能影响该提供程序的集成行为。

本节描述了所做的更改,以及您需要更新Python文件的操作。

airflow/__init__.py中移除了子包导入

导入项 LoggingMixinconfAirflowException 已从 airflow/__init__.py 中移除。 这些对象的所有隐式引用将不再有效。要进行迁移,必须将每个旧路径的所有使用替换为对应的新路径。

旧路径(隐式导入)

新路径(显式导入)

airflow.LoggingMixin

airflow.utils.log.logging_mixin.LoggingMixin

airflow.conf

airflow.configuration.conf

airflow.AirflowException

airflow.exceptions.AirflowException

从任务实例上下文中移除的变量

以下变量已从任务实例上下文中移除:

  • 结束日期

  • 最新日期

  • 表格

airflow.contrib.utils.Weekday

核心代码最初由Airbnb的创始团队维护。而contrib包中的代码则由社区提供支持。该项目后来移交给了Apache社区,目前所有代码均由社区维护,因此原有的区分已无实际意义,仅出于历史原因保留。

为了清理代码,Weekday枚举已从airflow.contrib.utils移至airflow.utils模块。

airflow.models.connection.Connection

连接模块新增了已弃用的方法:

  • Connection.parse_from_uri

  • Connection.log_info

  • Connection.debug_info

以及一个已弃用的函数:

  • parse_netloc_to_hostname

之前,用户可以通过两种方式创建连接对象

conn_1 = Connection(conn_id="conn_a", uri="mysql://AAA/")
# or
conn_2 = Connection(conn_id="conn_a")
conn_2.parse_uri(uri="mysql://AAA/")

目前不支持第二种方式。

Connection.log_infoConnection.debug_info 方法已被弃用。请单独读取每个Connection字段或使用默认表示形式(__repr__)。

旧方法仍然有效,但可能随时被弃用。这些变更旨在删除那些很少使用的方法。

airflow.models.dag.DAG.create_dagrun

DAG.create_dagrun 接受 run_type 且不再需要 run_id 这一变更是由于在 DagRun 中添加了 run_type 列所致。

之前的签名:

def create_dagrun(
    self,
    run_id,
    state,
    execution_date=None,
    start_date=None,
    external_trigger=False,
    conf=None,
    session=None,
): ...

当前:

def create_dagrun(
    self,
    state,
    execution_date=None,
    run_id=None,
    start_date=None,
    external_trigger=False,
    conf=None,
    run_type=None,
    session=None,
): ...

如果用户提供了run_id,那么run_type将通过检查前缀来推导得出,允许的类型包括:manualscheduledbackfill(由airflow.utils.types.DagRunType定义)。

如果用户提供了run_typeexecution_date,那么run_id将被构建为{run_type}__{execution_data.isoformat()}

Airflow应使用run_typeexecution_date来构建dagruns,保留使用run_id创建的功能供用户操作。

airflow.models.dagrun.DagRun

使用DagRunType.SCHEDULED.value替代DagRun.ID_PREFIX

所有不同类型DagRuns的run_id前缀已被统一归类到单个枚举中,位于airflow.utils.types.DagRunType

之前,这些定义分散在不同的地方,例如作为DagRunBackfillJob的类变量,以及在_trigger_dag函数中定义的ID_PREFIX

原内容:

>> from airflow.models.dagrun import DagRun
>> DagRun.ID_PREFIX
scheduled__

替换为:

>> from airflow.utils.types import DagRunType
>> DagRunType.SCHEDULED.value
scheduled
airflow.utils.file.TemporaryDirectory

我们移除了airflow.utils.file.TemporaryDirectory 由于Airflow放弃了对Python 3.5以下版本的支持,因此不再需要这个自定义的 TemporaryDirectory实现,因为同样的功能已由 tempfile.TemporaryDirectory提供。

现在用户应该使用from tempfile import TemporaryDirectory来替代import from airflow.utils.files import TemporaryDirectory。这两个上下文管理器提供相同的接口,因此不需要进行额外的修改。

airflow.AirflowMacroPlugin

我们移除了airflow.AirflowMacroPlugin类。这个类虽然存在于airflow包中,但从未被使用过(显然自2015年以来)。它已被移除。

airflow.settings.CONTEXT_MANAGER_DAG

CONTEXT_MANAGER_DAG 已从设置中移除。其功能已被 DagContext 在 'airflow.models.dag' 中取代。原因之一是设置应该是静态的而非存储来自DAG的动态上下文,但最主要的原因是,将上下文移出设置后,解决了DAG、BaseOperator、SerializedDAG、SerializedBaseOperator之间的循环导入问题,这是AIRFLOW-6010的一部分。

airflow.utils.log.logging_mixin.redirect_stderr
airflow.utils.log.logging_mixin.redirect_stdout

函数 redirect_stderrredirect_stdoutairflow.utils.log.logging_mixin 模块中 已被删除,因为它们可以轻松被标准库替代。 标准库的函数更加灵活,可以应用于更广泛的场景。

以下代码

import logging

from airflow.utils.log.logging_mixin import redirect_stderr, redirect_stdout

logger = logging.getLogger("custom-logger")
with redirect_stdout(logger, logging.INFO), redirect_stderr(logger, logging.WARN):
    print("I love Airflow")

可以被以下代码替换:

from contextlib import redirect_stdout, redirect_stderr
import logging

from airflow.utils.log.logging_mixin import StreamLogWriter

logger = logging.getLogger("custom-logger")

with (
    redirect_stdout(StreamLogWriter(logger, logging.INFO)),
    redirect_stderr(StreamLogWriter(logger, logging.WARN)),
):
    print("I Love Airflow")
airflow.models.baseoperator.BaseOperator

现在,传递给BaseOperator的额外参数会导致异常。旧版本的Airflow会接受额外参数并在控制台显示一条消息。当用户没有注意到这条消息时,会导致非常难以检测的错误。

要恢复之前的行为,您必须在airflow.cfg文件的[operators]部分中,将allow_illegal_arguments选项设置为True。未来可能会完全删除此选项。

airflow.models.dagbag.DagBag

向DagBag.init传递store_serialized_dags参数以及访问DagBag.store_serialized_dags属性 已被弃用,将在未来版本中移除。

上一个签名:

def __init__(
    dag_folder=None,
    include_examples=conf.getboolean("core", "LOAD_EXAMPLES"),
    safe_mode=conf.getboolean("core", "DAG_DISCOVERY_SAFE_MODE"),
    store_serialized_dags=False,
): ...

当前:

def __init__(
    dag_folder=None,
    include_examples=conf.getboolean("core", "LOAD_EXAMPLES"),
    safe_mode=conf.getboolean("core", "DAG_DISCOVERY_SAFE_MODE"),
    read_dags_from_db=False,
): ...

如果您之前使用的是位置参数,则无需更改;但如果您使用的是关键字参数,请将store_serialized_dags更改为read_dags_from_db

同样地,如果您之前使用的是DagBag().store_serialized_dags属性,请将其更改为 DagBag().read_dags_from_db

google 提供商包的变更

我们努力确保不会影响最终用户和您的Python文件的变更,但此版本可能包含需要您调整配置、DAG文件或其他集成(如自定义操作器)的更改。

这里仅描述该提供程序特有的变更。您仍需关注核心(包括核心操作符)所做的更改,因为它们可能影响该提供程序的集成行为。

本节描述了已进行的更改,以及如果您使用与Google服务(包括Google云平台-GCP)集成的操作器或钩子时需要进行哪些更新。

为与Google服务通信的操作员添加直接模拟功能

直接模拟服务账号 现在已支持操作员通过名为impersonation_chain的新参数 (对于同时与其他云服务提供商通信的操作员则使用google_impersonation_chain) 与Google服务进行交互。因此,GCSToS3Operator不再继承自GCSListObjectsOperator。

标准化Google Cloud的gcp_conn_id

之前并非所有与Google Cloud相关的钩子和操作符都使用gcp_conn_id作为GCP连接参数。目前有一个适用于大多数服务的参数。诸如datastore_conn_idbigquery_conn_idgoogle_cloud_storage_conn_id等类似参数已被弃用。需要两个连接的操作符保持不变。

以下组件受到规范化影响:

  • airflow.providers.google.cloud.hooks.datastore.DatastoreHook

  • airflow.providers.google.cloud.hooks.bigquery.BigQueryHook

  • airflow.providers.google.cloud.hooks.gcs.GoogleCloudStorageHook

  • airflow.providers.google.cloud.operators.bigquery.BigQueryCheckOperator

  • airflow.providers.google.cloud.operators.bigquery.BigQueryValueCheckOperator

  • airflow.providers.google.cloud.operators.bigquery.BigQueryIntervalCheckOperator

  • airflow.providers.google.cloud.operators.bigquery.BigQueryGetDataOperator

  • airflow.providers.google.cloud.operators.bigquery.BigQueryOperator

  • airflow.providers.google.cloud.operators.bigquery.BigQueryDeleteDatasetOperator

  • airflow.providers.google.cloud.operators.bigquery.BigQueryCreateEmptyDatasetOperator

  • airflow.providers.google.cloud.operators.bigquery.BigQueryTableDeleteOperator

  • airflow.providers.google.cloud.operators.gcs.GoogleCloudStorageCreateBucketOperator

  • airflow.providers.google.cloud.operators.gcs.GoogleCloudStorageListOperator

  • airflow.providers.google.cloud.operators.gcs.GoogleCloudStorageDownloadOperator

  • airflow.providers.google.cloud.operators.gcs.GoogleCloudStorageDeleteOperator

  • airflow.providers.google.cloud.operators.gcs.GoogleCloudStorageBucketCreateAclEntryOperator

  • airflow.providers.google.cloud.operators.gcs.GoogleCloudStorageObjectCreateAclEntryOperator

  • airflow.operators.sql_to_gcs.BaseSQLToGoogleCloudStorageOperator

  • airflow.operators.adls_to_gcs.AdlsToGoogleCloudStorageOperator

  • airflow.operators.gcs_to_s3.GoogleCloudStorageToS3Operator

  • airflow.operators.gcs_to_gcs.GoogleCloudStorageToGoogleCloudStorageOperator

  • airflow.operators.bigquery_to_gcs.BigQueryToCloudStorageOperator

  • airflow.operators.local_to_gcs.FileToGoogleCloudStorageOperator

  • airflow.operators.cassandra_to_gcs.CassandraToGoogleCloudStorageOperator

  • airflow.operators.bigquery_to_bigquery.BigQueryToBigQueryOperator

GCP操作符和钩子导入路径及名称变更

根据AIP-21,与Google Cloud相关的operators已从contrib迁移至core。下表展示了导入路径的变化。

旧路径

新路径

airflow.contrib.hooks.bigquery_hook.BigQueryHook

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook

airflow.contrib.hooks.datastore_hook.DatastoreHook

airflow.providers.google.cloud.hooks.datastore.DatastoreHook

airflow.contrib.hooks.gcp_bigtable_hook.BigtableHook

airflow.providers.google.cloud.hooks.bigtable.BigtableHook

airflow.contrib.hooks.gcp_cloud_build_hook.CloudBuildHook

airflow.providers.google.cloud.hooks.cloud_build.CloudBuildHook

airflow.contrib.hooks.gcp_container_hook.GKEClusterHook

airflow.providers.google.cloud.hooks.kubernetes_engine.GKEHook

airflow.contrib.hooks.gcp_compute_hook.GceHook

airflow.providers.google.cloud.hooks.compute.ComputeEngineHook

airflow.contrib.hooks.gcp_dataflow_hook.DataFlowHook

airflow.providers.google.cloud.hooks.dataflow.DataflowHook

airflow.contrib.hooks.gcp_dataproc_hook.DataProcHook

airflow.providers.google.cloud.hooks.dataproc.DataprocHook

airflow.contrib.hooks.gcp_dlp_hook.CloudDLPHook

airflow.providers.google.cloud.hooks.dlp.CloudDLPHook

airflow.contrib.hooks.gcp_function_hook.GcfHook

airflow.providers.google.cloud.hooks.functions.CloudFunctionsHook

airflow.contrib.hooks.gcp_kms_hook.GoogleCloudKMSHook

airflow.providers.google.cloud.hooks.kms.CloudKMSHook

airflow.contrib.hooks.gcp_mlengine_hook.MLEngineHook

airflow.providers.google.cloud.hooks.mlengine.MLEngineHook

airflow.contrib.hooks.gcp_natural_language_hook.CloudNaturalLanguageHook

airflow.providers.google.cloud.hooks.natural_language.CloudNaturalLanguageHook

airflow.contrib.hooks.gcp_pubsub_hook.PubSubHook

airflow.providers.google.cloud.hooks.pubsub.PubSubHook

airflow.contrib.hooks.gcp_speech_to_text_hook.GCPSpeechToTextHook

airflow.providers.google.cloud.hooks.speech_to_text.CloudSpeechToTextHook

airflow.contrib.hooks.gcp_spanner_hook.CloudSpannerHook

airflow.providers.google.cloud.hooks.spanner.SpannerHook

airflow.contrib.hooks.gcp_sql_hook.CloudSqlDatabaseHook

airflow.providers.google.cloud.hooks.cloud_sql.CloudSQLDatabaseHook

airflow.contrib.hooks.gcp_sql_hook.CloudSqlHook

airflow.providers.google.cloud.hooks.cloud_sql.CloudSQLHook

airflow.contrib.hooks.gcp_tasks_hook.CloudTasksHook

airflow.providers.google.cloud.hooks.tasks.CloudTasksHook

airflow.contrib.hooks.gcp_text_to_speech_hook.GCPTextToSpeechHook

airflow.providers.google.cloud.hooks.text_to_speech.CloudTextToSpeechHook

airflow.contrib.hooks.gcp_transfer_hook.GCPTransferServiceHook

airflow.providers.google.cloud.hooks.cloud_storage_transfer_service.CloudDataTransferServiceHook

airflow.contrib.hooks.gcp_translate_hook.CloudTranslateHook

airflow.providers.google.cloud.hooks.translate.CloudTranslateHook

airflow.contrib.hooks.gcp_video_intelligence_hook.CloudVideoIntelligenceHook

airflow.providers.google.cloud.hooks.video_intelligence.CloudVideoIntelligenceHook

airflow.contrib.hooks.gcp_vision_hook.CloudVisionHook

airflow.providers.google.cloud.hooks.vision.CloudVisionHook

airflow.contrib.hooks.gcs_hook.GoogleCloudStorageHook

airflow.providers.google.cloud.hooks.gcs.GCSHook

airflow.contrib.operators.adls_to_gcs.AdlsToGoogleCloudStorageOperator

airflow.operators.adls_to_gcs.AdlsToGoogleCloudStorageOperator

airflow.contrib.operators.bigquery_check_operator.BigQueryCheckOperator

airflow.providers.google.cloud.operators.bigquery.BigQueryCheckOperator

airflow.contrib.operators.bigquery_check_operator.BigQueryIntervalCheckOperator

airflow.providers.google.cloud.operators.bigquery.BigQueryIntervalCheckOperator

airflow.contrib.operators.bigquery_check_operator.BigQueryValueCheckOperator

airflow.providers.google.cloud.operators.bigquery.BigQueryValueCheckOperator

airflow.contrib.operators.bigquery_get_data.BigQueryGetDataOperator

airflow.providers.google.cloud.operators.bigquery.BigQueryGetDataOperator

airflow.contrib.operators.bigquery_operator.BigQueryCreateEmptyDatasetOperator

airflow.providers.google.cloud.operators.bigquery.BigQueryCreateEmptyDatasetOperator

airflow.contrib.operators.bigquery_operator.BigQueryCreateEmptyTableOperator

airflow.providers.google.cloud.operators.bigquery.BigQueryCreateEmptyTableOperator

airflow.contrib.operators.bigquery_operator.BigQueryCreateExternalTableOperator

airflow.providers.google.cloud.operators.bigquery.BigQueryCreateExternalTableOperator

airflow.contrib.operators.bigquery_operator.BigQueryDeleteDatasetOperator

airflow.providers.google.cloud.operators.bigquery.BigQueryDeleteDatasetOperator

airflow.contrib.operators.bigquery_operator.BigQueryOperator

airflow.providers.google.cloud.operators.bigquery.BigQueryExecuteQueryOperator

airflow.contrib.operators.bigquery_table_delete_operator.BigQueryTableDeleteOperator

airflow.providers.google.cloud.operators.bigquery.BigQueryDeleteTableOperator

airflow.contrib.operators.bigquery_to_bigquery.BigQueryToBigQueryOperator

airflow.operators.bigquery_to_bigquery.BigQueryToBigQueryOperator

airflow.contrib.operators.bigquery_to_gcs.BigQueryToCloudStorageOperator

airflow.operators.bigquery_to_gcs.BigQueryToCloudStorageOperator

airflow.contrib.operators.bigquery_to_mysql_operator.BigQueryToMySqlOperator

airflow.operators.bigquery_to_mysql.BigQueryToMySqlOperator

airflow.contrib.operators.dataflow_operator.DataFlowJavaOperator

airflow.providers.google.cloud.operators.dataflow.DataFlowJavaOperator

airflow.contrib.operators.dataflow_operator.DataFlowPythonOperator

airflow.providers.google.cloud.operators.dataflow.DataFlowPythonOperator

airflow.contrib.operators.dataflow_operator.DataflowTemplateOperator

airflow.providers.google.cloud.operators.dataflow.DataflowTemplateOperator

airflow.contrib.operators.dataproc_operator.DataProcHadoopOperator

airflow.providers.google.cloud.operators.dataproc.DataprocSubmitHadoopJobOperator

airflow.contrib.operators.dataproc_operator.DataProcHiveOperator

airflow.providers.google.cloud.operators.dataproc.DataprocSubmitHiveJobOperator

airflow.contrib.operators.dataproc_operator.DataProcJobBaseOperator

airflow.providers.google.cloud.operators.dataproc.DataprocJobBaseOperator

airflow.contrib.operators.dataproc_operator.DataProcPigOperator

airflow.providers.google.cloud.operators.dataproc.DataprocSubmitPigJobOperator

airflow.contrib.operators.dataproc_operator.DataProcPySparkOperator

airflow.providers.google.cloud.operators.dataproc.DataprocSubmitPySparkJobOperator

airflow.contrib.operators.dataproc_operator.DataProcSparkOperator

airflow.providers.google.cloud.operators.dataproc.DataprocSubmitSparkJobOperator

airflow.contrib.operators.dataproc_operator.DataProcSparkSqlOperator

airflow.providers.google.cloud.operators.dataproc.DataprocSubmitSparkSqlJobOperator

airflow.contrib.operators.dataproc_operator.DataprocClusterCreateOperator

airflow.providers.google.cloud.operators.dataproc.DataprocCreateClusterOperator

airflow.contrib.operators.dataproc_operator.DataprocClusterDeleteOperator

airflow.providers.google.cloud.operators.dataproc.DataprocDeleteClusterOperator

airflow.contrib.operators.dataproc_operator.DataprocClusterScaleOperator

airflow.providers.google.cloud.operators.dataproc.DataprocScaleClusterOperator

airflow.contrib.operators.dataproc_operator.DataprocOperationBaseOperator

airflow.providers.google.cloud.operators.dataproc.DataprocOperationBaseOperator

airflow.contrib.operators.dataproc_operator.DataprocWorkflowTemplateInstantiateInlineOperator

airflow.providers.google.cloud.operators.dataproc.DataprocInstantiateInlineWorkflowTemplateOperator

airflow.contrib.operators.dataproc_operator.DataprocWorkflowTemplateInstantiateOperator

airflow.providers.google.cloud.operators.dataproc.DataprocInstantiateWorkflowTemplateOperator

airflow.contrib.operators.datastore_export_operator.DatastoreExportOperator

airflow.providers.google.cloud.operators.datastore.DatastoreExportOperator

airflow.contrib.operators.datastore_import_operator.DatastoreImportOperator

airflow.providers.google.cloud.operators.datastore.DatastoreImportOperator

airflow.contrib.operators.file_to_gcs.FileToGoogleCloudStorageOperator

airflow.providers.google.cloud.transfers.local_to_gcs.FileToGoogleCloudStorageOperator

airflow.contrib.operators.gcp_bigtable_operator.BigtableClusterUpdateOperator

airflow.providers.google.cloud.operators.bigtable.BigtableUpdateClusterOperator

airflow.contrib.operators.gcp_bigtable_operator.BigtableInstanceCreateOperator

airflow.providers.google.cloud.operators.bigtable.BigtableCreateInstanceOperator

airflow.contrib.operators.gcp_bigtable_operator.BigtableInstanceDeleteOperator

airflow.providers.google.cloud.operators.bigtable.BigtableDeleteInstanceOperator

airflow.contrib.operators.gcp_bigtable_operator.BigtableTableCreateOperator

airflow.providers.google.cloud.operators.bigtable.BigtableCreateTableOperator

airflow.contrib.operators.gcp_bigtable_operator.BigtableTableDeleteOperator

airflow.providers.google.cloud.operators.bigtable.BigtableDeleteTableOperator

airflow.contrib.operators.gcp_bigtable_operator.BigtableTableWaitForReplicationSensor

airflow.providers.google.cloud.sensors.bigtable.BigtableTableReplicationCompletedSensor

airflow.contrib.operators.gcp_cloud_build_operator.CloudBuildCreateBuildOperator

airflow.providers.google.cloud.operators.cloud_build.CloudBuildCreateBuildOperator

airflow.contrib.operators.gcp_compute_operator.GceBaseOperator

airflow.providers.google.cloud.operators.compute.GceBaseOperator

airflow.contrib.operators.gcp_compute_operator.GceInstanceGroupManagerUpdateTemplateOperator

airflow.providers.google.cloud.operators.compute.GceInstanceGroupManagerUpdateTemplateOperator

airflow.contrib.operators.gcp_compute_operator.GceInstanceStartOperator

airflow.providers.google.cloud.operators.compute.GceInstanceStartOperator

airflow.contrib.operators.gcp_compute_operator.GceInstanceStopOperator

airflow.providers.google.cloud.operators.compute.GceInstanceStopOperator

airflow.contrib.operators.gcp_compute_operator.GceInstanceTemplateCopyOperator

airflow.providers.google.cloud.operators.compute.GceInstanceTemplateCopyOperator

airflow.contrib.operators.gcp_compute_operator.GceSetMachineTypeOperator

airflow.providers.google.cloud.operators.compute.GceSetMachineTypeOperator

airflow.contrib.operators.gcp_container_operator.GKEClusterCreateOperator

airflow.providers.google.cloud.operators.kubernetes_engine.GKECreateClusterOperator

airflow.contrib.operators.gcp_container_operator.GKEClusterDeleteOperator

airflow.providers.google.cloud.operators.kubernetes_engine.GKEDeleteClusterOperator

airflow.contrib.operators.gcp_container_operator.GKEPodOperator

airflow.providers.google.cloud.operators.kubernetes_engine.GKEStartPodOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPCancelDLPJobOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPCancelDLPJobOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPCreateDLPJobOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPCreateDLPJobOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPCreateDeidentifyTemplateOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPCreateDeidentifyTemplateOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPCreateInspectTemplateOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPCreateInspectTemplateOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPCreateJobTriggerOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPCreateJobTriggerOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPCreateStoredInfoTypeOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPCreateStoredInfoTypeOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPDeidentifyContentOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPDeidentifyContentOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPDeleteDeidentifyTemplateOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPDeleteDeidentifyTemplateOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPDeleteDlpJobOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPDeleteDLPJobOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPDeleteInspectTemplateOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPDeleteInspectTemplateOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPDeleteJobTriggerOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPDeleteJobTriggerOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPDeleteStoredInfoTypeOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPDeleteStoredInfoTypeOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPGetDeidentifyTemplateOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPGetDeidentifyTemplateOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPGetDlpJobOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPGetDLPJobOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPGetInspectTemplateOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPGetInspectTemplateOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPGetJobTripperOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPGetJobTriggerOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPGetStoredInfoTypeOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPGetStoredInfoTypeOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPInspectContentOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPInspectContentOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPListDeidentifyTemplatesOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPListDeidentifyTemplatesOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPListDlpJobsOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPListDLPJobsOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPListInfoTypesOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPListInfoTypesOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPListInspectTemplatesOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPListInspectTemplatesOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPListJobTriggersOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPListJobTriggersOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPListStoredInfoTypesOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPListStoredInfoTypesOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPRedactImageOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPRedactImageOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPReidentifyContentOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPReidentifyContentOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPUpdateDeidentifyTemplateOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPUpdateDeidentifyTemplateOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPUpdateInspectTemplateOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPUpdateInspectTemplateOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPUpdateJobTriggerOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPUpdateJobTriggerOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPUpdateStoredInfoTypeOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPUpdateStoredInfoTypeOperator

airflow.contrib.operators.gcp_function_operator.GcfFunctionDeleteOperator

airflow.providers.google.cloud.operators.functions.GcfFunctionDeleteOperator

airflow.contrib.operators.gcp_function_operator.GcfFunctionDeployOperator

airflow.providers.google.cloud.operators.functions.GcfFunctionDeployOperator

airflow.contrib.operators.gcp_natural_language_operator.CloudNaturalLanguageAnalyzeEntitiesOperator

airflow.providers.google.cloud.operators.natural_language.CloudNaturalLanguageAnalyzeEntitiesOperator

airflow.contrib.operators.gcp_natural_language_operator.CloudNaturalLanguageAnalyzeEntitySentimentOperator

airflow.providers.google.cloud.operators.natural_language.CloudNaturalLanguageAnalyzeEntitySentimentOperator

airflow.contrib.operators.gcp_natural_language_operator.CloudNaturalLanguageAnalyzeSentimentOperator

airflow.providers.google.cloud.operators.natural_language.CloudNaturalLanguageAnalyzeSentimentOperator

airflow.contrib.operators.gcp_natural_language_operator.CloudNaturalLanguageClassifyTextOperator

airflow.providers.google.cloud.operators.natural_language.CloudNaturalLanguageClassifyTextOperator

airflow.contrib.operators.gcp_spanner_operator.CloudSpannerInstanceDatabaseDeleteOperator

airflow.providers.google.cloud.operators.spanner.SpannerDeleteDatabaseInstanceOperator

airflow.contrib.operators.gcp_spanner_operator.CloudSpannerInstanceDatabaseDeployOperator

airflow.providers.google.cloud.operators.spanner.SpannerDeployDatabaseInstanceOperator

airflow.contrib.operators.gcp_spanner_operator.CloudSpannerInstanceDatabaseQueryOperator

airflow.providers.google.cloud.operators.spanner.SpannerQueryDatabaseInstanceOperator

airflow.contrib.operators.gcp_spanner_operator.CloudSpannerInstanceDatabaseUpdateOperator

airflow.providers.google.cloud.operators.spanner.SpannerUpdateDatabaseInstanceOperator

airflow.contrib.operators.gcp_spanner_operator.CloudSpannerInstanceDeleteOperator

airflow.providers.google.cloud.operators.spanner.SpannerDeleteInstanceOperator

airflow.contrib.operators.gcp_spanner_operator.CloudSpannerInstanceDeployOperator

airflow.providers.google.cloud.operators.spanner.SpannerDeployInstanceOperator

airflow.contrib.operators.gcp_speech_to_text_operator.GcpSpeechToTextRecognizeSpeechOperator

airflow.providers.google.cloud.operators.speech_to_text.CloudSpeechToTextRecognizeSpeechOperator

airflow.contrib.operators.gcp_text_to_speech_operator.GcpTextToSpeechSynthesizeOperator

airflow.providers.google.cloud.operators.text_to_speech.CloudTextToSpeechSynthesizeOperator

airflow.contrib.operators.gcp_transfer_operator.GcpTransferServiceJobCreateOperator

airflow.providers.google.cloud.operators.cloud_storage_transfer_service.CloudDataTransferServiceCreateJobOperator

airflow.contrib.operators.gcp_transfer_operator.GcpTransferServiceJobDeleteOperator

airflow.providers.google.cloud.operators.cloud_storage_transfer_service.CloudDataTransferServiceDeleteJobOperator

airflow.contrib.operators.gcp_transfer_operator.GcpTransferServiceJobUpdateOperator

airflow.providers.google.cloud.operators.cloud_storage_transfer_service.CloudDataTransferServiceUpdateJobOperator

airflow.contrib.operators.gcp_transfer_operator.GcpTransferServiceOperationCancelOperator

airflow.providers.google.cloud.operators.cloud_storage_transfer_service.CloudDataTransferServiceCancelOperationOperator

airflow.contrib.operators.gcp_transfer_operator.GcpTransferServiceOperationGetOperator

airflow.providers.google.cloud.operators.cloud_storage_transfer_service.CloudDataTransferServiceGetOperationOperator

airflow.contrib.operators.gcp_transfer_operator.GcpTransferServiceOperationPauseOperator

airflow.providers.google.cloud.operators.cloud_storage_transfer_service.CloudDataTransferServicePauseOperationOperator

airflow.contrib.operators.gcp_transfer_operator.GcpTransferServiceOperationResumeOperator

airflow.providers.google.cloud.operators.cloud_storage_transfer_service.CloudDataTransferServiceResumeOperationOperator

airflow.contrib.operators.gcp_transfer_operator.GcpTransferServiceOperationsListOperator

airflow.providers.google.cloud.operators.cloud_storage_transfer_service.CloudDataTransferServiceListOperationsOperator

airflow.contrib.operators.gcp_transfer_operator.GoogleCloudStorageToGoogleCloudStorageTransferOperator

airflow.providers.google.cloud.operators.cloud_storage_transfer_service.CloudDataTransferServiceGCSToGCSOperator

airflow.contrib.operators.gcp_translate_operator.CloudTranslateTextOperator

airflow.providers.google.cloud.operators.translate.CloudTranslateTextOperator

airflow.contrib.operators.gcp_translate_speech_operator.GcpTranslateSpeechOperator

airflow.providers.google.cloud.operators.translate_speech.GcpTranslateSpeechOperator

airflow.contrib.operators.gcp_video_intelligence_operator.CloudVideoIntelligenceDetectVideoExplicitContentOperator

airflow.providers.google.cloud.operators.video_intelligence.CloudVideoIntelligenceDetectVideoExplicitContentOperator

airflow.contrib.operators.gcp_video_intelligence_operator.CloudVideoIntelligenceDetectVideoLabelsOperator

airflow.providers.google.cloud.operators.video_intelligence.CloudVideoIntelligenceDetectVideoLabelsOperator

airflow.contrib.operators.gcp_video_intelligence_operator.CloudVideoIntelligenceDetectVideoShotsOperator

airflow.providers.google.cloud.operators.video_intelligence.CloudVideoIntelligenceDetectVideoShotsOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionAddProductToProductSetOperator

airflow.providers.google.cloud.operators.vision.CloudVisionAddProductToProductSetOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionAnnotateImageOperator

airflow.providers.google.cloud.operators.vision.CloudVisionImageAnnotateOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionDetectDocumentTextOperator

airflow.providers.google.cloud.operators.vision.CloudVisionTextDetectOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionDetectImageLabelsOperator

airflow.providers.google.cloud.operators.vision.CloudVisionDetectImageLabelsOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionDetectImageSafeSearchOperator

airflow.providers.google.cloud.operators.vision.CloudVisionDetectImageSafeSearchOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionDetectTextOperator

airflow.providers.google.cloud.operators.vision.CloudVisionDetectTextOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionProductCreateOperator

airflow.providers.google.cloud.operators.vision.CloudVisionCreateProductOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionProductDeleteOperator

airflow.providers.google.cloud.operators.vision.CloudVisionDeleteProductOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionProductGetOperator

airflow.providers.google.cloud.operators.vision.CloudVisionGetProductOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionProductSetCreateOperator

airflow.providers.google.cloud.operators.vision.CloudVisionCreateProductSetOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionProductSetDeleteOperator

airflow.providers.google.cloud.operators.vision.CloudVisionDeleteProductSetOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionProductSetGetOperator

airflow.providers.google.cloud.operators.vision.CloudVisionGetProductSetOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionProductSetUpdateOperator

airflow.providers.google.cloud.operators.vision.CloudVisionUpdateProductSetOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionProductUpdateOperator

airflow.providers.google.cloud.operators.vision.CloudVisionUpdateProductOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionReferenceImageCreateOperator

airflow.providers.google.cloud.operators.vision.CloudVisionCreateReferenceImageOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionRemoveProductFromProductSetOperator

airflow.providers.google.cloud.operators.vision.CloudVisionRemoveProductFromProductSetOperator

airflow.contrib.operators.gcs_acl_operator.GoogleCloudStorageBucketCreateAclEntryOperator

airflow.providers.google.cloud.operators.gcs.GCSBucketCreateAclEntryOperator

airflow.contrib.operators.gcs_acl_operator.GoogleCloudStorageObjectCreateAclEntryOperator

airflow.providers.google.cloud.operators.gcs.GCSObjectCreateAclEntryOperator

airflow.contrib.operators.gcs_delete_operator.GoogleCloudStorageDeleteOperator

airflow.providers.google.cloud.operators.gcs.GCSDeleteObjectsOperator

airflow.contrib.operators.gcs_download_operator.GoogleCloudStorageDownloadOperator

airflow.providers.google.cloud.operators.gcs.GCSToLocalFilesystemOperator

airflow.contrib.operators.gcs_list_operator.GoogleCloudStorageListOperator

airflow.providers.google.cloud.operators.gcs.GCSListObjectsOperator

airflow.contrib.operators.gcs_operator.GoogleCloudStorageCreateBucketOperator

airflow.providers.google.cloud.operators.gcs.GCSCreateBucketOperator

airflow.contrib.operators.gcs_to_bq.GoogleCloudStorageToBigQueryOperator

airflow.operators.gcs_to_bq.GoogleCloudStorageToBigQueryOperator

airflow.contrib.operators.gcs_to_gcs.GoogleCloudStorageToGoogleCloudStorageOperator

airflow.operators.gcs_to_gcs.GoogleCloudStorageToGoogleCloudStorageOperator

airflow.contrib.operators.gcs_to_s3.GoogleCloudStorageToS3Operator

airflow.operators.gcs_to_s3.GCSToS3Operator

airflow.contrib.operators.mlengine_operator.MLEngineBatchPredictionOperator

airflow.providers.google.cloud.operators.mlengine.MLEngineStartBatchPredictionJobOperator

airflow.contrib.operators.mlengine_operator.MLEngineModelOperator

airflow.providers.google.cloud.operators.mlengine.MLEngineManageModelOperator

airflow.contrib.operators.mlengine_operator.MLEngineTrainingOperator

airflow.providers.google.cloud.operators.mlengine.MLEngineStartTrainingJobOperator

airflow.contrib.operators.mlengine_operator.MLEngineVersionOperator

airflow.providers.google.cloud.operators.mlengine.MLEngineManageVersionOperator

airflow.contrib.operators.mssql_to_gcs.MsSqlToGoogleCloudStorageOperator

airflow.operators.mssql_to_gcs.MsSqlToGoogleCloudStorageOperator

airflow.contrib.operators.mysql_to_gcs.MySqlToGoogleCloudStorageOperator

airflow.operators.mysql_to_gcs.MySqlToGoogleCloudStorageOperator

airflow.contrib.operators.postgres_to_gcs_operator.PostgresToGoogleCloudStorageOperator

airflow.operators.postgres_to_gcs.PostgresToGoogleCloudStorageOperator

airflow.contrib.operators.pubsub_operator.PubSubPublishOperator

airflow.providers.google.cloud.operators.pubsub.PubSubPublishMessageOperator

airflow.contrib.operators.pubsub_operator.PubSubSubscriptionCreateOperator

airflow.providers.google.cloud.operators.pubsub.PubSubCreateSubscriptionOperator

airflow.contrib.operators.pubsub_operator.PubSubSubscriptionDeleteOperator

airflow.providers.google.cloud.operators.pubsub.PubSubDeleteSubscriptionOperator

airflow.contrib.operators.pubsub_operator.PubSubTopicCreateOperator

airflow.providers.google.cloud.operators.pubsub.PubSubCreateTopicOperator

airflow.contrib.operators.pubsub_operator.PubSubTopicDeleteOperator

airflow.providers.google.cloud.operators.pubsub.PubSubDeleteTopicOperator

airflow.contrib.operators.sql_to_gcs.BaseSQLToGoogleCloudStorageOperator

airflow.operators.sql_to_gcs.BaseSQLToGoogleCloudStorageOperator

airflow.contrib.sensors.bigquery_sensor.BigQueryTableSensor

airflow.providers.google.cloud.sensors.bigquery.BigQueryTableExistenceSensor

airflow.contrib.sensors.gcp_transfer_sensor.GCPTransferServiceWaitForJobStatusSensor

airflow.providers.google.cloud.sensors.cloud_storage_transfer_service.DataTransferServiceJobStatusSensor

airflow.contrib.sensors.gcs_sensor.GoogleCloudStorageObjectSensor

airflow.providers.google.cloud.sensors.gcs.GCSObjectExistenceSensor

airflow.contrib.sensors.gcs_sensor.GoogleCloudStorageObjectUpdatedSensor

airflow.providers.google.cloud.sensors.gcs.GCSObjectUpdateSensor

airflow.contrib.sensors.gcs_sensor.GoogleCloudStoragePrefixSensor

airflow.providers.google.cloud.sensors.gcs.GCSObjectsWithPrefixExistenceSensor

airflow.contrib.sensors.gcs_sensor.GoogleCloudStorageUploadSessionCompleteSensor

airflow.providers.google.cloud.sensors.gcs.GCSUploadSessionCompleteSensor

airflow.contrib.sensors.pubsub_sensor.PubSubPullSensor

airflow.providers.google.cloud.sensors.pubsub.PubSubPullSensor

统一Google Cloud的默认conn_id

之前并非所有与Google Cloud相关的钩子和操作器都使用google_cloud_default作为默认conn_id。目前只有一个默认变体。诸如google_cloud_storage_defaultbigquery_defaultgoogle_cloud_datastore_default等值已被弃用。数据库中现有相关连接的配置已保留。要使用这些已弃用的GCP conn_id,您需要显式地将它们的conn_id传递给操作器/钩子。否则,默认情况下将使用google_cloud_default作为GCP的conn_id。

airflow.providers.google.cloud.hooks.dataflow.DataflowHook
airflow.providers.google.cloud.operators.dataflow.DataflowCreateJavaJobOperator
airflow.providers.google.cloud.operators.dataflow.DataflowTemplatedJobStartOperator
airflow.providers.google.cloud.operators.dataflow.DataflowCreatePythonJobOperator

为了在GCP钩子和操作器中一致使用project_id参数,我们进行了以下更改:

  • 更改了DataflowHook.start_python_dataflow中的参数顺序。使用

    带有位置参数的代码可能会中断。

  • 修改了DataflowHook.is_job_dataflow_running中的参数顺序。使用

    位置参数可能会中断。

  • 修改了DataflowHook.cancel_job中的参数顺序。使用

    位置参数的代码可能会中断。

  • 为DataflowCreateJavaJobOperator添加了可选的project_id参数

    构造函数。

  • 为DataflowTemplatedJobStartOperator添加了可选的project_id参数

    构造函数。

  • 为DataflowCreatePythonJobOperator添加了可选的project_id参数

    构造函数。

airflow.providers.google.cloud.sensors.gcs.GCSUploadSessionCompleteSensor

为了更精确地控制底层GCS存储桶中对象的变更处理,此传感器的构造函数现已更改。

  • 旧行为: 此构造函数过去可选择性地接收 previous_num_objects: int

  • 新增替换构造函数参数:previous_objects: Optional[Set[str]]

大多数用户不会指定此参数,因为存储桶初始为空,用户希望将所有文件视为新文件。

更新该传感器使用方式的示例: 过去调用的用户:

GCSUploadSessionCompleteSensor(bucket='my_bucket', prefix='my_prefix', previous_num_objects=1)

现在将调用:

GCSUploadSessionCompleteSensor(bucket='my_bucket', prefix='my_prefix', previous_num_objects={'.keep'})

其中'.keep'是位于您前缀路径下的一个单独文件,传感器不应将其视为新文件。

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor
airflow.providers.google.cloud.hooks.bigquery.BigQueryHook

为了简化BigQuery操作符(不再需要Cursor)并标准化所有GCP集成方法中钩子的使用方式,原本位于BiqQueryBaseCursor中的方法 已被迁移至BigQueryHook。出于向后兼容性考虑,仍可通过Cursor对象调用这些方法,但会触发DeprecationWarning警告。 以下方法已被迁移:

旧路径

新路径

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.cancel_query

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.cancel_query

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.create_empty_dataset

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.create_empty_dataset

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.create_empty_table

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.create_empty_table

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.create_external_table

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.create_external_table

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.delete_dataset

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.delete_dataset

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.get_dataset

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.get_dataset

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.get_dataset_tables

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.get_dataset_tables

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.get_dataset_tables_list

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.get_dataset_tables_list

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.get_datasets_list

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.get_datasets_list

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.get_schema

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.get_schema

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.get_tabledata

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.get_tabledata

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.insert_all

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.insert_all

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.patch_dataset

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.patch_dataset

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.patch_table

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.patch_table

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.poll_job_complete

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.poll_job_complete

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.run_copy

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.run_copy

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.run_extract

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.run_extract

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.run_grant_dataset_view_access

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.run_grant_dataset_view_access

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.run_load

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.run_load

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.run_query

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.run_query

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.run_table_delete

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.run_table_delete

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.run_table_upsert

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.run_table_upsert

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.run_with_configuration

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.run_with_configuration

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.update_dataset

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.update_dataset

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor

由于BigQuery是GCP的一部分,可以通过使用airflow.providers.google.common.hooks.base.GoogleBaseHook.catch_http_exception装饰器来简化异常处理代码,但它会改变以下方法抛出的异常:

  • airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.run_table_delete 现在会抛出 AirflowException 而不是 Exception

  • airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.create_empty_dataset 抛出 AirflowException 而非 ValueError

  • airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.get_dataset 抛出 AirflowException 而非 ValueError

airflow.providers.google.cloud.operators.bigquery.BigQueryCreateEmptyTableOperator
airflow.providers.google.cloud.operators.bigquery.BigQueryCreateEmptyDatasetOperator

BigQueryCreateEmptyTableOperatorBigQueryCreateEmptyDatasetOperator中增加了幂等性支持。 但为了实现这一点,从BigQueryHookcreate_empty_datasetcreate_empty_table 方法中移除了try/except子句。

airflow.providers.google.cloud.hooks.dataflow.DataflowHook
airflow.providers.google.cloud.hooks.mlengine.MLEngineHook
airflow.providers.google.cloud.hooks.pubsub.PubSubHook

GCP操作符的变更意味着这些操作符对应的GCP钩子现在在所有使用project_id的方法中都需要关键字参数而非位置参数。如果使用位置参数调用这些方法,它们会抛出一个解释性异常。

其他GCP钩子不受影响。

airflow.providers.google.cloud.hooks.pubsub.PubSubHook
airflow.providers.google.cloud.operators.pubsub.PubSubTopicCreateOperator
airflow.providers.google.cloud.operators.pubsub.PubSubSubscriptionCreateOperator
airflow.providers.google.cloud.operators.pubsub.PubSubTopicDeleteOperator
airflow.providers.google.cloud.operators.pubsub.PubSubSubscriptionDeleteOperator
airflow.providers.google.cloud.operators.pubsub.PubSubPublishOperator
airflow.providers.google.cloud.sensors.pubsub.PubSubPullSensor

PubSubPublishOperatorPubSubHook.publish方法中,消息的data字段应该是字节字符串(utf-8编码)而不是base64编码的字符串。

由于GCP操作器和钩子内部参数的规范化,诸如projecttopic_project等参数已被弃用,将被project_id参数替代。 在PubSubHook.create_subscription钩子方法中,参数subscription_project已被subscription_project_id取代。 模板字段已相应更新,旧字段可能不再有效。

现在需要通过关键字参数传递给PubSub钩子。

这些更改不向后兼容。

airflow.providers.google.cloud.operators.kubernetes_engine.GKEStartPodOperator

GKEPodOperator中的gcp_conn_id参数是必需的。在之前的版本中,可以向GKEStartPodOperator操作符中的gcp_conn_id传递None值,这将导致根据Application Default Credentials策略确定凭据。

现在这个参数需要一个值。要恢复之前的行为,请配置连接时不指定服务账号。

有关连接管理的详细信息请参阅: Google Cloud Connection

airflow.providers.google.cloud.hooks.gcs.GCSHook
  • 以下参数已在GCSHook的所有方法中被替换:

    • bucket 已改为 bucket_name

    • object 已更改为 object_name

  • 为了保持一致性,GoogleCloudStorageHook.list中的参数maxResults已更名为max_results

airflow.providers.google.cloud.operators.dataproc.DataprocSubmitPigJobOperator
airflow.providers.google.cloud.operators.dataproc.DataprocSubmitHiveJobOperator
airflow.providers.google.cloud.operators.dataproc.DataprocSubmitSparkSqlJobOperator
airflow.providers.google.cloud.operators.dataproc.DataprocSubmitSparkJobOperator
airflow.providers.google.cloud.operators.dataproc.DataprocSubmitHadoopJobOperator
airflow.providers.google.cloud.operators.dataproc.DataprocSubmitPySparkJobOperator

与Dataproc相关操作符(DataprocXXXOperator)的'properties'和'jars'属性已从dataproc_xxxx_propertiesdataproc_xxx_jars分别更名为dataproc_propertiesdataproc_jars。参数dataproc_properties dataproc_jars

airflow.providers.google.cloud.operators.cloud_storage_transfer_service.CloudDataTransferServiceCreateJobOperator

为了实现pylint兼容性,filter参数在CloudDataTransferServiceCreateJobOperator中已被重命名为request_filter

airflow.providers.google.cloud.hooks.cloud_storage_transfer_service.CloudDataTransferServiceHook

为了实现pylint兼容性,filter参数在CloudDataTransferServiceHook.list_transfer_jobCloudDataTransferServiceHook.list_transfer_operations中已被重命名为request_filter

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook

通常所有钩子方法都使用@GoogleBaseHook.fallback_to_default_project_id装饰,因此 钩子的参数只能通过关键字参数传递。

  • create_empty_table 方法现在接受 table_resource 参数。如果提供了该参数,所有其他参数将被忽略。

  • create_empty_dataset 现在会使用 dataset_reference 中的值,而不再在参数同时传入 dataset_reference 和方法参数时抛出错误。此外,dataset_reference 的验证现在通过 Dataset.from_api_repr 完成。异常和日志消息已更改。

  • update_dataset 现在需要新的 fields 参数(破坏性变更)

  • delete_dataset 具有新的签名 (dataset_id, project_id, …) 之前的签名是 (project_id, dataset_id, …) (重大变更)

  • get_tabledata 返回行列表而不是字典格式的API响应。该方法已被弃用,推荐使用 list_rows。(重大变更)

airflow.providers.google.cloud.hooks.cloud_build.CloudBuildHook
airflow.providers.google.cloud.operators.cloud_build.CloudBuildCreateBuildOperator
The api_version has been removed and will not be used since we migrate CloudBuildHook from using

发现API到原生google-cloud-build Python库。

The body parameter in CloudBuildCreateBuildOperator has been deprecated.

相反,你应该使用build参数来传递body。

airflow.providers.google.cloud.hooks.dataflow.DataflowHook.start_python_dataflow
airflow.providers.google.cloud.hooks.dataflow.DataflowHook.start_python_dataflow
airflow.providers.google.cloud.operators.dataflow.DataflowCreatePythonJobOperator

将python3更改为Dataflow Hooks/Operators的默认解释器

现在DataFlow Hooks/Operators中的py_interpreter参数已从python2更改为python3。

airflow.providers.google.common.hooks.base_google.GoogleBaseHook

为了简化代码,装饰器 provide_gcp_credential_file 已从内部类中移出。

不应使用@GoogleBaseHook._Decorators.provide_gcp_credential_file, 而应写成@GoogleBaseHook.provide_gcp_credential_file

airflow.providers.google.cloud.operators.dataproc.DataprocCreateClusterOperator

强烈建议为Dataproc配置1TB以上的磁盘空间以确保足够的吞吐量: https://cloud.google.com/compute/docs/disks/performance

因此,DataprocCreateClusterOperatormaster_disk_size的默认值已从500GB更改为1TB。

生成集群配置

如果您是从Airflow 1.10.x版本升级且未使用CLUSTER_CONFIG,可以通过airflow.providers.google.cloud.operators.dataproc.ClusterGeneratormake()方法轻松生成配置。

如果您正在使用旧版API中的metadata参数,这已被证明特别有用,详情请参阅AIRFLOW-16911

例如,在v1.10.x版本中,您的集群创建可能如下所示

path = f"gs://goog-dataproc-initialization-actions-us-central1/python/pip-install.sh"

create_cluster = DataprocClusterCreateOperator(
    task_id="create_dataproc_cluster",
    cluster_name="test",
    project_id="test",
    zone="us-central1-a",
    region="us-central1",
    master_machine_type="n1-standard-4",
    worker_machine_type="n1-standard-4",
    num_workers=2,
    storage_bucket="test_bucket",
    init_actions_uris=[path],
    metadata={"PIP_PACKAGES": "pyyaml requests pandas openpyxl"},
)

升级到v2.x.x并使用CLUSTER_CONFIG后,将显示如下内容:

path = f"gs://goog-dataproc-initialization-actions-us-central1/python/pip-install.sh"

CLUSTER_CONFIG = ClusterGenerator(
    project_id="test",
    zone="us-central1-a",
    master_machine_type="n1-standard-4",
    worker_machine_type="n1-standard-4",
    num_workers=2,
    storage_bucket="test",
    init_actions_uris=[path],
    metadata={"PIP_PACKAGES": "pyyaml requests pandas openpyxl"},
).make()

create_cluster_operator = DataprocClusterCreateOperator(
    task_id="create_dataproc_cluster",
    cluster_name="test",
    project_id="test",
    region="us-central1",
    cluster_config=CLUSTER_CONFIG,
)
airflow.providers.google.cloud.operators.bigquery.BigQueryGetDatasetTablesOperator

我们修改了BigQueryGetDatasetTablesOperator的签名。

之前:

def __init__(
    dataset_id: str,
    dataset_resource: dict,
    # ...
): ...

之后:

def __init__(
    dataset_resource: dict,
    dataset_id: Optional[str] = None,
    # ...
): ...

amazon 提供程序包中的变更

我们努力确保不会影响终端用户的变更,也不会影响您的Python文件,但此版本可能包含需要您调整配置、DAG文件或其他集成(如自定义操作器)的变更。

这里仅描述该提供程序特有的变更。您仍需关注核心(包括核心操作符)所做的更改,因为它们可能影响该提供程序的集成行为。

本节描述了已进行的更改,以及如果您使用与亚马逊服务(包括亚马逊网络服务 - AWS)集成的操作器或钩子,您需要做什么来更新您的配置。

AWS组件迁移

所有AWS组件(钩子、操作符、传感器、示例DAG)将按照AIP-21中的决定进行分组。迁移后的组件保持向后兼容性,但从旧模块导入时会引发DeprecationWarning警告。已完成迁移的组件包括:

旧路径

新路径

airflow.hooks.S3_hook.S3Hook

airflow.providers.amazon.aws.hooks.s3.S3Hook

airflow.contrib.hooks.aws_athena_hook.AWSAthenaHook

airflow.providers.amazon.aws.hooks.athena.AWSAthenaHook

airflow.contrib.hooks.aws_lambda_hook.AwsLambdaHook

airflow.providers.amazon.aws.hooks.lambda_function.AwsLambdaHook

airflow.contrib.hooks.aws_sqs_hook.SQSHook

airflow.providers.amazon.aws.hooks.sqs.SQSHook

airflow.contrib.hooks.aws_sns_hook.AwsSnsHook

airflow.providers.amazon.aws.hooks.sns.AwsSnsHook

airflow.contrib.operators.aws_athena_operator.AWSAthenaOperator

airflow.providers.amazon.aws.operators.athena.AWSAthenaOperator

airflow.contrib.operators.awsbatch.AWSBatchOperator

airflow.providers.amazon.aws.operators.batch.AwsBatchOperator

airflow.contrib.operators.awsbatch.BatchProtocol

airflow.providers.amazon.aws.hooks.batch_client.AwsBatchProtocol

AWSBatchOperator上的私有属性和方法

airflow.providers.amazon.aws.hooks.batch_client.AwsBatchClient

不适用

airflow.providers.amazon.aws.hooks.batch_waiters.AwsBatchWaiters

airflow.contrib.operators.aws_sqs_publish_operator.SQSPublishOperator

airflow.providers.amazon.aws.operators.sqs.SQSPublishOperator

airflow.contrib.operators.aws_sns_publish_operator.SnsPublishOperator

airflow.providers.amazon.aws.operators.sns.SnsPublishOperator

airflow.contrib.sensors.aws_athena_sensor.AthenaSensor

airflow.providers.amazon.aws.sensors.athena.AthenaSensor

airflow.contrib.sensors.aws_sqs_sensor.SQSSensor

airflow.providers.amazon.aws.sensors.sqs.SQSSensor

airflow.providers.amazon.aws.hooks.emr.EmrHook
airflow.providers.amazon.aws.operators.emr_add_steps.EmrAddStepsOperator
airflow.providers.amazon.aws.operators.emr_create_job_flow.EmrCreateJobFlowOperator
airflow.providers.amazon.aws.operators.emr_terminate_job_flow.EmrTerminateJobFlowOperator

在之前版本的某些EMR操作符中,aws_conn_id的默认值被错误地设置为's3_default'而非'aws_default'。这导致EmrStepSensor无法找到对应的EMR集群。通过对EmrAddStepsOperator、EmrTerminateJobFlowOperator和EmrCreateJobFlowOperator的新改动,该问题已得到解决。

airflow.providers.amazon.aws.operators.batch.AwsBatchOperator

AwsBatchOperator 经过重构,提取出了一个 AwsBatchClient(并继承自它)。这些变更大部分向后兼容,并明确了这些类的公共 API;AwsBatchOperator 上一些用于轮询作业状态的私有方法被重新定位并重命名,以在 AwsBatchClient(以及通过继承在 AwsBatchOperator 上)暴露新的公共方法。AwsBatchOperator 实例上的几个作业属性被重命名;这些属性大多像私有属性一样使用,但它们出现在公共 API 中,因此任何使用它们的地方都需要按如下方式更新:

  • AwsBatchOperator().jobId -> AwsBatchOperator().job_id

  • AwsBatchOperator().jobName -> AwsBatchOperator().job_name

AwsBatchOperator新增了一个选项,用于定义自定义模型来等待作业状态变更。 AwsBatchOperator可以使用新的waiters参数(一个AwsBatchWaiters实例)来 指定将使用自定义作业等待器来监控批处理作业。详情请参阅最新的API文档。

airflow.providers.amazon.aws.sensors.athena.AthenaSensor

将参数 max_retires 替换为 max_retries 以修正拼写错误。

airflow.providers.amazon.aws.hooks.s3.S3Hook

注意:check_for_prefix的参数顺序已变更。 bucket_name现在变为可选参数,默认回退到connection schema属性。 delete_objects现在返回None而非响应结果,因为当键列表长度超过1000时,该方法会发起多个API请求。

其他provider包中的变更

我们努力确保不会影响最终用户和您的Python文件的变更,但此版本可能包含需要您调整配置、DAG文件或其他集成(如自定义操作器)的更改。

此处仅描述与providers相关的独特变更。您仍需关注核心部分(包括核心operators)的改动,因为这些变更可能影响该provider的集成行为。

本节描述了已进行的更改,以及如果您使用了airflow.providers包中的任何代码,需要进行哪些更新。

更改了list_prefixeslist_keys方法在S3Hook中的返回类型

之前,当没有结果时,list_prefixeslist_keys 方法会返回 None。现在行为已更改为在这种情况下返回空列表而非 None

移除HipChat集成

HipChat已终止服务,不再可用。

更多信息请参阅 https://community.atlassian.com/t5/Stride-articles/Stride-and-Hipchat-Cloud-have-reached-End-of-Life-updated/ba-p/940248

airflow.providers.salesforce.hooks.salesforce.SalesforceHook

将参数 sandbox 替换为 domain。根据 simple-salesforce 包的变更。

sign_in函数重命名为get_conn

airflow.providers.apache.pinot.hooks.pinot.PinotAdminHook.create_segment

将PinotAdminHook函数create_segment中的参数名称从format重命名为segment_format以兼容pylint

airflow.providers.apache.hive.hooks.hive.HiveMetastoreHook.get_partitions

将HiveMetastoreHook函数get_partitions中的参数名称从filter重命名为partition_filter以兼容pylint

airflow.providers.ftp.hooks.ftp.FTPHook.list_directory

移除FTPHook函数list_directory中不必要的参数nlst以实现pylint兼容

airflow.providers.postgres.hooks.postgres.PostgresHook.copy_expert

移除PostgresHook函数copy_expert中不必要的参数open以兼容pylint

airflow.providers.opsgenie.operators.opsgenie_alert.OpsgenieAlertOperator

将OpsgenieAlertOperator中的参数名称从visibleTo改为visible_to以兼容pylint规范

airflow.providers.imap.hooks.imap.ImapHook
airflow.providers.imap.sensors.imap_attachment.ImapAttachmentSensor

ImapHook:

  • 参数顺序已更改,涉及 has_mail_attachmentretrieve_mail_attachmentsdownload_mail_attachments

  • 这些函数都新增了一个mail_filter参数。

airflow.providers.http.hooks.http.HttpHook

HTTPHook现在默认启用安全验证:verify=True(之前为:verify=False) 可以通过使用extra_options参数来覆盖此设置,如{'verify': False}

airflow.providers.cloudant.hooks.cloudant.CloudantHook
  • 将cloudant版本从>=0.5.9,<2.0升级到>=2.0

  • 移除了连接中schema属性的使用

  • 移除了db函数,因为数据库对象也可以通过调用cloudant_session['database_name']来获取

例如:

from airflow.providers.cloudant.hooks.cloudant import CloudantHook

with CloudantHook().get_conn() as cloudant_session:
    database = cloudant_session["database_name"]

查看文档获取更多关于如何使用新版cloudant版本的信息。

airflow.providers.snowflake

初始化Snowflake钩子或操作符时,无论是否为其指定值,snowflake_conn_id使用的值始终是snowflake_conn_id。为了保持一致性,现在默认的snowflake_conn_id值已切换为snowflake_default,并在指定时会被正确覆盖。

其他变更

此版本还包括上述部分未涵盖的变更。

标准化的“额外”要求

我们标准化了Extras名称,并将providers包名称与主airflow extras同步。

我们在2.0版本中弃用了多个附加功能。

已弃用的附加功能

新的附加功能

atlas

apache.atlas

aws

亚马逊

azure

microsoft.azure

azure_blob_storage

microsoft.azure

azure_data_lake

microsoft.azure

azure_cosmos

microsoft.azure

azure_container_instances

microsoft.azure

cassandra

apache.cassandra

druid

apache.druid

gcp

谷歌

gcp_api

google

hdfs

apache.hdfs

hive

apache.hive

kubernetes

cncf.kubernetes

mssql

microsoft.mssql

pinot

apache.pinot

webhdfs

apache.webhdfs

winrm

apache.winrm

例如:

如果你想安装Apache Atlas的集成,那么应该使用pip install apache-airflow[apache.atlas]而不是pip install apache-airflow[atlas]

注意!

如果您想安装Microsoft Azure的集成,那么请使用

pip install 'apache-airflow[azure_blob_storage,azure_data_lake,azure_cosmos,azure_container_instances]'

你应该运行 pip install 'apache-airflow[microsoft.azure]'

如果您想安装Amazon Web Services的集成,那么应该执行pip install 'apache-airflow[aws]',而不是pip install 'apache-airflow[s3,emr]'

已弃用的附加功能将在3.0版本中移除。

简化端点/dag_stats和/task_stats的响应负载

端点 /dag_stats/task_stats 的响应帮助用户界面获取关于DAG和任务的简要统计信息。其格式如下:

{
    "example_http_operator": [
        {
            "state": "success",
            "count": 0,
            "dag_id": "example_http_operator",
            "color": "green"
        },
        {
            "state": "running",
            "count": 0,
            "dag_id": "example_http_operator",
            "color": "lime"
        }
    ]
}

payload中重复了dag_id,这使得响应payload变得不必要地更大。

现在 dag_id 将不会在负载中重复出现,响应格式如下

{
    "example_http_operator": [
        {
            "state": "success",
            "count": 0,
            "color": "green"
        },
        {
            "state": "running",
            "count": 0,
            "color": "lime"
        }
    ]
}

Airflow 1.10.15 (2021-03-17)

重大变更

无重大变更。

Bug修复

  • 修复 airflow db upgrade 以按预期升级数据库 (#13267)

  • 将boto3限制移至snowflake (#13286)

  • KubernetesExecutor 应该接受来自 executor_config 的镜像 (#13074)

  • 调度器应正确确认活跃运行的任务 (#13803)

  • 在发行包中包含 airflow/contrib/executors

  • 为Python 2.7用户固定Click版本

  • 确保所有StatsD计时器使用毫秒值。(#10633)

  • [kubernetes_generate_dag_yaml] - 修复DAG YAML生成函数 (#13816)

  • 修复带有 --yes 参数的 airflow tasks clear 命令行指令 (#14188)

  • 修复非POSIX文件系统上的权限错误 (#13121) (#14383)

  • 修复了“variables”命令的弃用消息 (#14457)

  • Bug修复:修复了json_client中的delete_dag函数 (#14441)

  • 修复KubernetesExecutor中secrets和configmaps的合并问题 (#14090)

  • 修复当gunicorn主进程崩溃时webserver退出的问题 (#13470)

  • ini从1.3.5版本升级到1.3.8版本,在airflow/www_rbac

  • datatables.net从1.10.21版本升级到1.10.23版本,在airflow/www_rbac

  • Webserver: 对传递给origin参数的字符串进行消毒处理 (#14738)

  • 使rbac_appdb.session@provide_session使用相同时区 (#14025)

改进

  • 在官方镜像中添加airflow作为可用的docker命令 (#12878)

  • StreamLogWriter: 提供(无操作)关闭方法 (#10885)

  • 为1.10.x过渡版本添加'airflow variables list'命令 (#14462)

仅文档变更

  • 更新Airflow文档的URL (#13561)

  • 在Docker中安装1.10版本时明确了版本参数 (#12875)

Airflow 1.10.14 (2020-12-10)

重大变更

[scheduler] max_threads 配置已重命名为 [scheduler] parsing_processes

从Airflow 1.10.14版本开始,max_threads配置项在[scheduler]章节下已被重命名为parsing_processes

这是为了使名称与实际代码保持一致,其中Scheduler会启动由[scheduler] parsing_processes定义的进程数量来解析DAG文件。

Airflow CLI 与2.0版本的变更保持一致

Airflow CLI 已进行重组,相关命令被归类为子命令组,这意味着如果您在脚本中使用这些命令,现在会触发 DeprecationWarning 警告,您必须在升级到 Airflow 2.0 之前对它们进行修改。

本节描述了所做的更改,以及您需要如何更新脚本。

The ability to manipulate users from the command line has been changed. airflow create_user, airflow delete_user

并且airflow list_users已被整合为一个单一命令airflow users,带有可选标志createlistdelete

airflow list_dags 命令现在改为 airflow dags listairflow pause 改为 airflow dags pause,以此类推。

在Airflow 1.10和2.0版本中都有一个airflow config命令,但行为有所不同。在Airflow 1.10中, 它会打印所有配置选项,而在Airflow 2.0中,它是一个命令组。airflow config现在变成了airflow config list。 您可以通过运行命令airflow config --help来查看其他选项

已保持与旧版CLI的兼容性,但它们将不再出现在帮助信息中

你可以通过运行airflow --help来了解相关命令。例如要获取关于celery组命令的帮助, 你需要运行帮助命令:airflow celery --help

旧命令

新命令

组别

airflow worker

airflow celery worker

celery

airflow flower

airflow celery flower

celery

airflow trigger_dag

airflow dags trigger

dags

airflow delete_dag

airflow dags delete

dags

airflow show_dag

airflow dags show

dags

airflow list_dag

airflow dags list

dags

airflow dag_status

airflow dags status

dags

airflow backfill

airflow dags backfill

dags

airflow list_dag_runs

airflow dags list-runs

dags

airflow pause

airflow dags pause

dags

airflow unpause

airflow dags unpause

dags

airflow next_execution

airflow dags next-execution

dags

airflow test

airflow tasks test

tasks

airflow clear

airflow tasks clear

tasks

airflow list_tasks

airflow tasks list

tasks

airflow task_failed_deps

airflow tasks failed-deps

tasks

airflow task_state

airflow tasks state

tasks

airflow run

airflow tasks run

tasks

airflow render

airflow tasks render

tasks

airflow initdb

airflow db init

db

airflow resetdb

airflow db reset

db

airflow upgradedb

airflow db upgrade

db

airflow checkdb

airflow db check

db

airflow shell

airflow db shell

db

airflow pool

airflow pools

pools

airflow create_user

airflow users create

users

airflow delete_user

airflow users delete

users

airflow list_users

airflow users list

users

airflow rotate_fernet_key

airflow rotate-fernet-key

airflow sync_perm

airflow sync-perm

Bug修复

  • Bug修复: 带有depends_on_pasttask_concurrency的任务卡住的问题 (#12663)

  • 修复了executor_config中空Resources的问题 (#12633)

  • 修复:已弃用的配置 force_log_out_after 未被使用 (#12661)

  • 修复JSON格式日志中空的asctime字段 (#10515)

  • [AIRFLOW-2809] 修复关于Flask SECRET_KEY的安全问题 (#3651)

  • [AIRFLOW-2884] 修复www_rbac中的Flask SECRET_KEY安全问题 (#3729)

  • [AIRFLOW-2886] 在默认配置中生成随机的Flask SECRET_KEY (#3738)

  • 在setup.py中添加缺失的逗号 (#12790)

  • Bug修复:无法在Python 3.8上导入Airflow插件 (#12859)

  • 修复 setup.py 中 setup_requires 缺少逗号的问题 (#12880)

  • 对于仅运行一次的DAG,不发送first_task_scheduling_delay指标 (#12835)

改进

  • 更新setup.py以获取无冲突的依赖项集合 (#12636)

  • [scheduler] max_threads 重命名为 [scheduler] parsing_processes (#12605)

  • 添加指标用于计算首次运行任务与预期开始时间之间的调度延迟 (#9544)

  • 为Airflow 1.10.x添加新式2.0命令名称 (#12725)

  • 为Helm Chart添加Kubernetes cleanup-pods CLI命令 (#11802)

  • 不要让webserver以危险配置运行 (#12747)

  • 将 pkg_resources 替换为 importlib.metadata 以避免 VersionConflict 错误 (#12694)

仅文档变更

  • 澄清了关于支持数据库的信息

Airflow 1.10.13 (2020-11-25)

重大变更

TimeSensor 现在支持时区感知

之前TimeSensor总是将target_time与UTC当前时间进行比较。

现在它将比较target_time与DAG所在时区的当前时间,默认使用全局配置中的default_timezone

移除了HDFS钩子的Kerberos支持

由于PyPI移除了python-krbV依赖项,且Python3普遍缺乏对SSL的支持(我们使用的依赖项Snakebite-py3不支持与HDFS建立SSL连接),HDFS钩子的Kerberos支持功能已被移除。

WebHDFS钩子的SSL支持仍然有效。

统一用户会话生命周期配置

在Airflow的早期版本中,用户会话生命周期可以通过session_lifetime_daysforce_log_out_after选项进行配置。实际上只有session_lifetime_days会影响会话生命周期,但它仅限于以天为单位的值。我们已移除上述选项并引入了新的session_lifetime_minutes选项,这简化了会话生命周期的配置。

之前

[webserver]
force_log_out_after = 0
session_lifetime_days = 30

之后

[webserver]
session_lifetime_minutes = 43200

通过Airflow插件添加Operators、Hooks和Sensors的方式已弃用

通过插件机制导入Operators、Hooks和Sensors的功能已被弃用,在Airflow 1.10.13中将发出警告,并将在Airflow 2.0中完全移除。

Check https://airflow.apache.org/docs/1.10.13/howto/custom-operator.html to see how you can create and import Custom Hooks, Operators and Sensors.

新功能

  • 在K8sPodOperator中添加"已检查"标记到失败的pod (#11368)

  • 向基于FAB的UI传递SQLAlchemy引擎选项 (#11395)

  • [AIRFLOW-4438] 为S3_hook添加Gzip压缩功能 (#8571)

  • 为查看者(Viewer)及以上角色添加"extra_links"权限 (#10719)

  • 添加generate_yaml命令,以便在部署pod之前轻松测试KubernetesExecutor (#10677)

  • 为Microsoft Azure Key Vault添加Secrets后端 (#10898)

Bug修复

  • SkipMixin: 处理空分支 (#11120)

  • [AIRFLOW-5274] DAG加载时长指标名称过长 (#5890)

  • 处理DagrunIdDep中没有Dagrun的情况 (#8389) (#11343)

  • 修复Kubernetes执行器对长DAG名称的日志记录问题 (#10942)

  • 为KubernetesPodOperator添加on_kill支持 (#10666)

  • KubernetesPodOperator模板修复 (#10963)

  • 修复显示添加序列化DAG表的迁移

  • 修复DAGs页面上的开始日期工具提示 (#10637)

  • 在"Last Run"链接中对执行日期进行URL编码 (#10595)

  • 修复了Airflow 1.10中affinity backcompat的问题

  • 修复 views.py 中的 KubernetesExecutor 导入问题

  • 修复甘特视图的问题 (#12419)

  • 修复Entrypoint和_CMD配置变量 (#12411)

  • 修复SerializedBaseOperator中操作员字段的更新 (#10924)

  • Python 2.7版本限制加密功能低于3.2

  • 在Python 3.7上安装cattr - 修复RTD上的文档构建 (#12045)

  • 限制 marshmallow-sqlalchemy 的版本

  • kubernetes 固定到最高版本 11.0.0 (#11974)

  • 为Python3使用snakebite-py3作为HDFS依赖项 (#12340)

  • 移除snakebite kerberos依赖 (#10865)

  • 修复FAB和Celery的依赖失败问题 (#10828)

  • 修复1.10.13版本的pod_mutation_hook (#10850)

  • 修复主机信息的格式问题

  • 修复非RBAC界面中的Google认证登出问题 (#11890)

  • 将缺失的导入添加到app.py (#10650)

  • 在旧版UI中为图表和查询视图显示通用错误 (#12495)

  • TimeSensor应遵循default_timezone配置 (#9699)

  • TimeSensor应遵循DAG时区设置 (#9882)

  • 统一用户会话生命周期配置 (#11970)

  • 优雅处理过期的webserver会话超时问题。(#12332)

改进

  • 将XCom.deserialize_value添加到Airflow 1.10.13 (#12328)

  • 将airflow.cfg挂载到pod_template_file (#12311)

  • 所有k8s对象必须符合JSON Schema (#12003)

  • 验证Airflow chart的values.yaml和values.schema.json文件 (#11990)

  • Pod模板文件使用了自定义环境变量 (#11480)

  • 升级attrs和cattrs依赖项 (#11969)

  • 将attrs升级至> 20.0版本 (#11799)

  • [AIRFLOW-3607] 每个DAG运行仅查询一次数据库以检查TriggerRuleDep (#4751)

  • 重命名具有重复task_id的任务

  • 使用Alembic迁移管理Flask AppBuilder表 (#12352)

  • airflow test 仅适用于1.10版本中的任务,不适用于整个DAG (#11191)

  • 改进DAG中重复task_ids的警告消息 (#11126)

  • 将moto固定到1.3.14版本 (#10986)

  • DbApiHook: 在get_pandas_df中支持kwargs参数 (#9730)

  • 在K8sPodOperator上添加grace_period_seconds选项 (#10727)

  • 修复Dockerfile中'maintainer'标签的语法错误 (#10899)

  • Docker镜像中的入口点应由Airflow拥有 (#10853)

  • 使dockerfiles符合Google Shell指南 (#10734)

  • Dockerfile的clean-logs脚本:在休眠前清理日志 (#10685)

  • 当从子进程向celery发送任务时,重置信号处理器(#11278)

  • SkipMixin: 添加缺失的session.commit()和测试 (#10421)

  • Web服务器:进一步清理传递给origin参数的值 (#12459)

  • 安全升级 lodash 从 4.17.19 到 4.17.20 (#11095)

  • 对于未注册的OperatorLinks改为记录日志而非抛出错误 (#11959)

  • 在使用CLI时,在日志表中隐藏密码 (#11468)

  • [AIRFLOW-3607] 优化当依赖过去设置和并发限制时的依赖检查

  • 在Dataproc Hook中执行任务取消HTTPRequest (#10361)

  • 使用rst语法高亮器格式化Airflow升级检查输出 (#11259)

  • 移除 contrib/kubernetes/pod.py 中的弃用警告

  • 为CloudSqlImportOperator添加body作为模板字段 (#10510)

  • 将用户会话的日志级别更改为DEBUG (#12414)

弃用项

  • 弃用从插件创建的模块导入Hooks (#12133)

  • 弃用通过插件添加Operators和Sensors的功能 (#12069)

仅文档变更

  • [文档] 修正宏任务实例键字符串的描述 (#11062)

  • 检查setup.py中的所有库是否都列在installation.rst文件中 (#12023)

  • 修改"项目重点"文案 (#12011)

  • 将项目重点和原则在README中置顶 (#11973)

  • 从README.md中移除存档链接 (#11945)

  • 更新Airflow版本的下载链接 (#11800)

  • 为PyPI页面添加项目URL (#11801)

  • 将Backport Providers文档迁移至我们的文档站点 (#11136)

  • 重构rebase副本 (#11030)

  • 为Kubernetes执行器文档添加缺失的图片 (#11083)

  • 修复executor_config示例中的缩进问题 (#10467)

  • 增强了Kubernetes Executor文档 (#10433)

  • 将内容重构为markdown表格 (#10863)

  • 重命名“Beyond the Horizon”部分并重构内容 (#10802)

  • 重构官方源码部分,改用项目符号列表 (#10801)

  • 添加官方源代码部分 (#10678)

  • 添加redbubble链接到Airflow周边商品 (#10359)

  • README文档:链接到ASF目录中的Airflow目录 (#11137)

  • 修复VaultBackend的config_path默认值 (#12518)

Airflow 1.10.12 (2020-08-25)

重大变更

清除被SkipMixin跳过的任务将再次跳过它们

之前,当被SkipMixin(如BranchPythonOperator、BaseBranchOperator和ShortCircuitOperator)跳过的任务被清除时,它们会执行。自1.10.12版本起,当这些被跳过的任务被清除时,它们将被新引入的NotPreviouslySkippedDep再次跳过。

pod_mutation_hook 函数现在将接受一个 kubernetes V1Pod 对象

自airflow 1.10.12版本起,在pod_mutation_hook中使用airflow.contrib.kubernetes.Pod类已被弃用。我们建议用户将pod参数视为kubernetes.client.models.V1Pod对象。这意味着用户在修改airflow pods时现在可以访问完整的Kubernetes API。

KubernetesPodOperator 现在支持 pod_template_file 选项

用户现在可以通过pod_template_file参数为KubernetesPodOperator提供yaml文件的路径。

新功能

  • 添加 DateTimeSensor (#9697)

  • 为Airflow本地设置添加AirflowClusterPolicyViolation支持 (#10282)

  • 从Secret Backends获取包含敏感数据的Airflow配置 (#9645)

  • [AIRFLOW-4734] PostgresHook.insert_rows() 的上插功能 (#8625)

  • 允许定义自定义XCom类 (#8560)

Bug修复

  • 将1.10.11版本之前的Kubernetes路径添加回来,并附带弃用警告 (#10067)

  • 修复 PodMutationHook 以保持向后兼容性 (#9903)

  • 修复定义资源时executor_config中的bug (#9935)

  • 在运行sync_perm时遵循DAG序列化设置 (#10321)

  • 在图表视图中显示运行任务的正确持续时间 (#8311) (#8675)

  • 修复SQLThresholdCheckOperator中的回归问题 (#9312)

  • [AIRFLOW-6931] 修复了迁移以查找MSSQL的所有依赖项 (#9891)

  • 避免在RenderedTaskInstanceFields的写入和删除操作中共享会话 (#9993)

  • 修复当使用ExternalTaskMarker时的clear future递归问题 (#9515)

  • 处理创建TIs时的IntegrityError错误 (#10136)

  • 修复使用Kerberos认证时airflow-webserver的启动错误 (#10047)

  • 修复调度器中开放槽位的处理问题 (#9316) (#9505)

  • 修复KubernetesPodOperator重新附加问题 (#10230)

  • 修复更多PodMutationHook问题以实现向后兼容性 (#10084)

  • [AIRFLOW-5391] 当跳过的任务被清除时,不再重新运行它们 (#7276)

  • 修复 task_instance_mutation_hook (#9910)

  • 修复了包含文档字符串中{}的DAG文件格式化失败问题 (#9779)

  • 修复 is_terminal_support_colors 函数 (#9734)

  • 修复当使用provide_context=True时的PythonVirtualenvOperator (#8256)

  • 修复了从secrets挂载卷的问题 (#10366)

  • Bug修复: K8s Executor 多命名空间模式默认评估为 true (#10410)

  • 使KubernetesExecutor能够识别kubernetes_labels (#10412)

  • 修复损坏的Kubernetes PodRuntimeInfoEnv (#10478)

改进

  • 使用序列化DAG的哈希值来判断DAG是否发生变化 (#10227)

  • 当DAGs更新时在Webserver中更新序列化DAGs (#9851)

  • 如果DAG未更改,则不更新数据库中的序列化DAG (#9850)

  • 为SerializedDagModel添加__repr__方法 (#9862)

  • 更新JS包至最新版本 (#9811) (#9921)

  • UI 图形视图:鼠标悬停时聚焦上游/下游任务依赖关系 (#9303)

  • 允许在KubernetesPodOperator中对image进行模板化 (#10068)

  • [AIRFLOW-6843] 向delete_namespaced_pod添加delete_option_kwargs参数 (#7523)

  • 改进调度器任务中的进程终止 (#8064)

  • 替换 bigquery_check_operator 中已弃用的基类 (#10272)

  • [AIRFLOW-5897] 允许在网页服务器中设置-1作为池槽位数值 (#6550)

  • 将所有google-cloud api限制在<2.0.0版本 (#10317)

  • [AIRFLOW-6706] 延迟加载操作符额外链接 (#7327) (#10318)

  • 为SQL操作器和传感器添加Snowflake支持 (#9843)

  • 使多命名空间模式变为可选 (#9570)

  • 固定 pyarrow 版本低于 1.0

  • 将pymongo版本固定为<3.11.0

  • 将google-cloud-container固定到版本<2 (#9901)

  • Dockerfile: 从生产镜像中移除package.json和yarn.lock文件 (#9814)

  • Dockerfile: 为了兼容OpenShift,嵌入式DAG组应设为root (#9794)

  • 更新flask-swagger、gunicorn和jinja2的上限版本 (#9684)

  • Web服务器:对传递给origin参数的值进行清理 (#10334)

  • 在添加/编辑页面按字母顺序排列连接类型列表 (#8692)

仅文档变更

  • 将新提交者Ry Walker和Leah Cole添加到project.rst (#9892)

  • 将侯庆平添加到提交者列表 (#9725)

  • 更新了指向官方文档的链接 (#9629)

  • 为Airflow Slack邀请创建短链接 (#10034)

  • 在文档/howto/email-config.rst中设置代码块的语言 (#10238)

  • 从1.10.10版本的更新日志中移除重复行 (#10289)

  • 改进Email Configuration页面的标题 (#10175)

  • 修复 docs/tutorial.rst 中 Jinja 项目的链接 (#10245)

  • 为Cron预设创建独立分区 (#10247)

  • 在docs/best-practices.rst文档中的代码块添加语法高亮 (#10258)

  • 修复 BigQueryGetDataOperator 中的文档字符串 (#10042)

  • 修复任务生命周期章节中的拼写错误 (#9867)

  • 使Secret Backend文档关于变量和连接视图的描述更加清晰 (#8913)

Airflow 1.10.11 (2020-07-10)

重大变更

使用NULL作为dag.description的默认值

现在在dag表中将NULL作为dag.description的默认值

限制在旧版UI(基于Flask-admin的界面)中编辑DagRun状态

Before 1.10.11 it was possible to edit DagRun State in the /admin/dagrun/ page

转换为任意文本。

在Airflow 1.10.11+版本中,用户只能从列表中选择状态。

实验性API默认将拒绝所有请求。

之前的默认设置是允许所有API请求无需认证,但这会给忽略这一事实的用户带来安全风险。此次更改将新安装的默认设置改为默认拒绝所有请求。

注意: 这不会改变现有安装的行为,请更新并检查您的airflow.cfg文件

如果您希望启用实验性API功能,并且了解在未启用身份验证的情况下启用此功能的风险(或者如果您在Airflow前有自己的身份验证层),您可以通过在airflow.cfg中设置以下内容来在新安装中获得之前的行为:

[api]
auth_backend = airflow.api.auth.backend.default

XCom值无法再从Web服务器添加或更改

由于XCom值可能包含序列化数据,我们将不再允许通过用户界面添加或修改XCom值。

run_as_user 的默认配置已从 0 更改为 50000

在使用时,Worker PODs第一个进程运行的UID已从之前的默认值0更改为50000。之前的默认值为空字符串,但代码在为空字符串时使用了0

之前:

[kubernetes]
run_as_user =

之后:

[kubernetes]
run_as_user = 50000

这样做是为了避免以root用户身份运行容器。

新功能

  • 添加任务实例变异钩子 (#8852)

  • 允许修改任务状态颜色 (#9520)

  • 新增对AWS Secrets Manager作为Secrets Backend的支持 (#8186)

  • 在CLI中添加Airflow信息命令 (#8704)

  • 新增本地文件系统密钥后端 (#8596)

  • 新增Airflow配置命令行界面命令 (#8694)

  • 新增对Python 3.8的支持 (#8836)(#8823)

  • 允许通过JSON/YAML文件配置K8S工作节点pod (#6230)

  • 将季度添加到crontab预设中 (#6873)

  • 为KubernetesPodOperator添加临时存储支持 (#6337)

  • 添加AirflowFailException以便无需任何重试即可失败 (#7133)

  • 添加SQL分支操作符 (#8942)

Bug修复

  • 使用 NULL 作为 dag.description 的默认值 (#7593)

  • Bug修复:在RBAC界面中通过UI触发DAG时出现错误 (#8411)

  • 修复运行任务时的日志记录问题 (#9363)

  • 修复DockerOperator中的JSON编码错误 (#8287)

  • 修复由于类型导入导致的alembic崩溃问题 (#6547)

  • 在反序列化Operators时正确恢复upstream_task_ids (#8775)

  • 在序列化任务/DAG中正确存储非默认的None值 (#8772)

  • 正确反序列化DAG上的dagrun_timeout字段 (#8735)

  • 修复当配置中包含“时的树状视图 (#9250)

  • 修复带时区的Dag Run UI执行日期无法保存的问题 (#8902)

  • 修复MSSQL的迁移问题 (#8385)

  • RBAC 用户界面:修复图表中缺失带单位的 Y 轴标签问题 (#8252)

  • RBAC界面:修复缺失的任务运行显示为圆圈的问题 (#8253)

  • 修复:DagRuns页面在旧版UI中渲染状态列时出现异常(#9612)

  • 修复主页上的任务和DAG统计信息 (#8865)

  • 修复嵌套子DAG情况下trigger_dag API的问题 (#8081)

  • 用户体验修复:在Chrome中防止选择DAG标题时意外选中文本 (#8912)

  • 修复Spark连接的添加/编辑功能 (#8685)

  • 修复在MySQL上因DAG序列化导致的重试约束冲突问题 (#9336)

  • [AIRFLOW-4472] 使用json.dumps/loads进行模板化血缘数据 (#5253)

  • 将google-cloud-texttospeech限制为

  • 修复生成进程时的pickling失败问题 (#8671)

  • 将azure-cosmos的版本固定为<4 (#8956)

  • Azure storage 0.37.0 版本已无法安装 (#8833)

  • 修复UI中的modal_backdrop z-index问题 (#7313)

  • 修复甘特视图中的额外链接 (#8308)

  • 修复了EmrAddStepOperator初始化时使用cluster_name参数的错误 (#9235)

  • 修复KubernetesPodOperator pod名称长度验证 (#8829)

  • 通过检查最后修改时间修复不更新的DAG代码 (#8266)

  • Bug修复:取消暂停一个设置了catchup=False的DAG会额外生成一个DAG运行实例 (#8776)

改进

  • 改进 add_dag_code_table 迁移 (#8176)

  • 持久化显示/过滤DAG状态 (#8106)

  • 设置唯一的日志记录器名称 (#7330)

  • 将cattrs的版本从0.9更新至1.0以支持Python 3.8 (#7100)

  • 减少/dag_stats和/task_stats接口的响应负载大小 (#8655)

  • 为snowflake_hook添加authenticator参数 (#8642)

  • 在Airflow网页服务器中显示"任务重调度"表格 (#9521)

  • 将worker_refresh_interval回退默认值更改为30 (#9588)

  • 在WebUI中使用pformat替代str来渲染参数 (#9587)

  • 简化DagFileProcessorManager (#7521)

  • 当插件变更时重新加载gunicorn (#8997)

  • 修复store_dag_code参数的默认值 (#9554)

  • 新增支持从运行中的Pod获取日志 (#8626)

  • 为DummyOperator任务实例持久化开始/结束日期和持续时间 (#8663)

  • 确保如果作业未启动,工具提示中不显示“started”/“ended”(#8667)

  • 在ExternalTaskSensor中为execution_date_fn添加上下文 (#8702)

  • 避免在/dag_stats/task_stats的响应中包含颜色信息 (#8742)

  • 使从入口点加载插件具备容错能力 (#8732)

  • 重构Kubernetes工作节点配置 (#7114)

  • 为Spark JDBC Hook添加默认conf参数 (#8787)

  • 允许传递backend_kwargs参数到AWS SSM客户端 (#8802)

  • 通过点击标签筛选dags (#8897)

  • 在Vault Secrets提供程序中支持k8s认证方法 (#8640)

  • 通过标签而非名称监控Pod (#6377)

  • 优化 /home 页面的计数查询 (#8729)

  • 修复树状视图中的JSON字符串转义问题 (#8551)

  • 在TI工具提示中添加TaskInstance状态,使其对色盲用户更友好 (#8910)

  • 在触发DAG界面添加提示 (#9049)

  • Use Markup for htmlcontent for landing_times (#9242)

  • 将最大pandas版本限制在2.0以下(小于),以兼容pandas 1.0 (#7954)

  • 更新示例webserver_config.py以显示正确的CSRF配置 (#8944)

  • 修复在"Base Job"表中显示Executor类名称的问题 (#8679)

  • 为'dag_details'和'trigger'端点使用现有的DagBag (#8501)

  • 在退出前刷新待处理的Sentry异常 (#7232)

  • 在列表视图中显示DAG运行配置 (#6794)

  • 修复更新dagrun状态时的性能下降问题 (#8435)

  • 不要在代码中使用 |safe 过滤器,这很危险 (#9180)

  • 验证只有任务命令由执行器运行 (#9178)

  • 在重复任务ID时显示弃用警告 (#8728)

  • 将DAG._schedule_interval逻辑从DAG.__init__中移出 (#8225)

  • 将获取暂停DAG ID的功能提取为独立方法 (#7587)

  • 批量获取暂停的DAG ID (#7476)

  • 为Kubernetes添加可配置的DAGs卷挂载路径 (#8147)

  • 为KubernetesPodOperator添加schedulername选项 (#6088)

  • 支持以root用户身份运行git同步容器 (#6312)

  • 为Slack Webhook操作符和Slack钩子添加额外选项 (#9409)

  • 对greenlet Celery池进行猴子补丁 (#8559)

  • 从SystemsManagerParameterStoreBackend解密密钥 (#9214)

  • 在任务实例视图中禁止对不可排序列进行点击排序 (#8681)

  • 使hive宏兼容py3 (#8598)

  • 修复使用自定义脚本时的SVG工具提示定位问题 (#8269)

  • 避免不必要的休眠以维持本地任务作业的心跳 (#6553)

  • 为用户和查看者角色添加一些缺失的RBAC角色 (#9133)

  • 在树状视图上显示Dag的Markdown文档 (#9448)

  • 提升与Python 3.5+的兼容性 - 将signal.SIGTERM转换为整型 (#9207)

  • 在DataprocSubmitPySparkJobOperator的template_fields中添加'main'参数 (#9154)

  • 使Airflow的警告静音成为可能 (#9208)

  • 在BaseOperator.clear()中移除冗余的计数查询 (#9362)

  • 修复数据库迁移消息 (#8988)

  • 修复dbapi_hook中不规范的日志信息 (#8482)

  • 修复Celery默认不再允许pickle (#7205)

  • 进一步验证只有任务命令由执行器运行 (#9240)

  • 移除内嵌的nvd3和slugify库 (#9136)

  • 启用可配置的git同步深度 (#9094)

  • 减少Kubernetes边车(agent)所需的资源 (#6062)

  • 使用k8s API模型重构K8S代码库 (#5481)

  • 将k8s执行器移出contrib以更接近主分支 (#8904)

  • 允许在"日志"视图中使用"事件"和"所有者"进行过滤 (#4881)

  • 在1.10版本中添加Yandex.Cloud自定义连接 (#8791)

  • 为DAGs表格添加table-hover CSS类 (#5033)

  • 在dags视图中显示暂停/取消暂停错误。(#7669)

  • 重构/home上的数据库查询 (#4872)

  • 添加跨站脚本攻击防御 (#6913)

  • 使甘特图工具提示与树状图和图表视图保持一致 (#8220)

  • 添加配置以便仅在任务失败时删除工作节点pod (#7507)(#8312)

  • 修复图表连接失败时重复显示错误消息的问题 (#8476)

  • 移除默认值 spark_binary (#8508)

  • 在生产环境Docker镜像中暴露Airflow Webserver端口 (#8228)

  • 每次alembic迁移后提交 (#4797)

  • KubernetesPodOperator 修复和测试 (#6524)

  • Docker镜像:添加ADDITIONAL_AIRFLOW_EXTRAS (#9032)

  • Docker镜像:添加ADDITIONAL_PYTHON_DEPS (#9031)

  • 从Google需求中移除httplib2 (#9194)

  • 合并多个SQL操作符 (#9124)

  • 在pyhive依赖中添加hive作为额外项 (#9075)

  • 将实验性后端的默认认证更改为deny_all (#9611)

  • 限制从Web服务器更改XCom值 (#9614)

  • 为DagTag添加__repr__方法,以便标签在/dagmodel/show中正确显示 (#8719)

  • 为HiveMetastoreHook添加了HMS连接轮换功能,便于实现负载均衡 (#9280)

  • 暴露SQLAlchemy的connect_args并使其可配置 (#6478)

仅文档变更

  • 添加关于使用DAGRun.conf的文档 (#9578)

  • 在文档中强制执行代码块指令 (#9443)

  • 构建文档时仔细解析警告信息 (#8693)

  • 在文档中明确KubernetesPodOperator (#8444)

  • 改进 Pod 变异钩子文档中的语言表述 (#8445)

  • 修复concepts.rst中Pool文档的格式问题 (#8443)

  • 完善关于使用环境变量设置Airflow变量的文档说明 (#8427)

  • 修复LocalExecutor的池文档 (#7643)

  • 将本地和顺序执行器添加到文档 (#8084)

  • 为CLI命令Airflow dags test添加文档 (#8251)

  • 修复DAG序列化文档中的拼写错误 (#8317)

  • 在生产环境部分添加调度器 (#7351)

  • 添加一个结构化的DAG验证示例 (#6727)

  • 添加任务重运行文档 (#6295)

  • 修复关于settings.policy的过时文档 (#7532)

  • 添加关于reload_on_plugin_change选项的文档 (#9575)

  • 为Airflow文档中的代码块添加复制按钮 (#9450)

  • 更新v1.10+版本的文档命令 (#9585)

  • 添加更多关于dry-run CLI选项的信息 (#9582)

  • 为SSHOperator记录默认超时值 (#8744)

  • 修复关于创建CustomOperator的文档 (#8678)

  • 改进了关于集群策略的文档 (#8661)

  • 在concepts.rst中使用sphinx语法 (#7729)

  • 更新README文件,移除对Master分支Python 3.8的限制 (#9451)

  • 添加关于在BashOperator中使用dag_run.conf的说明 (#9143)

  • 改进教程 - 包含所有导入语句 (#8670)

  • 在README.md中添加了更精确的Python需求 (#8455)

  • 修复 README.md 中的 Airflow 稳定版本 (#9360)

  • 更新AWS连接示例,展示如何从环境变量设置 (#9191)

  • 修复插件文档中的列表格式问题。(#8873)

  • 在Secrets Backend文档中添加'版本新增' (#8264)

  • 简化关于自建密钥后端的语言 (#8257)

  • 为可重复的PyPi安装添加安装说明 (#8513)

  • 添加说明:额外链接仅在启用RBAC网页服务器时渲染 (#8788)

  • 从文档中移除未使用的Airflow导入 (#9274)

  • 在贡献工作流示例中添加PR/问题说明 (#9177)

  • 使用包容性语言 - 语言很重要 (#9174)

  • 添加文档以更改Web服务器上的颜色 (#9607)

  • 将installation.rst中的'initiate'改为'initialize' (#9619)

  • 将旧的变量视图截图替换为新的 (#9620)

  • 将旧的SubDag缩放截图替换为新的 (#9621)

  • 更新关于实验性API默认认证变更的文档 (#9617)

Airflow 1.10.10 (2020-04-09)

重大变更

将空字符串设置为Airflow变量将返回空字符串

之前,当您使用空字符串('')设置Airflow变量时,返回的值是None。现在将返回空字符串(''')。

示例:

Variable.set("test_key", "")
Variable.get("test_key")

上述代码之前返回的是None,现在将返回''

使none_failed触发规则的行为与文档保持一致

The behavior of the none_failed trigger rule is documented as “all parents have not failed (failed or

upstream_failed) 即所有父任务都已成功或跳过。" 按照之前的实现方式,实际行为是当一个任务的所有父任务都已跳过时,该任务也会被跳过。

新增触发规则 none_failed_or_skipped

The fix to none_failed trigger rule breaks workflows that depend on the previous behavior.

如果需要旧版行为,您应该将使用none_failed触发规则的任务更改为none_failed_or_skipped

当任务在UI中被标记为成功时,将调用成功回调函数

当用户通过Airflow UI将任务标记为成功时 - on_success_callback 将被调用

新功能

  • [AIRFLOW-7048] 允许用户在UI界面中选择使用的时区 (#8046)

  • 添加生产环境Docker镜像支持 (#7832)

  • 从环境变量获取Airflow变量 (#7923)

  • 从Hashicorp Vault获取Airflow变量 (#7944)

  • 从AWS Systems Manager参数存储中获取Airflow变量 (#7945)

  • 从GCP密钥管理器获取Airflow变量 (#7946)

  • [AIRFLOW-5705] 添加密钥后端及对AWS SSM的支持 / 从AWS参数存储获取Airflow连接(#6376)

  • [AIRFLOW-7104] 为GCP Secrets Manager添加Secret后端 / 从GCP Secrets Manager获取Airflow连接 (#7795)

  • [AIRFLOW-7076] 添加对HashiCorp Vault作为密钥后端的支持 / 从Hashicorp Vault获取Airflow连接 (#7741)

  • [AIRFLOW-6685] 新增ThresholdCheckOperator (#7353)

  • [AIRFLOW-7080] 新增API端点以返回DAG的暂停状态 (#7737)

Bug修复

  • Bug修复:在图形视图工具提示中显示task_id (#7859)

  • [AIRFLOW-6730] 使用total_seconds替代seconds (#7363)

  • [AIRFLOW-6167] 在Hive建表语句中转义列名 (#6741)

  • [AIRFLOW-6628] DAG自动补全现在会从所有可访问的DAG中进行建议 (#7251)

  • [AIRFLOW-7113] 修复甘特图渲染错误 (#7913)

  • [AIRFLOW-6399] 添加_access控制以验证反序列化的DAG (#7896)

  • [AIRFLOW-6399] 序列化:DAG的access_control字段应该被标记为DAG序列化中的装饰字段 (#7879)

  • [AIRFLOW-4453] 使none_failed的行为与文档描述保持一致 (#7464)

  • [AIRFLOW-4363] 修复JSON编码错误 (#7628)

  • [AIRFLOW-6683] 当DAGs被序列化时运行REST API测试 (#7352)

  • [AIRFLOW-6704] 从Task复制通用的TaskInstance属性 (#7324)

  • [AIRFLOW-6734] 使用配置的base_template而非硬编码 (#7367)

  • [AIRFLOW-7098] Simple salesforce 1.0.0版本发布导致构建失败 (#7775)

  • [AIRFLOW-6062] 执行器(Executor)将仅删除其自身命名空间中的工作节点(workers) (#7123)

  • [AIRFLOW-7074] 添加查看子DAG的权限 (#7752)

  • [AIRFLOW-7025] 修复SparkSqlHook.run_query以正确处理其参数 (#7677)

  • [AIRFLOW-6855] 在GCS到BQ操作符的SQL查询中转义project_dataset_table (#7475)

  • [AIRFLOW-6949] 尊重SparkSubmitOperator中的显式配置 (#7575)

  • [AIRFLOW-6588] write_stdout 和 json_format 是布尔类型 (#7199)

  • [AIRFLOW-3439] 使用'utf-8'解码日志 (#4474)

  • [AIRFLOW-6878] 修复kube_client_request_args参数的默认值配置错误

  • [AIRFLOW-5167] 更新GCP包的依赖项 (#7116)

  • [AIRFLOW-6821] 当从UI界面将任务标记为成功时,成功回调未被调用 (#7447)

  • [AIRFLOW-6740] 移除未文档化、已弃用且功能异常的 PROXY_FIX_NUM_PROXIES (#7359)

  • [AIRFLOW-6728] 将各种DAG信息方法改为POST (#7364)

  • [AIRFLOW-6997] 确保工作节点pod的initcontainers能够从配置中获取环境变量 (#7663)

  • [AIRFLOW-7062] 修复pydruid版本导致构建失败的问题 (#7720)

  • [AIRFLOW-6040] KubernetesExecutor中的ReadTimeoutError不应引发异常 (#7616)

  • [AIRFLOW-6943] 修复Python 2中DAG的utf-8编码描述问题 (#7567)

  • [AIRFLOW-6892] 修复损坏的非wheel版本 (#7514)

  • [AIRFLOW-6789] 缺陷修复: 修复默认Worker并发数 (#7494)

  • [AIRFLOW-6840] 提升future版本 (#7471)

  • [AIRFLOW-5705] 修复AWS SSM密钥后端的bug (#7745)

  • [AIRFLOW-5705] 修复Secrets Backend中的bug (#7742)

  • 修复CloudSecretsManagerBackend无效的connections_prefix (#7861)

  • [AIRFLOW-7045] Bug修复: DebugExecutor 无法更改任务状态。(#8073)

  • Bug修复: UI界面上的日期时间选择器卡住问题 (#8092)

  • [AIRFLOW-5277] 甘特图遵循每个用户的时区UI设置 (#8096)

  • 修复任务实例工具提示中显示的时区问题 (#8103)

  • Bug修复:修复序列化DAG时写入和删除DAG代码的问题 (#8151)

  • 将默认TI池槽位设为'1' (#8153)

  • 修复安全界面中的500错误 (#8165)

  • 修复无状态Web服务器查看Dag代码的问题 (#8159)

  • 修复了sqlalchemy 1.3.16的问题 (#8230)

改进

  • 为TaskInstances的图形视图和树视图使用相同的工具提示 (#8043)

  • 允许Webserver中的DateTimePicker也能实际选择时间 (#8034)

  • [AIRFLOW-5590] 在触发DAG运行API响应中添加run_id (#6256)

  • [AIRFLOW-6695] 现在可以通过用户界面触发DAG时传递DAG运行配置 (#7312)

  • [AIRFLOW-5336] 添加可选功能,使在webserver上更新FAB权限成为可选项 (#5940)

  • [AIRFLOW-1467] 允许任务使用多个池槽位 (#7160)

  • [AIRFLOW-6987] 避免创建默认连接 (#7629)

  • [AIRFLOW-4175] S3Hook的load_file方法应支持ACL策略参数 (#7733)

  • [AIRFLOW-4438] 为S3_hook添加Gzip压缩功能 (#7680)

  • 允许将Airflow变量值设置为空字符串 (#8021)

  • 不调度虚拟任务 (#7880)

  • 防止任务实例表的顺序扫描 (#8014)

  • [AIRFLOW-7017] 在触发DAG来源时遵循默认DAG视图 (#7667)

  • [AIRFLOW-6837] 限制首页上Dag描述的长度 (#7457)

  • [AIRFLOW-6989] 无需访问Dag文件即可显示渲染后的template_fields (#7633)

  • [AIRFLOW-5944] 无需访问DAG文件即可渲染模板化字段 (#6788)

  • [AIRFLOW-5946] DAG序列化:将源代码存储在数据库中 (#7217)

  • [AIRFLOW-7079] 移除用于存储template_fields的冗余代码 (#7750)

  • [AIRFLOW-7024] 为SparkSqlOperator添加verbose参数支持 (#7676)

  • [AIRFLOW-6733] 扩展而非替换模板 (#7366)

  • [AIRFLOW-7001] 进一步修复MySQL 5.7的UtcDateTime问题 (#7655)

  • [AIRFLOW-6014] 处理被kubernetes抢占并删除但未重启的pods (#6606)

  • [AIRFLOW-6950] 从ti.refresh_from_db中移除refresh_executor_config (#7577)

  • [AIRFLOW-7016] 在用户界面中对DAG标签进行排序 (#7661)

  • [AIRFLOW-6762] 修复“对本页内容提出修改建议”的链接 (#7387)

  • [AIRFLOW-6948] 从版本命令中移除ASCII Airflow (#7572)

  • [AIRFLOW-6767] 修正默认Athena工作组的名称 (#7394)

  • [AIRFLOW-6905] 使用新的风车图标更新 pin.svg (#7524)

  • [AIRFLOW-6801] 利用 ImportError.timestamp (#7425)

  • [AIRFLOW-6830] 为SNS钩子和操作符添加Subject/MessageAttributes功能 (#7451)

  • [AIRFLOW-6630] 解决handlebars安全建议 (#7284)

  • [AIRFLOW-6945] 在v1-10-test中使用MySQL 5.7作为可选方案

  • [AIRFLOW-6871] 针对大型DAG优化树状视图 (#7492)

  • [AIRFLOW-7063] 修复由count引起的dag.clear()运行缓慢问题 (#7723)

  • [AIRFLOW-7023] 移除 setup.py 中重复的包定义 (#7675)

  • [AIRFLOW-7001] 从MySQL TIMESTAMP字段插入中移除了时区信息

  • [AIRFLOW-7105] 统一Secrets后端方法接口 (#7830)

  • 使BaseSecretsBackend.build_path通用化 (#7948)

  • 允许使用 'hashicorp' 扩展安装 hvac 包 (#7915)

  • 标准化 SecretBackend 类名称 (#7846)

  • [AIRFLOW-5705] 使AwsSsmSecretsBackend与VaultBackend保持一致 (#7753)

  • [AIRFLOW-7045] 更新SQL查询以删除RenderedTaskInstanceFields (#8051)

  • 在任务实例工具提示中更好地处理夏令时(DST)(#8104)

杂项/内部

  • 修复不稳定的TriggerDAG界面测试(#8022)

  • 在CI中移除不必要的消息 (#7951)

  • 修复了CI中并行度过高的问题 (#7947)

  • 安装版本在breeze中不持久 (#7914)

  • 修复了镜像重建的自动检查 (#7912)

  • 将Dockerfile移至Dockerfile.ci (#7829)

  • 生成需求现已排序 (#8040)

  • 修改通用环境初始化函数的名称 (#7805)

  • 现在需求依赖于Python版本 (#7841)

  • 在CI入口处显式调用的重置数据库功能重新引入 (#7798)

  • 修复了Airflow 1.10的不干净安装问题 (#7796)

  • [AIRFLOW-7029] 使用单独的docker镜像来运行许可证检查 (#7678)

  • [AIRFLOW-5842] 将基础镜像切换为Debian buster (#7647)

  • [AIRFLOW-5828] 将构建逻辑从hooks/build中移出 (#7618)

  • [AIRFLOW-6839] 进一步提升mypy运行速度 (#7460)

  • [AIRFLOW-6820] 将breeze拆分为函数 (#7433)

  • [AIRFLOW-7097] 在CI镜像中安装gcloud beta组件 (#7772)

  • [AIRFLOW-7018] 修复travis任务名称转义问题 (#7668)

  • [AIRFLOW-7054] Breeze现在有一个选项可以在入口处重置数据库 (#7710)

  • [AIRFLOW-7005] 为Breeze添加了exec命令 (#7649)

  • [AIRFLOW-7015] 在Dockerhub上构建时检测Dockerhub仓库/用户 (#7673)

  • [AIRFLOW-6727] 修复发布管理脚本中的小错误 (#7355)

  • [AIRFLOW-7013] 自动检查是否需要拉取Breeze镜像 (#7656)

  • [AIRFLOW-7010] 跳过Dockerhub构建中的容器内检查 (#7652)

  • [AIRFLOW-7011] 固定JPype版本以支持构建1.10镜像

  • [AIRFLOW-7006] 修复Breeze脚本中缺失的+e问题 (#7648)

  • [AIRFLOW-6979] 修复breeze测试目标特定测试参数问题 (#7614)

  • [AIRFLOW-6932] 为Breeze添加重启环境命令

  • [AIRFLOW-6919] 使Breeze支持DAG测试 (#7539)

  • [AIRFLOW-6838] 为Breeze引入真正的子命令 (#7515)

  • [AIRFLOW-6763] 使系统测试准备好进行回溯测试 (#7389)

  • [AIRFLOW-6866] 修复Breeze在Mac上的错误导出 (#7485)

  • [AIRFLOW-6842] 在Mac上跳过修复所有权 (#7469)

  • [AIRFLOW-6841] 修复了Mac上的无界变量问题 (#7465)

  • [AIRFLOW-7067] 固定Apache Airflow的版本 (#7730)

  • [AIRFLOW-7058] 添加对不同数据库版本的支持 (#7717)

  • [AIRFLOW-7002] 移除bash中的yaml"解析器" (#7646)

  • [AIRFLOW-6972] 在Breeze中缩短常用命令 (#7608)

仅文档变更

  • 修复 store_serialized_dags 配置的拼写错误 (#7952)

  • 修复README.md中的损坏链接 (#7893)

  • 用逗号分隔支持的Postgres版本 (#7892)

  • 修复 setup.py 中的语法问题 (#7877)

  • 将Jiajie Zhong添加到committers列表 (#8047)

  • 更新1.10.*版本的安全文档以支持认证后端(#8072)

  • 修复Secrets Backend的config_templates中的示例 (#8074)

  • 在IMAGES.rst命令描述中添加反引号 (#8075)

  • 修改 store_dag_code 配置的 version_added 参数 (#8076)

  • [AIRFLOW-XXXX] 移除重复文档

  • [AIRFLOW-XXXX] 移除Dag序列化的失效限制 (#7716)

  • [AIRFLOW-XXXX] 为所有GCP操作指南添加先决条件任务 (#6049)

  • [AIRFLOW-XXXX] 简化AWS/Azure/Databricks操作符列表 (#6047)

  • [AIRFLOW-XXXX] 为所有GCP操作指南添加外部引用 (#6048)

  • [AIRFLOW-XXXX] 简化GCP操作符列表

  • [AIRFLOW-XXXX] 简化Qubole操作符列表

  • [AIRFLOW-XXXX] 添加自动生成的目录 (#6038)

  • [AIRFLOW-XXXX] 创建"使用CLI"页面 (#5823)

  • [AIRFLOW-XXXX] 将引用内容整合到一个章节 (#5776)

  • [AIRFLOW-XXXX] 修复分析文档 (#5885)

  • [AIRFLOW-XXXX] 新增S3日志记录部分 (#6039)

  • [AIRFLOW-XXXX] 将Azure日志记录部分移动到操作符上方 (#6040)

  • [AIRFLOW-XXXX] 将临时链接更新为固定链接 (#7715)

  • [AIRFLOW-XXXX] 为1.10.9版本添加更新说明文档章节 (#7385)

  • [AIRFLOW-XXXX] 移除BaseOperator文档字符串中的重复内容 (#7321)

  • [AIRFLOW-XXXX] 更新CONTRIBUTING.rst中的测试信息 (#7466)

  • [AIRFLOW-XXXX] 小幅更新BREEZE.rst (#7487)

  • [AIRFLOW-XXXX] 添加记录到localstack S3的说明 (#7461)

  • [AIRFLOW-XXXX] 移除Travis配置警告 (#7467)

  • [AIRFLOW-XXXX] 为贡献指南添加沟通章节 (#7204)

  • [AIRFLOW-XXXX] 添加已知问题 - example_dags/__init__.py (#7444)

  • [AIRFLOW-XXXX] 修复breeze build-docs (#7445)

  • [AIRFLOW-XXXX] 减少Docker构建的冗长输出

  • [AIRFLOW-XXXX] 加速mypy运行 (#7421)

  • [AIRFLOW-XXXX] 修复kubernetes测试的位置 (#7373)

  • [AIRFLOW-XXXX] 在Google Oauth中去掉域名引号 (#4226)

  • [AIRFLOW-XXXX] 为代码相关PR添加关于JIRA的明确信息 (#7318)

  • [AIRFLOW-XXXX] 修复单词committer的拼写错误 (#7392)

  • [AIRFLOW-XXXX] 移除文档中重复的段落 (#7662)

  • 修复对KubernetesPodOperator的引用 (#8100)

Airflow 1.10.9 (2020-02-07)

重大变更

无重大变更。

Bug修复

  • [AIRFLOW-6751] 将Werkzeug(我们多个依赖项的依赖)固定到版本 < 1.0.0 (#7377)

Airflow 1.10.8 (2020-02-07)

重大变更

当任务被标记为失败时,将调用失败回调函数

当任务被用户标记为失败或由于系统故障导致任务失败时 - 失败回调函数将作为清理过程的一部分被调用

详情请参阅 AIRFLOW-5621

新功能

  • [AIRFLOW-4026] 新增按DAG标签筛选功能 (#6489)

  • [AIRFLOW-6613] 在图形视图加载时居中显示DAG (#7238)

  • [AIRFLOW-5843] 在添加DAG运行视图中添加配置选项 (#7281)

  • [AIRFLOW-4495] 允许外部触发的DAG运行未来的执行日期 (#7038)

改进

  • [AIRFLOW-6438] 通过blocked过滤返回的DAGs (#7019)

  • [AIRFLOW-6666] 解决js-yaml安全建议 (#7283)

  • [AIRFLOW-6632] 升级dagre-d3以解决lodash CVE安全公告 (#7280)

  • [AIRFLOW-6667] 解决序列化JavaScript建议 (#7282)

  • [AIRFLOW-6451] dag_processing.py 中的 self._print_stat() 应该可以跳过 (#7134)

  • [AIRFLOW-6495] 使用StandardTaskRunner运行任务时仅加载一次DAG (#7090)

  • [AIRFLOW-6319] 添加对AWS Athena工作组的支持 (#6871)

  • [AIRFLOW-6677] 从SQLAlchemy中移除弃用警告 (#7289)

  • [AIRFLOW-6428] 修复示例DAG中airflow.utils.dates.days_ago的导入路径 (#7007)

  • [AIRFLOW-6595] 使用TaskNotFound异常替代AirflowException (#7210)

  • [AIRFLOW-6620] 在worker cli测试中模拟celery (#7243)

  • [AIRFLOW-6608] 修改Bash和PyOperator环境变量导出的日志级别

  • [AIRFLOW-2279] 如果被ExternalTaskMarker标记,则清除跨DAG的任务 (#6633)

  • [AIRFLOW-6359] 显式设置Spark状态轮询间隔(status_poll_interval) (#6978)

  • [AIRFLOW-6359] spark_submit_hook.py 状态轮询间隔配置 (#6909)

  • [AIRFLOW-6316] 在tutorial.rst中使用exampleinclude指令 (#6868)

  • [AIRFLOW-6519] 使Web服务器中的TI日志常量可配置 (#7113)

  • [AIRFLOW-6327] http_hook: 接受json=参数作为payload (#6886)

  • [AIRFLOW-6261] flower_basic_auth 符合 _cmd 条件 (#6825)

  • [AIRFLOW-6238] 过滤由dag_stats返回的dags

  • [AIRFLOW-5616] 将PrestoHook从pyhive切换为presto-python-client

  • [AIRFLOW-6611] 在default_airflow.cfg中添加proxy_fix配置 (#7236)

  • [AIRFLOW-6557] 为BaseOperator新增字段添加测试 (#7162)

  • [AIRFLOW-6584] 固定cassandra驱动版本 (#7194)

  • [AIRFLOW-6537] 修复RST文件中的反引号 (#7140)

  • [AIRFLOW-4428] 如果在trigger_dag中exec_date早于default_args.start_date则报错 (#6948)

  • [AIRFLOW-6330] 当参数为空或输入错误时显示命令行帮助 (#6883)

  • [AIRFLOW-4113] 取消固定boto3版本 (#6884)

  • [AIRFLOW-6181] 添加 DebugExecutor (#6740)

  • [AIRFLOW-6504] 允许为Airflow本地设置指定配置映射 (#7097)

  • [AIRFLOW-6436] 清理Airflow配置文档生成器代码 (#7036)

  • [AIRFLOW-6436] 在config.yml中添加x_frame_enabled配置 (#7024)

  • [AIRFLOW-6436] 创建并自动化关于Airflow配置的文档 (#7015)

  • [AIRFLOW-6527] 使发送任务到执行器的超时可配置 (#7143)

  • [AIRFLOW-6272] 将前端依赖管理从npm切换为yarnpkg (#6844)

  • [AIRFLOW-6350] 安全性 - spark提交操作符的日志记录和异常处理应屏蔽密码

  • [AIRFLOW-6358] 记录失败任务的详细信息 (#6908)

  • [AIRFLOW-5149] 跳过SLA检查配置 (#6923)

  • [AIRFLOW-6057] 更新PythonSensor的template_fields (#6656)

  • [AIRFLOW-4445] 蘑菇云错误信息过于冗长 (#6952)

  • [AIRFLOW-6394] 简化github PR模板 (#6955)

  • [AIRFLOW-5385] spark hook 在 spark 2.3/2.4 上不工作 (#6976)

Bug修复

  • [AIRFLOW-6345] 确保ProxyFix的参数是整数类型 (#6901)

  • [AIRFLOW-6576] 修复因删除带有SLA超时任务导致的调度器崩溃问题 (#7187)

  • [AIRFLOW-6686] 修复构建进程ID列表时的语法错误 (#7298)

  • [AIRFLOW-6683] REST API 遵循 store_serialized_dag 设置 (#7296)

  • [AIRFLOW-6553] 在WebUI的实例状态过滤器中添加upstream_failed状态 (#7159)

  • [AIRFLOW-6357] 如果任务ID包含点号,则在图形界面中高亮显示节点 (#6904)

  • [AIRFLOW-3349] 在StreamLogWriter中使用None而非False作为编码参数值 (#7329)

  • [AIRFLOW-6627] 包含错误DAG的邮件未送达 (#7250)

  • [AIRFLOW-6637] 修复1.10.x版本中的Airflow测试命令

  • [AIRFLOW-6636] 打印任务实例时避免异常

  • [AIRFLOW-6522] 在开始修复S3TaskHandler中的重复问题前清除任务日志文件 (#7120)

  • [AIRFLOW-5501] 使KubernetesPodOperator中的默认in_cluster值遵循配置 (#6124)

  • [AIRFLOW-6514] 使用 RUNNING_DEPS 来检查从用户界面运行的依赖 (#6367)

  • [AIRFLOW-6381] 从DAG页面移除基于DAG id的样式 (#6985)

  • [AIRFLOW-6434] 将返回语句添加回DockerOperator.execute (#7013)

  • [AIRFLOW-2516] 修复mysql死锁问题 (#6988)

  • [AIRFLOW-6528] 禁用flake8 W503规则:在二元运算符前换行 (#7124)

  • [AIRFLOW-6517] 使merge_dicts函数支持递归 (#7111)

  • [AIRFLOW-5621] 当在用户界面标记为失败时,失败回调未被触发 (#7025)

  • [AIRFLOW-6353] 安全 - 用户界面 - 添加点击劫持防御 (#6995)

  • [AIRFLOW-6348] 安全问题 - cli.py 当前会打印包含密码的日志 (#6915)

  • [AIRFLOW-6323] 从默认配置中移除非ASCII字符 (#6878)

  • [AIRFLOW-6506] 修复KubernetesPodOperator中do_xcom_push默认值为True的问题 (#7122)

  • [AIRFLOW-6516] 错误修复:Volume挂载中不存在airflow.cfg文件 (#7109)

  • [AIRFLOW-6427] 修复损坏的example_qubole_operator dag (#7005)

  • [AIRFLOW-6385] 错误修复:当未设置blocks时SlackAPIPostOperator会失败 (#7022)

  • [AIRFLOW-6347] 错误修复:启用序列化时无法获取任务日志 (#7092)

  • [AIRFLOW-XXXX] 修复数据库迁移0e2a74e0fc9f的降级问题 (#6859)

  • [AIRFLOW-6366] 修复MS SQL Server的迁移问题 (#6920)

  • [AIRFLOW-5406] 允许在不使用kubernetes的情况下运行spark (#6921)

  • [AIRFLOW-6229] 如果状态JSON无法解析,SparkSubmitOperator会无限轮询… (#6918)

  • [AIRFLOW-6352] 安全 - 用户界面 - 添加登录超时功能 (#6912)

  • [AIRFLOW-6397] 确保在尝试终止子进程前其sub_process属性存在 (#6958)

  • [AIRFLOW-6400] 修复Windows上pytest无法运行的问题 (#6964)

  • [AIRFLOW-6418] 移除 SystemTest.skip 装饰器 (#6991)

  • [AIRFLOW-6425] 序列化:向JSON Schema添加缺失的DAG参数 (#7002)

杂项/内部

  • [AIRFLOW-6467] 使用 self.dag 替代创建新实例 (#7067)

  • [AIRFLOW-6490] 改进本地任务作业测试中的时间差比较 (#7083)

  • [AIRFLOW-5814] 实现Presto钩子测试 (#6491)

  • [AIRFLOW-5704] 改进本地测试用的Kind Kubernetes脚本 (#6516)

  • [AIRFLOW-XXXX] 将airflow-config-yaml预提交检查移至pylint之前 (#7108)

  • [AIRFLOW-XXXX] 改进确认消息的清晰度 (#7110)

  • [AIRFLOW-6662] 安装dumb init (#7300)

  • [AIRFLOW-6705] 在breeze初始化时减少一条冗余日志消息 (#7326)

  • [AIRFLOW-6705] 减少集成/后端检查的冗余输出 (#7325)

  • [AIRFLOW-6662] 将信号传播切换为使用 --init docker 标志 (#7278)

  • [AIRFLOW-6661] 在50次测试失败后终止 (#7277)

  • [AIRFLOW-6607] 移除Breeze的旧本地脚本 (#7225)

  • [AIRFLOW-6589] 在预提交阶段针对bash脚本变更运行BAT测试 (#7203)

  • [AIRFLOW-6592] 文档构建已移至测试阶段 (#7208)

  • [AIRFLOW-6641] 改进Kubernetes不稳定测试的诊断功能 (#7261)

  • [AIRFLOW-6642] 使本地任务作业测试更稳定 (#7262)

  • [AIRFLOW-6643] 修复kerberos测试的不稳定性

  • [AIRFLOW-6638] 从 test_serialized_db 移除中移除不稳定的测试

  • [AIRFLOW-6701] 从稳定备份/镜像下载Rat (#7323)

  • [AIRFLOW-6702] 将kind日志转储到file.io。(#7319)

  • [AIRFLOW-6491] 改进对Breeze参数的处理 (#7084)

  • [AIRFLOW-6470] 避免在使用curl时管道输出到文件 (#7063)

  • [AIRFLOW-6471] 添加 pytest-instafail 插件 (#7064)

  • [AIRFLOW-6462] 限制Dockerfile/Breeze中导出的变量 (#7057)

  • [AIRFLOW-6465] 为Breeze中的Airflow添加bash自动补全功能 (#7060)

  • [AIRFLOW-6464] 在Breeze中添加云服务提供商CLI工具 (#7059)

  • [AIRFLOW-6461] 移除Dockerfile中的静默标志 (#7052)

  • [AIRFLOW-6459] 增加pytest的详细程度 (#7049)

  • [AIRFLOW-6370] 如果Cassandra集群未启动则跳过相关测试 (#6926)

  • [AIRFLOW-6511] 移除BATS Docker容器 (#7103)

  • [AIRFLOW-6475] 移除Breeze中卷挂载规范的重复项 (#7065)

  • [AIRFLOW-6489] 为Bash单元测试添加BATS支持 (#7081)

  • [AIRFLOW-6387] 打印成功/跳过任务的详细信息 (#6956)

  • [AIRFLOW-6568] 将Emacs相关文件添加到.gitignore (#7175)

  • [AIRFLOW-6575] 更改CI测试的熵源以解除阻塞 (#7185)

  • [AIRFLOW-6496] 在测试中分离集成 (#7091)

  • [AIRFLOW-6634] 在交互式Breeze中设置PYTHONPATH

  • [AIRFLOW-6564] CI检查失败时的额外诊断信息 (#7172)

  • [AIRFLOW-6383] 添加无尾随空格的前置提交钩子 (#6941)

仅文档变更

  • [AIRFLOW-XXXX] 新文档中的一致性修复 (#7207)

  • [AIRFLOW-XXXX] 改进FAQ文档中的语法和结构 (#7291)

  • [AIRFLOW-XXXX] 修复CONTRIBUTING.rst中的邮件配置链接 (#7311)

  • [AIRFLOW-XXXX] 更新文档以反映BranchPythonOperator的新行为 (#4682)

  • [AIRFLOW-XXXX] 修复 scripts/ci/ci_run_airflow_testing.sh 中的拼写错误 (#7235)

  • [AIRFLOW-XXXX] 展示OSX磁盘空间配置的截图 (#7226)

  • [AIRFLOW-XXXX] 向贡献文档添加导师信息 (#7202)

  • [AIRFLOW-XXXX] 向贡献指南添加rebase信息 (#7201)

  • [AIRFLOW-XXXX] 在CI中增加静态检查的详细程度 (#7200)

  • [AIRFLOW-XXXX] 在文档中添加分支策略 (#7193)

  • [AIRFLOW-XXXX] 将邮件配置从概念页面移出 (#7189)

  • [AIRFLOW-XXXX] 更新任务生命周期图 (#7161)

  • [AIRFLOW-XXXX] 修复概念文档中的引用 (#7135)

  • [AIRFLOW-XXXX] 清理调试文档 (#7104)

  • [AIRFLOW-XXXX] 修复开发文档中的拼写错误和失效链接 (#7086)

  • [AIRFLOW-XXXX] 明确 wait_for_downstream 和 execution_date (#6999)

  • [AIRFLOW-XXXX] 添加 airflow dags show 命令指南 (#7014)

  • [AIRFLOW-XXXX] 更新操作链式文档 (#7018)

  • [AIRFLOW-XXXX] 将 .autoenv_leave.zsh 添加到 .gitignore (#6986)

  • [AIRFLOW-XXXX] 修复开发包安装说明 (#6942)

  • [AIRFLOW-XXXX] 更新提交者列表 (#7212)

  • [AIRFLOW-XXXX] 将UPDATING变更移至正确的版本 (#7166)

  • [AIRFLOW-XXXX] 为check_slas标志添加文档 (#6974)

  • [AIRFLOW-XXXX] 修复gcp keyfile_dict拼写错误 (#6962)

  • [AIRFLOW-XXXX] 在UPDATIND.md中添加编写注释的提示 (#6960)

  • [AIRFLOW-XXXX] 添加注释警告文档构建脚本需要bash>4.0版本 (#6947)

  • [AIRFLOW-XXXX] 将autoenv添加到gitignore (#6946)

  • [AIRFLOW-XXXX] 修复GCSTaskHandler中的注释拼写错误 (#6928)

  • [AIRFLOW-XXXX] 修复损坏的DAG序列化链接 (#6891)

  • [AIRFLOW-XXXX] 向配置添加versions_added字段

Airflow 1.10.7 (2019-12-24)

重大变更

实验性API中execution_date微秒替换的变更

默认行为是去除由实验性REST API触发的所有DAG运行的微秒(以及毫秒等)。当请求体中传入明确的execution_date时,默认行为将会改变。现在还可以通过发送replace_microseconds=false来生成execution_date但保留微秒。默认行为可以通过发送replace_microseconds=true以及明确的execution_date来覆盖。

无限池大小和池大小查询优化

现在可以将池大小设置为-1以表示无限大小(它还包含对池查询的优化,该优化导致MySQL中任务池查询的n^2性能较差)。

查看者在DAG视图上没有编辑权限。

Google云存储钩子

GoogleCloudStorageDownloadOperator 可以将内容写入提供的 filename 或通过 store_to_xcom_key 经由 xcom 返回文件内容——这两个选项是互斥的。

新功能

  • [AIRFLOW-5088][AIP-24] 将序列化DAG持久化存储到数据库中以提升Web服务器可扩展性 (#5992)

  • [AIRFLOW-6083] 新增向AWS Lambda客户端传递自定义配置的功能。(#6678)

  • [AIRFLOW-5117] 在需要时自动刷新EKS API令牌 (#5731)

  • [AIRFLOW-5118] 为DataprocClusterCreateOperator添加指定可选组件的能力 (#5821)

  • [AIRFLOW-5681] 允许为git_sync初始化容器指定标签或哈希值 (#6350)

  • [AIRFLOW-6025] 添加标签以唯一标识Pod创建者 (#6621)

  • [AIRFLOW-4843] 支持通过Docker Swarm进行编排(SwarmOperator) (#5489)

  • [AIRFLOW-5751] 为Connection添加get_uri方法 (#6426)

  • [AIRFLOW-6056] 允许EmrAddStepsOperator接受job_flow_name作为job_flow_id的替代参数 (#6655)

  • [AIRFLOW-2694] 在DAG定义中声明权限 (#4642)

  • [AIRFLOW-4940] 新增DynamoDB到S3的操作符 (#5663)

  • [AIRFLOW-4161] BigQuery到MySQL操作符 (#5711)

  • [AIRFLOW-6041] 为Discovery API客户端添加用户代理(#6636)

  • [AIRFLOW-6089] 重新排序setup.py依赖项并添加ci (#6681)

  • [AIRFLOW-5921] 在MySqlHook中添加bulk_load_custom (#6575)

  • [AIRFLOW-5854] 在Docker相关操作器中添加对tty参数的支持 (#6542)

  • [AIRFLOW-4758] 新增GcsToGDriveOperator操作符 (#5822)

改进

  • [AIRFLOW-3656] 显示当前安装版本的文档链接 (#6690)

  • [AIRFLOW-5665] 为SFTPHook添加path_exists方法 (#6344)

  • [AIRFLOW-5729] 使SageMaker训练配置中的InputDataConfig变为可选 (#6398)

  • [AIRFLOW-5045] 新增功能:支持从其他项目使用自定义镜像创建Google Dataproc集群 (#5752)

  • [AIRFLOW-6132] 允许为AzureContainerInstancesOperator传入标签 (#6694)

  • [AIRFLOW-5945] 在使用序列化时使内置OperatorLinks正常工作 (#6715)

  • [AIRFLOW-5947] 使DAG序列化的JSON后端可插拔 (#6630)

  • [AIRFLOW-6239] 根据last_dagruns筛选返回的dags(仅选择可见的dags,而非所有dags)(#6804)

  • [AIRFLOW-6095] 筛选task_stats返回的dags(仅选择可见的dags,而非所有dags)(#6684)

  • [AIRFLOW-4482] 在“触发DagRun”API响应中添加execution_date字段 (#5260)

  • [AIRFLOW-1076] 为模板变量访问器添加get方法 (#6793)

  • [AIRFLOW-5194] 为操作日志添加错误处理程序 (#5883)

  • [AIRFLOW-5936] 允许在SSHOperator中显式设置get_pty (#6586)

  • [AIRFLOW-5474] 为Druid钩子添加基础认证 (#6095)

  • [AIRFLOW-5726] 允许在RedshiftToS3Transfer中使用自定义文件名 (#6396)

  • [AIRFLOW-5834] 为airflow worker添加跳过serve_logs进程的选项 (#6709)

  • [AIRFLOW-5583] 扩展'DAG详情'页面以显示start_date/end_date (#6235)

  • [AIRFLOW-6250] 确保on_failure_callback始终拥有填充的上下文 (#6812)

  • [AIRFLOW-6222] http钩子在失败时记录响应体 (#6779)

  • [AIRFLOW-6260] 通过环境变量驱动_cmd配置选项(例如AIRFLOW__DATABASE__SQL_ALCHEMY_CONN_CMD)(#6801)

  • [AIRFLOW-6168] 允许配置webserver的proxy_fix中间件 (#6723)

  • [AIRFLOW-5931] 在适当情况下使用os.fork来加速任务执行。(#6627)

  • [AIRFLOW-4145] 允许RBAC角色权限和ViewMenu可被覆盖 (#4960)

  • [AIRFLOW-5928] Hive钩子的load_file短路问题 (#6582)

  • [AIRFLOW-5313] 为awsbatch_operator添加参数支持 (#5900)

  • [AIRFLOW-2227] 为Variable类添加删除方法 (#4963)

  • [AIRFLOW-5082] 在AwsSnsHook中添加主题 (#5694)

  • [AIRFLOW-5715] 使邮件、所有者上下文可用 (#6385)

  • [AIRFLOW-5345] 允许SqlSensor的hook被子类自定义 (#5946)

  • [AIRFLOW-5417] 修复Web服务器启动期间的数据库断开连接问题 (#6023)

  • [AIRFLOW-5730] 在PinotDbApiHook上启用get_pandas_df功能 (#6399)

  • [AIRFLOW-3235] 在AzureDataLakeHook中添加列表功能 (#4070)

  • [AIRFLOW-5442] 为druid broker hook实现get_pandas_df方法 (#6057)

  • [AIRFLOW-5883] 在多处改进count()查询 (#6532)

  • [AIRFLOW-5811] 添加外部终止任务计数的指标 (#6466)

  • [AIRFLOW-5758] 支持PostgreSQL钩子的自定义游标类 (#6432)

  • [AIRFLOW-5766] 在http_default中使用httpbin.org (#6438)

  • [AIRFLOW-5798] 设置默认的ExternalTaskSensor.external_task_id (#6431)

  • [AIRFLOW-5643] 减少S3Hook中的重复逻辑 (#6313)

  • [AIRFLOW-5562] 跳过为Admin角色授予单个DAG权限。(#6199)

  • [AIRFLOW-6192] 停止在SFTPSensor.__init__中创建Hook (#6748)

  • [AIRFLOW-5749][AIRFLOW-4162] 支持Slack操作符中的"blocks"组件 (#6418)

  • [AIRFLOW-5693] 支持Slack消息中的“blocks”组件 (#6364)

  • [AIRFLOW-5714] 仅从违反SLA的任务中收集SLA未达标邮件 (#6384)

  • [AIRFLOW-5049] 在bigquery hook中添加对src_fmt_configs的验证 (#5671)

  • [AIRFLOW-6177] 将DAG处理器超时事件的日志级别从信息调整为错误 (#6731)

  • [AIRFLOW-6180] 改进 pytest conftest 中的 kerberos 初始化 (#6735)

  • [AIRFLOW-6159] 将心跳消息的日志级别调整为DEBUG (#6716)

  • [AIRFLOW-6144] 改进Airflow调度器的日志消息 (#6710)

  • [AIRFLOW-6045] 执行compile_assets失败时的错误 (#6640)

  • [AIRFLOW-5144] 在删除按钮点击时添加确认提示 (#6745)

  • [AIRFLOW-6099] 在任务运行日志中添加主机名 (#6688)

  • [AIRFLOW-5915] 新增对新文档主题的支持 (#6563)

  • [AIRFLOW-5897] 允许在网页服务器中设置-1作为池槽位数值 (#6550)

  • [AIRFLOW-5888] 使用psycopg2-binary进行postgres操作 (#6533)

  • [AIRFLOW-5870] 允许将-1作为池大小并优化池查询 (#6520)

Bug修复

  • [AIRFLOW-XXX] 升级Jira版本以修复异步问题

  • [AIRFLOW-XXX] 添加编码以修复读取任务日志时的西里尔字母输出问题 (#6631)

  • [AIRFLOW-5304] 修复BigQueryOperator中多个查询的额外链接问题 (#5906)

  • [AIRFLOW-6268] 当没有可见的DAG时,防止主页进行(昂贵的)ajax调用 (#6839)

  • [AIRFLOW-6259] 每次对DAG进行新搜索时将页面重置为1 (#6828)

  • [AIRFLOW-6185] SQLAlchemy连接模型架构与Alembic架构不一致 (#6754)

  • [AIRFLOW-3632] 在trigger_dag REST API中,仅当execution_date为None时才替换微秒 (#6380)

  • [AIRFLOW-5458] 将Flask-AppBuilder升级至2.2.0版本(适用于Python >= 3.6)(#6607)

  • [AIRFLOW-5072] gcs_hook 应该只下载一次文件 (#5685)

  • [AIRFLOW-5744] Spark提交操作符中环境变量未正确设置 (#6796)

  • [AIRFLOW-3189] 如果为None则从DbHook.get_uri响应中移除schema (#6833)

  • [AIRFLOW-6195] 修复了用户界面中任务实例属性显示不正确的问题 (#6758)

  • [AIRFLOW-5889] 增强AWS Batch作业状态轮询的健壮性 (#6765)

  • [AIRFLOW-6043] 修复UI中"按根节点筛选"显示DAG部分时的bug (#6638)

  • [AIRFLOW-6033] 修复当task_id变更时"着陆时间"界面崩溃的问题 (#6635)

  • [AIRFLOW-3745] 修复查看器无法查看DAG详情的问题 (#4569)

  • [AIRFLOW-6175] 修复任务卡在“scheduled”状态的bug (#6732)

  • [AIRFLOW-5463] 使Variable.set在替换时成为原子操作 (#6807)

  • [AIRFLOW-5582] 为JdbcHook添加get_autocommit功能 (#6232)

  • [AIRFLOW-5867] 修复webserver单元测试模式的数据类型 (#6517)

  • [AIRFLOW-5819] 更新AWSBatchOperator默认值 (#6473)

  • [AIRFLOW-5709] 修复设置自定义操作符资源的回归问题。(#6331)

  • [AIRFLOW-5658] 修复损坏的导航链接 (#6374)

  • [AIRFLOW-5727] SqoopHook: 仅在端口/模式定义时构建–connect参数 (#6397)

  • [AIRFLOW-5695] 使用 RUNNING_DEPS 来检查从用户界面运行 (#6367)

  • [AIRFLOW-6254] 在日志中隐藏连接额外信息 (#6817)

  • [AIRFLOW-4824] 为MySqlHook的SqlAlchemy引擎添加字符集处理 (#6816)

  • [AIRFLOW-6091] 在BigQueryCursor的execute方法中添加刷新功能 (#6683)

  • [AIRFLOW-6256] 确保重置数据库时清空Jobs表 (#6818)

  • [AIRFLOW-5224] 为GoogleCloudStorageToBigQuery添加编码参数 (#6297)

  • [AIRFLOW-5179] 移除顶层的__init__.py (#5818)

  • [AIRFLOW-5660] 尝试通过Kubernetes pod标签从数据库中查找任务 (#6340)

  • [AIRFLOW-6241] 修复 airflow/gcp/operator/dataflow.py 中的拼写错误 (#6806)

  • [AIRFLOW-6171] 将.airflowignore应用于正确的子目录 (#6784)

  • [AIRFLOW-6018] 在回填过程中以表格形式显示任务实例 (#6612)

  • [AIRFLOW-6189] 将最长测试持续时间缩短至8分钟 (#6744)

  • [AIRFLOW-6141] 如果传感器模式为poke,则移除ReadyToRescheduleDep (#6704)

  • [AIRFLOW-6054] 新增一个启动数据库控制台的命令 (#6653)

  • [AIRFLOW-6047] 简化日志配置模板 (#6644)

  • [AIRFLOW-6017] 从RAT检查中排除PULL_REQUEST_TEMPLATE.md文件 (#6611)

  • [AIRFLOW-4560] 修复 mapred_queue 中的 Tez 队列参数名称 (#5315)

  • [AIRFLOW-2143] 修复TaskTries图表计数偏差1的问题 (#6526)

  • [AIRFLOW-5873] KubernetesPodOperator 修复和测试 (#6523)

  • [AIRFLOW-5869] 错误修复:部分反序列化任务缺少开始日期 (#6519)

  • [AIRFLOW-4020] 从查看者角色中移除DAG编辑权限 (#4845)

  • [AIRFLOW-6263] 修复损坏的WinRM集成 (#6832)

  • [AIRFLOW-5836] 将azure-storage-blob版本固定为<12 (#6486)

  • [AIRFLOW-4488] 修复非RBAC界面中max_active_runs_per_dag的拼写错误 (#6778)

  • [AIRFLOW-5942] 将PyMSSQL固定到3.0以下版本 (#6592)

  • [AIRFLOW-5451] SparkSubmitHook 未设置默认命名空间 (#6072)

  • [AIRFLOW-6271] 在load_test_config期间打印读取的日志文件 (#6842)

  • [AIRFLOW-6308] 为Python 3取消Kombu的版本固定

杂项/内部

  • [AIRFLOW-6009] 关闭常规测试的travis_wait (#6600)

  • [AIRFLOW-6226] 测试时始终重置警告

  • [AIRFLOW-XXX] 移除序列化中的循环导入和pylint临时解决方案 (#6601)

  • [AIRFLOW-XXX] 将/airflow/www中的npm从6.4.1升级到6.13.4 (#6815)

  • [AIRFLOW-XXX] 移除文件的可执行权限

  • [AIRFLOW-XXX] 将AWS和Azure依赖项分组(旧的[emr]等额外项仍然有效)

  • [AIRFLOW-5487] 修复未使用的警告变量 (#6111)

  • [AIRFLOW-5925] 放宽 funcsigs 和 psutil 的版本要求 (#6580)

  • [AIRFLOW-5740] 修复Slack测试中的瞬时故障 (#6407)

  • [AIRFLOW-6058] 使用pytest运行测试 (#6472)

  • [AIRFLOW-6066] 添加了针对意外调试语句的预提交检查 (#6662)

  • [AIRFLOW-6060] 改进conf_vars上下文管理器 (#6658)

  • [AIRFLOW-6044] 标准化kube_pod_operator.py中的代码结构 (#6639)

  • [AIRFLOW-4940] 简化DynamoDBToS3Operator的测试 (#6836)

  • [AIRFLOW-XXX] 更新airflow-jira发布管理脚本 (#6772)

  • [AIRFLOW-XXX] 为单元测试编写添加简单指南 (#6846)

  • [AIRFLOW-6309] 修复Travis上的稳定版本构建

仅文档变更

  • [AIRFLOW-6211] 文档说明如何使用conda创建本地虚拟环境 (#6766)

  • [AIRFLOW-5855] 修复自定义操作符文档中的错误引用 (#6508)

  • [AIRFLOW-5875] 修复 example_qubole_operator.py 中的拼写错误 (#6525)

  • [AIRFLOW-5702] 修复常见文档字符串问题 (#6372)

  • [AIRFLOW-5640] 文档化和测试 BaseOperator 的 email 参数 (#6315)

  • [AIRFLOW-XXX] 改进OpenFaaS Hook的描述 (#6187)

  • [AIRFLOW-XXX] GSoD: 如何使DAGs具备生产就绪状态 (#6515)

  • [AIRFLOW-XXX] 在示例中使用完整命令 (#5973)

  • [AIRFLOW-XXX] 更新文档以准确描述远程和本地日志的优先级 (#5607)

  • [AIRFLOW-XXX] 修复mysql连接文档中的示例"extras"字段 (#5285)

  • [AIRFLOW-XXX] 修复文档中错误的行内代码高亮显示 (#5309)

  • [AIRFLOW-XXX] 将执行器分组到一个部分 (#5834)

  • [AIRFLOW-XXX] 在文档中添加任务生命周期流程图 (#6762)

  • [AIRFLOW-XXX] 高亮代码块 (#6243)

  • [AIRFLOW-XXX] 关于task_concurrency和pool的文档 (#5262)

  • [AIRFLOW-XXX] 修复错误的文档字符串参数 (#6649)

  • [AIRFLOW-XXX] 在concepts.rst中添加指向XCom部分的链接 (#6791)

  • [AIRFLOW-XXX] 更新 Kubernetes 文档中的正确路径 (#6774)

  • [AIRFLOW-XXX] 添加如何配置pytest运行器的信息 (#6736)

  • [AIRFLOW-XXX] 更多GSOD改进 (#6585)

  • [AIRFLOW-XXX] 修正了一个语法错误的句子 (#6667)

  • [AIRFLOW-XXX] 在文档中添加关于Mesos Executor弃用的通知 (#6712)

  • [AIRFLOW-XXX] 更新预提交钩子列表 (#6603)

  • [AIRFLOW-XXX] 更新来自GSOD的Breeze文档 (#6285)

  • [AIRFLOW-XXX] 阐明夏令时行为 (#6324)

  • [AIRFLOW-XXX] GSoD: 新增‘创建自定义操作符’文档 (#6348)

  • [AIRFLOW-XXX] 向CONTRIBUTING.rst添加资源与链接 (#6405)

  • [AIRFLOW-XXX] 将聊天频道详情从gitter更新至slack (#4149)

  • [AIRFLOW-XXX] 在readme中添加logo信息 (#6349)

  • [AIRFLOW-XXX] 修复了CONTRIBUTING.rst文件的大小写问题 (#6329)

  • [AIRFLOW-XXX] 为CONTRIBUTING文档更新Google Season of Docs相关内容 (#6283)

Airflow 1.10.6 (2019-10-28)

重大变更

BaseOperator::render_template 函数签名变更

BaseOperator::render_template 函数的早期版本要求将 attr 参数作为第一个位置参数,与 contentcontext 一起使用。该函数签名在 1.10.6 版本中进行了更改,不再需要(或接受)attr 参数。

为了在BaseOperator的子类中使用此函数,必须移除attr参数:

result = self.render_template("myattr", self.myattr, context)  # Pre-1.10.6 call
# ...
result = self.render_template(self.myattr, context)  # Post-1.10.6 call

aws_default 连接默认区域的变更

Airflow默认连接到AWS的区域(aws_default)在安装时被设置为us-east-1

现在需要手动设置区域,可以通过Airflow中的连接界面、~/.aws配置文件或AWS_DEFAULT_REGION环境变量来完成。

部分DAG处理指标已重命名

以下指标已弃用,在Airflow 2.0中将不再发出:

  • scheduler.dagbag.errorsdagbag_import_errors – 请改用 dag_processing.import_errors

  • dag_file_processor_timeouts – 请改用 dag_processing.processor_timeouts

  • collect_dags – 改用 dag_processing.total_parse_time

  • dag.loading-duration. – 请改用 dag_processing.last_duration.

  • dag_processing.last_runtime. – 请改用 dag_processing.last_duration.

新功能

  • [AIRFLOW-4908] 实现用于update_dataset、patch_dataset和get_dataset的BigQuery Hooks/Operators (#5546)

  • [AIRFLOW-4741] 可选择将任务错误报告至Sentry (#5407)

  • [AIRFLOW-4939] 添加 default_task_retries 配置 (#5570)

  • [AIRFLOW-5508] 添加配置设置以限制发送哪些StatsD指标 (#6130)

  • [AIRFLOW-4222] 为bash和zsh添加cli自动补全功能 (#5789)

  • [AIRFLOW-3871] 操作器的模板字段现在可以渲染对象内部的字段 (#4743)

改进

  • [AIRFLOW-5127] 为CassandraToGoogleCloudStorageOperator添加Gzip支持 (#5738)

  • [AIRFLOW-5125] 为AdlsToGoogleCloudStorageOperator添加gzip支持 (#5737)

  • [AIRFLOW-5124] 为S3ToGoogleCloudStorageOperator添加gzip支持 (#5736)

  • [AIRFLOW-5653] 在任务实例日志中记录AirflowSkipException,以便更清楚地了解任务可能被跳过的原因 (#6330)

  • [AIRFLOW-5343] 移除遗留的SQLAlchemy悲观连接池断开处理机制 (#6034)

  • [AIRFLOW-5561] 放宽gcp额外功能所需的httplib2版本 (#6194)

  • [AIRFLOW-5657] 更新dill依赖的上限版本 (#6334)

  • [AIRFLOW-5292] 允许ECSOperator标记任务 (#5891)

  • [AIRFLOW-4939] 简化默认任务重试的代码 (#6233)

  • [AIRFLOW-5126] 在aws hook的extra_config中读取aws_session_token (#6303)

  • [AIRFLOW-5636] 允许添加或覆盖现有的操作员链接 (#6302)

  • [AIRFLOW-4965] 处理GCP AI操作符中的引号异常(v1.10版本)(#6304)

  • [AIRFLOW-3783] 加速Redshift到S3带有HEADERs的卸载操作 (#6309)

  • [AIRFLOW-3388] 为AWS Batch Operator添加对数组作业的支持 (#6153)

  • [AIRFLOW-4574] 在SSHHook中添加提供private_key的选项 (#6104) (#6163)

  • [AIRFLOW-5530] 修复AWS SQS传感器中的拼写错误 (#6012)

  • [AIRFLOW-5445] 减少Kubernetes边车所需的资源 (#6062)

  • [AIRFLOW-5443] 在Kubernetes的sidecar中使用alpine镜像 (#6059)

  • [AIRFLOW-5344] 为SparkSubmitOperator添加–proxy-user参数 (#5948)

  • [AIRFLOW-3888] Hive元存储连接的高可用性支持 (#4708)

  • [AIRFLOW-5269] 在调度器作业中复用健康检查端点的会话 (#5873)

  • [AIRFLOW-5153] 新增强制删除非空BQ数据集的选项 (#5768)

  • [AIRFLOW-4443] 为外部触发器记录LatestOnly行为 (#5214)

  • [AIRFLOW-2891] 使DockerOperator的container_name支持模板化 (#5696)

  • [AIRFLOW-2891] 允许配置docker_operator容器名称 (#5689)

  • [AIRFLOW-4285] 更新任务依赖上下文定义及使用方式 (#5079)

  • [AIRFLOW-5142] 修复了不稳定的Cassandra测试 (#5758)

  • [AIRFLOW-5218] 减少对AWS Batch作业状态的轮询 (#5825)

  • [AIRFLOW-4956] 修复LocalTaskJob心跳日志刷屏问题 (#5589)

  • [AIRFLOW-3160] 在首页异步加载最新DAG运行记录 (#5339)

  • [AIRFLOW-5560] 允许在airflow backfill命令中重置DAG时无需确认 (#6195)

  • [AIRFLOW-5280] 连接:移除aws_default的默认区域名称 (#5879)

  • [AIRFLOW-5528] end_of_log_mark 不应作为日志记录 (#6159)

  • [AIRFLOW-5526] 由于GCP文档迁移更新文档配置 (#6154)

  • [AIRFLOW-4835] 重构操作符的render_template (#5461)

Bug修复

  • [AIRFLOW-5459] 在Dataflow操作符中使用动态临时位置 (#6078)

  • [Airflow 4923] 修复Databricks钩子在日志中泄露API密钥的问题 (#5635)

  • [AIRFLOW-5133] 在provide_gcp_credential_file中保持原始环境状态 (#5747)

  • [AIRFLOW-5497] 更新 airflow/utils/dag_processing.py 文件中的文档字符串 (#6314)

  • 回退并重新处理"[AIRFLOW-4797] 改进僵尸检测的性能和行为(#5511)"以提升性能(#5908)

  • [AIRFLOW-5634] 不允许编辑DagModelView (#6308)

  • [AIRFLOW-4309] 修复删除Dag后仍显示Broken Dag错误的问题 (#6102)

  • [AIRFLOW-5387] 修复“显示暂停”分页错误 (#6100)

  • [AIRFLOW-5489] 移除不必要的变量赋值 (#6106)

  • [AIRFLOW-5491] mark_tasks 的pydoc文档有误 (#6108)

  • [AIRFLOW-5492] 添加了缺失的文档字符串 (#6107)

  • [AIRFLOW-5503] 修复高分辨率屏幕上的树状视图布局 (#6125)

  • [AIRFLOW-5481] 允许删除已重命名的DAGs (#6101)

  • [AIRFLOW-3857] spark_submit_hook 无法终止 Kubernetes 中的 driver pod (#4678)

  • [AIRFLOW-4391] 修复'最近任务'中None状态任务的工具提示 (#5909)

  • [AIRFLOW-5554] 要求最低StatsD版本为3.3.0 (#6185)

  • [AIRFLOW-5306] 修复链接包含特殊字符时的显示问题 (#5904)

  • [AIRFLOW-3705] 修复PostgresHook的get_conn方法以使用conn_name_attr (#5841)

  • [AIRFLOW-5581] 安全关闭KubernetesJobWatcher,以便在SIGTERM信号下实现调度器的安全关闭 (#6237)

  • [AIRFLOW-5634] 禁止在DagModelView中编辑已禁用的字段 (#6307)

  • [AIRFLOW-4833] 允许在DAG声明中设置Jinja环境选项 (#5943)

  • [AIRFLOW-5408] 修复Kubernetes模板中的环境变量名称 (#6016)

  • [AIRFLOW-5102] 如果工作进程无法发送心跳,它们应该自行终止 (#6284)

  • [AIRFLOW-5572] 在清除任务实例时清除任务重新调度记录 (#6217)

  • [AIRFLOW-5543] 修复树状图和图表视图中工具提示消失的问题(RBAC界面) (#6174)

  • [AIRFLOW-5444] 修复action_logging以记录POST请求的request.form (#6064)

  • [AIRFLOW-5484] 修复 PigCliHook 中参数命名错误的问题 (#6112)

  • [AIRFLOW-5342] 修复MSSQL导致task_instance数据库迁移中断的问题 (#6014)

  • [AIRFLOW-5556] 为调度器DAG处理添加独立的超时配置 (#6186)

  • [AIRFLOW-4858] 弃用airflow.configuration中的"历史便利函数" (#5495) (#6144)

  • [AIRFLOW-774] 修复长期损坏的DAG解析StatsD指标 (#6157)

  • [AIRFLOW-5419] 在使用模拟身份运行时,使用sudo命令来终止已清理的任务 (#6026) (#6176)

  • [AIRFLOW-5537] 主机上不需要将Yamllint作为依赖项

  • [AIRFLOW-5536] 改进临时输出文件的处理方式

  • [AIRFLOW-5535] 修复VERBOSE参数的名称

  • [AIRFLOW-5519] 修复sql_to_gcs操作符缺失多级默认参数的问题,通过添加apply_defaults装饰器 (#6146)

  • [AIRFLOW-5210] 提升模板文件查找效率 (#5815)

  • [AIRFLOW-5447] 调度器停滞问题,原因是默认参数中的第二个监视线程 (#6129)

仅文档变更

  • [AIRFLOW-5574] 修复Google Analytics脚本加载问题 (#6218)

  • [AIRFLOW-5588] 添加Celery架构图 (#6247)

  • [AIRFLOW-5521] 修复指向GCP文档的链接 (#6150)

  • [AIRFLOW-5398] 更新contrib示例DAG以使用上下文管理器 (#5998)

  • [AIRFLOW-5268] 应用与文献中相同的DAG命名规范 (#5874)

  • [AIRFLOW-5101] 修复示例中不一致的owner值 (#5712)

  • [AIRFLOW-XXX] 修复拼写错误 - AWS DynamoDB Hook (#6319)

  • [AIRFLOW-XXX] 修复添加额外操作符链接的文档 (#6301)

  • [AIRFLOW-XXX] 添加任务生命周期章节并修正文档中的大小写 (#4681)

  • [AIRFLOW-XXX] 明确指出1.10.5版本并非被意外遗漏在UPDATING.md文件中 (#6240)

  • [AIRFLOW-XXX] 改进代码块指令中的格式 (#6242)

  • [AIRFLOW-XXX] 格式化Sendgrid文档 (#6245)

  • [AIRFLOW-XXX] 更新为新logo (#6066)

  • [AIRFLOW-XXX] 常见问题解答中的拼写错误 - schedule_interval (#6291)

  • [AIRFLOW-XXX] 添加关于1.10.4版本中DAG#get_task_instances破坏性变更的说明 (#6226)

  • [AIRFLOW-XXX] 修复文档中使用Timers的指标单位错误 (#6152)

  • [AIRFLOW-XXX] 修复.rst文件中的反引号问题 & 添加预提交钩子 (#6162)

  • [AIRFLOW-XXX] 更新关于强制应答变量的文档 (#6158)

  • [AIRFLOW-XXX] 新增第三种授权配置方式 (#6134)

  • [AIRFLOW-XXX] 添加在单个文件上运行pre-commit钩子的示例 (#6143)

  • [AIRFLOW-XXX] 在文档中添加关于默认池的信息 (#6019)

  • [AIRFLOW-XXX] 将Breeze设为默认集成测试环境 (#6001)

杂项/内部

  • [AIRFLOW-5687] 在CI构建流水线中将pip升级至19.0.2 (#6358) (#6361)

  • [AIRFLOW-5533] 修复了失败的CRON构建 (#6167)

  • [AIRFLOW-5130] 使用库中的GOOGLE_APPLICATION_CREDENTIALS常量 (#5744)

  • [AIRFLOW-5369] 为pre-commits添加交互功能 (#5976)

  • [AIRFLOW-5531] 将已弃用的 log.warn() 替换为 log.warning() (#6165)

  • [AIRFLOW-4686] 使dags兼容Pylint (#5753)

  • [AIRFLOW-4864] 移除对load_test_config的调用 (#5502)

  • [AIRFLOW-XXX] 固定mypy版本以确保长期稳定性 (#6198)

  • [AIRFLOW-XXX] 添加从#5127中遗漏的测试

  • [AIRFLOW-4928] 将配置解析器移至DagBag类属性内部 (#5557)

  • [AIRFLOW-5003] 使AWS Hooks兼容pylint (#5627)

  • [AIRFLOW-5580] 添加系统测试基类 (#6229)

Airflow 1.10.5 (2019-09-04)

重大变更

无重大变更。

新功能

  • [AIRFLOW-1498] 新增功能:允许用户在Airflow界面中添加谷歌分析 (#5850)

  • [AIRFLOW-4074] 添加为Dataproc作业添加标签的选项 (#5606)

  • [AIRFLOW-4846] 允许为初始化容器指定包含git凭据的现有密钥 (#5475)

改进

  • [AIRFLOW-5335] 更新GCSHook方法使其所需IAM权限最小化 (#5939)

  • [AIRFLOW-2692] 允许AWS批处理操作器在job_name参数中使用模板 (#3557)

  • [AIRFLOW-4768] 在example_gcp_video_intelligence中添加超时参数 (#5862)

  • [AIRFLOW-5165] 使Dataproc实现高可用性 (#5781)

  • [AIRFLOW-5139] 允许自定义ES配置 (#5760)

  • [AIRFLOW-5340] 修复GCP DLP示例 (#594)

  • [AIRFLOW-5211] 为BigQueryValueCheckOperator的template_fields添加pass_value参数 (#5816)

  • [AIRFLOW-5113] 支持在Slack web hook中使用图标URL (#5724)

  • [AIRFLOW-4230] BigQuery 模式更新选项应为列表 (#5766)

  • [AIRFLOW-1523] 点击图形视图应显示相关DAG运行 (#5866)

  • [AIRFLOW-5027] 为ECS和SageMaker操作员实现的通用CloudWatch日志抓取功能 (#5645)

  • [AIRFLOW-5244] 将所有可能的主题添加到 default_webserver_config.py (#5849)

  • [AIRFLOW-5245] 为调度器添加更多指标 (#5853)

  • [AIRFLOW-5048] 改进Kubernetes资源的显示 (#5665)

  • [AIRFLOW-5284] 将已弃用的 log.warn 替换为 log.warning (#5881)

  • [AIRFLOW-5276] 从airflow.utils.helpers中移除未使用的辅助函数 (#5878)

  • [AIRFLOW-4316] 支持通过环境变量设置kubernetes_environment_variables配置项 (#5668)

Bug修复

  • [AIRFLOW-5168] 修复在1.10.4版本中失败的Dataproc操作符 (#5928)

  • [AIRFLOW-5136] 修复DataProc{*}操作符中template_fields错误的Bug (#5751)

  • [AIRFLOW-5169] 在GCSHook中显式传递GCP项目ID给StorageClient (#5783)

  • [AIRFLOW-5302] 修复none_skipped触发规则中的错误 (#5902)

  • [AIRFLOW-5350] 修复BigQueryHook中num_retires字段的bug (#5955)

  • [AIRFLOW-5145] 修复rbac界面错误显示是否加密变量值的选项 (#5761)

  • [AIRFLOW-5104] 为GCP传输操作设置默认调度 (#5726)

  • [AIRFLOW-4462] 使用MSSQL后端时采用datetime2列类型 (#5707)

  • [AIRFLOW-5282] 为kubeclient添加默认超时设置 & 捕获HTTPError (#5880)

  • [AIRFLOW-5315] 当用户更改executor_config时,TaskInstance未从数据库更新 (#5926)

  • [AIRFLOW-4013] 标记成功/失败操作会选中所有执行日期 (#5616)

  • [AIRFLOW-5152] 修复GoogleCloudStorageToBigQueryOperator中的autodetect默认值(#5771)

  • [AIRFLOW-5100] Airflow调度器未遵守安全模式设置 (#5757)

  • [AIRFLOW-4763] 允许在DockerOperator.command中使用列表 (#5408)

  • [AIRFLOW-5260] 允许连接字符串中的空URI参数 (#5855)

  • [AIRFLOW-5257] 修复ElasticSearch日志处理器在尝试关闭日志时出现的错误 (#5863)

  • [AIRFLOW-1772] Google更新传感器无法与CRON表达式配合使用 (#5730)

  • [AIRFLOW-5085] 当从TAG运行kubernetes git-sync测试时,它会失败 (#5699)

  • [AIRFLOW-5258] ElasticSearch日志处理器在_clean_execution_dat中存在两次小时格式(%H和%I) (#5864)

  • [AIRFLOW-5348] 当通过JS设置时,在弃用的图表视图中转义标签 (#5952)

  • [AIRFLOW-5357] 修复导出的variables.json文件的Content-Type (#5963)

  • [AIRFLOW-5109] 修复终止进程时的进程竞争问题 (#5721)

  • [AIRFLOW-5240] Kombu的最新版本导致Airflow在Python2环境下崩溃

杂项/内部

  • [AIRFLOW-5111] 从Dockerfile中移除apt-get升级命令 (#5722)

  • [AIRFLOW-5209] 修复文档构建 (#5814)

  • [AIRFLOW-5083] 检查许可证镜像构建是否可以更快并移至安装前阶段 (#5695)

  • [AIRFLOW-5119] Cron任务应始终从头开始重新构建所有内容 (#5733)

  • [AIRFLOW-5108] 在CI本地环境中,长时间运行的kerberos有时可能会失败 (#5719)

  • [AIRFLOW-5092] 在force_pull_and_build中应该本地拉取最新的Python镜像 (#5705)

  • [AIRFLOW-5225] 可以为所有JS文件自动添加一致的许可证 (#5827)

  • [AIRFLOW-5229] 为所有其他文件类型添加许可证 (#5831)

  • [AIRFLOW-5227] 统一所有.sql文件的许可证 (#5829)

  • [AIRFLOW-5161] 添加预提交钩子以仅对更改的文件运行静态检查 (#5777)

  • [AIRFLOW-5159] 优化checklicence镜像构建(非必要时不构建)(#5774)

  • [AIRFLOW-5263] 在预提交检查失败时显示差异 (#5869)

  • [AIRFLOW-5204] Shell文件应使用shellcheck进行检查并保持相同的许可证 (#5807)

  • [AIRFLOW-5233] 检查空格(制表符/换行符)的一致性和常见问题 (#5835)

  • [AIRFLOW-5247] 在Dockerfile中可以将所有NPM依赖项的获取步骤提前 (#5870)

  • [AIRFLOW-5143] 损坏的rat.jar文件被包含进Docker镜像中 (#5759)

  • [AIRFLOW-5226] Consistent licences for all html JINJA templates (#5828)

  • [AIRFLOW-5051] 新CI系统中覆盖率报告不正确 (#5732)

  • [AIRFLOW-5239] CONTRIBUTING.md 文件中的小拼写错误和测试不正确 (#5844)

  • [AIRFLOW-5287] 检查基础镜像许可证未被拉取 (#5886)

  • [AIRFLOW-5301] 一些尚未可用的breeze文件被提交到了master分支 (#5901)

  • [AIRFLOW-5285] Pre-commit pylint 检查会扫描 todo 文件 (#5884)

  • [AIRFLOW-5288] 用于静态检查的临时容器应自动移除 (#5887)

  • [AIRFLOW-5206] 所有.md文件都应包含通用许可证和目录(如适用)(#5809)

  • [AIRFLOW-5329] 将本地文件添加到docker的简便方法 (#5933)

  • [AIRFLOW-4027] 使实验性API测试更加无状态 (#4854)

仅文档变更

  • [AIRFLOW-XXX] 修复了Azkaban链接 (#5865)

  • [AIRFLOW-XXX] 从CONTRIBUTING.md中移除重复行 (#5830)

  • [AIRFLOW-XXX] 修复SchedulerJob中错误的文档字符串参数 (#5729)

Airflow 1.10.4 (2019-08-06)

重大变更

将MySQL时间戳导出为UTC时间

MySqlToGoogleCloudStorageOperator 现在默认将 TIMESTAMP 列导出为 UTC 时间,而不是使用 MySQL 服务器的默认时区。这是与 BigQuery 配合使用的正确行为,因为 BigQuery 会假设没有时区的 TIMESTAMP 列采用 UTC 时间。如需保留之前的行为,请将 ensure_utc 设为 False。

DatastoreHook的变更

  • 移除了get_conn函数中的version参数,改为将其添加到hook的__init__函数中,并将其重命名为api_version

  • 将函数allocate_ids的参数partialKeys重命名为partial_keys

GoogleCloudStorageHook的变更

  • GoogleCloudStorageHook中使用的基于发现的API(googleapiclient.discovery)现已被推荐的基于客户端的API(google-cloud-storage)取代。要了解这两个库之间的区别,请阅读https://cloud.google.com/apis/docs/client-libraries-explained。PR:#5054

  • 作为此次替换的一部分,multipartnum_retries 参数在 GoogleCloudStorageHook.upload 方法中已被弃用。

    如果对象/blob大小超过8MB,客户端库会自动使用多部分上传 - 源代码。客户端还会自动处理重试

  • generation 参数在 GoogleCloudStorageHook.deleteGoogleCloudStorageHook.insert_object_acl 中已被弃用。

更新到google-cloud-storage >= 1.16会改变上游client.get_bucket()方法的签名,从get_bucket(bucket_name: str)变为get_bucket(bucket_or_name: Union[str, Bucket])。这个方法并未直接暴露在airflow hook中,但任何直接访问连接的代码(如GoogleCloudStorageHook().get_conn().get_bucket(...)或类似代码)都需要进行更新。

写入日志到Elasticsearch的变更

所有在[elasticsearch]部分下的配置项都已移除elasticsearch_前缀。例如elasticsearch_host现在简化为host

移除 non_pooled_task_slot_countnon_pooled_backfill_task_slot_count

non_pooled_task_slot_countnon_pooled_backfill_task_slot_count 已被移除,改用真实的池,例如 default_pool

默认情况下,任务在default_pool中运行。 default_pool初始化为128个槽位,用户可以通过UI/CLI修改槽位数量。default_pool不可被删除。

pool Celery部分中的配置选项,用于支持不同的Celery池实现

新的pool配置选项允许用户选择不同的池实现。默认值为"prefork",可选值包括"prefork"(默认)、"eventlet"、"gevent"或"solo"。这可以帮助用户在不同场景下获得更好的并发性能。

有关Celery池实现的更多详情,请参阅:

修改BaseOperatorDAG类中的方法签名

BaseOperatorDAG 类中的 get_task_instances 方法签名已变更。该变更不会改变该方法在两种情况下的行为。

对于 BaseOperator

旧签名:

def get_task_instances(self, session, start_date=None, end_date=None): ...

新签名:

@provide_session
def get_task_instances(self, start_date=None, end_date=None, session=None): ...
对于 DAG

旧签名:

def get_task_instances(self, session, start_date=None, end_date=None, state=None): ...

新签名:

@provide_session
def get_task_instances(self, start_date=None, end_date=None, state=None, session=None): ...

无论哪种情况,都需要重写当前提供session位置参数的get_task_instances方法调用。新的方法调用示例如下:

# if you can rely on @provide_session
dag.get_task_instances()
# if you need to provide the session
dag.get_task_instances(session=your_session)

新功能

  • [AIRFLOW-4811] 实现GCP数据丢失防护Hook和操作符 (#5539)

  • [AIRFLOW-5035] 用golang风格的"channel"替代multiprocessing.Manager (#5615)

  • [AIRFLOW-4883] 终止挂起的文件进程管理器 (#5605)

  • [AIRFLOW-4929] 在用户界面中漂亮地打印JSON变量 (#5573)

  • [AIRFLOW-4884] 在RBAC用户界面中汇总导入错误 (#5516)

  • [AIRFLOW-4871] 允许通过RBAC界面创建DagRuns (#5507)

  • [AIRFLOW-4591] 将default_pool设为真正的资源池 (#5349)

  • [AIRFLOW-4844] 为DAG添加可选的is_paused_upon_creation参数 (#5473)

  • [AIRFLOW-4456] 添加可被子类化的BaseBranchOperator (#5231)

  • [AIRFLOW-4343] 如果调度程序未运行,在用户界面显示警告 (#5127)

  • [AIRFLOW-4739] 新增支持自定义Kubernetes工作节点Pod标签的功能 (#5376)

  • [AIRFLOW-4348] 在BigQueryOperator中添加GCP控制台链接 (#5195)

  • [AIRFLOW-4306] 全局操作符额外链接 (#5094)

  • [AIRFLOW-4812] 添加批量图片标注功能 (#5433)

  • [AIRFLOW-4135] 新增Google Cloud Build操作符和钩子 (#5251)

  • [AIRFLOW-4781] 添加在KubernetesPodOperator中指定端口的功能 (#5410)

  • [AIRFLOW-4521] 暂停DAG也会暂停其子DAG (#5283)

  • [AIRFLOW-4738] 强制对示例DAG使用exampleinclude (#5375)

  • [AIRFLOW-4326] Airflow AWS SQS操作符 (#5110)

  • [AIRFLOW-3729] 在KubernetesPodOperator的环境变量中支持DownwardAPI (#4554)

  • [AIRFLOW-4585] 实现Kubernetes Pod变异钩子 (#5359)

  • [AIRFLOW-161] 新增重定向路由和额外链接 (#5059)

  • [AIRFLOW-4420] 回填操作遵循任务并发数限制 (#5221)

  • [AIRFLOW-4147] 新增操作符以发布事件到Redis (#4967)

  • [AIRFLOW-3359] 添加向Dataproc传递客户加密密钥的选项 (#4200)

  • [AIRFLOW-4318] Create Google Cloud Translate Speech Operator (#5102)

  • [AIRFLOW-3960] 新增Google Cloud Speech操作符 (#4780)

  • [AIRFLOW-1501] 新增GoogleCloudStorageDeleteOperator (#5230)

  • [AIRFLOW-3672] 添加对Mongo DB DNS种子列表连接格式的支持 (#4481)

  • [AIRFLOW-4397] 手动添加GCS传感器的集成文档 (#5204)

  • [AIRFLOW-4251] 测量DagRun调度延迟 (#5050)

  • [AIRFLOW-4118] 仪表化DagRun持续时间 (#4946)

  • [AIRFLOW-4361] 修复不稳定的 test_integration_run_dag_with_scheduler_failure 测试 (#5182)

  • [AIRFLOW-4361] 修复不稳定的 test_integration_run_dag_with_scheduler_failure 测试 (#5140)

  • [AIRFLOW-4168] 创建Google Cloud视频智能分析操作器 (#4985)

  • [AIRFLOW-4397] 新增GCSUploadSessionCompleteSensor (#5166)

  • [AIRFLOW-4335] 为GCP连接添加默认num_retries参数 (#5117)

  • [AIRFLOW-3808] 在BigQueryHook的create_empty_table中添加cluster_fields (#4654)

  • [AIRFLOW-4362] 修复test_execution_limited_parallelism测试用例 (#5141)

  • [AIRFLOW-4307] 回填操作遵守并发限制 (#5128)

  • [AIRFLOW-4268] 添加MsSqlToGoogleCloudStorageOperator (#5077)

  • [AIRFLOW-4169] 新增Google Cloud Vision检测操作符 (#4986)

  • [AIRFLOW-XXX] 修复 WS-2019-0032 (#5384)

  • [AIRFLOW-XXX] 修复CVE-2019-11358漏洞 (#5197)

  • [AIRFLOW-XXX] 更改允许的Jinja2版本以修复CVE-2019-10906漏洞 (#5075)

改进

  • [AIRFLOW-5022] 修复带端口号的注册表DockerHook问题 (#5644)

  • [AIRFLOW-4961] 将TaskFail.duration插入为int类型以匹配数据库模式列类型 (#5593)

  • [AIRFLOW-5038] 当禁用Pod删除时跳过Pod已删除的日志消息 (#5656)

  • [AIRFLOW-5067] 更新分页符号 (#5682)

  • [AIRFLOW-4981][AIRFLOW-4788] 在任务实例上下文中始终使用pendulum DateTimes (#5654)

  • [AIRFLOW-4880] 为SqlSensor添加success、failure和fail_on_empty参数 (#5488)

  • [AIRFLOW-3617] 在Kube执行器和pod的配置中添加GPU限制选项 (#5643)

  • [AIRFLOW-4998] 在BigQueryOperator中运行多个查询 (#5619)

  • [AIRFLOW-4929] 改进UI中JSON变量的显示 (#5641)

  • [AIRFLOW-4959] 为DataProcHiveOperator添加.hql支持 (#5591)

  • [AIRFLOW-4962] 修复Werkzeug v0.15版本中DispatcherMiddleware导入的弃用通知 (#5595)

  • [AIRFLOW-4797] 提升僵尸检测的性能和行为 (#5511)

  • [AIRFLOW-4911] 静默处理来自KubernetesExecutor的FORBIDDEN错误 (#5547)

  • [AIRFLOW-3495] 验证传递给DataProcSparkSqlOperator的query和query_uri参数之一 (#5510)

  • [AIRFLOW-4925] 改进变量导入文件字段的CSS样式 (#5552)

  • [AIRFLOW-4906] 改进SparkSubmitHook的调试功能 (#5542)

  • [AIRFLOW-4904] 可以通过设置$AIRFLOW_TEST_CONFIG来覆盖unittest.cfg的名称和路径 (#5540)

  • [AIRFLOW-4920] Use html.escape instead of cgi.escape to fix DeprecationWarning (#5551)

  • [AIRFLOW-4919] DataProcJobBaseOperator 数据处理的 *_属性 支持模板 (#5555)

  • [AIRFLOW-4478] 延迟实例化默认资源对象。(#5259)

  • [AIRFLOW-4564] Azure容器实例的bug修复和改进 (#5319)

  • [AIRFLOW-4237] 在甘特图中包含任务尝试次数 (#5037)

  • [AIRFLOW-4862] 允许直接使用IP地址作为Web服务器日志的主机名 (#5501)

  • [AIRFLOW-4857] 为SlackWebhookOperator添加模板字段 (#5490)

  • [AIRFLOW-3502] 新增Celery配置选项以设置“pool”(#4308)

  • [AIRFLOW-3217] 在日志和代码视图中添加切换行换行的按钮 (#4277)

  • [AIRFLOW-4491] 为日志添加“跳转到末尾”按钮 (#5266)

  • [AIRFLOW-4422] 资源池利用率统计 (#5453)

  • [AIRFLOW-4805] 在DataflowPythonOperator中添加py_file作为模板字段 (#5451)

  • [AIRFLOW-4838] 在AWSAthenaOperator中显示Athena错误 (#5467)

  • [AIRFLOW-4831] 当配置段缺失时,conf.has_option不再抛出异常。(#5455)

  • [AIRFLOW-4829] 为EMR传感器提供更具描述性的异常信息 (#5452)

  • [AIRFLOW-4414] AWSAthenaOperator: 将QueryExecutionID推送到XCom (#5276)

  • [AIRFLOW-4791] 为SnowflakeOperator添加"schema"关键字参数 (#5415)

  • [AIRFLOW-4759] 当将成功运行的标记为失败时不再报错 (#5435)

  • [AIRFLOW-4716] 记录DAG加载时间 (#5350)

  • [AIRFLOW-3958] 支持将任务列表作为链中的上游 (#4779)

  • [AIRFLOW-4409] 防止任务时长因空值中断 (#5178)

  • [AIRFLOW-4418] 在任务模态中添加"仅失败"选项 (#5193)

  • [AIRFLOW-4740] 在DAG的default_args中接受字符串类型的end_date (#5381)

  • [AIRFLOW-4423] 改进mysql到gcs操作符中的日期处理。(#5196)

  • [AIRFLOW-4447] 在用户界面中以更人性化的格式显示任务持续时间 (#5218)

  • [AIRFLOW-4377] 移除 DAG.owner() 中不必要的对象转换 (#5144)

  • [AIRFLOW-4766] 为DataprocClusterCreateOperator添加自动伸缩选项 (#5425)

  • [AIRFLOW-4795] 将alembic升级至最新版本。(#5411)

  • [AIRFLOW-4793] 为mlengine操作符添加signature_name参数 (#5417)

  • [AIRFLOW-3211] 在Airflow重启后重新附加到GCP Dataproc作业 (#4083)

  • [AIRFLOW-4750] 记录识别出的僵尸任务实例 (#5389)

  • [AIRFLOW-3870] STFPOperator: 更新日志级别和返回值 (#4355)

  • [AIRFLOW-4759] 在set_state API中支持批量查询。(#5403)

  • [AIRFLOW-2737] 将原始许可证头部恢复至airflow.api.auth.backend.kerberos_auth

  • [AIRFLOW-3635] 修复delete_dag中的错误逻辑(在PR#4406中引入)(#4445)

  • [AIRFLOW-3599] 从删除DAG操作中移除了Dagbag (#4406)

  • [AIRFLOW-4737] 增加并记录Celery队列名称长度限制 (#5383)

  • [AIRFLOW-4505] 修正PY3的Tag ALL (#5275)

  • [AIRFLOW-4743] 为SSHOperator添加环境变量支持 (#5385)

  • [AIRFLOW-4725] 修复 setup.py 中的 PEP440 兼容性问题及 Sphinx-PyPI-upload 依赖 (#5363)

  • [AIRFLOW-3370] 为Elasticsearch任务日志处理器添加标准输出选项 (#5048)

  • [AIRFLOW-4396] 在用户界面中提供指向外部Elasticsearch日志的链接。(#5164)

  • [AIRFLOW-1381] 允许在DockerOperator中设置主机临时目录 (#5369)

  • [AIRFLOW-4598] Kubernetes执行器的任务重试次数未被耗尽 (#5347)

  • [AIRFLOW-4218] 支持在调用K8 Python客户端库API时为K8执行器提供HTTP参数 (#5060)

  • [AIRFLOW-4159] 为K8sExecutor添加额外静态pod标签支持 (#5134)

  • [AIRFLOW-4720] 允许在.airflowignore文件中添加注释。(#5355)

  • [AIRFLOW-4486] 在MySqlHook中添加AWS IAM认证 (#5334)

  • [AIRFLOW-4417] 为PostgresHook添加AWS IAM认证 (#5223)

  • [AIRFLOW-3990] 编译正则表达式。(#4813)

  • [AIRFLOW-4572] 将prepare_classpath()重命名为prepare_syspath() (#5328)

  • [AIRFLOW-3869] 在AirflowConfigParser.getboolean中抛出统一的异常 (#4692)

  • [AIRFLOW-4571] 为SimpleHttpOperator的模板字段添加头部信息 (#5326)

  • [AIRFLOW-3867] 重命名GCP的子包 (#4690)

  • [AIRFLOW-3725] 在bigquery_hook的get_pandas_df方法中添加private_key参数 (#4549)

  • [AIRFLOW-4546] 升级google-cloud-bigtable。(#5307)

  • [AIRFLOW-4519] 优化视图中操作符类名的排序 (#5282)

  • [AIRFLOW-4503] 支持完整的pig选项 (#5271)

  • [AIRFLOW-4468] 添加sql_alchemy_max_overflow参数 (#5249)

  • [AIRFLOW-4467] 在Dataproc操作符的模板字段中添加dataproc_jars (#5248)

  • [AIRFLOW-4381] 使用get_direct_relative_ids获取任务关联项 (#5147)

  • [AIRFLOW-3624] 为MLEngineTrainingOperator添加masterType参数 (#4428)

  • [AIRFLOW-3143] 在DataprocClusterCreateOperator中支持自动区域 (#5169)

  • [AIRFLOW-3874] 改进BigQueryHook.run_with_configuration的位置支持 (#4695)

  • [AIRFLOW-4399] 避免在 models.dagbag 中重复进行 os.path.isfile() 检查 (#5165)

  • [AIRFLOW-4031] 允许在snowflake hook中使用密钥对认证 (#4875)

  • [AIRFLOW-3901] 为SnowflakeHook添加role作为可选配置参数 (#4721)

  • [AIRFLOW-3455] 在Snowflake连接器中添加区域参数 (#4285)

  • [AIRFLOW-4073] 为AWS Athena操作符添加template_ext (#4907)

  • [AIRFLOW-4093] AWSAthenaOperator: 当作业失败/取消/达到最大重试次数时抛出异常 (#4919)

  • [AIRFLOW-4356] 为DataFlowHook添加额外的RuntimeEnvironment键值 (#5149)

  • [AIRFLOW-4337] 修复CI中的docker-compose弃用警告 (#5119)

  • [AIRFLOW-3603] QuboleOperator: 从SparkCmd文档中移除SQLCommand (#4411)

  • [AIRFLOW-4328] 修复从池页面到任务实例的链接 (#5124)

  • [AIRFLOW-4255] 使GCS Hook向后兼容 (#5089)

  • [AIRFLOW-4103] 允许在数据流作业名称中使用大写字母 (#4925)

  • [AIRFLOW-4255] 将基于发现的API替换为基于客户端的GCS实现 (#5054)

  • [AIRFLOW-4311] 移除localexecutor中的sleep (#5096)

  • [AIRFLOW-2836] 小改进 - contrib.sensors.FileSensor (#3674)

  • [AIRFLOW-4104] 为常用类添加类型注解。(#4926)

  • [AIRFLOW-3910] 在Connection.get_hook()中显式抛出异常 (#4728)

  • [AIRFLOW-3322] 更新QuboleHook以动态从qds_sdk获取参数 (#4165)

  • [AIRFLOW-4565] 为Celery执行器添加监控 (#5321)

  • [AIRFLOW-4573] 在prepare_classpath之后导入airflow_local_settings (#5330)

  • [AIRFLOW-4448] 对于非sudo用户,不要将ENV和_cmd参数写入临时配置文件 (#4050)

  • [AIRFLOW-4295] 使HttpHook中的method属性不区分大小写 (#5313)

  • [AIRFLOW-3703] 为KubernetesPodOperator添加dnsPolicy选项 (#4520)

  • [AIRFLOW-3057] 将prev_*_date_success添加到模板上下文 (#5372)

  • [AIRFLOW-4336] 停止在日志中显示GCS下载操作符(gcs_download_operator)的完整文件字节信息 (#5151)

  • [AIRFLOW-4528] 在超时时取消DataProc任务 (#5293)

Bug修复

  • [AIRFLOW-5089] 修改google-cloud-spanner的版本要求以解决版本不兼容问题 (#5703)

  • [AIRFLOW-4289] 修复 SparkSubmitHook 中 spark_binary 参数被忽略的问题 (#5564)

  • [AIRFLOW-5075] 让HttpHook能够处理主机字段为空的连接 (#5686)

  • [AIRFLOW-4822] 修复了在使用子DAG时父DAG任务实例被错误清除的bug (#5444)

  • [AIRFLOW-5050] 在airflow sync_perms中正确删除FAB权限多对多对象 (#5679)

  • [AIRFLOW-5030] 修复配置键中包含 __ 的环境变量扩展问题 (#5650)

  • [AIRFLOW-4590] 修改日志级别为适当的库以抑制WinRM中的警告 (#5337)

  • [AIRFLOW-4451] 允许模板化命名元组 (#5673)

  • [AIRFLOW-XXX] 修复Kubernetes Pod限制未生效的问题(请求限制生效但实际限制未生效)(#5657)

  • [AIRFLOW-4775] 修复GceHook中参数顺序错误的问题 (#5613)

  • [AIRFLOW-4995] 修复MySQL版本>=8.0.16的数据库初始化问题 (#5614)

  • [AIRFLOW-4934] 修复因Werkzeug升级导致的ProxyFix问题 (#5563) (#5571)

  • [AIRFLOW-4136] 修复hook的key_file被SSHHook连接覆盖的问题 (#5558)

  • [AIRFLOW-4587] 在AWSAthenaHook中用self.get_conn()替换self.conn (#5545)

  • [AIRFLOW-1740] 修复通过UI创建和更新xcom的问题 (#5530) (#5531)

  • [AIRFLOW-4900] 解决Werkzeug版本不兼容问题 (#5535)

  • [AIRFLOW-4510] 在DAG初始化期间不要修改default_args (#5277)

  • [AIRFLOW-3360] 使用url-search-params-polyfill使DAG搜索功能兼容IE浏览器并保留其他查询字符串参数 (#5503)

  • [AIRFLOW-4896] 使KubernetesExecutorConfig的默认参数不可变 (#5534)

  • [AIRFLOW-4494] 在DaskExecutor中移除shell=True (#5273)

  • [AIRFLOW-4890] 修复非RBAC模式下任务实例视图中的日志链接 (#5525)

  • [AIRFLOW-4892] 修复通过用户界面创建连接的问题 (#5527)

  • [AIRFLOW-4406] 修复方法名拼写错误:将NullFernet.decrpyt改为decrypt (#5509)

  • [AIRFLOW-4849] 在cloudsqldatabehook类中添加gcp_conn_id以正确使用CloudSqlProxyRunner类 (#5478)

  • [AIRFLOW-4769] 将gcp_conn_id传递给BigtableHook (#5445)

  • [AIRFLOW-4524] 修复"标记成功/失败"视图中错误的字段名称 (#5486)

  • [AIRFLOW-3671] 从 kwargs 中移除 MongoToS3Operator 的 replace 参数 (#4480)

  • [AIRFLOW-4845] 修复了k8s安全上下文中runAsUser 0未设置的bug (#5474)

  • [AIRFLOW-4354] 修复经典UI中"between"日期过滤器的异常问题 (#5480)

  • [AIRFLOW-4587] 在AWSAthenaHook中用self.get_conn()替换self.conn (#5462)

  • [AIRFLOW-4516] K8s runAsUser 和 fsGroup 不能是字符串 (#5429)

  • [AIRFLOW-4298] 停止调度器重复警告“连接失效” (#5470)

  • [AIRFLOW-4559] JenkinsJobTriggerOperator 错误修复 (#5318)

  • [AIRFLOW-4841] 将Sphinx AutoApi固定到1.0.0版本 (#5468)

  • [AIRFLOW-4479] 在load_bytes方法中包含s3_overwrite参数 (#5312)

  • [AIRFLOW-3746] 修复DockerOperator缺失容器退出的问题 (#4583)

  • [AIRFLOW-4233] 从Bq到GCS操作器中移除模板扩展 (#5456)

  • [AIRFLOW-2141][AIRFLOW-3157][AIRFLOW-4170] 导入变量时通过JSON序列化非字符串值 (#4991)

  • [AIRFLOW-4826] 移除airflow resetdb命令中的警告信息 (#5447)

  • [AIRFLOW-4148] 修复点击状态列时编辑DagRuns的问题 (#5436)

  • [AIRFLOW-4455] RBAC 界面中子DAG的dag_details功能损坏 (#5234)

  • [AIRFLOW-2955] 修复kubernetes pod operator以设置任务pod的requests和limits (#4551)

  • [AIRFLOW-4459] 修复当DAG数量为零时/home页面显示错误DAG计数的问题 (#5235)

  • [AIRFLOW-3876] AttributeError: 模块 distutils 没有属性 'util'

  • [AIRFLOW-4146] 修复CgroupTaskRunner错误 (#5224)

  • [AIRFLOW-4524] 修复RBAC模式下“忽略*”切换按钮的bug (#5378)

  • [AIRFLOW-4765] 修复DataProcPigOperator执行方法 (#5426)

  • [AIRFLOW-4798] 消除dagbag和TI测试之间的相互依赖关系 (#5422)

  • [AIRFLOW-4800] 修复 GKEClusterHook 构造函数调用 (#5424)

  • [AIRFLOW-4799] 在BashOperator执行方法中不要修改self.env (#5421)

  • [AIRFLOW-4393] 在KubernetesPodOperator中获取pod状态和/或日志时添加重试逻辑 (#5284)

  • [AIRFLOW-4174] 修复HttpHook运行时的退避机制 (#5213)

  • [AIRFLOW-4463] 处理短重试间隔中的除零错误 (#5243)

  • [AIRFLOW-2614] 当系统中有大量DAG时加速trigger_dag API调用

  • [AIRFLOW-4756] 将ti.state作为甘特图标准添加到ti.start_date (#5399)

  • [AIRFLOW-4760] 修复zip打包的DAG在重新加载时从DagBag中消失的问题 (#5404)

  • [AIRFLOW-4731] 修复GCS钩子与google-storage-client 1.16的兼容性问题 (#5368)

  • [AIRFLOW-3506] 使用match_phrase查询elasticsearch中的log_id (#4342)

  • [AIRFLOW-4084] 修复ElasticSearch日志下载问题 (#5177)

  • [AIRFLOW-4501] 为sqla+pymysql注册pendulum日期时间转换器 (#5190)

  • [AIRFLOW-986] HiveCliHook 忽略连接额外参数中的 'proxy_user' 值 (#5305)

  • [AIRFLOW-4442] 修复HiveToDruidTransfer中的hive_tblproperties (#5211)

  • [AIRFLOW-4557] 为CloudSqlDatabaseHook的get_sqlproxy_runner()添加gcp_conn_id参数 (#5314)

  • [AIRFLOW-4545] 将FAB升级至最新版本 (#4955)

  • [AIRFLOW-4492] 将Dataproc集群操作符更改为轮询操作 (#5269)

  • [AIRFLOW-4452] 由于slackclient更新导致Webserver和Scheduler持续崩溃 (#5225)

  • [AIRFLOW-4450] 修复has_dag_access中的请求参数 (#5220)

  • [AIRFLOW-4434] 支持在HiveServer2Hook中使用Impala (#5206)

  • [AIRFLOW-3449] 在启用远程日志记录时写入本地DAG解析日志。(#5175)

  • [AIRFLOW-4300] 修复当DAG尚未运行时图形模态调用的错误 (#5185)

  • [AIRFLOW-4401] 使用管理器进行队列同步 (#5200)

  • [AIRFLOW-3626] 修复了触发包含在zip文件中的DAGs的问题 (#4439)

  • [AIRFLOW-3720] 修复比较GCS和S3文件时的不匹配问题 (#4766)

  • [AIRFLOW-4403] 在UI界面中通过dag_idowners进行搜索 (#5184)

  • [AIRFLOW-4308] 修复Python 3.6+版本中围绕夏令时的时区循环问题 (#5095)

  • [AIRFLOW-4324] 修复RBAC界面中的DAG模糊搜索功能 (#5131)

  • [AIRFLOW-4297] 针对1.10.4版本发布的manage_slas()临时热修复 (#5150)

  • [AIRFLOW-4299] 升级至 Celery 4.3.0 以修复崩溃的工作节点 (#5116)

  • [AIRFLOW-4291] 在DAG图形页面正确渲染doc_md (#5121)

  • [AIRFLOW-4310] 修复Dag详情页面上错误的链接 (#5122)

  • [AIRFLOW-4331] 修正Dag详情页面对空状态运行的筛选条件 (#5123)

  • [AIRFLOW-4294] 修复UI中dag_id包含点号时缺失的DAG和任务运行记录 (#5111)

  • [AIRFLOW-4332] 升级sqlalchemy以修复安全漏洞 (#5113)

  • [AIRFLOW-4312] 为BigQueryCheckO…添加template_fields和template_ext (#5097)

  • [AIRFLOW-4293] 修复d4ecb8fbee3_add_schedule_interval_to_dag.py中的降级问题 (#5086)

  • [AIRFLOW-4267] 修复图形视图中的任务实例持续时间 (#5071)

  • [AIRFLOW-4163] IntervalCheckOperator 支持相对差异且不忽略0 (#4983)

  • [AIRFLOW-3938] QuboleOperator 修复及支持 SqlCommand (#4832)

  • [AIRFLOW-2903] 将默认所有者更改为 airflow (#4151)

  • [AIRFLOW-4136] 修复构造函数对key_file的覆盖问题 (#5155)

  • [AIRFLOW-3241] 移除GCS传感器中的无效模板扩展 (#4076)

杂项/内部

  • [AIRFLOW-4338] 将k8s pod_request_factory改为使用yaml safe_load (#5120)

  • [AIRFLOW-4869] 重新组织SQL到GCS操作符。(#5504)

  • [AIRFLOW-5021] 将gitpython移至setup_requires (#5640)

  • [AIRFLOW-4583] 修复了GKEPodOperator中的类型错误 (#5612)

  • [AIRFLOW-4116] Dockerfile 现在支持在 DockerHub 上构建 CI 镜像 (#4937)

  • [AIRFLOW-4115] 多阶段构建的Airflow Docker镜像 (#4936)

  • [AIRFLOW-4963] 避免重复创建任务上下文 (#5596)

  • [AIRFLOW-4865] 在测试中添加上下文管理器以设置临时配置值。(#5569)

  • [AIRFLOW-4937] 修复 lodash 版本低于 4.17.13 的安全问题 (#5572) (仅用于构建管道,不涉及运行时)

  • [AIRFLOW-4868] 修复kubernetes/docker/build.sh中的拼写错误 (#5505)

  • [AIRFLOW-4211] 为WebHDFSHook添加测试 (#5015)

  • [AIRFLOW-4320] 为SegmentTrackEventOperator添加测试 (#5104)

  • [AIRFLOW-4319] 为Bigquery相关操作符添加测试 (#5101)

  • [AIRFLOW-4014] 修改DatastoreHook并添加测试 (#4842)

  • [AIRFLOW-4322] 为VerticaOperator添加测试 (#5107)

  • [AIRFLOW-4323] 为WinRMOperator添加2个测试 (#5108)

  • [AIRFLOW-3677] 提升CheckOperator测试覆盖率 (#4756)

  • [AIRFLOW-4659] 修复api模块的pylint问题 (#5398)

  • [AIRFLOW-4358] 通过不运行任务来加速test_jobs测试 (#5162)

  • [AIRFLOW-4394] 不要从CLI测试中验证BackfillJob的行为 (#5160)

  • [AIRFLOW-3471] 将XCom从models.py中移出 (#4629)

  • [AIRFLOW-4379] 移除重复代码 & 在gcs_to_gcs.py中添加验证 (#5145)

  • [AIRFLOW-4259] 将模型从models.py中移出 (#5056)

  • [AIRFLOW-XXX] 在Travis上加速构建Cassanda模块 (#5233)

  • [AIRFLOW-4535] 将jobs.py拆分为多个文件 (#5303)

  • [AIRFLOW-1464] 批量更新任务实例状态 (#5323)

  • [AIRFLOW-4554] 测试sudo命令,添加其他一些测试文档 (#5310)

  • [AIRFLOW-4419] 优化调度器中的并发检查 (#5194)

  • [AIRFLOW-4269] 轻微加速jobs._process_task_instances()的执行 (#5076)

  • [AIRFLOW-4341] 移除 View.render() 因为它已存在于 fab.BaseView 中 (#5125)

  • [AIRFLOW-4342] 使用@cached_property替代每次重新实现它 (#5126)

  • [AIRFLOW-4256] 从迁移中移除noqa (#5055)

  • [AIRFLOW-4034] 移除不必要的字符串格式化,使用**locals() (#4861)

  • [AIRFLOW-3944] 移除代码异味 (#4762)

仅文档变更

  • [AIRFLOW-XXX] 为KubernetesPodOperator的annotations参数添加缺失文档 (#5666)

  • [AIRFLOW-XXX] 修复CONTRIBUTING.md中的拼写错误 (#5626)

  • [AIRFLOW-XXX] 修正BaseSensorOperator文档 (#5562)

  • [AIRFLOW-4926] 修复示例DAG中起始日期为datetime.utcnow()的情况 (#5553)

  • [AIRFLOW-4860] 移除示例Dag中的冗余信息 (#5497)

  • [AIRFLOW-4767] 修复Dataproc操作符文档中的错误 (#5487)

  • [AIRFLOW-1684] 基于XCom变量的分支功能(文档)(#4365)

  • [AIRFLOW-3341] 常见问题解答返回DAG对象示例 (#4605)

  • [AIRFLOW-4433] 在DockerOperator文档字符串中添加缺失的类型 (#5205)

  • [AIRFLOW-4321] 修正GCS对象大小最大限制的错误信息 (#5106)

  • [AIRFLOW-XXX] 添加关于用户列表的信息 (#5341)

  • [AIRFLOW-XXX] 澄清GCS_to_BQ操作中关于autodetect参数的文档 (#5294)

  • [AIRFLOW-XXX] 从时区文档中移除关于pytz兼容性的提及 (#5316)

  • [AIRFLOW-XXX] 为GoogleCloudStorageDeleteOperator添加缺失的文档 (#5274)

  • [AIRFLOW-XXX] 移除关于GCP连接作用域的错误说明 (#5242)

  • [AIRFLOW-XXX] 修复Dataproc操作符文档中的错误 (#5192)

  • [AIRFLOW-XXX] 在macros.rst中为timedelta添加正确类的链接 (#5226)

  • [AIRFLOW-XXX] 添加Kamil为提交者 (#5216)

  • [AIRFLOW-XXX] 添加Joshua和Kevin为提交者 (#5207)

  • [AIRFLOW-XXX] 减少测试中的日志冗余信息 (#5174)

  • [AIRFLOW-XXX] 加速PythonSensor的测试 (#5158)

  • [AIRFLOW-XXX] 将Bas Harenslak添加到committer列表 (#5157)

  • [AIRFLOW-XXX] 将Jarek Potiuk添加到提交者列表 (#5132)

  • [AIRFLOW-XXX] 更新SchedulerJob的文档字符串 (#5105)

  • [AIRFLOW-XXX] 修复CassandraToGoogleCloudStorageOperator的文档字符串 (#5103)

  • [AIRFLOW-XXX] 更新SlackWebhookHook和SlackWebhookOperator的文档字符串 (#5074)

  • [AIRFLOW-XXX] 在文档中忽略node_modules下的Python文件 (#5063)

  • [AIRFLOW-XXX] 构建一个包含LICENSE文件的通用wheel包 (#5052)

  • [AIRFLOW-XXX] 修复 SQSHook 的文档字符串 (#5099)

  • [AIRFLOW-XXX] 在readthedocs上使用Py3.7

  • [AIRFLOW-4446] 修复拼写错误 (#5217)

Airflow 1.10.3 (2019-04-09)

重大变更

新增 dag_discovery_safe_mode 配置选项

如果启用了dag_discovery_safe_mode,则仅当文件包含字符串"airflow"和"DAG"时才检查其中的DAG。为了向后兼容,此选项默认启用。

RedisPy依赖项已更新至v3系列

如果您正在使用Redis传感器或钩子,可能需要更新代码。请参阅redis-py移植说明以检查您的代码是否会受到影响(MSET、MSETNX、ZADD和ZINCRBY都涉及修改,但请阅读完整文档)。

不再需要SLUGIFY_USES_TEXT_UNIDECODE或AIRFLOW_GPL_UNIDECODE

不再需要设置环境变量来避免GPL依赖。如果之前未安装unidecode,Airflow现在将始终使用text-unidecode

[celery]部分新增sync_parallelism配置选项

新的sync_parallelism配置选项将控制CeleryExecutor使用多少个进程并行获取celery任务状态。默认值为max(1, 核心数 - 1)

将BashTaskRunner重命名为StandardTaskRunner

BashTaskRunner已更名为StandardTaskRunner。这是默认的任务运行器,因此您可能需要更新配置。

task_runner = StandardTaskRunner

配置文件发现的修改

如果未设置环境变量AIRFLOW_CONFIG且存在~/airflow/airflow.cfg文件,airflow之前会使用~/airflow/airflow.cfg而非$AIRFLOW_HOME/airflow.cfg。现在airflow将通过$AIRFLOW_CONFIG$AIRFLOW_HOME环境变量来查找其配置文件,而不再检查文件是否存在。

访问变量时使用默认值的行为变更

现在可以在获取变量时使用None作为default_var参数的默认值,例如

foo = Variable.get("foo", default_var=None)
if foo is None:
    handle_missing_foo()

(注意:在某些情况下,Variable.setdefault()可能已经很有帮助。)

这将改变您之前明确提供None作为默认值时的行为。如果您的代码期望抛出KeyError,则不要传递default_var参数。

移除 airflow_home 配置设置

之前有两种方式可以指定Airflow的"home"目录(默认为~/airflow):通过AIRFLOW_HOME环境变量,或者在[core]配置节中的airflow_home配置项。

如果它们有两个不同的值,代码库的不同部分最终会得到不同的值。该配置设置已被弃用,如果您需要为此使用非默认值,应从配置文件中删除该值并设置AIRFLOW_HOME环境变量。

(由于此设置用于计算要加载的配置文件,因此无法仅保留配置选项)

GCPTransferServiceHook中两个方法签名的变更

GCPTransferServiceHook类中的create_transfer_job方法签名已更改。这一变更不会改变该方法的行为。

旧签名:

def create_transfer_job(self, description, schedule, transfer_spec, project_id=None): ...

新签名:

def create_transfer_job(self, body): ...

需要重写对该方法的调用。新的调用如下所示:

body = {
    "status": "ENABLED",
    "projectId": project_id,
    "description": description,
    "transferSpec": transfer_spec,
    "schedule": schedule,
}
gct_hook.create_transfer_job(body)

这一变更源于对所有钩子的统一调整,以符合官方推荐的Google Cloud使用规范。

GCPTransferServiceHook 中的 wait_for_transfer_job 方法签名已更改。

旧签名:

def wait_for_transfer_job(self, job): ...

新签名:

def wait_for_transfer_job(self, job, expected_statuses=(GcpTransferOperationStatus.SUCCESS,)): ...

wait_for_transfer_job 的行为已发生变化:

旧行为:

wait_for_transfer_job 会等待指定作业操作中的SUCCESS状态。

新行为:

您现在可以指定一组预期的状态数组。wait_for_transfer_job现在会等待其中任意一个状态。

expected_statuses的默认值是SUCCESS,因此这一变更是向后兼容的。

将两个类移动到不同模块

GoogleCloudStorageToGoogleCloudStorageTransferOperator 已从 airflow.contrib.operators.gcs_to_gcs_transfer_operator 移至 airflow.contrib.operators.gcp_transfer_operator

S3ToGoogleCloudStorageTransferOperator 已从 airflow.contrib.operators.s3_to_gcs_transfer_operator 移至 airflow.contrib.operators.gcp_transfer_operator

这一变更是为了将所有与GCS传输服务相关的操作符集中在一个文件中。

之前的导入方式将在Airflow 2.0之前继续有效

修正了 SparkSubmitHook 中 --driver-class-path 的拼写错误

SparkSubmit Hook和Operator中的driver_classapth参数会在spark命令行生成--driver-classpath,但这并不是spark的有效选项。

该参数已重命名为driver_class_path,并且它生成的选项已被修复。

新功能

  • [AIRFLOW-4232] 添加 none_skipped 触发规则 (#5032)

  • [AIRFLOW-3971] 添加Google Cloud自然语言操作符 (#4980)

  • [AIRFLOW-4069] 新增Opsgenie告警钩子和操作器 (#4903)

  • [AIRFLOW-3552] 修复ImapAttachmentToS3Operator中的编码问题 (#5040)

  • [AIRFLOW-3552] 新增ImapAttachmentToS3Operator操作符 (#4476)

  • [AIRFLOW-1526] 新增钉钉钩子和操作符 (#4895)

  • [AIRFLOW-3490] 新增BigQueryHook支持修补表/视图的功能 (#4299)

  • [AIRFLOW-3918] 为KubernetesExecutor的git-sync添加SSH私钥支持 (#4777)

  • [AIRFLOW-3659] 创建Google云传输服务操作器 (#4792)

  • [AIRFLOW-3939] 新增Google Cloud Translate操作符 (#4755)

  • [AIRFLOW-3541] 为BigQuery钩子添加Avro逻辑类型转换功能 (#4553)

  • [AIRFLOW-4106] 检测池中的饥饿任务 (#4927)

  • [AIRFLOW-2568] Azure 容器实例操作符 (#4121)

  • [AIRFLOW-4107] 仪表化执行器 (#4928)

  • [AIRFLOW-4033] 记录任务持续时间的统计信息 (#4858)

  • [AIRFLOW-3892] 创建Redis发布订阅传感器 (#4712)

  • [AIRFLOW-4124] 在aws_glue_hook中添加get_table和get_table_location方法及测试 (#4942)

  • [AIRFLOW-1262] 添加缺失的邮件配置文档 (#4557)

  • [AIRFLOW-3701] 新增Google Cloud Vision产品搜索操作符 (#4665)

  • [AIRFLOW-3766] 添加对kubernetes注解的支持 (#4589)

  • [AIRFLOW-3741] 为Oracle钩子添加额外配置 (#4584)

  • [AIRFLOW-1262] 允许配置邮件告警主题和正文 (#2338)

  • [AIRFLOW-2985] 用于S3对象复制/删除的操作符 (#3823)

  • [AIRFLOW-2993] s3_to_sftp和sftp_to_s3操作符 (#3828)

  • [AIRFLOW-3799] 为GoogleCloudStorageHook添加compose方法 (#4641)

  • [AIRFLOW-3218] 添加支持触发整个DAG的功能 (#4058)

  • [AIRFLOW-3315] 新增Imap附件传感器 (#4161)

  • [AIRFLOW-3556] 添加交叉连接设置依赖功能 (#4356)

改进

  • [AIRFLOW-3823] 从待跳过任务中排除分支的下游任务 (#4666)

  • [AIRFLOW-3274] 为Kubernetes添加run_as_user和fs_group选项 (#4648)

  • [AIRFLOW-4247] Dataproc操作器上的模板区域 (#5046)

  • [AIRFLOW-4008] 为Kubernetes执行器添加envFrom支持 (#4952)

  • [AIRFLOW-3947] 为无DAG级别访问错误添加闪存消息 (#4767)

  • [AIRFLOW-3287] 将数据库清理代码移至CoreTest.tearDown() (#4122)

  • [AIRFLOW-4058] 将模型测试文件命名以便自动识别 (#4901)

  • [AIRFLOW-3830] 从/dag_details中移除DagBag (#4831)

  • [AIRFLOW-3596] 清理未定义的模板变量。(#4401)

  • [AIRFLOW-3573] 移除DagStat表 (#4378)

  • [AIRFLOW-3623] 修复下载任务日志中的错误 (#5005)

  • [AIRFLOW-4173] 改进 SchedulerJob.process_file() (#4993)

  • [AIRFLOW-3540] 如果发现旧的airflow.cfg文件则发出警告 (#5006)

  • [AIRFLOW-4000] 当没有文件时返回响应 (#4822)

  • [AIRFLOW-3383] 轮换fernet密钥。(#4225)

  • [AIRFLOW-3003] 拉取krb5镜像而非构建 (#3844)

  • [AIRFLOW-3862] 使用mypy检查类型。(#4685)

  • [AIRFLOW-251] 添加SQL_ALCHEMY_SCHEMA参数选项以指定元数据模式 (#4199)

  • [AIRFLOW-1814] 模板化PythonOperator的{op_args,op_kwargs}字段 (#4691)

  • [AIRFLOW-3730] 标准化日志机制的使用 (#4556)

  • [AIRFLOW-3770] 在CI上验证文档 (#4593)

  • [AIRFLOW-3866] 在CI中静默运行docker-compose pull (#4688)

  • [AIRFLOW-3685] 移动许可证头检查 (#4497)

  • [AIRFLOW-3670] 为Travis构建添加阶段 (#4477)

  • [AIRFLOW-3937] KubernetesPodOperator 支持通过 envFrom 配置 configMapRef 和 secretRef (#4772)

  • [AIRFLOW-3408] 从Systemd指令中移除过时信息 (#4269)

  • [AIRFLOW-3202] 为AWS hooks/operator添加缺失的文档 (#4048)

  • [AIRFLOW-3908] 新增更多Google Cloud Vision操作符 (#4791)

  • [AIRFLOW-2915] 为GoogleCloudStorageToBigQueryOperator添加示例DAG (#3763)

  • [AIRFLOW-3062] 在集成文档中添加Qubole (#3946)

  • [AIRFLOW-3288] 添加SNS集成 (#4123)

  • [AIRFLOW-3148] 移除RedshiftToS3Transfer中不必要的参数"parameters" (#3995)

  • [AIRFLOW-3049] 为Mongo钩子添加额外操作 (#3890)

  • [AIRFLOW-3559] 为DatadogHook添加缺失的选项。(#4362)

  • [AIRFLOW-1191] 简化spark提交命令的重写。(#4360)

  • [AIRFLOW-3155] 在GCS操作符中添加按最后修改时间过滤的功能 (#4008)

  • [AIRFLOW-2864] 修复SubDagOperator的文档字符串 (#3712)

  • [AIRFLOW-4062] 改进关于安装额外包命令的文档 (#4966)

  • [AIRFLOW-3743] 统一计算AIRFLOW_HOME的不同方法 (#4705)

  • [AIRFLOW-4002] 新增在airflow test命令出错时启动调试器的选项。(#4828)

  • [AIRFLOW-3997] 扩展Variable.get功能,使其在变量未找到时可返回None (#4819)

  • [AIRFLOW-4009] 修复GCSToBQOperator中的文档字符串问题 (#4836)

  • [AIRFLOW-3980] 统一日志记录器 (#4804)

  • [AIRFLOW-4076] 修正init_db中beeline_default的端口类型 (#4908)

  • [AIRFLOW-4046] 为Sensor添加poke_interval和timeout的验证 (#4878)

  • [AIRFLOW-3744] 弃用过时的方法别名 (#4568)

  • [AIRFLOW-3865] 新增通过ID获取DAG Python代码的API端点 (#4687)

  • [AIRFLOW-3516] 支持批量创建k8工作节点pod (#4434)

  • [AIRFLOW-2843] 在ExternalTaskSensor中添加标志以检查外部DAG/任务是否存在 (#4547)

  • [AIRFLOW-2224] 在MySqlToGoogleCloudStorageOperator中添加对CSV文件的支持 (#4738)

  • [AIRFLOW-3895] GoogleCloudStorageHook/Op 的 create_bucket 方法新增可选资源参数 (#4717)

  • [AIRFLOW-3950] 改进AirflowSecurityManager.update_admin_perm_view (#4774)

  • [AIRFLOW-4006] 在AirflowSecurityManager中更有效地利用Set (#4833)

  • [AIRFLOW-3917] 在集群外运行时指定替代的kube配置文件/上下文 (#4859)

  • [AIRFLOW-3911] 将DAG解析结果的收集日志级别调整为DEBUG (#4729)

  • [AIRFLOW-3584] 在索引视图中使用ORM DAGs。(#4390)

  • [AIRFLOW-2821] 优化文档“插件”部分 (#3664)

  • [AIRFLOW-3561] 优化查询 (#4368)

  • [AIRFLOW-3600] 从触发器移除dagbag (#4407)

  • [AIRFLOW-3713] 更新了GCP可选参数project_id的文档 (#4541)

  • [AIRFLOW-2767] 将gunicorn升级至19.5.0版本以避免中等严重程度的CVE漏洞 (#4795)

  • [AIRFLOW-3795] 现在使用了 provide_context 参数 (#4735)

  • [AIRFLOW-4012] 将tabulate升级至0.8.3版本 (#4838)

  • [AIRFLOW-3623] 支持从UI界面按尝试次数下载日志 (#4425)

  • [AIRFLOW-2715] 启动Dataflow模板时使用区域设置 (#4139)

  • [AIRFLOW-3932] 更新单元测试和文档以支持安全模式标志。(#4760)

  • [AIRFLOW-3932] 可选择跳过DAG发现启发式规则。(#4746)

  • [AIRFLOW-3258] K8S执行器环境变量部分。(#4627)

  • [AIRFLOW-3931] 在启动数据流模板时设置网络和子网络 (#4744)

  • [AIRFLOW-4095] 为S3CopyObjectOperator和S3DeleteObjectsOperator添加template_fields (#4920)

  • [AIRFLOW-2798] 从models.py中移除不必要的代码

  • [AIRFLOW-3731] 将mysqlclient限制为<1.4版本 (#4558)

  • [AIRFLOW-3139] 在SQL操作符的log.info中包含参数(如果有的话)(#3986)

  • [AIRFLOW-3174] 优化SQL操作符和钩子的文档字符串 (#4043)

  • [AIRFLOW-3933] 修复多处拼写错误 (#4747)

  • [AIRFLOW-3905] 允许在SqlSensor中使用"parameters"参数 (#4723)

  • [AIRFLOW-2761] 在Celery执行器中并行化任务入队 (#4234)

  • [AIRFLOW-3540] 在查找配置文件时遵循环境配置。(#4340)

  • [AIRFLOW-2156] 并行化Celery Executor任务状态获取 (#3830)

  • [AIRFLOW-3702] 添加回填选项以向后运行 (#4676)

  • [AIRFLOW-3821] 为GCP SQL示例DAG添加副本逻辑 (#4662)

  • [AIRFLOW-3547] 修复了SparkSubmitOperator中的Jinja模板问题 (#4347)

  • [AIRFLOW-3647] 为SparkSubmitOperator添加archives配置选项 (#4467)

  • [AIRFLOW-3802] 更新了HiveServer2Hook的文档 (#4647)

  • [AIRFLOW-3817] 修正了BranchPythonOperator返回的任务ID以匹配虚拟操作符ID (#4659)

  • [AIRFLOW-3782] 澄清关于 default_airflow.cfg 中 celery worker_autoscale 的文档 (#4609)

  • [AIRFLOW-1945] 为Celery workers添加自动扩展配置 (#3989)

  • [AIRFLOW-3590] 修改执行器退出状态的日志消息 (#4616)

  • [AIRFLOW-3591] 修复重新调度任务的开始日期、结束日期和持续时间 (#4502)

  • [AIRFLOW-3709] 验证ExternalTaskSensor的allowed_states参数 (#4536)

  • [AIRFLOW-3522] 添加对发送Slack附件的支持 (#4332)

  • [AIRFLOW-3569] 在DAG页面添加"触发DAG"按钮 (#4373)

  • [AIRFLOW-3044] Dataflow操作符现在支持模板化的job_name参数 (#3887)

  • [AIRFLOW-3023] 修复文档字符串数据类型

  • [AIRFLOW-2928] 使用uuid4替代uuid1 (#3779)

  • [AIRFLOW-2988] 为数据流专门运行python2 (#3826)

  • [AIRFLOW-3697] 将nvd3和slugify进行供应商化 (#4513)

  • [AIRFLOW-3692] 移除环境变量以避免GPL (#4506)

  • [AIRFLOW-3907] 升级flask并设置cookie安全标志。(#4725)

  • [AIRFLOW-3698] 添加AWS连接文档 (#4514)

  • [AIRFLOW-3616][AIRFLOW-1215] 为带下划线的schema添加别名 (#4523)

  • [AIRFLOW-3375] 支持通过BranchPythonOperator返回多个任务 (#4215)

  • [AIRFLOW-3742] 修复AirflowConfigParsxer.getint/boolean中对"fallback"的处理 (#4674)

  • [AIRFLOW-3742] 在airflow.configuration.get中尊重fallback参数 (#4567)

  • [AIRFLOW-3789] 修复flake8 3.7的错误。(#4617)

  • [AIRFLOW-3602] 改进ImapHook处理无附件检索的情况 (#4475)

  • [AIRFLOW-3631] 更新flake8并修复lint问题。(#4436)

Bug修复

  • [AIRFLOW-4248] 修复文件处理器中的FileExistsError目录创建竞争问题 (#5047)

  • [AIRFLOW-4240] 状态变更操作应为POST请求 (#5039)

  • [AIRFLOW-4246] 由于破坏性变更,Flask-Oauthlib需要固定下游依赖项版本 (#5045)

  • [AIRFLOW-3887] 将dagre-d3降级至0.4.18版本 (#4713)

  • [AIRFLOW-3419] 修复Python3中的S3Hook.select_key问题 (#4970)

  • [AIRFLOW-4127] 修正 AzureContainerInstanceHook._get_instance_view 的返回值 (#4945)

  • [AIRFLOW-4172] 修复Spark Submit中驱动类路径选项的更改 (#4992)

  • [AIRFLOW-3615] 在连接中保留UNIX套接字路径的大小写 (#4591)

  • [AIRFLOW-3417] ECSOperator: 仅对FARGATE启动类型传递platformVersion参数 (#4256)

  • [AIRFLOW-3884] 修复文档检查器,不再允许任何警告并修复了当前问题... (#4702)

  • [AIRFLOW-2652] 实现/增强 baseOperator 的深拷贝功能

  • [AIRFLOW-4001] 更新关于如何运行测试的文档 (#4826)

  • [AIRFLOW-3699] 加速Flake8 (#4515)

  • [AIRFLOW-4160] 修复DAG页面中‘触发DAG’按钮的重定向问题 (#4982)

  • [AIRFLOW-3650] 跳过在mysql上运行不稳定的测试 (#4457)

  • [AIRFLOW-3423] 修复mongo hook以支持匿名访问 (#4258)

  • [AIRFLOW-3982] 修复CI测试中的竞态条件 (#4968)

  • [AIRFLOW-3982] 根据自身任务更新DagRun状态 (#4808)

  • [AIRFLOW-3737] Kubernetes执行器无法处理过长的dag/任务名称 (#4636)

  • [AIRFLOW-3945] 当权限视图未变更时停止插入行 (#4764)

  • [AIRFLOW-4123] 为K8 Executor中的_change_state方法添加异常处理 (#4941)

  • [AIRFLOW-3771] 安全管理器小规模重构 (#4594)

  • [AIRFLOW-987] 将kerberos命令行参数keytab和principal传递给kerberos.run() (#4238)

  • [AIRFLOW-3736] 允许在SqoopOperator.extra_import_options中使用整数值(#4906)

  • [AIRFLOW-4063] 修复 BigQueryHook 中的异常字符串 [2/2] (#4902)

  • [AIRFLOW-4063] 修复BigQueryHook中的异常字符串 (#4899)

  • [AIRFLOW-4037] 即使响应检查失败,也记录SimpleHttpOperator中的响应日志

  • [AIRFLOW-4044] BigQueryOperatorquery_params 的文档有误。 (#4876)

  • [AIRFLOW-4015] 使缺失的API端点可在经典模式下使用

  • [AIRFLOW-3153] 将DAG处理统计信息发送到StatsD (#4748)

  • [AIRFLOW-2966] 在Kubernetes执行器中捕获ApiException (#4209)

  • [AIRFLOW-4129] Escape HTML in generated tooltips (#4950)

  • [AIRFLOW-4070] 将AirflowException改为log.warning处理重复任务依赖关系 (#4904)

  • [AIRFLOW-4054] 修复 assertEqualIgnoreMultipleSpaces 工具 & 添加测试 (#4886)

  • [AIRFLOW-3239] 进一步修复测试恢复问题 (#4074)

  • [AIRFLOW-4053] 修复KubePodOperator在Kubernetes 1.13.0版本中的Xcom问题 (#4883)

  • [AIRFLOW-2961] 重构 tests.BackfillJobTest.test_backfill_examples 测试 (#3811)

  • [AIRFLOW-3606] 修复Flake8测试并修复自Flake8测试中断以来引入的错误 (#4415)

  • [AIRFLOW-3543] 修复删除带有重新调度任务的DAG的问题 (#4646)

  • [AIRFLOW-2548] 将插件导入错误输出到网页界面 (#3930)

  • [AIRFLOW-4019] 修复AWS Athena传感器对象没有'mode'属性的问题 (#4844)

  • [AIRFLOW-3758] 修复WasbTaskHandler中的循环导入问题 (#4601)

  • [AIRFLOW-3706] 通过修正CSS文件顺序来修复提示框最大宽度问题 (#4947)

  • [AIRFLOW-4100] 正确对树状/图形视图的数据进行JSON转义 (#4921)

  • [AIRFLOW-3636] 修复在 #4425 中引入的测试 (#4446)

  • [AIRFLOW-3977] 在文档中添加触发规则的示例 (#4805)

  • [AIRFLOW-2511] 修复导致死锁的错误会话提交处理 (#4769)

  • [AIRFLOW-3962] 添加了对创建无任务DAG的dag_run的优雅处理 (#4781)

  • [AIRFLOW-3881] 修正to_csv行数统计 (#4699)

  • [AIRFLOW-3875] 简化SlackWebhookHook代码并修改文档字符串 (#4696)

  • [AIRFLOW-3733] 当HQL钩子的to_csv方法没有返回行时,不再抛出NameError (#4560)

  • [AIRFLOW-3734] 修复当分区为None时hql不运行的问题 (#4561)

  • [AIRFLOW-3767] 修正批量插入函数 (#4773)

  • [AIRFLOW-4087] 在basetaskrunner的on_finish中移除sudo (#4916)

  • [AIRFLOW-3768] 在分页控件中对搜索参数进行转义 (#4911)

  • [AIRFLOW-4045] 修复基于FAB的UI中的硬编码URL (#4914)

  • [AIRFLOW-3123] 使用栈结构进行DAG上下文管理 (#3956)

  • [AIRFLOW-3060] 在某些情况下DAG上下文管理器无法正确退出

  • [AIRFLOW-3924] 修复告警邮件中的尝试次数 (#4741)

  • [AIRFLOW-4083] 添加链接生成工具的测试 (#4912)

  • [AIRFLOW-2190] 当基础URL未找到时发送正确的HTTP状态码 (#4910)

  • [AIRFLOW-4015] 在“经典”API中添加get_dag_runs GET端点 (#4884)

  • [AIRFLOW-3239] 启用现有CI测试 (#4131)

  • [AIRFLOW-1390] 将Alembic更新至0.9版本 (#3935)

  • [AIRFLOW-3885] 修复调度器测试中的竞态条件 (#4737)

  • [AIRFLOW-3885] SchedulerJobTest测试套件速度提升约10倍 (#4730)

  • [AIRFLOW-3780] 修复了在使用base_url时的一些错误 (#4643)

  • [AIRFLOW-3807] 修复图形视图中任务的高亮显示问题 (#4653)

  • [AIRFLOW-3009] 从collection.abc导入Hashable以修复Python 3.7的弃用警告 (#3849)

  • [AIRFLOW-2231] 修复 relativedelta DAG 的 schedule_interval (#3174)

  • [AIRFLOW-2641] 修复MySqlToHiveTransfer以正确处理MySQL DECIMAL类型

  • [AIRFLOW-3751] 新增选项以允许LDAP认证使用格式错误的架构 (#4574)

  • [AIRFLOW-2888] 为task_runner配置变更添加弃用路径 (#4851)

  • [AIRFLOW-2930] 修复Celery执行器调度器崩溃问题 (#3784)

  • [AIRFLOW-2888] 移除任务启动中的shell=True和bash (#3740)

  • [AIRFLOW-3885] 回填测试速度提升约2.5倍 (#4731)

  • [AIRFLOW-3885] 将最慢的单元测试速度提升约20倍 (#4726)

  • [AIRFLOW-2508] 处理操作符模板化字段中的非字符串类型 (#4292)

  • [AIRFLOW-3792] 修复BQ中对useLegacySQL和queryParameters的验证 (#4626)

  • [AIRFLOW-3749] 修复使用RBAC时的编辑DAG运行页面 (#4613)

  • [AIRFLOW-3801] 修复DagBag收集dags的调用以防止加载示例 (#4677)

  • [AIRFLOW-3774] 使用RBAC网页应用注册蓝图 (#4598)

  • [AIRFLOW-3719] 处理从CloudWatch日志检索中的StopIteration异常 (#4516)

  • [AIRFLOW-3108] 为MsSqlHook定义get_autocommit方法 (#4525)

  • [AIRFLOW-3074] 为ECS操作符添加相关ECS选项。(#3908)

  • [AIRFLOW-3353] 升级Redis客户端 (#4834)

  • [AIRFLOW-3250] 修复Redis Hook在未授权连接调用时的问题 (#4090)

  • [AIRFLOW-2009] 修复dataflow hook的connection-id (#4563)

  • [AIRFLOW-2190] 修复返回404时的TypeError错误 (#4596)

  • [AIRFLOW-2876] 将Tenacity更新至4.12版本 (#3723)

  • [AIRFLOW-3923] 更新flask-admin依赖至1.5.3版本以解决安全漏洞问题 (#4739)

  • [AIRFLOW-3683] 修复无效TriggerRule错误消息的格式 (#4490)

  • [AIRFLOW-2787] 允许is_backfill处理NULL DagRun.run_id (#3629)

  • [AIRFLOW-3639] 修复Jenkins Operator中的请求创建问题 (#4450)

  • [AIRFLOW-3779] 在不需要时不安装enum34回溯兼容包 (#4620)

  • [AIRFLOW-3079] 改进迁移脚本以支持MSSQL服务器 (#3964)

  • [AIRFLOW-2735] 使用相等性而非同一性检查来检测AWS Batch失败[]

  • [AIRFLOW-2706] AWS Batch 操作符应使用顶级作业状态来确定状态

  • [AIRFLOW-XXX] 修复 http_operator.py 中的拼写错误

  • [AIRFLOW-XXX] 解决lodash安全警告 (#4820)

  • [AIRFLOW-XXX] 固定celery引入的tornado版本。(#4815)

  • [AIRFLOW-XXX] 升级FAB至1.12.3版本 (#4694)

  • [AIRFLOW-XXX] 固定pinodb依赖项 (#4704)

  • [AIRFLOW-XXX] 在测试中固定Pip版本以解决pypa/pip#6163问题 (#4576)

  • [AIRFLOW-XXX] 修复spark提交钩子的KeyError错误 (#4578)

  • [AIRFLOW-XXX] 由于破坏性变更而固定psycopg2 (#5036)

  • [AIRFLOW-XXX] 固定Sendgrid依赖版本 (#5031)

  • [AIRFLOW-XXX] 修复不稳定测试 - test_execution_unlimited_parallelism (#4988)

杂项/内部

  • [AIRFLOW-4144] 添加关于is_delete_operator_pod的描述 (#4943)

  • [AIRFLOW-3476][AIRFLOW-3477] 将Kube类移出models.py (#4443)

  • [AIRFLOW-3464] 将SkipMixin移出models.py (#4386)

  • [AIRFLOW-3463] 将日志移出models.py文件 (#4639)

  • [AIRFLOW-3458] 迁移连接测试 (#4680)

  • [AIRFLOW-3461] 将TaskFail移出models.py (#4630)

  • [AIRFLOW-3462] 将TaskReschedule从models.py中移出 (#4618)

  • [AIRFLOW-3474] 将 SlaMiss 移出 models.py (#4608)

  • [AIRFLOW-3475] 将 ImportError 移出 models.py (#4383)

  • [AIRFLOW-3459] 将 DagPickle 移至单独文件 (#4374)

  • [AIRFLOW-3925] 在预测试阶段不拉取docker镜像 (#4740)

  • [AIRFLOW-4154] 修正jobs.py中的字符串格式化问题 (#4972)

  • [AIRFLOW-3458] 迁移 models.Connection 的弃用路径

  • [AIRFLOW-3458] 将models.Connection移动到单独的文件中 (#4335)

  • [AIRFLOW-XXX] 移除被nose忽略的旧/非测试文件 (#4930)

仅文档变更

  • [AIRFLOW-3996] 为包含的片段添加查看源代码链接

  • [AIRFLOW-3811] 文档中自动生成API参考 (#4788)

  • [AIRFLOW-3810] 移除重复的autoclass指令 (#4656)

  • [AIRFLOW-XXX] 提到必须安装StatsD才能收集指标 (#5038)

  • [AIRFLOW-XXX] 向命令行界面添加内容 (#4825)

  • [AIRFLOW-XXX] 修复CI上的文档检查失败问题 (#4998)

  • [AIRFLOW-XXX] 修复语法文档错误 (#4789)

  • [AIRFLOW-XXX] 文档渲染改进 (#4684)

  • [AIRFLOW-XXX] 在文档变更日志页面自动链接Jira/GH (#4587)

  • [AIRFLOW-XXX] 在额外包文档中提及Oracle (#4987)

  • [AIRFLOW-XXX] 移除已弃用的sudo选项;在Travis上使用默认的docker compose。(#4732)

  • [AIRFLOW-XXX] 更新kubernetes.rst文档 (#3875)

  • [AIRFLOW-XXX] 文档中格式化内容的改进 (#4835)

  • [AIRFLOW-XXX] 将Daniel添加到提交者列表 (#4961)

  • [AIRFLOW-XXX] 将邓晓东加入提交者名单

  • [AIRFLOW-XXX] 添加历史成为ASF顶级项目 (#4757)

  • [AIRFLOW-XXX] 将示例从 integration.rst 中移出 (#4672)

  • [AIRFLOW-XXX] 将反向代理信息提取到单独的文件 (#4657)

  • [AIRFLOW-XXX] 减少文档中的警告数量 (#4585)

  • [AIRFLOW-XXX] 修复GCS操作符文档字符串 (#4054)

  • [AIRFLOW-XXX] 修复钩子、传感器和操作器中的文档字符串 (#4137)

  • [AIRFLOW-XXX] 将操作指南拆分为多个文件 (#4814)

  • [AIRFLOW-XXX] 将连接指南拆分为多个文件 (#4824)

  • [AIRFLOW-XXX] 移除了构建文档时几乎所有的警告 (#4588)

  • [AIRFLOW-XXX] 在文档中添加操作符与集成之间的反向引用 (#4671)

  • [AIRFLOW-XXX] 改进类链接功能 (#4655)

  • [AIRFLOW-XXX] 构建文档时模拟可选模块 (#4586)

  • [AIRFLOW-XXX] 更新插件宏文档 (#4971)

  • [AIRFLOW-XXX] 为GCS到BQ操作符中的'autodetect'添加缺失的文档字符串 (#4979)

  • [AIRFLOW-XXX] 在文档中添加缺失的GCP操作符 (#4260)

  • [AIRFLOW-XXX] 修复文档中的问题 (#3756)

  • [AIRFLOW-XXX] 在用户自定义宏中添加提示 (#4885)

  • [AIRFLOW-XXX] 修正Scheduler文档中的schedule_interval (#4157)

  • [AIRFLOW-XXX] 改进airflow-jira脚本以简化RelManager的工作 (#4857)

  • [AIRFLOW-XXX] 向文档添加缺失的类引用 (#4644)

  • [AIRFLOW-XXX] 修复拼写错误 (#4564)

  • [AIRFLOW-XXX] 添加关于fab安全的文档 (#4595)

  • [AIRFLOW-XXX] 加速DagBag测试用例 (#3974)

Airflow 1.10.2 (2019-01-19)

重大变更

新增 dag_processor_manager_log_location 配置选项

默认情况下,DAG解析管理器日志现在会记录到文件中,其位置由核心部分的新配置选项dag_processor_manager_log_location控制。

针对新版RBAC UI的DAG层级访问控制

扩展并增强Airflow RBAC UI以支持DAG级别的访问控制。每个DAG现在关联两个权限(一个用于写入,一个用于读取)('can_dag_edit', 'can_dag_read')。 管理员将创建新角色,将DAG权限与目标DAG关联,并将该角色分配给用户。该用户只能在UI上访问/查看其拥有权限的特定DAG。 如果新角色需要访问所有DAG,管理员可以将人工视图(all_dags)上的DAG权限与该角色关联。

我们还提供了一个新的命令行界面命令(sync_perm),允许管理员自动同步权限。

ts_nodash宏的修改

ts_nodash 之前包含时区信息和执行日期。例如:20150101T000000+0000。这对于文件或文件夹名称(这是ts_nodash的常见用例)来说不够友好。因此,这一行为已被更改,使用ts_nodash将不再包含时区信息,恢复该宏在1.10版本之前的行为。同时新增了一个宏ts_nodash_with_tz,可用于获取带执行日期和时区信息(不含短横线)的字符串。

示例:

  • ts_nodash: 20150101T000000

  • ts_nodash_with_tz: 20150101T000000+0000

手动触发运行中next_ds/prev_ds的语义变更

next_ds/prev_ds 现在映射到 execution_date,而不是在UI中触发的DAG的下一个/上一个与计划对齐的执行日期。

用户模型变更

此补丁将User.superuser字段从硬编码的布尔值改为Boolean()数据库列。User.superuser将默认设置为False,这意味着需要手动将此权限授予可能需要它的任何用户。

例如,打开一个Python shell并

from airflow import models, settings

session = settings.Session()
users = session.query(models.User).all()  # [admin, regular_user]

users[1].superuser  # False

admin = users[0]
admin.superuser = True
session.add(admin)
session.commit()

自定义认证后端接口变更

我们已更新所依赖的flask-login版本,因此任何自定义认证后端可能需要做一个小改动:is_activeis_authenticatedis_anonymous现在应该作为属性使用。这意味着如果您的用户类中原先是这样定义的

def is_active(self):
    return self.active

那么你需要像这样修改它

@property
def is_active(self):
    return self.active

支持自动检测GoogleCloudStorageToBigQueryOperator的架构

GoogleCloudStorageToBigQueryOperator 现在支持在将数据加载到BigQuery时自动检测模式。遗憾的是,可能需要做一些更改。

如果在airflow之外创建了BigQuery表且任务中未定义schema,有以下多种选项可用:

定义一个schema_fields:

gcs_to_bq.GoogleCloudStorageToBigQueryOperator(
    # ...
    schema_fields={...}
)

或定义一个schema_object:

gcs_to_bq.GoogleCloudStorageToBigQueryOperator(
    # ...
    schema_object="path/to/schema/object"
)

或启用自动检测模式:

gcs_to_bq.GoogleCloudStorageToBigQueryOperator(
    # ...
    autodetect=True
)

新功能

  • [AIRFLOW-2658] 添加GCP特定的k8s pod操作符 (#3532)

  • [AIRFLOW-2440] Google Cloud SQL 导入/导出操作符 (#4251)

  • [AIRFLOW-3212] 添加AwsGlueCatalogPartitionSensor (#4112)

  • [AIRFLOW-2750] 新增删除和列出用户的子命令

  • [AIRFLOW-3480] 新增GCP Spanner数据库操作符 (#4353)

  • [AIRFLOW-3560] 新增周几传感器 (#4363)

  • [AIRFLOW-3371] BigQueryHook新增创建视图功能 (#4213)

  • [AIRFLOW-3332] 新增方法支持向BQ表插入行 (#4179)

  • [AIRFLOW-3055] 在bigquery_hook中添加get_dataset和get_datasets_list方法 (#3894)

  • [AIRFLOW-2887] 新增了BigQueryCreateEmptyDatasetOperator操作符以及在bigquery_hook中添加了create_empty_dataset功能 (#3876)

  • [AIRFLOW-2758] 添加MongoDB传感器

  • [AIRFLOW-2640] 添加Cassandra表传感器

  • [AIRFLOW-3398] Google Cloud Spanner 实例数据库查询操作符 (#4314)

  • [AIRFLOW-3310] Google Cloud Spanner 部署/删除操作符 (#4286)

  • [AIRFLOW-3406] 实现一个Azure CosmosDB操作符 (#4265)

  • [AIRFLOW-3434] 允许在SFTPOperator中创建中间目录 (#4270)

  • [AIRFLOW-3345] 新增Google云存储(GCS)的ACL操作符 (#4192)

  • [AIRFLOW-3266] 新增AWS Athena Hook和Operator (#4111)

  • [AIRFLOW-3346] 为GCP传输服务添加hook和operator (#4189)

  • [AIRFLOW-2983] 添加 prev_ds_nodash 和 next_ds_nodash 宏 (#3821)

  • [AIRFLOW-3403] 新增AWS Athena传感器 (#4244)

  • [AIRFLOW-3323] 支持Airflow Flower的HTTP基础认证 (#4166)

  • [AIRFLOW-3410] 新增支持SSH操作中主机密钥变更的功能 (#4249)

  • [AIRFLOW-3275] 新增Google Cloud SQL查询操作符 (#4170)

  • [AIRFLOW-2691] 通过npm管理JS依赖项

  • [AIRFLOW-2795] Oracle到Oracle数据传输操作符 (#3639)

  • [AIRFLOW-2596] 新增Oracle到Azure Datalake的传输操作器

  • [AIRFLOW-3220] 为GCE添加实例组管理器操作符 (#4167)

  • [AIRFLOW-2882] 添加使用JSON格式的池命令行导入导出功能

  • [AIRFLOW-2965] 用于显示下次执行时间的CLI工具 (#3834)

  • [AIRFLOW-2874] 启用FAB的主题支持 (#3719)

  • [AIRFLOW-3336] 新增针对0个上游失败的TriggerRule (#4182)

改进

  • [AIRFLOW-3680] 针对所有GCP相关操作符的测试进行一致性更新 (#4493)

  • [AIRFLOW-3675] 使用googleapiclient来处理Google APIs (#4484)

  • [AIRFLOW-3205] 支持多部分上传到GCS (#4084)

  • [AIRFLOW-2826] 添加GoogleCloudKMSHook (#3677)

  • [AIRFLOW-3676] 为CloudSQL导入/导出示例添加所需权限 (#4489)

  • [AIRFLOW-3679] 将Google Cloud基础钩子添加到文档中 (#4487)

  • [AIRFLOW-3594] 统一不同的许可证头部

  • [AIRFLOW-3197] 在示例DAG中移除无效参数KeepJobFlowAliveWhenNoSteps (#4404)

  • [AIRFLOW-3504] 优化“/health”端点的功能 (#4309)

  • [AIRFLOW-3103][AIRFLOW-3147] 更新flask-appbuilder (#3937)

  • [AIRFLOW-3168] 在CI中更稳健地使用数据库 (#4014)

  • [AIRFLOW-3076] 移除MySQL测试数据的预加载 (#3911)

  • [AIRFLOW-3035] 允许在dataproc操作中自定义'job_error_states' (#3884)

  • [AIRFLOW-3246] 使hmsclient在airflow.hooks.hive_hooks中变为可选 (#4080)

  • [AIRFLOW-3059] 记录从Postgres读取的行数 (#3905)

  • [AIRFLOW-2463] 使任务实例上下文可用于hive查询

  • [AIRFLOW-3190] 使flake8合规 (#4035)

  • [AIRFLOW-1998] 实现了用于jobs/run-now的DatabricksRunNowOperator (#3813)

  • [AIRFLOW-2267] Airflow DAG级别访问控制 (#3197)

  • [AIRFLOW-2359] 在树状视图中为DagRun和任务添加失败标记 (#3255)

  • [AIRFLOW-3008] 将Kubernetes示例DAG迁移至contrib目录

  • [AIRFLOW-3402] 支持全局k8s亲和性和容忍度配置 (#4247)

  • [AIRFLOW-3610] 为EMR作业流创建添加region参数 (#4418)

  • [AIRFLOW-3531] 修复GCS到GCS传输钩子的测试 (#4452)

  • [AIRFLOW-3531] 新增GCS到GCS传输操作符 (#4331)

  • [AIRFLOW-3034] 自述文件更新:添加Slack和Twitter,移除Gitter

  • [AIRFLOW-3028] 更新Readme.md中的文本和图片

  • [AIRFLOW-208] 添加徽章显示支持的Python版本 (#3839)

  • [AIRFLOW-2238] 更新PR工具以直接推送到GitHub

  • [AIRFLOW-2238] 对dev/airflow-pr分支进行Flake8修复

  • [AIRFLOW-2238] 更新PR工具以移除过时信息 (#3978)

  • [AIRFLOW-3005] 将‘Airbnb Airflow’替换为‘Apache Airflow’ (#3845)

  • [AIRFLOW-3150] 在TriggerDagRunOperator中将execution_date设为模板变量 (#4359)

  • [AIRFLOW-1196][AIRFLOW-2399] 在TriggerDagRunOperator中添加模板化字段 (#4228)

  • [AIRFLOW-3340] 连接表单中的占位符支持 (#4185)

  • [AIRFLOW-3446] 新增Google Cloud BigTable操作符 (#4354)

  • [AIRFLOW-1921] 添加对https和用户认证的支持 (#2879)

  • [AIRFLOW-2770] 将dags_in_image配置值读取为布尔类型 (#4319)

  • [AIRFLOW-3022] 为KubernetesExecutorConfig添加卷挂载 (#3855)

  • [AIRFLOW-2917] 仅在需要时设置 AIRFLOW__CORE__SQL_ALCHEMY_CONN (#3766)

  • [AIRFLOW-2712] 将注解传递给KubernetesExecutorConfig

  • [AIRFLOW-461] 在BigQuery的run_load中支持自动检测模式 (#3880)

  • [AIRFLOW-2997] 支持BigQuery中的集群字段 (#3838)

  • [AIRFLOW-2916] AwsHook() 和 S3 传感器/操作器的参数 verify (#3764)

  • [AIRFLOW-491] 新增功能:向BQ Hook传递额外API配置 (#3733)

  • [AIRFLOW-2889] 修复由github.com/client9/misspell检测到的拼写错误 (#3732)

  • [AIRFLOW-850] 添加PythonSensor (#4349)

  • [AIRFLOW-2747] 显式重新调度传感器 (#3596)

  • [AIRFLOW-3392] 在sla_miss表中为dag_id字段添加索引 (#4235)

  • [AIRFLOW-3001] 为任务实例添加索引 'ti_dag_date' (#3885)

  • [AIRFLOW-2861] 在日志表上添加索引 (#3709)

  • [AIRFLOW-3518] 针对Tasks拓扑排序的性能修复 (#4322)

  • [AIRFLOW-3521] 在airflow-jira compare脚本中获取超过50个项目 (#4300)

  • [AIRFLOW-1919] 添加通过DAG ID查询DAG运行记录的选项

  • [AIRFLOW-3444] 显式设置传输操作符描述。(#4279)

  • [AIRFLOW-3411] 添加OpenFaaS钩子 (#4267)

  • [AIRFLOW-2785] 为mongoHook添加上下文管理器入口点

  • [AIRFLOW-2524] 在AWS集成部分添加SageMaker文档 (#4278)

  • [AIRFLOW-3479] 删除DAG时保留日志表中的记录 (#4287)

  • [AIRFLOW-2948] 参数检查与文档优化 - SSHOperator 和 SFTPOperator (#3793)

  • [AIRFLOW-2245] 将SSH/SFTP操作符的remote_host添加为模板字段 (#3765)

  • [AIRFLOW-2670] 更新SSH操作器的Hook以支持超时设置 (#3666)

  • [AIRFLOW-3380] 添加指标文档 (#4219)

  • [AIRFLOW-3361] 在BaseOperator的PendingDeprecationWarning中记录task_id (#4030)

  • [AIRFLOW-3213] 创建ADLS到GCS的操作器 (#4134)

  • [AIRFLOW-3395] 将REST API端点添加到文档中 (#4236)

  • [AIRFLOW-3294] 更新连接表单和集成文档 (#4129)

  • [AIRFLOW-3236] 创建 AzureDataLakeStorageListOperator (#4094)

  • [AIRFLOW-3062] 在集成文档中添加Qubole (#3946)

  • [AIRFLOW-3306] 禁用flask-sqlalchemy的修改跟踪功能。(#4146)

  • [AIRFLOW-2867] 重构代码以符合标准 (#3714)

  • [AIRFLOW-2753] 添加dataproc_job_id实例变量来保存实际的DP jobId

  • [AIRFLOW-3132] 支持为DockerOperator指定auto_remove选项 (#3977)

  • [AIRFLOW-2731] 将psutil限制提升至<6.0.0

  • [AIRFLOW-3384] 允许使用更高版本的Sqlalchemy和Jinja2 (#4227)

  • [Airflow-2760] 将DAG解析循环与调度器循环解耦 (#3873)

  • [AIRFLOW-3004] 添加禁用调度器cron的配置 (#3899)

  • [AIRFLOW-3175] 修复airflow/jobs.py中的文档字符串格式 (#4025)

  • [AIRFLOW-3589] 在所有视图中可视化重调度状态 (#4408)

  • [AIRFLOW-2698] 简化Kerberos代码 (#3563)

  • [AIRFLOW-2499] 将CI流水线容器化 (#3393)

  • [AIRFLOW-3432] 为“在用户界面中删除DAG”功能添加测试 (#4266)

  • [AIRFLOW-3301] 更新DockerOperator的CI测试以支持PR #3977 (#4138)

  • [AIRFLOW-3478] 确保会话已关闭

  • [AIRFLOW-3687] 添加缺失的@apply_defaults装饰器 (#4498)

  • [AIRFLOW-3691] 更新通知至2019年 (#4503)

  • [AIRFLOW-3689] 在RBAC UI中删除DAG时更新弹出消息 (#4505)

  • [AIRFLOW-2801] 在CI环境的PostgreSQL中跳过test_mark_success_no_kill测试 (#3642)

  • [AIRFLOW-3693] 将psycopg2-binary替换为psycopg2 (#4508)

  • [AIRFLOW-3700] 修改“requests”的最低允许版本 (#4517)

  • [AIRFLOW-3704] 当Redis作为CeleryExecutor的代理时支持SSL保护 (#4521)

  • [AIRFLOW-3681] 所有GCP操作符现在都有可选的GCP项目ID (#4500)

  • [Airflow 2782] 将Dagre D3版本升级至最新可用版本

  • [Airflow 2783] 为JS代码检查实现eslint (#3641)

  • [AIRFLOW-2805] 在用户界面上显示多个时区 (#3687)

  • [AIRFLOW-3302] 小型CSS修复 (#4140)

  • [Airflow-2766] 跨标签页共享日期时间设置

  • [AIRFLOW-2776] 压缩树状视图JSON数据

  • [AIRFLOW-2407] 使用特性检测实现reload() (#3298)

  • [AIRFLOW-3452] 移除了一个未使用/危险的display-none (#4295)

  • [AIRFLOW-3348] 在DAG刷新时更新运行统计信息 (#4197)

  • [AIRFLOW-3125] 监控任务实例创建速率 (#3966)

Bug修复

  • [AIRFLOW-3191] 修复创建dagrun时无法指定execution_date的问题 (#4037)

  • [AIRFLOW-3657] 修复zendesk集成 (#4466)

  • [AIRFLOW-3605] 从入口点加载插件 (#4412)

  • [AIRFLOW-3646] 将plugins_manager.py重命名为test_xx以触发测试 (#4464)

  • [AIRFLOW-3655] 转义模型视图中生成的链接 (#4463)

  • [AIRFLOW-3662] 为Enum添加依赖项 (#4468)

  • [AIRFLOW-3630] 清理GCP Cloud SQL连接 (#4451)

  • [AIRFLOW-1837] 当任务开始日期与DAG不同时予以尊重 (#4010)

  • [AIRFLOW-2829] 优化minikube的CI脚本

  • [AIRFLOW-3519] 修复示例http操作符 (#4455)

  • [AIRFLOW-2811] 修复 scheduler_ops_metrics.py 使其正常工作 (#3653)

  • [AIRFLOW-2751] 在Hive到Druid操作符中添加作业属性更新。

  • [AIRFLOW-2918] 移除未使用的导入

  • [AIRFLOW-2918] 修复Flake8违规问题 (#3931)

  • [AIRFLOW-2771] 为广泛的S3Hook try catch子句添加异常类型

  • [AIRFLOW-2918] 修复Flake8违规问题 (#3772)

  • [AIRFLOW-2099] 优雅处理getsource()调用

  • [AIRFLOW-3397] 修复rbac AirflowSecurityManager中的完整性错误 (#4305)

  • [AIRFLOW-3281] 修复Kubernetes操作符与git-sync的问题 (#3770)

  • [AIRFLOW-2615] 限制DAG解析仅执行一次

  • [AIRFLOW-2952] 修复Kubernetes CI (#3922)

  • [AIRFLOW-2933] 在Docker-CI构建中启用Codecov (#3780)

  • [AIRFLOW-2082] 修复了在API中添加password_auth作为认证方法的bug (#4343)

  • [AIRFLOW-3612] 移除孵化/孵化器相关提及 (#4419)

  • [AIRFLOW-3581] 修复手动运行时的next_ds/prev_ds语义 (#4385)

  • [AIRFLOW-3527] 更新Cloud SQL Proxy以缩短UNIX套接字路径 (#4350)

  • [AIRFLOW-3316] 针对gcs_to_bq:添加缺失的schema_fields变量初始化 (#4430)

  • [AIRFLOW-3583] 修复AirflowException导入问题 (#4389)

  • [AIRFLOW-3578] 修复 BigQueryOperator 的类型错误 (#4384)

  • [AIRFLOW-2755] 新增了 kubernetes.worker_dags_folder 配置项 (#3612)

  • [AIRFLOW-2655] 修复kubernetes worker默认配置不一致的问题

  • [AIRFLOW-2645][AIRFLOW-2617] 添加 worker_container_image_pull_policy 参数

  • [AIRFLOW-2661] 修复配置项 dags_volume_subpath 和 logs_volume_subpath

  • [AIRFLOW-3550] 标准化GKE钩子 (#4364)

  • [AIRFLOW-2863] 修复GKEClusterHook捕获错误异常的问题 (#3711)

  • [AIRFLOW-2939][AIRFLOW-3568] 修复 GCSToS3Op 和 S3ToGCSOp 中的 TypeError (#4371)

  • [AIRFLOW-3327] 在BigQueryHook中添加对location的支持 (#4324)

  • [AIRFLOW-3438] 修复BigQuery Hook和BigQueryOperator中的默认值 (…

  • [AIRFLOW-3355] 修复BigQueryCursor.execute使其兼容Python3 (#4198)

  • [AIRFLOW-3447] 为 ts_nodash 宏添加 2 个选项 (#4323)

  • [AIRFLOW-1552] Airflow 的 filter_by_owner 在使用 password_auth 时无法正常工作 (#4276)

  • [AIRFLOW-3484] 修复k8s执行器中的过度日志记录问题 (#4296)

  • [AIRFLOW-3309] 新增MongoDB连接 (#4154)

  • [AIRFLOW-3414] 修复DagFileProcessorAgent中的reload_module问题 (#4253)

  • [AIRFLOW-1252] API在触发DAG时接受JSON格式 (#2334)

  • [AIRFLOW-3425] 修复钩子中默认作用域的设置问题 (#4261)

  • [AIRFLOW-3416] 修复了CloudSqlQueryOperator在Python 3中的兼容性问题 (#4254)

  • [AIRFLOW-3263] 当'run'杀死已终止任务时忽略异常 (#4108)

  • [AIRFLOW-3264] 解析连接URI时的URL解码 (#4109)

  • [AIRFLOW-3365][AIRFLOW-3366] 允许通过环境变量设置celery_broker_transport_options (#4211)

  • [AIRFLOW-2642] 修复git-sync初始化容器环境变量GIT_SYNC_ROOT的错误值 (#3519)

  • [AIRFLOW-3353] 固定redis版本 (#4195)

  • [AIRFLOW-3251] KubernetesPodOperator 现在在创建 Pod 时会使用 'image_pull_secrets' 参数 (#4188)

  • [AIRFLOW-2705] 将类级别的moto装饰器移动到方法级别

  • [AIRFLOW-3233] 修复用户界面中删除DAG的功能 (#4069)

  • [AIRFLOW-2908] 允许使用KubernetesExecutor进行重试。(#3758)

  • [AIRFLOW-1561] 修复调度器在没有其他DAG时能正确加载示例DAG的问题 (#2635)

  • [AIRFLOW-3352] 修复RBAC界面未遵循expose_config的问题 (#4194)

  • [AIRFLOW-3592] 修复任务处于重新调度状态时的日志问题 (#4492)

  • [AIRFLOW-3634] 修复GCP Spanner测试 (#4440)

  • [AIRFLOW-XXX] 修复PythonVirtualenvOperator测试 (#3968)

  • [AIRFLOW-3239] 修复/优化 api/common/experimental/ 的测试 (#4255)

  • [AIRFLOW-2951] 当状态变更时更新dag_run表的end_date字段 (#3798)

  • [AIRFLOW-2756] 修复设置DAG运行状态工作流中的错误 (#3606)

  • [AIRFLOW-3690] 修复手动触发DAG时任务状态设置的bug (#4504)

  • [AIRFLOW-3319] KubernetsExecutor: 如果稍后获取标签,需要在标签中包含try_number (#4163)

  • [AIRFLOW-3724] 修复RBAC UI中图形视图上失效的刷新按钮

  • [AIRFLOW-3732] 修复在RBAC用户界面中尝试编辑连接时的问题

  • [AIRFLOW-2866] 修复使用RBAC UI时缺失CSRF令牌头的问题 (#3804)

  • [AIRFLOW-3259] 修复显示图表时出现的内部服务器错误 (#4114)

  • [AIRFLOW-3271] 修复通过UI修改RBAC权限持久化的问题 (#4118)

  • [AIRFLOW-3141] 处理缺失DAG的持续时间视图 (#3984)

  • [AIRFLOW-2766] 跨标签页共享日期时间设置

  • [AIRFLOW-1413] 修复FTPSensor在遇到意外错误消息时失败的问题 (#2450)

  • [AIRFLOW-3378] KubernetesPodOperator 在超时失败时未删除 (#4218)

  • [AIRFLOW-3245] 修复resolve_template_files中的列表处理问题 (#4086)

  • [AIRFLOW-2703] 捕获调度器心跳中的瞬时数据库异常,防止其崩溃 (#3650)

  • [AIRFLOW-1298] 使用clean命令行工具清除UPSTREAM_FAILED状态 (#3886)

仅文档变更

  • [AIRFLOW-XXX] GCP操作符文档澄清 (#4273)

  • [AIRFLOW-XXX] 文档:修复GCS传输操作符的路径 (#4479)

  • [AIRFLOW-XXX] 在文档中添加缺失的GCP操作符 (#4260)

  • [AIRFLOW-XXX] 修复操作符的文档字符串 (#3820)

  • [AIRFLOW-XXX] 修复example_python_operator.py中不一致的注释 (#4337)

  • [AIRFLOW-XXX] 修复SFTPOperator示例中的错误参数 (#4344)

  • [AIRFLOW-XXX] 添加缺失的远程日志字段 (#4333)

  • [AIRFLOW-XXX] 修订模板变量文档 (#4172)

  • [AIRFLOW-XXX] 修复gcs_to_bq文档字符串中的拼写错误 (#3833)

  • [AIRFLOW-XXX] 修复SageMaker操作符/钩子文档的显示问题 (#4263)

  • [AIRFLOW-XXX] 改进Airflow flower的使用说明 (#4214)

  • [AIRFLOW-XXX] 统一pip安装命令 (#3752)

  • [AIRFLOW-XXX] 将BigQueryGetDataOperator添加到集成文档中 (#4063)

  • [AIRFLOW-XXX] 不要在测试日志中频繁输出“错误的cron表达式”信息 (#3973)

  • [AIRFLOW-XXX] 根据最新的TLP讨论更新提交者列表 (#4427)

  • [AIRFLOW-XXX] 修复贡献指南中的错误陈述 (#4104)

  • [AIRFLOW-XXX] 修复CONTRIBUTING.md中的失效链接

  • [AIRFLOW-XXX] 更新贡献指南 - Git钩子 (#4120)

  • [AIRFLOW-3426] 修正Python版本文档引用 (#4259)

  • [AIRFLOW-2663] 添加安装SSH依赖项的说明

  • [AIRFLOW-XXX] 清理安装额外包表格 (#3750)

  • [AIRFLOW-XXX] 移除Kerberos中多余的空格 (#3866)

  • [AIRFLOW-3086] 在setup.py中添加google auth的额外依赖组 (#3917)

  • [AIRFLOW-XXX] 在额外包文档中添加Kubernetes依赖项 (#4281)

  • [AIRFLOW-3696] 在Airflow文档中添加版本信息 (#4512)

  • [AIRFLOW-XXX] 修正传感器异常中的拼写错误 (#4545)

  • [AIRFLOW-XXX] 修复配置中的一个拼写错误 (#4544)

  • [AIRFLOW-XXX] 修复BashOperator文档字符串 (#4052)

  • [AIRFLOW-3018] 修复文档中的小问题

  • [AIRFLOW-XXX] 修复Azure Cosmos Operator的小问题 (#4289)

  • [AIRFLOW-3382] 修复DatastoreHook中的错误文档字符串 (#4222)

  • [AIRFLOW-XXX] 修复复制粘贴错误 (#4212)

  • [AIRFLOW-3260] 修正了误导性的BigQuery错误 (#4098)

  • [AIRFLOW-XXX] 修复 SFTPOperator 文档字符串中的拼写错误 (#4016)

  • [AIRFLOW-XXX] 修复文档中的问题 (#3998)

  • [AIRFLOW-XXX] 修复S3_hook中未记录的参数

  • [AIRFLOW-XXX] 修复SlackWebhookOperator执行方法注释 (#3963)

  • [AIRFLOW-3070] 优化Web UI身份验证相关文档 (#3863)

Airflow 1.10.1 (2018-11-13)

重大变更

min_file_parsing_loop_time 配置选项暂时禁用

由于存在一些bug,scheduler.min_file_parsing_loop_time配置选项已被临时移除。

StatsD 指标

scheduler_heartbeat 指标已从计量器(gauge)更改为计数器(counter)。调度器的每次循环将使计数器增加1。这提供了更高的可见性,并允许通过StatsD Exporter与Prometheus实现更好的集成。可以通过绘制计数器变化率的图表和设置警报来确定调度器的活动状态。如果调度器停止运行,该变化率将降至0。

EMRHook现在会将连接的所有额外参数传递给CreateJobFlow API

EMRHook.create_job_flow 已更改为将所有键传递给 create_job_flow API,而不仅仅是特定的已知键,以获得更大的灵活性。

然而在此版本之前,创建的"emr_default"示例连接配置无效,因此在更新连接之前创建EMR集群可能会失败。(Ec2KeyName、Ec2SubnetId、TerminationProtection和KeepJobFlowAliveWhenNoSteps都曾是顶级键,但它们本应位于"Instances"字典内)

LDAP认证后端现在需要TLS

不再支持通过明文连接到LDAP服务器。LDAP服务器提供的证书必须由受信任的证书签名,或者您必须在配置文件的[ldap]部分下提供cacert选项。

如果你想在不使用TLS的情况下使用LDAP认证后端,那么你需要基于 https://github.com/apache/airflow/blob/1.10.0/airflow/contrib/auth/backends/ldap_auth.py创建一个自定义认证后端

新功能

  • [AIRFLOW-2524] Airflow与AWS Sagemaker的集成

  • [AIRFLOW-2657] 新增从网页界面删除DAG的功能

  • [AIRFLOW-2780] 新增IMAP Hook用于与邮件服务器交互

  • [AIRFLOW-2794] 为Azure blob添加删除支持

  • [AIRFLOW-2912] 添加Google云函数操作符

  • [AIRFLOW-2974] 为Databricks Hook添加启动/重启/终止方法

  • [AIRFLOW-2989] DataprocClusterCreateOperator 缺少修改 bootDiskType 的参数

  • [AIRFLOW-3078] Google Compute Engine 基础操作符

  • [AIRFLOW-3147] 更新Flask-AppBuilder版本

  • [AIRFLOW-3231] Google Cloud SQL 基础操作符(部署/补丁/删除)

  • [AIRFLOW-3276] Google Cloud SQL 数据库创建/更新/删除操作符

改进

  • [AIRFLOW-393] 为FTP下载添加进度回调

  • [AIRFLOW-520] 在网页上显示Airflow版本

  • [AIRFLOW-843] 现在可以在on_failure_callback的上下文中获取异常信息

  • [AIRFLOW-2476] 更新tabulate依赖至v0.8.2版本

  • [AIRFLOW-2592] 升级Bleach依赖项

  • [AIRFLOW-2622] 为SFTPOperator添加"confirm=False"选项

  • [AIRFLOW-2662] 支持Kubernetes执行器/操作器的亲和性与节点选择器策略

  • [AIRFLOW-2709] 改进Databricks钩子中的错误处理

  • [AIRFLOW-2723] 将 lxml 依赖更新至 >= 4.0。

  • [AIRFLOW-2763] 工作节点初始化时缺少对元数据库连接的预检查机制

  • [AIRFLOW-2789] 为DataprocClusterCreateOperator添加创建单节点集群的功能

  • [AIRFLOW-2797] 新增使用自定义镜像创建Google Dataproc集群的功能

  • [AIRFLOW-2854] kubernetes_pod_operator 添加更多配置项

  • [AIRFLOW-2855] 处理DAG文件/压缩文件时需要检查Cron表达式的有效性

  • [AIRFLOW-2904] 清理airflow/executors/celery_executor.py中不必要的行

  • [AIRFLOW-2921] CeleryExecutor()中的一个微小错误

  • [AIRFLOW-2922] CeleryExecutor()中潜在的僵死锁错误

  • [AIRFLOW-2932] GoogleCloudStorageHook - 允许文件压缩

  • [AIRFLOW-2949] 单引号的语法高亮

  • [AIRFLOW-2951] DAG运行结束后end_date仍为Null的问题

  • [AIRFLOW-2956] Kubernetes Pod操作器的容忍度配置

  • [AIRFLOW-2997] 在Bigquery钩子/操作器中支持集群表

  • [AIRFLOW-3006] 修复当schedule_interval="None"时的错误

  • [AIRFLOW-3008] 将Kubernetes相关的示例DAG移动到contrib/example_dags目录

  • [AIRFLOW-3025] 允许为DockerOperator指定dns和dns-search参数

  • [AIRFLOW-3067] (www_rbac) Flask flash消息未正确显示(无背景色)

  • [AIRFLOW-3069] 解码S3文件转换操作符的输出

  • [AIRFLOW-3072] 将get_logs_with_metadata权限分配给viewer角色

  • [AIRFLOW-3090] INFO日志过于冗长

  • [AIRFLOW-3103] 更新flask-login

  • [AIRFLOW-3112] 将SFTP钩子与SSH钩子对齐

  • [AIRFLOW-3119] 在Celery worker上启用日志级别并从airflow.cfg继承

  • [AIRFLOW-3137] 使ProxyFix中间件变为可选

  • [AIRFLOW-3173] 为更多密码配置选项添加_cmd选项

  • [AIRFLOW-3177] 将调度器心跳指标从gauge更改为counter

  • [AIRFLOW-3193] 将docker需求版本固定为v3

  • [AIRFLOW-3195] Druid Hook:记录摄取规格和任务ID

  • [AIRFLOW-3197] EMR Hook缺少一些在AWS API上有效的参数

  • [AIRFLOW-3232] 使GCF函数操作符的文档更易读

  • [AIRFLOW-3262] 使用SimpleHttpOperator时无法获取包含Response的日志

  • [AIRFLOW-3265] 在Mysql Hook的连接额外参数中添加对"unix_socket"的支持

仅文档变更

  • [AIRFLOW-1441] 教程中示例管道定义与回顾部分存在不一致

  • [AIRFLOW-2682] 添加关于如何使用基本操作符(如BashOperator和PythonOperator)的指南

  • [AIRFLOW-3104] 文档中完全没有提及.airflowignore功能

  • [AIRFLOW-3237] 重构示例DAG

  • [AIRFLOW-3187] 更新Airflow.gif文件为慢速版本

  • [AIRFLOW-3159] 更新关于GCP日志记录的Airflow文档

  • [AIRFLOW-3030] 命令行文档中错误的子目录

  • [AIRFLOW-2990] Hooks/Operators 的文档字符串格式不正确

  • [AIRFLOW-3127] Celery SSL 文档已过时

  • [AIRFLOW-2779] 为文档文件添加许可证头部

  • [AIRFLOW-2779] 在许可证中添加项目版本

Bug修复

  • [AIRFLOW-839] docker_operator.py 尝试记录状态键而未先检查其是否存在

  • [AIRFLOW-1104] 调度器中的并发检查应同时计算队列中的任务和正在运行的任务

  • [AIRFLOW-1163] 添加对x-forwarded-*头信息的支持,以便在AWS ELB后实现访问

  • [AIRFLOW-1195] 在SubDagOperator中清除的任务不会触发父级dag_runs

  • [AIRFLOW-1508] 跳过状态不属于State.task_states

  • [AIRFLOW-1762] 在SSHHook.create_tunnel()中使用key_file

  • [AIRFLOW-1837] 调度器未遵循任务的不同开始日期(start_dates)。

  • [AIRFLOW-1874] 在BigQuery操作符Check、ValueCheck和IntervalCheck中支持标准SQL

  • [AIRFLOW-1917] Python操作符中的print()函数会输出额外的换行符

  • [AIRFLOW-1970] 如果提供了无效的fernet密钥,则无法初始化数据库

  • [AIRFLOW-2145] 清除运行任务后出现死锁

  • [AIRFLOW-2216] 无法为AWS Hook指定配置文件以加载s3配置文件

  • [AIRFLOW-2574] 当mysql密码包含百分号时initdb失败

  • [AIRFLOW-2707] 从网页界面访问日志文件时出错

  • [AIRFLOW-2716] 替换新的Python 3.7关键字

  • [AIRFLOW-2744] RBAC应用未集成插件(蓝图等)

  • [AIRFLOW-2772] BigQuery钩子不允许同时指定分区字段名和表名

  • [AIRFLOW-2778] DagBag中collect_dag的错误导入

  • [AIRFLOW-2786] 如果变量键为空,变量视图将无法渲染

  • [AIRFLOW-2799] 按日期时间筛选UI对象功能失效

  • [AIRFLOW-2800] 移除airflow/中容易修复的代码规范错误

  • [AIRFLOW-2825] S3ToHiveTransfer 操作符可能无法处理S3中带有大写扩展名的GZIP文件

  • [AIRFLOW-2848] LocalTaskJob 的元数据表 "job" 中缺少 dag_id 字段

  • [AIRFLOW-2860] DruidHook: 检查超时时时间变量未正确更新

  • [AIRFLOW-2865] on_success_callback 和 LocalTaskJob 的清理之间存在竞争条件

  • [AIRFLOW-2893] 由于jobName不匹配导致的数据流作业卡住问题。

  • [AIRFLOW-2895] 防止调度器频繁发送心跳/日志

  • [AIRFLOW-2900] 打包DAG的代码不可见

  • [AIRFLOW-2905] 切换至区域数据流作业服务。

  • [AIRFLOW-2907] Sendgrid - 附件 - 错误 - 'bytes'类型的对象无法JSON序列化

  • [AIRFLOW-2938] 连接中的无效'extra'字段在尝试编辑时可能引发AttributeError

  • [AIRFLOW-2979] 已弃用的Celery选项不在选项列表中

  • [AIRFLOW-2981] 使用GCS jar或py_file时dataflow操作符中出现TypeError

  • [AIRFLOW-2984] 当任务使用原生日期时间作为start_date/end_date时无法转换naive_datetime

  • [AIRFLOW-2994] BigQueryOperator/BigQueryHook中的flatten_results参数应默认为None

  • [AIRFLOW-3002] 使用GCS jar或py_file时数据流操作符中的ValueError

  • [AIRFLOW-3012] SLA超时邮件仅发送给列表中的第一个地址

  • [AIRFLOW-3046] 当任务因EC2主机终止而被终止时,ECS Operator错误地报告成功

  • [AIRFLOW-3064] 由于默认日志配置导致 airflow test 没有输出

  • [AIRFLOW-3072] 仅管理员可以在RBAC界面查看日志

  • [AIRFLOW-3079] 改进initdb以支持MSSQL Server

  • [AIRFLOW-3089] Google身份验证在http下无法工作

  • [AIRFLOW-3099] 当airflow.cfg中缺少某些配置块时引发的错误

  • [AIRFLOW-3109] 默认用户权限应包含'can_clear'

  • [AIRFLOW-3111] UPDATING.md 和 default_airflow.cfg 中关于日志模板的注释和说明令人困惑

  • [AIRFLOW-3124] 修复了Web服务器调试模式(RBAC)的问题

  • [AIRFLOW-3136] 调度器在处理执行器事件时任务重试运行失败

  • [AIRFLOW-3138] 迁移 cc1e65623dc7 导致与 postgres 产生问题

  • [AIRFLOW-3161] 日志URL链接在RBAC UI中未正确指向任务实例日志

  • [AIRFLOW-3162] 当指定端口时,HttpHook无法解析URL

  • [AIRFLOW-3183] utils/dag_processing/DagFileProcessorManager.max_runs_reached() 中存在的潜在错误

  • [AIRFLOW-3203] DockerOperator中的错误及部分操作符测试脚本命名不正确

  • [AIRFLOW-3238] 从文件系统中移除的Dags,在initdb时未被停用

  • [AIRFLOW-3268] 无法通过URL将SSL字典传递给mysql连接

  • [AIRFLOW-3277] 修复cron调度时区转换无效的问题

  • [AIRFLOW-3295] 当配置了证书时,要求在DaskExecutor中使用加密。

  • [AIRFLOW-3297] EmrStepSensor将已取消的步骤标记为成功

Airflow 1.10.0 (2018-08-03)

重大变更

安装和升级需要在您的环境中设置SLUGIFY_USES_TEXT_UNIDECODE=yesAIRFLOW_GPL_UNIDECODE=yes。如果选择后者,由于依赖关系(python-nvd3 -> python-slugify -> unidecode),将会安装一个GPL运行时依赖项。

将DataProcHook.await调用替换为DataProcHook.wait

方法名称被修改以兼容Python 3.7的async/await关键字

在邮件工具中将UTF-8设为默认的mime_charset

添加配置变量(default_dag_run_display_number)来控制显示的DAG运行数量

在webserver部分添加一个配置变量(default_dag_run_display_number),用于控制在UI中显示的dag运行数量。

SubDagOperator的默认执行器已更改为SequentialExecutor

全新Web服务器界面,支持基于角色的访问控制

当前的webserver UI使用Flask-Admin扩展。新的webserver UI采用Flask-AppBuilder (FAB)扩展。FAB内置了认证支持和基于角色的访问控制(RBAC),可为单个用户提供可配置的角色和权限。

要启用此功能,请在您的airflow.cfg文件(位于[webserver]部分下)中设置配置变量rbac = True,然后运行airflow命令,这将在您的$AIRFLOW_HOME目录下生成webserver_config.py文件。

设置身份验证

FAB内置支持DB、OAuth、OpenID、LDAP和REMOTE_USER的认证。默认认证类型是AUTH_DB

对于其他任何认证类型(OAuth、OpenID、LDAP、REMOTE_USER),请参阅FAB文档的认证部分了解如何在webserver_config.py文件中配置变量。

修改配置文件后,运行airflow db init来生成支持RBAC的新表(这些表将带有ab_前缀)。

创建管理员账户

配置设置更新且新表生成后,使用airflow create_user命令创建管理员账户。

使用您的新用户界面

运行 airflow webserver 以启动新UI界面。这将显示登录页面,请输入最近创建的管理员用户名和密码。

Airflow默认创建了五种角色:管理员(Admin)、用户(User)、操作员(Op)、查看者(Viewer)和公共(Public)。要配置角色/权限,请转到Security选项卡,在新版界面中点击List Roles

重大变更
  • AWS Batch Operator 将属性 queue 重命名为 job_queue,以避免与 CeleryExecutor 的内部队列冲突 - AIRFLOW-2542

  • 在旧用户表中创建和存储的用户不会自动迁移。必须重新配置FAB的内置认证支持。

  • Airflow的DAG主页现在是/home(而非之前的/admin)。

  • Flask-AppBuilder中的所有ModelView都遵循与Flask-Admin不同的模式。URL路径中的/admin部分将不再存在。例如:/admin/connection变为/connection/list/admin/connection/new变为/connection/add/admin/connection/edit变为/connection/edit,等等。

  • 出于安全考虑,新的webserver将不再支持旧UI中Data Profiling菜单的功能,包括Ad Hoc QueryChartsKnown Events

  • 根据Python API 2的规范,HiveServer2Hook.get_results()总是返回一个元组列表,即使查询的是单个列。

  • UTC is now the default timezone: Either reconfigure your workflows scheduling in UTC or set default_timezone as explained in https://airflow.apache.org/timezone.html#default-time-zone

airflow.contrib.sensors.hdfs_sensors 已重命名为 airflow.contrib.sensors.hdfs_sensor

为了保持一致性,我们现在将airflow.contrib.sensors.hdfs_sensors重命名为airflow.contrib.sensors.hdfs_sensor。

MySQL 所需设置

我们现在对MySQL采用更严格的ANSI SQL设置以确保合理的默认配置。请确保在my.cnf文件的[mysqld]部分下已指定explicit_defaults_for_timestamp=1

Celery配置

为了使Airflow的配置与Celery兼容,部分属性已被重命名:

celeryd_concurrency -> worker_concurrency
celery_result_backend -> result_backend
celery_ssl_active -> ssl_active
celery_ssl_cert -> ssl_cert
celery_ssl_key -> ssl_key

结果与Celery 4相同的配置参数,但更加透明。

GCP Dataflow 操作符

Dataflow作业标记现在在Dataflow{Java,Python}Operator中得到支持,默认带有"airflow-version"标签,请将您的google-cloud-dataflow或apache-beam版本升级至2.2.0或更高版本。

BigQuery 钩子和操作符

传递给BigQueryOperatorBigQueryBaseCursor.run_querybql参数已被弃用,为保持一致性更名为sql。继续使用bql仍能工作(但会引发DeprecationWarning警告),不过不再受支持,并将在Airflow 2.0中完全移除

Redshift到S3操作符

在Airflow 1.9或更低版本中,卸载操作始终包含标题行。为了包含标题行,我们需要关闭并行卸载。通常建议使用所有节点执行卸载操作,这样对于较大的表会更快。因此,添加了一个名为include_header的参数,默认设置为False。只有当此参数设置为True时才会添加标题行,同时在这种情况下会自动关闭并行模式(PARALLEL OFF)

Google云端连接字符串

在Airflow 1.9或更低版本中,Google Cloud操作符有两个连接字符串,分别是google_cloud_storage_defaultgoogle_cloud_default。这可能会造成混淆,因此google_cloud_storage_default连接ID已被替换为google_cloud_default,以使Airflow中的连接ID保持一致。

日志配置

在Airflow 1.9或更低版本中,FILENAME_TEMPLATEPROCESSOR_FILENAME_TEMPLATELOG_ID_TEMPLATEEND_OF_LOG_MARK是在airflow_local_settings.py中配置的。这些配置项已被移至配置文件中,因此如果您使用的是自定义配置文件,则需要添加以下默认值。

[core]
fab_logging_level = WARN
log_filename_template = {{{{ ti.dag_id }}}}/{{{{ ti.task_id }}}}/{{{{ ts }}}}/{{{{ try_number }}}}.log
log_processor_filename_template = {{{{ filename }}}}.log

[elasticsearch]
elasticsearch_log_id_template = {{dag_id}}-{{task_id}}-{{execution_date}}-{{try_number}}
elasticsearch_end_of_log_mark = end_of_log

在使用带有远程存储的默认日志配置时,现在很多情况下不再需要之前的log_task_reader设置。(以前需要将其设置为s3.task或类似值。使用默认配置后不再需要此设置)

变更每个任务的日志路径

随着Airflow核心改为支持时区感知,任务实例的默认日志路径现在将包含时区信息。默认情况下,这意味着所有先前的任务日志将无法找到。您可以通过设置以下配置选项恢复旧的行为:

[core]
log_filename_template = {{ ti.dag_id }}/{{ ti.task_id }}/{{ execution_date.strftime("%%Y-%%m-%%dT%%H:%%M:%%S") }}/{{ try_number }}.log

更新日志

  • [AIRFLOW-2870] 在迁移中使用抽象TaskInstance

  • [AIRFLOW-2859] 实现自定义的UtcDateTime (#3708)

  • [AIRFLOW-2140] SparkSubmit钩子不需要kubernetes

  • [AIRFLOW-2869] 从默认配置中移除智能引号

  • [AIRFLOW-2857] 修复Read the Docs环境

  • [AIRFLOW-2817] 强制明确选择GPL依赖项

  • [AIRFLOW-2716] 替换async和await这两个Python 3.7关键字

  • [AIRFLOW-2810] 修复Xcom模型中时间戳的拼写错误

  • [AIRFLOW-2710] 在文档中澄清fernet密钥值

  • [AIRFLOW-2606] 修复数据库模式和SQLAlchemy模型

  • [AIRFLOW-2646] 修复 setup.py 不在 Python3 上安装 snakebite 的问题

  • [AIRFLOW-2604] 为task_fail添加索引

  • [AIRFLOW-2650] 当按下Ctrl-c时将SchedulerJob标记为成功

  • [AIRFLOW-2678] 修复数据库模式单元测试以移除对fab模型的检查

  • [AIRFLOW-2624] 修复匿名用户登录webserver的问题

  • [AIRFLOW-2654] 修复FAB UI图形视图中刷新时URL不正确的问题

  • [AIRFLOW-2668] 处理缺失的可选加密依赖项

  • [AIRFLOW-2681] 在用户界面中包含外部触发DAG的最后一次运行记录。

  • [AIRFLOW-1840] 支持旧版Celery配置的向后兼容

  • [AIRFLOW-2612][AIRFLOW-2534] 清理与Hive相关的测试

  • [AIRFLOW-2608] 实现/标准化实验性API的自定义异常

  • [AIRFLOW-2607] 修复失败的TestLocalClient测试

  • [AIRFLOW-2638] dbapi_hook: 支持 REPLACE INTO 语法

  • [AIRFLOW-2542][AIRFLOW-1790] 将AWS批处理操作队列重命名为job_queue

  • [AIRFLOW-2567] 从Kubernetes Pod中提取结果作为Xcom

  • [AIRFLOW-XXX] 将REA集团添加到自述文件中

  • [AIRFLOW-2601] 允许用户指定k8s配置

  • [AIRFLOW-2559] Azure 文件共享钩子

  • [AIRFLOW-1786] 强制执行软失败传感器的正确行为

  • [AIRFLOW-2355] 子DAG中的Airflow触发器标签参数

  • [AIRFLOW-2613] 修复Airflow搜索.zip文件的bug

  • [AIRFLOW-2627] 添加一个Cassandra传感器

  • [AIRFLOW-2634][AIRFLOW-2534] 移除对impyla的依赖

  • [AIRFLOW-2611] 修复Kubernetes执行器中错误的DAG卷挂载路径

  • [AIRFLOW-2562] 新增Google Kubernetes引擎操作器

  • [AIRFLOW-2630] 修复 test_sql_sensor.py 中的类名

  • [AIRFLOW-2534] 修复HiveServer2Hook中的bug

  • [AIRFLOW-2586] 停止从bash操作符的配置文件中获取AIRFLOW_HOME值

  • [AIRFLOW-2605] 修复 MySqlHook 的自动提交功能

  • [AIRFLOW-2539][AIRFLOW-2359] 将剩余的日志配置移至配置文件

  • [AIRFLOW-1656] 树状视图DAG查询已变更

  • [AIRFLOW-2617] 为kubernetes执行器添加imagePullPolicy配置

  • [AIRFLOW-2429] 修复 security/task/sensors/ti_deps 文件夹的 flake8 错误

  • [AIRFLOW-2550] 实现列出DAG运行的API端点

  • [AIRFLOW-2512][AIRFLOW-2522] 使用google-auth替代oauth2client

  • [AIRFLOW-2429] 修复operators文件夹中的flake8错误

  • [AIRFLOW-2585] 修复CassandraHook和CassandraToGCSOperator中的多个错误

  • [AIRFLOW-2597] 恢复原始 dbapi.run() 行为

  • [AIRFLOW-2590] 修复 DbApiHook.run() 在非自动提交数据库中的提交问题

  • [AIRFLOW-1115] 修复github oauth api URL

  • [AIRFLOW-2587] 为MySqlToHiveTransfer添加TIMESTAMP类型映射

  • [AIRFLOW-2591][AIRFLOW-2581] 在DbApiHook.run()中将autocommit的默认值设为False

  • [AIRFLOW-59] 为Postgres钩子实现批量转储(bulk_dump)和批量加载(bulk_load)功能

  • [AIRFLOW-2533] 修复Kubernetes执行器工作节点上DAG的路径问题

  • [AIRFLOW-2581] RFLOW-2581] 修复DbApiHook自动提交问题

  • [AIRFLOW-2578] 在JiraHook中添加使用代理的选项

  • [AIRFLOW-2575] 使gcs到gcs操作符能够处理大文件

  • [AIRFLOW-437] 在杀死僵尸进程时发送任务实例上下文

  • [AIRFLOW-2566] 将回填改为重新运行失败的任务

  • [AIRFLOW-1021] 修复LDAP新用户重复登录问题

  • [AIRFLOW-XXX] 拼写错误修复

  • [AIRFLOW-2561] 修复EmailOperator中的拼写错误

  • [AIRFLOW-2573] 将BigQuery的TIMESTAMP字段转换为浮点数

  • [AIRFLOW-2560] 为DataprocClusterCreateOperator添加internalIpOnly参数支持

  • [AIRFLOW-2565] 模板化集群标签

  • [AIRFLOW-83] 添加mongo钩子和操作器

  • [AIRFLOW-2558] 清除任务/DAG时正在清除所有执行记录

  • [AIRFLOW-XXX] 修复文档拼写错误

  • [AIRFLOW-2513] 将BigQuery Hooks和Ops中的bql改为sql

  • [AIRFLOW-2557] 修复s3的分页问题

  • [AIRFLOW-2545] 消除弃用警告

  • [AIRFLOW-2500] 修复MySqlToHiveTransfer以正确传输无符号类型

  • [AIRFLOW-2462] 修改PasswordUser设置器使用正确语法

  • [AIRFLOW-2525] 修复由提交 dabf1b9 引入的错误

  • [AIRFLOW-2553] 将webserver.pid添加到.gitignore

  • [AIRFLOW-1863][AIRFLOW-2529] 在甘特视图中添加DAG运行选择控件

  • [AIRFLOW-2504] 正确记录用户名并将额外信息添加到搜索列

  • [AIRFLOW-2551] 使用base64标准而非base64 url对二进制数据进行编码

  • [AIRFLOW-2537] 为回填命令添加重置DAG运行选项

  • [AIRFLOW-2526] dag_run.conf 可以覆盖参数

  • [AIRFLOW-2544][AIRFLOW-1967] 防范Celery和Flower的下一个主要版本

  • [AIRFLOW-XXX] 将Yieldr添加到使用airflow的用户列表中

  • [AIRFLOW-2547] 描述如何使用Docker运行测试

  • [AIRFLOW-2538] 更新关于如何降低Airflow调度器延迟的常见问题文档

  • [AIRFLOW-2529] 提升图形视图性能和可用性

  • [AIRFLOW-2517] 回填支持通过CLI传递键值

  • [AIRFLOW-2532] 为KubernetesExecutor支持logs_volume_subpath

  • [AIRFLOW-2466] 在 _change_state_for_tis_without_dagrun 中考虑 task_id

  • [AIRFLOW-2519] 修复CeleryExecutor与SQLAlchemy的兼容性问题

  • [AIRFLOW-2402] 修复RBAC任务日志

  • [AIRFLOW-XXX] 将M4U添加到用户列表

  • [AIRFLOW-2536] 关于如何处理Airflow initdb失败的文档

  • [AIRFLOW-2530] KubernetesOperator 支持多集群

  • [AIRFLOW-1499] 消除重复和冗余代码

  • [AIRFLOW-2521] 回填 - 使变量名称和日志消息更加准确

  • [AIRFLOW-2429] 修复hook和macros文件夹中的flake8错误

  • [Airflow-XXX] 将Prime添加到公司列表

  • [AIRFLOW-2525] 修复PostgresHook.copy_expert以支持"COPY FROM"功能

  • [AIRFLOW-2515] 为hive额外功能添加对thrift_sasl的依赖

  • [AIRFLOW-2523] 添加管理GCP连接的指南

  • [AIRFLOW-2510] 引入新宏:prev_ds 和 next_ds

  • [AIRFLOW-1730] 从数据库查询的XCom值进行反序列化

  • [AIRFLOW-2518] 修复 integration.rst 中损坏的目录链接

  • [AIRFLOW-1472] 修复跳过的任务触发SLA未达标的问题。

  • [AIRFLOW-2520] 命令行界面 - 减少回填操作的冗长输出

  • [AIRFLOW-2107] 在BigQueryBaseCursor的run_query中添加time_partitioning

  • [AIRFLOW-1057][AIRFLOW-1380][AIRFLOW-2362][2362] AIRFLOW 更新DockerOperator以适配新API

  • [AIRFLOW-2415] 使Airflow DAG模板能够渲染数字

  • [AIRFLOW-2473] 修复TransferTests中错误的跳过条件

  • [AIRFLOW-2472] 实现 MySqlHook.bulk_dump

  • [AIRFLOW-2419] 为子DAG操作符使用默认视图

  • [AIRFLOW-2498] 修复SFTP传感器中的意外参数问题

  • [AIRFLOW-2509] 将配置文档拆分为操作指南

  • [AIRFLOW-2429] 添加BaseExecutor回退

  • [AIRFLOW-2429] 修复 dag、example_dags、executors 的 flake8 错误

  • [AIRFLOW-2502] 将文档字符串的单三引号改为双引号

  • [AIRFLOW-2503] 修复CONTRIBUTING.md中的失效链接

  • [AIRFLOW-2501] 参考文档贡献指南中的开发说明

  • [AIRFLOW-2429] 修复contrib文件夹中的flake8错误

  • [AIRFLOW-2471] 修复 HiveCliHook.load_df 以使用未使用的参数

  • [AIRFLOW-2495] 将celery更新至4.1.1版本

  • [AIRFLOW-2429] 修复api、bin、config_templates文件夹的flake8错误

  • [AIRFLOW-2493] 在API文档中将所有Operator的template_fields标记为"可模板化"

  • [AIRFLOW-2489] 将FlaskAppBuilder更新至1.11.1版本

  • [AIRFLOW-2448] 增强HiveCliHook.load_df以支持datetime类型

  • [AIRFLOW-2487] 增强druid数据摄取钩子

  • [AIRFLOW-2397] 支持Kubernetes执行器/操作器的亲和性策略

  • [AIRFLOW-2482] 为GCS Hook中的rewrite方法添加测试

  • [AIRFLOW-2481] 修复不稳定的Kubernetes测试

  • [AIRFLOW-2479] 改进文档FAQ部分

  • [AIRFLOW-2485] 修复Qubole传感器的错误日志记录

  • [AIRFLOW-2486] 移除端口号后不必要的斜杠

  • [AIRFLOW-2429] 使Airflow符合flake8规范

  • [AIRFLOW-2491] 解决Flask版本冲突

  • [AIRFLOW-2484] 移除MySQL到GCS操作中的重复键

  • [AIRFLOW-2458] 添加Cassandra到GCS的操作器

  • [AIRFLOW-2477] 改进RBAC UI中任务持续时间和着陆时间图表的时间单位

  • [AIRFLOW-2474] 仅在Python 2环境下导入snakebite

  • [AIRFLOW-48] 解析连接URI查询字符串

  • [AIRFLOW-2467][AIRFLOW-2] 更新导入直接警告信息以使用模块名称

  • [AIRFLOW-XXX] 修复公司排序问题

  • [AIRFLOW-2452] 文档字段field_dict必须是有序字典OrderedDict

  • [AIRFLOW-2420] Azure Data Lake 钩子

  • [AIRFLOW-2213] 添加Qubole检查操作符

  • [AIRFLOW-2465] 修复文档中错误的模块名称

  • [AIRFLOW-1929] 修改TriggerDagRunOperator以接受execution_date参数

  • [AIRFLOW-2460] 用户现在可以使用卷挂载和卷

  • [AIRFLOW-2110][AIRFLOW-2122] 增强Http Hook功能

  • [AIRFLOW-XXX] 更新了贡献者名单

  • [AIRFLOW-2435] 为ECSOperator添加launch_type参数以支持FARGATE

  • [AIRFLOW-2451] 修复gcs_to_gcs操作符中使用通配符时多余的斜杠('/')字符问题

  • [AIRFLOW-2461] 为dataproc操作符添加集群扩展支持

  • [AIRFLOW-2376] 修复无hive部分错误

  • [AIRFLOW-2425] 添加血缘关系支持

  • [AIRFLOW-2430] 将查询批处理扩展到其他慢查询

  • [AIRFLOW-2453] 为kubernetes/git_subpath添加默认nil值

  • [AIRFLOW-2396] 在Kubernetes操作符中添加对资源的支持

  • [AIRFLOW-2169] 在导入到BigQuery之前使用base64编码二进制数据

  • [AIRFLOW-XXX] 在用户列表中添加spotahome

  • [AIRFLOW-2457] 更新FAB版本要求

  • [AIRFLOW-2454][Airflow 2454] 支持k8s的imagePullPolicy

  • [AIRFLOW-2450] 更新支持的k8s版本至1.9和1.10

  • [AIRFLOW-2333] 新增Segment Hook和TrackEventOperator

  • [AIRFLOW-2442][AIRFLOW-2] Airflow运行命令导致数据库连接未关闭

  • [AIRFLOW-2016] 为Dataproc工作流模板子类分配template_fields,而非基类

  • [AIRFLOW-2446] 将S3ToRedshiftTransfer添加到"集成"文档中

  • [AIRFLOW-2449] 修复operators.py以运行所有测试用例

  • [AIRFLOW-2424] 添加DAG运行状态端点并增加Kubernetes测试覆盖率

  • [AIRFLOW-2441] 修复HiveCliHook.load_df中的错误

  • [AIRFLOW-2358][AIRFLOW-201804] 使Kubernetes示例变为可选

  • [AIRFLOW-2436] 在initdb中移除cli_logger

  • [AIRFLOW-2444] 移除cli回填命令中未使用的选项(include_adhoc)

  • [AIRFLOW-2447] 修复TestHiveMetastoreHook以运行所有测试用例

  • [AIRFLOW-2445] 允许在kubernetes操作符中使用模板

  • [AIRFLOW-2086][AIRFLOW-2393] 自定义树状视图中默认的dagrun数量

  • [AIRFLOW-2437] 将PubNub添加到当前Airflow用户列表中

  • [AIRFLOW-XXX] 将Quantopian添加到Airflow用户列表中

  • [AIRFLOW-1978] 添加WinRM Windows操作器和钩子

  • [AIRFLOW-2427] 为命名Hive传感器添加测试

  • [AIRFLOW-2412] 修复HiveCliHook.load_file以解决HIVE-10541问题

  • [AIRFLOW-2431] 为RBAC UI添加导航栏颜色参数

  • [AIRFLOW-2407] 修复Python未定义名称问题

  • [AIRFLOW-1952] 添加导航栏颜色参数

  • [AIRFLOW-2222] 实现GoogleCloudStorageHook.rewrite

  • [AIRFLOW-2426] 添加Google云存储Hook测试

  • [AIRFLOW-2418] 升级Flask-WTF

  • [AIRFLOW-2417] 等待Pod未运行以结束任务

  • [AIRFLOW-1914] 为邮件工具添加其他字符集支持

  • [AIRFLOW-XXX] 使用Craig@Work更新README.md文件

  • [AIRFLOW-1899] 修复Kubernetes测试

  • [AIRFLOW-1812] 更新日志记录示例

  • [AIRFLOW-2313] 为Dataproc添加TTL参数

  • [AIRFLOW-2411] 将dataproc_jars添加到templated_fields中

  • [AIRFLOW-XXX] 将Reddit添加到Airflow用户列表

  • [AIRFLOW-XXX] 修复 scheduler.rst 中错误的表格标题

  • [AIRFLOW-2409] 提供密码作为参数

  • [AIRFLOW-2410][AIRFLOW-75] 在RBAC Web界面中设置时区

  • [AIRFLOW-2394] Kubernetes操作符中的默认命令和参数

  • [AIRFLOW-2406] 在Readme中添加Apache2许可证标识

  • [AIRFLOW-2404] 为未排队任务添加额外文档

  • [AIRFLOW-2400] 新增为K8s设置环境变量的功能

  • [AIRFLOW-XXX] 将Twine Labs添加为Airflow用户

  • [AIRFLOW-1853] 在树状视图中仅显示指定数量的运行记录

  • [AIRFLOW-2401] 记录在Jinja模板中使用变量的方法

  • [AIRFLOW-2403] 修复许可证头部

  • [AIRFLOW-1313] 修复许可证头部

  • [AIRFLOW-2398] 将BounceX添加到当前Airflow用户列表中

  • [AIRFLOW-2363] 修复TaskHandler中的返回类型错误

  • [AIRFLOW-2389] 创建一个pinot数据库API钩子

  • [AIRFLOW-2390] 解决FlaskWTFDeprecationWarning问题

  • [AIRFLOW-1933] 修复一些拼写错误

  • [AIRFLOW-1960] 为kubernetes操作符添加密钥支持

  • [AIRFLOW-1313] 添加vertica_to_mysql操作符

  • [AIRFLOW-1575] 添加用于批量插入记录的AWS Kinesis Firehose Hook

  • [AIRFLOW-2266][AIRFLOW-2343] 移除google-cloud-dataflow依赖

  • [AIRFLOW-2370] 在create_user中实现--use_random_password参数

  • [AIRFLOW-2348] 当source_object包含通配符时,从destination_object中去除路径前缀[]

  • [AIRFLOW-2391] 修复至Flask 0.12.2版本

  • [AIRFLOW-2381] 修复不稳定的ApiPasswordTests测试

  • [AIRFLOW-2378] 将Groupon添加到当前用户列表中

  • [AIRFLOW-2382] 修复分隔符的错误描述

  • [AIRFLOW-2380] 在Spark提交操作符中添加对环境变量的支持。

  • [AIRFLOW-2377] 改进Sendgrid发件人支持

  • [AIRFLOW-2331] 支持在创建Dataproc集群时设置初始化操作超时

  • [AIRFLOW-1835] 更新文档:变量文件为json格式

  • [AIRFLOW-1781] 使LDAP组中的搜索不区分大小写

  • [AIRFLOW-2042] 修复浏览器菜单遮挡自动完成菜单的问题

  • [AIRFLOW-XXX] 从Travis中移除不属于Travis的wheelhouse文件

  • [AIRFLOW-2336] 在hive_hook中使用hmsclient

  • [AIRFLOW-2041] 修正Python示例中的语法

  • [AIRFLOW-74] SubdagOperators可能会占用所有celeryd工作进程

  • [AIRFLOW-2369] 修复gcs测试

  • [AIRFLOW-2365] 修复自动提交属性检查

  • [AIRFLOW-2068] MesosExecutor 支持可选的 Docker 镜像

  • [AIRFLOW-1652] 将DatabricksRunSubmitOperator的元数据推送到XCOM中

  • [AIRFLOW-2234] 为PrestoHook启用insert_rows功能

  • [AIRFLOW-2208][Airflow-22208] 从任务实例视图链接到相同的DagRun图表

  • [AIRFLOW-1153] 允许HiveOperators使用hiveconfs

  • [AIRFLOW-775] 修复Jdbc hook的自动提交设置

  • [AIRFLOW-2364] 当在不支持自动提交的连接上设置自动提交时发出警告

  • [AIRFLOW-2357] 为日志添加持久化存储卷

  • [AIRFLOW-766] 在自动提交模式下跳过conn.commit()

  • [AIRFLOW-2351] 检查default_args中的start_date是否有效

  • [AIRFLOW-1433] 将默认rbac设置为initdb

  • [AIRFLOW-2270] 处理回填中被移除的任务

  • [AIRFLOW-2344] 修复 connections -l 使其支持管道/重定向

  • [AIRFLOW-2300] 为S3ToHiveTransfer添加S3 Select功能

  • [AIRFLOW-1314] 清理配置

  • [AIRFLOW-1314] 完善部分Kubernetes文档/配置

  • [AIRFLOW-1314] 改进错误处理

  • [AIRFLOW-1999] 添加每个任务的GCP服务账户支持

  • [AIRFLOW-1314] 基于主分支进行变基

  • [AIRFLOW-1314] 针对PR评论进行的小规模清理 (#24)

  • [AIRFLOW-1314] 添加executor_config和测试

  • [AIRFLOW-1314] 改进k8s支持

  • [AIRFLOW-1314] 使用VolumeClaim传输DAGs

  • [AIRFLOW-1314] 创建集成测试环境

  • [AIRFLOW-1314] Git模式用于为Kubernetes执行器拉取DAG

  • [AIRFLOW-1314] 在Kubernetes执行器中添加对卷挂载和Secrets的支持

  • [AIRFLOW=1314] 基础Kubernetes模式

  • [AIRFLOW-2326][AIRFLOW-2222] 移除 contrib.gcs_copy_operator

  • [AIRFLOW-2328] 修复S3ToGoogleCloudStorageOperator中的空GCS blob问题

  • [AIRFLOW-2350] 修复UPDATING.md中的语法问题

  • [AIRFLOW-2302] 修复文档

  • [AIRFLOW-2345] 这个setup.py中没有使用pip

  • [AIRFLOW-2347] 在Readme中添加Banco de Formaturas

  • [AIRFLOW-2346] 将Investorise添加为Airflow的官方用户

  • [AIRFLOW-2330] 如果未提供目标前缀则不要追加

  • [AIRFLOW-2240][DASK] 为dask-distributed调度器添加了TLS/SSL支持。

  • [AIRFLOW-2309] 修复TaskFail上的持续时间计算

  • [AIRFLOW-2335] 修复CI中jdk8下载的问题

  • [AIRFLOW-2184] 添加druid_checker_operator

  • [AIRFLOW-2299] 为S3FileTransformOperator添加S3 Select功能

  • [AIRFLOW-2254] 将标题行作为卸载文件的第一行

  • [AIRFLOW-610] 在默认配置前优先考虑_cmd选项

  • [AIRFLOW-2287] 修复错误的ASF头部信息

  • [AIRFLOW-XXX] 新增Zego作为Apache Airflow用户

  • [AIRFLOW-952] 修复在UI中保存空额外字段的问题

  • [AIRFLOW-1325] 添加ElasticSearch日志处理程序和读取器

  • [AIRFLOW-2301] 将S3密钥的文件与GCS路径同步

  • [AIRFLOW-2293] 修复S3FileTransformOperator以支持boto3

  • [AIRFLOW-3212][AIRFLOW-2314] 仅移除GCS路径中的前导斜杠

  • [AIRFLOW-1509][AIRFLOW-442] SFTP传感器

  • [AIRFLOW-2291] 为ML Engine添加可选参数

  • [AIRFLOW-1774] 允许在MLEngineBatchPredictionOperator中对参数进行一致的模板化

  • [AIRFLOW-2302] 添加缺失的operators和hooks

  • [AIRFLOW-2312] 文档拼写修正:对应

  • [AIRFLOW-1623] 在操作器中触发on_kill方法

  • [AIRFLOW-2162] 当模拟其他用户时,将环境变量传递给sudo

  • [AIRFLOW-2304] 更新快速入门文档以提及调度程序部分

  • [AIRFLOW-1633] docker_operator 需要一种设置 shm_size 的方式

  • [AIRFLOW-1340] 添加S3到Redshift的数据传输操作符

  • [AIRFLOW-2303] 列出S3存储桶中的键

  • [AIRFLOW-2209] 恢复flask_login导入

  • [AIRFLOW-2306] 将Bonnier Broadcasting添加到当前用户列表中

  • [AIRFLOW-2305][AIRFLOW-2027] 修复由[]导致的CI失败

  • [AIRFLOW-2281] 添加对Sendgrid分类的支持

  • [AIRFLOW-2027] 仅在所有文件解析完成后才触发调度器休眠

  • [AIRFLOW-2256] SparkOperator: 添加客户端独立模式和重试机制

  • [AIRFLOW-2284] GCS到S3操作符

  • [AIRFLOW-2287] 更新许可证声明

  • [AIRFLOW-2296] 将Cinimex DataLab添加到Readme中

  • [AIRFLOW-2298] 将Kalibrr添加到Airflow用户列表

  • [AIRFLOW-2292] 修复 S3Hook.get_wildcard_key 的文档字符串

  • [AIRFLOW-XXX] 更新PR模板

  • [AIRFLOW-XXX] 移除过时的 migrations.sql

  • [AIRFLOW-2287] 为docs/Makefile添加许可证头

  • [AIRFLOW-2286] 在README中添加tokopedia

  • [AIRFLOW-2273] 新增Discord webhook操作器/钩子

  • [AIRFLOW-2282] 修复UPDATING.md中的语法问题

  • [AIRFLOW-2200] 添加带测试的snowflake操作器

  • [AIRFLOW-2178] 添加对SLA超时错误的处理

  • [AIRFLOW-2169] 修复Python3中'bytes'类型不可JSON序列化的问题

  • [AIRFLOW-2215] 在base_task_runner中将环境传递给subprocess.Popen

  • [AIRFLOW-2253] 添加Airflow CLI工具

  • [AIRFLOW-2274] 修复Dataflow测试

  • [AIRFLOW-2269] 将Custom Ink添加为Airflow用户

  • [AIRFLOW-2259] Dataflow Hook 索引超出范围

  • [AIRFLOW-2233] 更新updating.md文档,包含hdfs_sensors重命名的相关信息

  • [AIRFLOW-2217] 添加Slack webhook操作器

  • [AIRFLOW-1729] 优化DagBag时间

  • [AIRFLOW-2264] 改进create_user命令行工具的帮助信息

  • [AIRFLOW-2260][AIRFLOW-2260] SSHOperator 添加命令模板 .sh 文件

  • [AIRFLOW-2261] 检查远程基础日志文件夹的配置/环境变量

  • [AIRFLOW-2258] 允许将Parquet格式文件导入BigQuery

  • [AIRFLOW-1430] 包含INSTALL安装说明以避免GPL

  • [AIRFLOW-1430] 解决GPL依赖问题

  • [AIRFLOW-2251] 将Thinknear添加为Airflow用户

  • [AIRFLOW-2244] 错误修复:从models.py中移除遗留的LongText代码

  • [AIRFLOW-2247] 修复 RedshiftToS3Transfer 避免因 ValueError 失败

  • [AIRFLOW-2249] 为Zendesk Hook添加侧载支持

  • [AIRFLOW-XXX] 将Qplum添加到Airflow用户列表

  • [AIRFLOW-2228] ValueCheckOperator功能增强

  • [AIRFLOW-1206] 拼写错误

  • [AIRFLOW-2060] 更新pendulum版本至1.4.4

  • [AIRFLOW-2248] 修复RedshiftToS3Transfer文档中的错误参数名称

  • [AIRFLOW-1433][AIRFLOW-85] 新版Airflow网页服务器界面,支持基于角色的访问控制(RBAC)

  • [AIRFLOW-1235] 修复webserver的异常行为

  • [AIRFLOW-1460] 允许恢复已删除的任务实例(TI)

  • [AIRFLOW-2235] 修复两个操作符中错误的文档字符串

  • [AIRFLOW-XXX] 修复使用Airflow的公司的时间顺序问题

  • [AIRFLOW-2124] 上传Python文件到Dataproc的存储桶

  • [AIRFLOW-2212] 修复未生成的传感器API参考文档

  • [AIRFLOW-2226] 将google_cloud_storage_default重命名为google_cloud_default

  • [AIRFLOW-2211] 将hdfs_sensors.py重命名为hdfs_sensor.py以保持一致性

  • [AIRFLOW-2225] 更新文档以包含DruidDbApiHook

  • [Airflow-2202] 在HiveMetastoreHook().max_partition()中添加过滤器支持

  • [AIRFLOW-2220] 移除security.rst中重复的数字列表条目

  • [AIRFLOW-XXX] 更新教程文档

  • [AIRFLOW-2215] 更新Celery任务以保留环境变量并改进异常日志记录

  • [AIRFLOW-2185] 使用状态替代查询参数

  • [AIRFLOW-2183] 重构DruidHook以支持sql

  • [AIRFLOW-2203] 延迟循环检测

  • [AIRFLOW-2203] 移除无用命令。

  • [AIRFLOW-2203] 在apply_defaults中缓存签名

  • [AIRFLOW-2203] 加速Operator资源

  • [AIRFLOW-2203] 缓存静态规则(触发器/权重)

  • [AIRFLOW-2203] 将任务ID存储为集合而非列表

  • [AIRFLOW-2205] 从JdbcHook文档中移除不支持的参数

  • [AIRFLOW-2207] 修复使用 app.cached_app() 的不稳定测试

  • [AIRFLOW-2206] 从JdbcOperator文档中移除不支持的参数

  • [AIRFLOW-2140] 为SparkSubmitOperator添加Kubernetes调度器支持

  • [AIRFLOW-XXX] 将Xero添加到用户列表中

  • [AIRFLOW-2204] 修复网页服务器调试模式

  • [AIRFLOW-102] 修复test_complex_template测试总是通过的问题

  • [AIRFLOW-442] 添加SFTPHook

  • [AIRFLOW-2169] 为MySqlToGoogleCloudStorageOperator添加schema支持

  • [AIRFLOW-2184][AIRFLOW-2138] Google Cloud Storage 支持通配符

  • [AIRFLOW-1588] 将变量值转换为字符串

  • [AIRFLOW-2199] 修复对日志记录器的无效引用

  • [AIRFLOW-2191] 将调度器心跳日志从信息级别调整为调试级别

  • [AIRFLOW-2106] SalesForce 钩子沙盒选项

  • [AIRFLOW-2197] 静默 hostname_callable 配置错误信息

  • [AIRFLOW-2150] 在HiveMetastoreHook().max_partition()中使用更轻量的调用

  • [AIRFLOW-2186] 修改部分操作中的日志记录方式

  • [AIRFLOW-2181] 将password_auth和test_password_endpoints从DOS格式转换为UNIX格式

  • [AIRFLOW-2187] 修复因AIRFLOW-2123导致的Travis CI故障

  • [AIRFLOW-2175] 检查文件路径是否为空

  • [AIRFLOW-2173] 在检查并发数是否达到时不再检查任务ID

  • [AIRFLOW-2168] Azure Blob Storage的远程日志记录

  • [AIRFLOW-XXX] 将DocuTAP添加到用户列表中

  • [AIRFLOW-2176] 修改BQ获取数据操作符中的日志记录方式

  • [AIRFLOW-2177] 为GCS下载操作添加模拟测试

  • [AIRFLOW-2123] 从 setup.py 安装 CI 依赖项

  • [AIRFLOW-2129] Presto钩子调用_parse_exception_message但定义了_get_pretty_exception_message

  • [AIRFLOW-2174] 修复拼写错误和文档渲染问题

  • [AIRFLOW-2171] 存储委托凭证

  • [AIRFLOW-2166] 恢复BQ run_query方言参数

  • [AIRFLOW-2163] 将HBC Digital添加为Airflow用户

  • [AIRFLOW-2065] 修复创建日志记录器时的竞态条件

  • [AIRFLOW-2147] 插件管理器:新增了'sensors'属性

  • [AIRFLOW-2059] taskinstance 查询性能极差,未建立索引,无法扩展

  • [AIRFLOW-2159] 修复salesforce_hook中的几处拼写错误

  • [AIRFLOW-2132] 添加初始化数据库的步骤

  • [AIRFLOW-2160] 修复错误的rowid反序列化问题

  • [AIRFLOW-2161] 将Vevo添加到使用Airflow的公司列表中

  • [AIRFLOW-2149] 添加链接到Apache Beam文档以创建自执行Jar

  • [AIRFLOW-2151] 允许从AwsHook获取会话

  • [AIRFLOW-2097] 在赋值前引用了tz变量

  • [AIRFLOW-2152] 将Multiply添加到使用Airflow的公司列表中

  • [AIRFLOW-1551] 添加触发Jenkins任务的operator

  • [AIRFLOW-2034] 修复使用str.format时%s和{}混用的问题

  • [AIRFLOW-2102] 为Sendgrid个性化设置添加custom_args参数

  • [AIRFLOW-1035][AIRFLOW-1053] 导入unicode_literals以解析HQL中的Unicode字符

  • [AIRFLOW-2127] 在数据库迁移期间保留日志记录器

  • [AIRFLOW-2146] 解决BQ使用DbApiHook方法的问题

  • [AIRFLOW-2087] 调度器报告显示错误的总任务数

  • [AIRFLOW-2139] 移除使用pandas_gbq获取DataFrame时不必要的样板代码

  • [AIRFLOW-2125] 使用二进制包 psycopg2-binary

  • [AIRFLOW-2142] 包含创建目录失败时的消息

  • [AIRFLOW-1615] SSHHook: 使用Connection指定的端口

  • [AIRFLOW-2122] 处理sshHook中的布尔值

  • [AIRFLOW-XXX] 将Tile添加到用户列表中

  • [AIRFLOW-2130] 在API参考文档中添加缺失的操作符

  • [AIRFLOW-XXX] 添加超时单位(秒)

  • [AIRFLOW-2134] 将Alan添加到使用Airflow的公司列表中

  • [AIRFLOW-2133] 移除CONTRIBUTING中对GitHub问题的引用

  • [AIRFLOW-2131] 移除令人困惑的AirflowImport文档

  • [AIRFLOW-1852] 允许主机名可被覆盖。

  • [AIRFLOW-2126] 将Bluecore添加到活跃用户中

  • [AIRFLOW-1618] 新增创建GCS存储桶功能

  • [AIRFLOW-2108] 修复BashOperator中的日志缩进问题

  • [AIRFLOW-2115] 修复指向PythonHosted的文档链接

  • [AIRFLOW-XXX] 添加来自Easy公司的贡献者

  • [AIRFLOW-1882] 为gcs_to_bq操作符添加ignoreUnknownValues选项

  • [AIRFLOW-2089] 为独立集群中的SparkSubmit添加on kill功能

  • [AIRFLOW-2113] 解决缺失的DagRun回调问题 鉴于handle_callback方法属于DAG对象,我们能够直接通过get_task获取任务列表,减少与数据库的通信,使Airflow更加轻量级。

  • [AIRFLOW-2112] 修复UI上最近任务显示的svg宽度问题。

  • [AIRFLOW-2116] 将CI Cloudant版本设置为小于2.0

  • [AIRFLOW-XXX] 将PMC添加到使用Airflow的公司列表中

  • [AIRFLOW-2100] 修复损坏的文档链接

  • [AIRFLOW-1404] 为BQ操作符添加'flatten_results'和'maximum_bytes_billed'参数

  • [AIRFLOW-800] 初始化有效的Google BigQuery连接

  • [AIRFLOW-1319] 修复SparkSubmitOperator和SparkSubmitHook文档字符串中的误导性描述

  • [AIRFLOW-1983] 将环境参数解析为模板

  • [AIRFLOW-2095] 添加操作符以创建外部BigQuery表

  • [AIRFLOW-2085] 添加SparkJdbc操作器

  • [AIRFLOW-1002] 添加清理已删除DAG所有依赖项的功能

  • [AIRFLOW-2094] 在DataProc{*}操作符中对project_id、region和zone进行了Jinja模板化处理

  • [AIRFLOW-2092] 修复了FTPHook文档字符串中的错误参数

  • [AIRFLOW-XXX] 将SocialCops添加到Airflow用户列表

  • [AIRFLOW-2088] 修复MySQL到GCS辅助函数中的重复键问题

  • [AIRFLOW-2091] 修复BigQuery Hook中错误的文档字符串参数

  • [AIRFLOW-2090] 修复DataStore Hook中的拼写错误

  • [AIRFLOW-1157] 修复缺失的池导致调度器崩溃的问题

  • [AIRFLOW-713] 将{EmrCreateJobFlow,EmrAddSteps}Operator属性Jinja模板化

  • [AIRFLOW-2083] 文档:在适当的地方使用"its"而非"it's"

  • [AIRFLOW-2066] 新增创建空BQ表的操作符

  • [AIRFLOW-XXX] 将Karmic添加到公司列表中

  • [AIRFLOW-2073] 当文件不存在时使FileSensor失败

  • [AIRFLOW-2078] 提升任务统计(task_stats)和DAG统计(dag_stats)的性能

  • [AIRFLOW-2080] 使用登出图标替代电源按钮

  • [AIRFLOW-2077] 获取list_objects_v2响应的所有页面

  • [AIRFLOW-XXX] 将TM添加到公司列表中

  • [AIRFLOW-1985] 修复了使用run_as_user时的身份模拟问题

  • [AIRFLOW-2018][AIRFLOW-2] 使传感器向后兼容

  • [AIRFLOW-XXX] 修复概念文档中的拼写错误 (dag_md)

  • [AIRFLOW-2069] 允许上传字节数据到S3

  • [AIRFLOW-2074] 修复GHE认证中的日志变量名

  • [AIRFLOW-1927] 将TaskInstances中的原生日期时间转换为时区感知日期时间

  • [AIRFLOW-1760] 实验性API的密码认证

  • [AIRFLOW-2038] 为开发环境添加缺失的kubernetes依赖

  • [AIRFLOW-2040] 转义任务实例日志URL中的特殊字符

  • [AIRFLOW-1968][AIRFLOW-1520] 为aws hook重新添加role_arn和aws_account_id/aws_iam_role支持

  • [AIRFLOW-2048] 修复任务实例失败字符串格式化问题

  • [AIRFLOW-2046] 修复kerberos错误以兼容Python 3.x

  • [AIRFLOW-2063] 添加缺失的GCP文档

  • [AIRFLOW-XXX] 修复文档中的拼写错误

  • [AIRFLOW-1793] 使用docker_url替代无效的base_url

  • [AIRFLOW-2055] 详细说明略微模糊的文档

  • [AIRFLOW-2039] BigQueryOperator 支持优先级属性

  • [AIRFLOW-2053] 修复BQ hook中的引号字符错误

  • [AIRFLOW-2057] 将Overstock添加到公司列表中

  • [AIRFLOW-XXX] 将Plaid添加到Airflow用户

  • [AIRFLOW-2044] 将SparkSubmitOperator添加到文档中

  • [AIRFLOW-2037] 添加获取GCS对象哈希值的方法

  • [AIRFLOW-2050] 修复Travis权限问题

  • [AIRFLOW-2043] 将Intercom添加到公司列表中

  • [AIRFLOW-2023] 添加关于排队文件数量的调试日志

  • [AIRFLOW-XXX] 将Pernod-ricard添加为Airflow用户

  • [AIRFLOW-1453] 在EmrAddSteps的template_fields中添加'steps'

  • [AIRFLOW-2015] 添加交互式运行标志

  • [AIRFLOW-1895] 修复MySQL的主键完整性

  • [AIRFLOW-2030] 修复 DbApiHook 中插入操作时的 KeyError: 'i' 错误

  • [AIRFLOW-1943] 添加外部BigQuery表功能

  • [AIRFLOW-2033] 新增Google云存储列表操作器

  • [AIRFLOW-2006] 为kubernetes操作器添加本地日志捕获功能

  • [AIRFLOW-2031] 在DataFlow文档字符串示例中添加缺失的gcp_conn_id参数

  • [AIRFLOW-2029] 修复 BigQueryPandasConnector 中的 AttributeError 错误

  • [AIRFLOW-2028] 将JobTeaser添加到官方用户列表

  • [AIRFLOW-2016] 添加对Dataproc工作流模板的支持

  • [AIRFLOW-2025] 降低日志详细程度

  • [AIRFLOW-1267][AIRFLOW-1874] 为BigQueryHook添加方言参数

  • [AIRFLOW-XXX] 修复了一个拼写错误

  • [AIRFLOW-XXX] 将node更正为nodes

  • [AIRFLOW-2019] 更新DataflowHook以支持流式作业更新

  • [AIRFLOW-2017][Airflow 2017] 为PostgresOperator添加查询输出功能

  • [AIRFLOW-1889] 将传感器拆分为单独的文件

  • [AIRFLOW-1950] 可选传递xcom_pull任务ID

  • [AIRFLOW-1755] 允许挂载到根目录以下

  • [AIRFLOW-511][Airflow 511] 在DAG级别添加成功/失败回调

  • [AIRFLOW-192] 为BaseOperator添加weight_rule参数

  • [AIRFLOW-2008] 使用可调用对象作为Python列的默认值

  • [AIRFLOW-1984] 修复AWS Batch操作符的问题

  • [AIRFLOW-2000] 支持非主数据流作业类

  • [AIRFLOW-2003] 使用flask-caching替代flask-cache

  • [AIRFLOW-2002] 在日志导入时不要吞掉异常

  • [AIRFLOW-2004] 从flask而非flask.login导入flash

  • [AIRFLOW-1997] 修复GCP操作符文档字符串

  • [AIRFLOW-1996] 更新DataflowHook的wait_for_done功能以支持流式作业类型

  • [AIRFLOW-1995][Airflow 1995] 为SqoopOperator添加on_kill方法

  • [AIRFLOW-1770] 允许HiveOperator接收文件

  • [AIRFLOW-1994] 修改已调度状态任务实例的背景色

  • [AIRFLOW-1436][AIRFLOW-1475] EmrJobFlowSensor将已取消的步骤视为成功

  • [AIRFLOW-1517] Kubernetes操作符PR修复

  • [AIRFLOW-1517] 已处理PR评论

  • [AIRFLOW-1517] 开始编写k8s操作符的文档

  • [AIRFLOW-1517] 恢复资源的作者归属

  • [AIRFLOW-1517] 移除资源的作者信息

  • [AIRFLOW-1517] 为Kubernetes集成测试添加minikube

  • [AIRFLOW-1517] 恢复资源的作者身份

  • [AIRFLOW-1517] 修复了许可证问题

  • [AIRFLOW-1517] 为Kubernetes集群问题创建了更准确的故障报告

  • [AIRFLOW-1517] 移除资源的作者信息

  • [AIRFLOW-1517] 为Kubernetes集成测试添加minikube支持

  • [AIRFLOW-1988] 修改None状态任务实例的背景色

  • [AIRFLOW-790] 清理没有DagRuns的TaskInstances

  • [AIRFLOW-1949] 修复变量上传问题,str()生成"b'...'"格式不符合json规范

  • [AIRFLOW-1930] 将func.now()转换为timezone.utcnow()

  • [AIRFLOW-1688] 在bigquery_hook中支持load.time_partitioning

  • [AIRFLOW-1975] 使TriggerDagRunOperator的回调函数变为可选

  • [AIRFLOW-1480] 为ExternalTaskSensor字段渲染模板属性

  • [AIRFLOW-1958] 为send_email添加kwargs参数

  • [AIRFLOW-1976] 修复FileProcessHandler中缺失的log/logger属性

  • [AIRFLOW-1982] 修复Executor事件日志格式问题

  • [AIRFLOW-1971] 在模拟身份时传播hive配置

  • [AIRFLOW-1969] 始终使用HTTPS URI进行Google OAuth2认证

  • [AIRFLOW-1954] 添加DataFlowTemplateOperator

  • [AIRFLOW-1963] 为HiveOperator添加mapred_queue配置

  • [AIRFLOW-1946][AIRFLOW-1855] 创建BigQuery数据获取操作器

  • [AIRFLOW-1953] 为数据流操作器添加标签

  • [AIRFLOW-1967] 将Celery更新至4.0.2版本

  • [AIRFLOW-1964] 将Upsight添加到Airflow用户列表中

  • [AIRFLOW-XXX] 1.9.0版本变更日志

  • [AIRFLOW-1470] 实现BashSensor操作器

  • [AIRFLOW-XXX] 固定sqlalchemy依赖项

  • [AIRFLOW-1955] 不要引用未赋值的变量

  • [AIRFLOW-1957] 在Readme中添加BalanceHero的贡献者

  • [AIRFLOW-1517] 恢复secrets和init container的作者身份

  • [AIRFLOW-1517] 移除密钥和初始化容器的作者属性

  • [AIRFLOW-1935] 在README中添加BalanceHero

  • [AIRFLOW-1939] 添加天文学家贡献者

  • [AIRFLOW-1517] Kubernetes操作器

  • [AIRFLOW-1928] 修复 @once 当 catchup=False 时的问题

  • [AIRFLOW-1937] 通过批量提交加快调度速度

  • [AIRFLOW-1821] 通过移除额外的日志记录器来增强默认日志配置

  • [AIRFLOW-1904] 修正DAG文件位置至正确的文件路径

  • [AIRFLOW-1909] 更新文档中支持的MySQL服务器版本

  • [AIRFLOW-1915] 放宽flask-wtf依赖规范

  • [AIRFLOW-1920] 更新CONTRIBUTING.md以反映强制执行的代码规范检查规则

  • [AIRFLOW-1942] 更新Sphinx文档以移除已弃用的导入结构

  • [AIRFLOW-1846][AIRFLOW-1697] 将临时查询功能隐藏在安全模式配置后

  • [AIRFLOW-1948] 包含关于on_kill失败的详细信息

  • [AIRFLOW-1938] 清理未使用的异常

  • [AIRFLOW-1932] 添加GCP Pub/Sub拉取和确认功能

  • [AIRFLOW-XXX] 清除coveralls

  • [AIRFLOW-XXX] 移除未使用的coveralls令牌

  • [AIRFLOW-1938] 移除 setup.py 中的标签版本检查

  • [AIRFLOW-1916] 不要从run --raw上传日志到远程

  • [AIRFLOW-XXX] 修复Python3上失败的PubSub测试

  • [AIRFLOW-XXX] 升级至 Python 3.5 并禁用 dask 测试

  • [AIRFLOW-1913] 新增GCP PubSub操作符

  • [AIRFLOW-1525] 修复次要的LICENSE和NOTICE问题

  • [AIRFLOW-1687] 修复未加密时的fernet错误

  • [AIRFLOW-1912] airflow.processor 不应传播日志记录

  • [AIRFLOW-1911] 重命名 celeryd_concurrency

  • [AIRFLOW-1885] 修复 ready_prefix_on_cmdline 中的 IndexError 错误

  • [AIRFLOW-1854] 改进Spark Submit操作符以支持独立集群模式

  • [AIRFLOW-1908] 修复Celery代理选项配置加载问题

  • [AIRFLOW-1907] 将max_ingestion_time参数传递给Druid钩子

  • [AIRFLOW-1909] 添加用户列表方式

  • [AIRFLOW-1893][AIRFLOW-1901] 在使用模拟身份时传播PYTHONPATH

  • [AIRFLOW-1892] 修改BQ钩子以按列提取过滤数据

  • [AIRFLOW-1829] 支持查询作业中的模式更新

  • [AIRFLOW-1840] 使celery配置与Celery 4保持一致

  • [AIRFLOW-1878] 修复任务的标准错误/标准输出重定向问题

  • [AIRFLOW-1897][AIRFLOW-1873] 运行实例的任务日志在Web界面中不可见

  • [AIRFLOW-1896] FIX bleach <> html5lib incompatibility

  • [AIRFLOW-1884][AIRFLOW-1059] 重置外部DAG运行中孤立任务的状态

  • [AIRFLOW-XXX] 修复注释中的拼写错误

  • [AIRFLOW-1869] 不再对缺失日志发出多余警告

  • [AIRFLOW-1888] 添加AWS Redshift集群传感器

  • [AIRFLOW-1887] 重命名了端点URL变量

  • [AIRFLOW-1873] 根据任务实例状态设置TI.try_number为正确值

  • [AIRFLOW-1891] 修复默认配置模板中的非ASCII拼写错误

  • [AIRFLOW-1879] 在ti内部完全处理ti日志

  • [AIRFLOW-1869] 将更多错误信息写入GCS和文件日志

  • [AIRFLOW-1876] 将子任务ID写入任务日志头部

  • [AIRFLOW-1554] 修复错误的DagFileProcessor终止方法调用

  • [AIRFLOW-342] 不要使用amqp、rpc作为结果后端

  • [AIRFLOW-966] 使celery broker_transport_options可配置

  • [AIRFLOW-1881] 将操作日志记录到任务日志中

  • [AIRFLOW-XXX] 将DataReply添加到Airflow用户列表中

  • [AIRFLOW-1883] 获取Google云存储中对象文件大小

  • [AIRFLOW-1872] 为所有处理器(包括父级)设置上下文

  • [AIRFLOW-1855][AIRFLOW-1866] 添加GCS复制操作符以复制多个文件

  • [AIRFLOW-1870] 启用flake8测试

  • [AIRFLOW-1785] 启用Python 3测试

  • [AIRFLOW-1850] 在屏蔽前复制命令

  • [AIRFLOW-1665] 在数据库错误时重新连接

  • [AIRFLOW-1559] 退出时销毁SQLAlchemy引擎

  • [AIRFLOW-1559] 关闭子进程中的文件句柄

  • [AIRFLOW-1559] 使数据库连接池成为可选配置

  • [AIRFLOW-1848][Airflow-1848] 修复DataFlowPythonOperator中py_file扩展名的文档注释

  • [AIRFLOW-1843] 添加支持前缀的Google云存储传感器

  • [AIRFLOW-1803] 时区文档

  • [AIRFLOW-1826] 更新视图以使用时区感知对象

  • [AIRFLOW-1827] 修复API端点日期解析问题

  • [AIRFLOW-1806] 使用cron时采用原生日期时间

  • [AIRFLOW-1809] 更新测试以使用时区感知对象

  • [AIRFLOW-1806] 使用原生日期时间进行cron调度

  • [AIRFLOW-1807] 强制使用时区感知的数据库字段

  • [AIRFLOW-1808] 将所有utcnow()转换为时区感知

  • [AIRFLOW-1804] 添加时区配置选项

  • [AIRFLOW-1802] 将数据库字段转换为时区感知

  • [AIRFLOW-XXX] 将dask锁定文件添加到排除项

  • [AIRFLOW-1790] 添加对AWS Batch操作符的支持

  • [AIRFLOW-XXX] 更新README.md文件

  • [AIRFLOW-1820] 从指标名称中移除时间戳

  • [AIRFLOW-1810] 移除迁移中未使用的mysql导入。

  • [AIRFLOW-1838] 正确记录collect_dags异常

  • [AIRFLOW-1842] 修复了GCS到GCS复制操作符的超类名称

  • [AIRFLOW-1845] 模态背景现在可以覆盖长页面或高页面

  • [AIRFLOW-1229] 添加指向运行ID的链接,包含执行日期

  • [AIRFLOW-1842] 添加GCS到GCS的复制操作符,支持按需重命名

  • [AIRFLOW-1841] 在operator和hook中将False改为None

  • [AIRFLOW-1839] 修复S3Hook中boto迁移至boto3的更多bug

  • [AIRFLOW-1830] 在Google认证后端支持多域名

  • [AIRFLOW-1831] 添加驱动类路径 spark提交

  • [AIRFLOW-1795] 迁移至boto3后正确调用S3Hook

  • [AIRFLOW-1811] 修复渲染Druid操作符

  • [AIRFLOW-1819] 修复slack操作器的单元测试bug

  • [AIRFLOW-1805] 允许通过连接传递Slack令牌

  • [AIRFLOW-1816] 为Dataproc操作符添加region参数

  • [AIRFLOW-868] 添加postgres_to_gcs操作符及单元测试

  • [AIRFLOW-1613] 使mysql_to_gcs_operator兼容py3

  • [AIRFLOW-1817] 使用boto3作为s3依赖

  • [AIRFLOW-1813] 修复SSH操作符空缓冲区问题

  • [AIRFLOW-1801][AIRFLOW-288] 对执行日期进行URL编码

  • [AIRFLOW-1563] 在符号链接最新日志目录时捕获OSError

  • [AIRFLOW-1794] 移除对Python 3中Exception.message的使用

  • [AIRFLOW-1799] 修复导致错误的日志行

  • [AIRFLOW-1102] 升级gunicorn至19.4.0或更高版本

  • [AIRFLOW-1756] 修复S3TaskHandler以兼容基于Boto3的S3Hook

  • [AIRFLOW-1797] S3Hook.load_string 在Python3上无法工作

  • [AIRFLOW-646] 将docutils添加到setup_requires中

  • [AIRFLOW-1792] DruidOperator缺少时间间隔

  • [AIRFLOW-1789][AIRFLOW-1712] 将SSHOperator的标准错误输出记录为log.warning

  • [AIRFLOW-1787] 修复任务实例批量清除和设置状态的错误

  • [AIRFLOW-1780] 修复因父进程中的Unicode导致长输出行挂起的问题

  • [AIRFLOW-387] 正确关闭SQLAlchemy会话

  • [AIRFLOW-1779] 为ssh钩子添加keepalive数据包

  • [AIRFLOW-1669] 修复Docker并锁定moto版本至1.1.19

  • [AIRFLOW-71] 添加对私有Docker镜像的支持

  • [AIRFLOW-XXX] 说明'ds'变量的含义

  • [AIRFLOW-XXX] 修正常见问题文档页面中的拼写错误

  • [AIRFLOW-1571] 添加AWS Lambda Hook

  • [AIRFLOW-1675] 修复API文档的docstrings

  • [AIRFLOW-1712][AIRFLOW-756][AIRFLOW-751] 记录SSHOperator输出日志

  • [AIRFLOW-1776] 捕获标准输出和标准错误用于日志记录

  • [AIRFLOW-1765] 使实验性API无需Kerberos即可实现安全保护。

  • [AIRFLOW-1764] 网页界面不应使用实验性API

  • [AIRFLOW-1771] 将heartbeat重命名以避免混淆

  • [AIRFLOW-1769] 为VirtualenvOperator添加模板支持

  • [AIRFLOW-1763] 修复S3TaskHandler单元测试

  • [AIRFLOW-1315] 新增Qubole文件与分区传感器

  • [AIRFLOW-1018] 让处理器使用日志框架

  • [AIRFLOW-1695] 使用boto3添加RedshiftHook

  • [AIRFLOW-1706] 修复MSSQL后端的查询错误

  • [AIRFLOW-1711] 使用ldap3字典实现群组成员关系

  • [AIRFLOW-1723] 将sendgrid设为插件

  • [AIRFLOW-1757] 为SparkSubmitOperator添加缺失的选项

  • [AIRFLOW-1734][Airflow 1734] Sqoop钩子/操作符增强

  • [AIRFLOW-1761] 修复 scheduler.rst 中的拼写错误

  • [AIRFLOW-1731] 为日志设置python路径

  • [AIRFLOW-1641] 在调度器中处理执行器事件

  • [AIRFLOW-1744] 确保可以设置max_tries

  • [AIRFLOW-1732] 改进数据流钩子的日志记录

  • [AIRFLOW-1736] 将HotelQuickly添加到谁在使用Airflow

  • [AIRFLOW-1657] 处理失败的Qubole操作符

  • [AIRFLOW-1677] 修复example_qubole_operator中的拼写错误

  • [AIRFLOW-926] 修复JDBC Hook

  • [AIRFLOW-1520] Boto3 S3Hook, S3Log

  • [AIRFLOW-1716] 修复SimpleDag中的多个__init__定义

  • [AIRFLOW-XXX] 修复树状视图中的日期时间问题

  • [AIRFLOW-1719] 修复小拼写错误

  • [AIRFLOW-1432] 图表Y轴标签不可见

  • [AIRFLOW-1743] 验证ldap过滤器是否正确

  • [AIRFLOW-1745] 恢复默认信号处理方式

  • [AIRFLOW-1741] 正确隐藏任务持续时间页面上的第二个图表

  • [AIRFLOW-1728] 为Dataproc操作器添加networkUri、subnet和tags参数

  • [AIRFLOW-1726] 在PostgresHook中添加copy_expert psycopg2方法

  • [AIRFLOW-1330] 在添加连接时为CLI添加conn_type参数

  • [AIRFLOW-1698] 在systemd中移除SCHEDULER_RUNS环境变量

  • [AIRFLOW-1694] 停止使用itertools.izip

  • [AIRFLOW-1692] 修改test_views文件名以支持Windows系统

  • [AIRFLOW-1722] 修复调度器自动重启输出文件名中的拼写错误

  • [AIRFLOW-1723] 在邮件后端支持sendgrid

  • [AIRFLOW-1718] 在Dataproc作业请求执行上设置num_retries

  • [AIRFLOW-1727] 为DataProcHook添加单元测试

  • [AIRFLOW-1631] 修复单元测试中的时序问题

  • [AIRFLOW-1631] 修复本地执行器无限制并行度问题

  • [AIRFLOW-1724] 将Fundera添加到"谁在使用Airflow?"列表中

  • [AIRFLOW-1683] 在超时时取消BigQuery作业。

  • [AIRFLOW-1714] 修复拼写错误: s/separate/separate/

  • [AIRFLOW-1681] 在任务实例视图中添加批量清除功能

  • [AIRFLOW-1696] 修复dataproc版本标签错误

  • [AIRFLOW-1613] 在MySqlToGoogleCloudStorageOperator中处理二进制字段

  • [AIRFLOW-1697] 禁用图表端点的模式

  • [AIRFLOW-1691] 添加更完善的Google云日志记录文档

  • [AIRFLOW-1690] 为GCS错误消息添加详细信息

  • [AIRFLOW-1682] 让S3TaskHandler在关闭时写入S3

  • [AIRFLOW-1634] 新增任务并发特性

  • [AIRFLOW-1676] 使GCSTaskHandler在关闭时写入GCS

  • [AIRFLOW-1678] 修复函数文档字符串中错误重复的单词

  • [AIRFLOW-1323] 统一了Dataproc操作符的参数命名

  • [AIRFLOW-1590] 修复未使用的模块和变量

  • [AIRFLOW-1671] 将@apply_defaults重新添加回gcs下载操作符

  • [AIRFLOW-988] 修复重复的SLA未命中回调

  • [AIRFLOW-1611] 自定义日志记录

  • [AIRFLOW-1668] 为Postgres连接暴露keepalives_idle参数

  • [AIRFLOW-1658] Druid任务超时时终止

  • [AIRFLOW-1669][AIRFLOW-1368] 修复Docker导入问题

  • [AIRFLOW-891] 让网页服务器时钟显示日期

  • [AIRFLOW-1560] 添加用于批量插入项目的AWS DynamoDB钩子和操作器

  • [AIRFLOW-1654] 在DAG视图中显示链接图标的工具提示

  • [AIRFLOW-1660] 将网页宽度改为全宽

  • [AIRFLOW-1664] 以二进制而非字符串形式写入文件

  • [AIRFLOW-1659] 修复file_task_handler.py中的无效obj属性错误

  • [AIRFLOW-1635] 允许创建GCP连接时无需JSON文件

  • [AIRFLOW-1650] 修复自定义Celery配置加载问题

  • [AIRFLOW-1647] 修复Spark-sql钩子

  • [AIRFLOW-1587] 修复 CeleryExecutor 导入错误

  • [Airflow-1640][AIRFLOW-1640] 添加Qubole默认连接

  • [AIRFLOW-1576] 为Dataproc{*}Operators添加了region参数

  • [AIRFLOW-1643] 将healthjump添加到官方使用列表

  • [AIRFLOW-1626] 将Azri Solutions添加到Airflow用户列表

  • [AIRFLOW-1636] 添加AWS和EMR连接类型

  • [AIRFLOW-1527] 重构celery配置

  • [AIRFLOW-1639] 修复Fernet错误处理

  • [AIRFLOW-1637] 修复Travis CI构建状态链接

  • [AIRFLOW-1628] 修复sqlsensor的文档字符串

  • [AIRFLOW-1331] 添加SparkSubmitOperator选项

  • [AIRFLOW-1627] 仅在必要时在SubDAG初始化时查询池

  • [AIRFLOW-1629] 在编辑连接表单中将extra字段设为文本区域

  • [AIRFLOW-1368] 退出时自动移除Docker容器

  • [AIRFLOW-289] 使Airflow时区独立

  • [AIRFLOW-1356] 在 airflow worker 中添加 --celery_hostname 参数

  • [AIRFLOW-1247] 修复忽略所有依赖项参数的问题

  • [AIRFLOW-1621] 添加服务器端分页测试

  • [AIRFLOW-1591] 渲染日志文件名时避免属性错误

  • [AIRFLOW-1031] 将硬编码替换为DagRun.ID_PREFIX

  • [AIRFLOW-1604] 将logger重命名为log

  • [AIRFLOW-1512] 新增PythonVirtualenvOperator

  • [AIRFLOW-1617] 修复变量端点中的XSS漏洞

  • [AIRFLOW-1497] 切换连接类型时重置隐藏字段

  • [AIRFLOW-1619] 为GCP数据流操作器添加poll_sleep参数

  • [AIRFLOW-XXX] 移除landscape.io配置

  • [AIRFLOW-XXX] 移除无效的服务徽章

  • [AIRFLOW-1177] 修复 Variable.setdefault 在已有 JSON 时的处理

  • [AIRFLOW-1600] 修复get_fernet中的异常处理

  • [AIRFLOW-1614] 用 sys._getframe() 替换 inspect.stack()

  • [AIRFLOW-1519] 在DAG列表中添加服务器端分页

  • [AIRFLOW-1309] 允许hive_to_druid接收tblproperties参数

  • [AIRFLOW-1613] 使MySqlToGoogleCloudStorageOperator兼容python3

  • [AIRFLOW-1603] 将PAYMILL添加到公司列表

  • [AIRFLOW-1609] 修复gitignore以忽略所有venvs

  • [AIRFLOW-1601] 添加可配置的任务清理时间

Airflow 1.9.0 (2018-01-02)

重大变更

SSH Hook更新,以及新增的SSH Operator和SFTP Operator

SSH Hook 现在使用 Paramiko 库来创建 ssh 客户端连接,而不是之前基于子进程的 ssh 命令执行方式(<1.9.0 版本),因此这是向后不兼容的变更。

  • 更新SSHHook构造函数

  • 使用SSHOperator类替代已被移除的SSHExecuteOperator。具体用法请参考test_ssh_operator.py文件。

  • 新增了SFTPOperator用于安全地从服务器A传输文件到服务器B。使用说明请参考test_sftp_operator.py。

  • 如果您正在使用ftpHook,则无需进行任何更新,它将继续按原样工作。

S3Hook 已切换为使用 Boto3

airflow.hooks.S3_hook.S3Hook 已切换为使用 boto3 替代旧版的 boto(也称为 boto2)。这导致以下类出现一些向后不兼容的变更:S3Hook:

  • 构造函数不再接受 s3_conn_id。现在改名为 aws_conn_id

  • 默认连接现在改为"aws_default"而非"s3_default"

  • get_bucket 方法返回的对象类型现在是 boto3.s3.Bucket

  • get_keyget_wildcard_key 的返回类型现在是 boto3.S3.Object。

如果在您的DAG中使用以下任何组件并指定了连接ID,您需要将连接参数名称更新为"aws_conn_id":S3ToHiveTransfer、S3PrefixSensor、S3KeySensor、RedshiftToS3Transfer。

日志更新

Airflow的日志结构已重新设计,使配置更简单且日志系统更透明。

关于日志记录的快速回顾

日志记录器是进入日志系统的入口点。每个日志记录器都是一个命名的容器,可以向其中写入消息进行处理。日志记录器被配置为具有一个日志级别,该级别描述了日志记录器将处理的消息的严重程度。Python定义了以下日志级别:DEBUG、INFO、WARNING、ERROR或CRITICAL。

写入日志记录器的每条消息都是一个日志记录。每条日志记录包含一个日志级别,用于指示该特定消息的严重程度。日志记录还可以包含描述被记录事件的有用元数据。这可能包括堆栈跟踪或错误代码等详细信息。

当向日志记录器传递消息时,会将消息的日志级别与日志记录器的日志级别进行比较。如果消息的日志级别达到或超过日志记录器自身的日志级别,则该消息会进行进一步处理。如果未达到,则该消息将被忽略。

一旦日志记录器确定某条消息需要被处理,就会将其传递给处理器。现在的配置更加灵活,可以轻松在单个文件中维护。

Airflow日志记录变更

Airflow的日志记录机制已重构为使用Python内置的logging模块来执行应用程序的日志记录。通过使用现有的LoggingMixin扩展类,所有日志都将通过中央记录器处理。此外,BaseHookBaseOperator已经扩展了该类,因此可以轻松进行日志记录。

主要优势是通过设置一个集中的Python文件来简化日志配置。免责声明:目前仍有一些内联配置,但最终会被移除。新的日志类通过在~/airflow/airflow.cfg文件中设置点分路径来定义:

# Logging class
# Specify the class that will specify the logging configuration
# This class has to be on the python classpath
logging_config_class = my.path.default_local_settings.LOGGING_CONFIG

日志配置文件需要位于PYTHONPATH中,例如$AIRFLOW_HOME/config。该目录默认会被加载。可以将任何目录添加到PYTHONPATH中,这在配置文件位于其他目录或Docker情况下挂载卷时可能会很方便。

配置可以从airflow/config_templates/airflow_local_settings.py作为起点开始。将内容复制到${AIRFLOW_HOME}/config/airflow_local_settings.py,并根据偏好修改配置。

#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

import os

from airflow import configuration as conf

# TODO: Logging format and level should be configured
# in this file instead of from airflow.cfg. Currently
# there are other log format and level configurations in
# settings.py and cli.py. Please see AIRFLOW-1455.

LOG_LEVEL = conf.get('core', 'LOGGING_LEVEL').upper()
LOG_FORMAT = conf.get('core', 'log_format')

BASE_LOG_FOLDER = conf.get('core', 'BASE_LOG_FOLDER')
PROCESSOR_LOG_FOLDER = conf.get('scheduler', 'child_process_log_directory')

FILENAME_TEMPLATE = '{{ ti.dag_id }}/{{ ti.task_id }}/{{ ts }}/{{ try_number }}.log'
PROCESSOR_FILENAME_TEMPLATE = '{{ filename }}.log'

DEFAULT_LOGGING_CONFIG = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'airflow.task': {
            'format': LOG_FORMAT,
        },
        'airflow.processor': {
            'format': LOG_FORMAT,
        },
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'formatter': 'airflow.task',
            'stream': 'ext://sys.stdout'
        },
        'file.task': {
            'class': 'airflow.utils.log.file_task_handler.FileTaskHandler',
            'formatter': 'airflow.task',
            'base_log_folder': os.path.expanduser(BASE_LOG_FOLDER),
            'filename_template': FILENAME_TEMPLATE,
        },
        'file.processor': {
            'class': 'airflow.utils.log.file_processor_handler.FileProcessorHandler',
            'formatter': 'airflow.processor',
            'base_log_folder': os.path.expanduser(PROCESSOR_LOG_FOLDER),
            'filename_template': PROCESSOR_FILENAME_TEMPLATE,
        }
        # When using s3 or gcs, provide a customized LOGGING_CONFIG
        # in airflow_local_settings within your PYTHONPATH, see UPDATING.md
        # for details
        # 's3.task': {
        #     'class': 'airflow.utils.log.s3_task_handler.S3TaskHandler',
        #     'formatter': 'airflow.task',
        #     'base_log_folder': os.path.expanduser(BASE_LOG_FOLDER),
        #     's3_log_folder': S3_LOG_FOLDER,
        #     'filename_template': FILENAME_TEMPLATE,
        # },
        # 'gcs.task': {
        #     'class': 'airflow.utils.log.gcs_task_handler.GCSTaskHandler',
        #     'formatter': 'airflow.task',
        #     'base_log_folder': os.path.expanduser(BASE_LOG_FOLDER),
        #     'gcs_log_folder': GCS_LOG_FOLDER,
        #     'filename_template': FILENAME_TEMPLATE,
        # },
    },
    'loggers': {
        '': {
            'handlers': ['console'],
            'level': LOG_LEVEL
        },
        'airflow': {
            'handlers': ['console'],
            'level': LOG_LEVEL,
            'propagate': False,
        },
        'airflow.processor': {
            'handlers': ['file.processor'],
            'level': LOG_LEVEL,
            'propagate': True,
        },
        'airflow.task': {
            'handlers': ['file.task'],
            'level': LOG_LEVEL,
            'propagate': False,
        },
        'airflow.task_runner': {
            'handlers': ['file.task'],
            'level': LOG_LEVEL,
            'propagate': True,
        },
    }
}

要自定义日志记录(例如使用日志轮转),请定义一个或多个Python提供的日志处理器。有关Python日志记录的更多详细信息,请参阅官方日志文档

此外,这一变更还简化了DAG内部的日志记录:

root@ae1bc863e815:/airflow# python
Python 3.6.2 (default, Sep 13 2017, 14:26:54)
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from airflow.settings import *
>>>
>>> from datetime import datetime
>>> from airflow.models.dag import DAG
>>> from airflow.operators.dummy import DummyOperator
>>>
>>> dag = DAG('simple_dag', start_date=datetime(2017, 9, 1))
>>>
>>> task = DummyOperator(task_id='task_1', dag=dag)
>>>
>>> task.log.error('I want to say something..')
[2017-09-25 20:17:04,927] {<stdin>:1} ERROR - I want to say something..
文件任务处理器的模板路径

file_task_handler日志记录器变得更加灵活。默认格式{dag_id}/{task_id}/{execution_date}/{try_number}.log可以通过在配置变量FILENAME_TEMPLATE中提供Jinja模板来修改。更多信息请参阅file_task_handler

我正在使用S3Log或GCSLogs,我该怎么办!?

如果您要登录Google云存储,请参阅Google云平台文档获取登录说明。

如果您使用的是S3,操作说明与上述Google云平台指南大致相同。您需要一个自定义的日志配置。airflow配置中的REMOTE_BASE_LOG_FOLDER配置项已被移除,因此您需要执行以下步骤:

  • airflow/config_templates/airflow_logging_settings.py复制日志配置。

  • 将其放置在Python导入路径PYTHONPATH内的目录中。如果您使用的是Python 2.7,请确保存在__init__.py文件以便可以导入。

  • 通过显式设置配置中REMOTE_BASE_LOG_FOLDER的路径来更新配置。REMOTE_BASE_LOG_FOLDER键已不再使用。

  • logging_config_class设置为文件名和字典。例如,如果您将custom_logging_config.py放在PYTHONPATH的根目录下,您需要在配置中设置logging_config_class = custom_logging_config.LOGGING_CONFIG,就像在Airflow 1.8中一样。

新功能

Dask 执行器

新的DaskExecutor允许Airflow任务在Dask分布式集群中运行。

已弃用的功能

这些功能已被标记为弃用。它们可能仍然有效(并引发DeprecationWarning),但不再受支持,并将在Airflow 2.0中完全移除

  • 如果您在contrib.operators.Dataproc{*}Operator中显式使用参数名google_cloud_conn_iddataproc_cluster,请确保将它们分别重命名为gcp_conn_idcluster_name。为了保持一致性,我们已重命名这些参数。(AIRFLOW-1323)

  • post_execute() 钩子现在接受两个参数,contextresult (AIRFLOW-886)

    之前,post_execute() 只接受一个参数 context

  • contrib.hooks.gcp_dataflow_hook.DataFlowHook 开始使用 --runner=DataflowRunner 而不是 DataflowPipelineRunner,后者已从 google-cloud-dataflow-0.6.0 包中移除。

  • XCom消息的pickle类型已被替换为json以防止RCE攻击。 请注意JSON序列化比pickling更严格,因此如果您想通过XCom传递原始字节等数据,必须使用base64等编码方式进行编码。 默认情况下pickling在Airflow 2.0之前仍保持启用状态。要禁用它, 请在您的Airflow配置中设置enable_xcom_pickling = False。

更新日志

  • [AIRFLOW-1525] 修复次要的LICENSE和NOTICE问题

  • [AIRFLOW-XXX] 版本升级至1.9.0

  • [AIRFLOW-1897][AIRFLOW-1873] 运行实例的任务日志在Web界面中不可见

  • [AIRFLOW-XXX] 确保会话已提交

  • [AIRFLOW-1896] FIX bleach <> html5lib incompatibility

  • [AIRFLOW-XXX] 修复日志处理器测试

  • [AIRFLOW-1873] 根据任务实例状态设置TI.try_number为正确值

  • [AIRFLOW-1554] 修复错误的DagFileProcessor终止方法调用

  • [AIRFLOW-1872] 为所有处理器(包括父级)设置上下文

  • [AIRFLOW-XXX] 将dask锁定文件添加到排除项

  • [AIRFLOW-1839] 修复S3Hook中boto迁移至boto3的更多bug

  • [AIRFLOW-1795] 迁移至boto3后正确调用S3Hook

  • [AIRFLOW-1813] 修复SSH操作符空缓冲区问题

  • [AIRFLOW-1794] 移除对Python 3中Exception.message的使用

  • [AIRFLOW-1799] 修复导致错误的日志行

  • [AIRFLOW-1102] 升级gunicorn至19.4.0或更高版本

  • [AIRFLOW-1756] 修复S3TaskHandler以兼容基于Boto3的S3Hook

  • [AIRFLOW-1797] S3Hook.load_string 在Python3上无法工作

  • [AIRFLOW-1792] DruidOperator缺少时间间隔

  • [AIRFLOW-1789][AIRFLOW-1712] 将SSHOperator的标准错误输出记录为log.warning

  • [AIRFLOW-1669] 修复Docker并锁定Moto版本至1.1.19

  • [AIRFLOW-71] 添加对私有Docker镜像的支持

  • [AIRFLOW-1779] 为ssh钩子添加keepalive数据包

  • [AIRFLOW-XXX] 说明'ds'变量的含义

  • [AIRFLOW-XXX] 修正常见问题文档页面中的拼写错误

  • [AIRFLOW-1571] 添加AWS Lambda Hook

  • [AIRFLOW-1675] 修复API文档的docstrings

  • [AIRFLOW-1712][AIRFLOW-756][AIRFLOW-751] 记录SSHOperator输出日志

  • [AIRFLOW-1776] 捕获标准输出和标准错误用于日志记录

  • [AIRFLOW-1765] 使实验性API无需Kerberos即可实现安全保护。

  • [AIRFLOW-1764] 网页界面不应使用实验性API

  • [AIRFLOW-1634] 新增任务并发特性

  • [AIRFLOW-1018] 让处理器使用日志框架

  • [AIRFLOW-1695] 使用boto3添加RedshiftHook

  • [AIRFLOW-1706] 修复MSSQL后端的查询错误

  • [AIRFLOW-1711] 使用ldap3字典实现群组成员关系

  • [AIRFLOW-1757] 为SparkSubmitOperator添加缺失的选项

  • [AIRFLOW-1734][Airflow 1734] Sqoop钩子/操作符增强

  • [AIRFLOW-1731] 为日志设置python路径

  • [AIRFLOW-1641] 在调度器中处理执行器事件

  • [AIRFLOW-1744] 确保可以设置max_tries

  • [AIRFLOW-1330] 在添加连接时为CLI添加conn_type参数

  • [AIRFLOW-926] 修复JDBC Hook

  • [AIRFLOW-1520] Boto3 S3Hook, S3Log

  • [AIRFLOW-XXX] 修复树状视图中的日期时间问题

  • [AIRFLOW-1432] 图表Y轴标签不可见

  • [AIRFLOW-1743] 验证ldap过滤器是否正确

  • [AIRFLOW-1745] 恢复默认信号处理方式

  • [AIRFLOW-1741] 正确隐藏任务持续时间页面上的第二个图表

  • [AIRFLOW-1726] 在PostgresHook中添加copy_expert psycopg2方法

  • [AIRFLOW-1698] 在systemd中移除SCHEDULER_RUNS环境变量

  • [AIRFLOW-1694] 停止使用itertools.izip

  • [AIRFLOW-1692] 修改test_views文件名以支持Windows系统

  • [AIRFLOW-1722] 修复调度器自动重启输出文件名中的拼写错误

  • [AIRFLOW-1691] 添加更好的Google Cloud日志记录文档

  • [AIRFLOW-1690] 为GCS错误消息添加详细信息

  • [AIRFLOW-1682] 让S3TaskHandler在关闭时写入S3

  • [AIRFLOW-1676] 使GCSTaskHandler在关闭时写入GCS

  • [AIRFLOW-1635] 允许创建GCP连接时无需JSON文件

  • [AIRFLOW-1323] 统一了Dataproc操作符的参数命名

  • [AIRFLOW-1590] 修复未使用的模块和变量

  • [AIRFLOW-988] 修复重复的SLA未命中回调

  • [AIRFLOW-1611] 自定义日志记录

  • [AIRFLOW-1668] 为Postgres连接暴露keepalives_idle参数

  • [AIRFLOW-1658] Druid任务超时时终止

  • [AIRFLOW-1669][AIRFLOW-1368] 修复Docker导入问题

  • [AIRFLOW-1560] 添加用于批量插入项目的AWS DynamoDB钩子和操作器

  • [AIRFLOW-1654] 在DAG视图中显示链接图标的工具提示

  • [AIRFLOW-1660] 将网页宽度改为全宽

  • [AIRFLOW-1664] 以二进制而非字符串形式写入文件

  • [AIRFLOW-1659] 修复file_task_handler.py中的无效obj属性错误

  • [AIRFLOW-1650] 修复自定义Celery配置加载问题

  • [AIRFLOW-1647] 修复Spark-sql钩子

  • [AIRFLOW-1587] 修复 CeleryExecutor 导入错误

  • [AIRFLOW-1636] 添加AWS和EMR连接类型

  • [AIRFLOW-1527] 重构celery配置

  • [AIRFLOW-1639] 修复Fernet错误处理

  • [AIRFLOW-1628] 修复sqlsensor的文档字符串

  • [AIRFLOW-1331] 添加SparkSubmitOperator选项

  • [AIRFLOW-1627] 仅在必要时在SubDAG初始化时查询池

  • [AIRFLOW-1629] 在编辑连接表单中将extra字段设为文本区域

  • [AIRFLOW-1621] 添加服务器端分页测试

  • [AIRFLOW-1519] 在DAG列表中添加服务器端分页

  • [AIRFLOW-289] 使Airflow时区独立

  • [AIRFLOW-1356] 在 airflow worker 中添加 --celery_hostname 参数

  • [AIRFLOW-1591] 渲染日志文件名时避免属性错误

  • [AIRFLOW-1031] 将硬编码替换为DagRun.ID_PREFIX

  • [AIRFLOW-1604] 将logger重命名为log

  • [AIRFLOW-1512] 新增PythonVirtualenvOperator

  • [AIRFLOW-1617] 修复变量端点中的XSS漏洞

  • [AIRFLOW-1497] 切换连接类型时重置隐藏字段

  • [AIRFLOW-1177] 修复 Variable.setdefault 在已有 JSON 时的处理

  • [AIRFLOW-1600] 修复get_fernet中的异常处理

  • [AIRFLOW-1614] 用 sys._getframe() 替换 inspect.stack()

  • [AIRFLOW-1613] 使MySqlToGoogleCloudStorageOperator兼容python3

  • [AIRFLOW-1609] 修复gitignore以忽略所有venvs

  • [AIRFLOW-1601] 添加可配置的任务清理时间

  • [AIRFLOW-XXX] 升级 airflow 1.9.0alpha0 版本

  • [AIRFLOW-1608] 在GCP Dataflow钩子中处理待处理作业状态

  • [AIRFLOW-1606] 使用非静态的DAG.sync_to_db方法

  • [AIRFLOW-1606][Airflow-1606][AIRFLOW-1605][AIRFLOW-160] DAG.sync_to_db 现在是一个普通方法

  • [AIRFLOW-1602] DAG类中的LoggingMixin

  • [AIRFLOW-1593] 在WasbHook中暴露load_string方法

  • [AIRFLOW-1597] 将GameWisp添加为Airflow用户

  • [AIRFLOW-1594] 不要将测试包安装到Python根目录下。

  • [AIRFLOW-1582] 改进Airflow内部的日志记录

  • [AIRFLOW-1476] 为源码发布版本添加安装说明

  • [AIRFLOW-XXX] 在airflow-pr中保存用户名和密码

  • [AIRFLOW-1522] 增大MySQL变量表中var字段的文本长度

  • [AIRFLOW-950] 文档中缺少AWS集成::integrations

  • [AIRFLOW-XXX] 1.8.2 版本发布说明

  • [AIRFLOW-1573] 移除 thrift < 0.10.0 依赖要求

  • [AIRFLOW-1584] 移除不安全的/headers端点

  • [AIRFLOW-1586] 为mysql_to_gcs操作符添加日期类型映射

  • [AIRFLOW-1579] 为BigQuery钩子中的BQ加载任务添加了对不规则行的支持

  • [AIRFLOW-1577] 为DatabricksHook添加令牌支持

  • [AIRFLOW-1580] 字符串格式化错误

  • [AIRFLOW-1567] 更新了Google ML Engine操作符/钩子的文档

  • [AIRFLOW-1574] 为邮件操作符的模板变量添加'to'属性

  • [AIRFLOW-1572] 将carbonite添加到公司列表

  • [AIRFLOW-1568] 修复 BigQueryHook 中的拼写错误

  • [AIRFLOW-1493][AIRFLOW-XXXX][WIP] 修复了愚蠢的问题

  • [AIRFLOW-1567][Airflow-1567] 将cloudml钩子和操作符重命名为mlengine

  • [AIRFLOW-1568] 添加数据存储导出/导入操作器

  • [AIRFLOW-1564] 使用Jinja2渲染日志文件名

  • [AIRFLOW-1562] Spark-sql日志记录中存在死锁

  • [AIRFLOW-1556][Airflow 1556] 在BigQueryBaseCursor中添加对SQL参数的支持

  • [AIRFLOW-108] 将CreditCards.com添加至公司列表

  • [AIRFLOW-1541] 将频道添加到slack_operator的模板字段中

  • [AIRFLOW-1535] 在dataproc中添加服务账号/作用域

  • [AIRFLOW-1384] 在README.md中添加CaDC/ARGO

  • [AIRFLOW-1546] 在README的机构列表中添加Zymergen 80

  • [AIRFLOW-1545] 将Nextdoor添加至公司列表

  • [AIRFLOW-1544] 将DataFox添加到公司列表

  • [AIRFLOW-1529] 添加支持Google BigQuery加载任务中带引号的换行符的逻辑

  • [AIRFLOW-1521] 修复 BigqueryTableDeleteOperator 的模板渲染问题

  • [AIRFLOW-1324] 通用化Druid操作器和钩子

  • [AIRFLOW-1516] 修复获取fernet时的错误处理

  • [AIRFLOW-1420][AIRFLOW-1473] 修复死锁检查

  • [AIRFLOW-1495] 修复job_id索引迁移问题

  • [AIRFLOW-1483] 使列表中的页面尺寸保持一致

  • [AIRFLOW-1495] 添加基于job_id的TaskInstance索引

  • [AIRFLOW-855] 在XCom中用LargeBinary替换PickleType

  • [AIRFLOW-1505] 记录Jinja模板替换发生的时机

  • [AIRFLOW-1504] 记录Dataproc集群名称

  • [AIRFLOW-1239] 修复base_task_runner中日志的Unicode错误

  • [AIRFLOW-1280] 修复甘特图高度问题

  • [AIRFLOW-1507] file_to_gcs操作器中的模板参数

  • [AIRFLOW-1452] 解决方法锁定方法

  • [AIRFLOW-1385] 使Airflow任务日志可配置

  • [AIRFLOW-940] 处理变量解密时的错误

  • [AIRFLOW-1492] 添加任务成功/失败的指标

  • [AIRFLOW-1443] 更新Airflow配置文档

  • [AIRFLOW-1486] 意外的S3写入日志错误

  • [AIRFLOW-1487] 添加了所有官方使用Airflow的公司的链接

  • [AIRFLOW-1489] 修复 BigQueryCheckOperator 中的拼写错误

  • [AIRFLOW-1349] 修复回填功能以遵守限制

  • [AIRFLOW-1478] 图表所有者列应支持排序

  • [AIRFLOW-1397][AIRFLOW-1] 在airflow UI 1.8.1版本中没有显示"最后运行"列数据

  • [AIRFLOW-1474] 为airflow clear命令添加dag_id正则表达式功能

  • [AIRFLOW-1445] 将HivePartitionSensor UI颜色改为更浅的色调

  • [AIRFLOW-1359] 在Cloud ML评估中使用default_args

  • [AIRFLOW-1389] 在BigQueryOperator中支持createDisposition

  • [AIRFLOW-1349] 重构 BackfillJob _execute

  • [AIRFLOW-1459] 修复了集成文档.rst格式损坏的问题

  • [AIRFLOW-1448] 回滚“修复cli读取日志文件内存问题”

  • [AIRFLOW-1398] 允许ExternalTaskSensor等待一个任务的多次运行

  • [AIRFLOW-1399] 修复cli读取日志文件时占用内存的问题

  • [AIRFLOW-1442] 移除ignore_all_deps生成命令中的多余空格

  • [AIRFLOW-1438] 修改调度器中每查询的批量大小

  • [AIRFLOW-1439] 为BQ Hook和Operator添加最大计费层级

  • [AIRFLOW-1437] 修改BigQueryTableDeleteOperator

  • [Airflow 1332] 根据尝试次数拆分日志

  • [AIRFLOW-1385] 为Airflow任务日志创建抽象层

  • [AIRFLOW-756][AIRFLOW-751] 将ssh钩子、操作符和sftp操作符替换为基于paramiko的实现

  • [AIRFLOW-1393][[AIRFLOW-1393] 在contrib/spark_submit_hook中启用Py3测试

  • [AIRFLOW-1345] 不要在每次调度器循环时使任务实例过期

  • [AIRFLOW-1059] 批量重置调度器中孤立的任务

  • [AIRFLOW-1255] 修复SparkSubmitHook输出死锁问题

  • [AIRFLOW-1359] 添加用于模型评估的Google CloudML工具

  • [AIRFLOW-1247] 修复忽略所有依赖项参数被忽略的问题

  • [AIRFLOW-1401] 标准化云机器学习操作符参数

  • [AIRFLOW-1394] 为GCS钩子和操作符添加quote_character参数

  • [AIRFLOW-1402] 清理SafeConfigParser弃用警告

  • [AIRFLOW-1326][[AIRFLOW-1326][AIRFLOW-1184] 不要分割参数数组——它已经是一个数组。

  • [AIRFLOW-1384] 将ARGO/CaDC添加为Airflow用户

  • [AIRFLOW-1357] 修复调度程序zip文件支持

  • [AIRFLOW-1382] 为DockerOperator添加工作目录选项

  • [AIRFLOW-1388] 将Cloud ML Engine操作器添加到集成文档中

  • [AIRFLOW-1387] 添加Unicode字符串前缀

  • [AIRFLOW-1366] 为任务实例添加max_tries参数

  • [AIRFLOW-1300] 支持使用TBLPROPERTIES创建表

  • [AIRFLOW-1271] 添加Google CloudML训练操作器

  • [AIRFLOW-300] 添加Google Pubsub钩子和操作器

  • [AIRFLOW-1343] 修复dataproc标签格式

  • [AIRFLOW-1367] Pass Content-ID To reference inline images in an email, we need to be able to add to the HTML. However currently the Content-ID (cid) is not passed, so we need to add it

  • [AIRFLOW-1265] 修复Celery执行器解析CELERY_SSL_ACTIVE的问题

  • [AIRFLOW-1272] Google Cloud ML 批量预测操作器

  • [AIRFLOW-1352][AIRFLOW-1335] 回滚MemoryHandler变更 ()[]

  • [AIRFLOW-1350] 为Hive/SparkSQL DataProc操作符添加query_uri参数

  • [AIRFLOW-1334] 检查调度器中任务是否处于回填状态的连接操作

  • [AIRFLOW-1343] 为dataproc算子添加Airflow默认标签

  • [AIRFLOW-1273] 添加Google Cloud ML版本和模型操作器

  • [AIRFLOW-1273]AIRFLOW-1273] 添加Google Cloud ML版本和模型操作器

  • [AIRFLOW-1321] 修复隐藏字段键忽略大小写问题

  • [AIRFLOW-1337] 将日志格式键名改为小写

  • [AIRFLOW-1338][AIRFLOW-782] 将GCP数据流钩子运行器变更添加到UPDATING.md

  • [AIRFLOW-801] 移除BaseOperator上过时的文档字符串

  • [AIRFLOW-1344] 修复在Python 3.5中读取日志时的文本编码错误

  • [AIRFLOW-1338] 修复不兼容的GCP数据流钩子

  • [AIRFLOW-1333] 为Google云存储Hook启用复制功能

  • [AIRFLOW-1337] 允许通过airflow.cfg自定义日志格式

  • [AIRFLOW-1320] 更新README中的LetsBonus用户

  • [AIRFLOW-1335] 使用MemoryHandler实现缓冲日志记录

  • [AIRFLOW-1339] 将Drivy添加到用户列表中

  • [AIRFLOW-1275] 将'airflow pool'加入API

  • [AIRFLOW-1296] 将SKIPPED状态传播至所有下游任务

  • [AIRFLOW-1317] 修复API参考中的小问题

  • [AIRFLOW-1308] 禁用Dask的保姆进程

  • [AIRFLOW-1172] 支持月份的第N个工作日cron表达式

  • [AIRFLOW-936] 在用户界面中为DAG添加清除/标记成功功能

  • [AIRFLOW-1294] 回填操作可能导致任务执行丢失

  • [AIRFLOW-1299] 在Google Dataproc集群中支持imageVersion

  • [AIRFLOW-1291] 更新NOTICE和LICENSE文件以符合ASF要求

  • [AIRFLOW-1301] 将New Relic添加到公司列表中

  • [AIRFLOW-1289] 移除了对调度器线程数量的限制

  • [AIRFLOW-1024] 忽略Celery执行器错误 (#49)

  • [AIRFLOW-1265] 修复加载celery配置时的异常

  • [AIRFLOW-1290] 将文档作者设置为 'Apache Airflow'

  • [AIRFLOW-1242] 允许project_id中包含冒号。

  • [AIRFLOW-1282] 修复已知事件列排序问题

  • [AIRFLOW-1166] 加速 _change_state_for_tis_without_dagrun

  • [AIRFLOW-1208] 加速cli测试

  • [AIRFLOW-1192] 对qubole_operator的一些增强

  • [AIRFLOW-1281] 默认按关键字段对变量进行排序

  • [AIRFLOW-1277] 禁止创建空字段的KE

  • [AIRFLOW-1276] 禁止创建结束时间早于开始时间的事件

  • [AIRFLOW-1263] 图表动态高度

  • [AIRFLOW-1266] 增加甘特图Y轴宽度

  • [AIRFLOW-1244] 禁止创建名称为空的池

  • [AIRFLOW-1274][HTTPSENSOR] 将参数params重命名为data

  • [AIRFLOW-654] 为CeleryExecutor添加RabbitMQ的SSL配置选项 - 新增BROKER_USE_SSL配置项以支持通过SSL发送AMQP消息 - 可通过常规Airflow配置方式设置(如airflow.cfg、环境变量等)

  • [AIRFLOW-1256] 在README中添加美联航

  • [AIRFLOW-1251] 将eRevalue添加到Airflow用户列表

  • [AIRFLOW-908] 在cli运行开始时打印主机名

  • [AIRFLOW-1237] 修复IN谓词sqlalchemy警告

  • [AIRFLOW-1243] DAGs表格默认没有显示任何条目

  • [AIRFLOW-1245] 修复 test_trigger_dag_for_date 中的随机失败问题

  • [AIRFLOW-1248] 修复工作线程超时的错误配置名称

  • [AIRFLOW-1197] : SparkSubmitHook 终止错误

  • [AIRFLOW-1191] : SparkSubmitHook 自定义命令

  • [AIRFLOW-1234] 使用单元测试覆盖utils.operator_helpers

  • [AIRFLOW-1217] 启用Sqoop日志记录

  • [AIRFLOW-645] 在HttpHook中支持HTTPS连接

  • [AIRFLOW-1231] 使用flask_wtf.CSRFProtect

  • [AIRFLOW-1232] 移除已弃用的readfp警告

  • [AIRFLOW-1233] 为utils.json添加单元测试覆盖

  • [AIRFLOW-1227] 移除日志视图中的空列

  • [AIRFLOW-1226] 移除Jobs视图中的空列

  • [AIRFLOW-1221] 修复DatabricksSubmitRunOperator中的模板渲染错误

  • [AIRFLOW-1210] 启用DbApiHook单元测试

  • [AIRFLOW-1199] 修复创建模态框

  • [AIRFLOW-1200] 禁止创建键为空的变量

  • [AIRFLOW-1207] 启用 utils.helpers 单元测试

  • [AIRFLOW-1213] 为sqoop添加hcatalog参数

  • [AIRFLOW-1201] 更新已弃用的 'nose-parameterized'

  • [AIRFLOW-1186] 按execution_date对dag.get_task_instances进行排序

  • [AIRFLOW-1203] 固定Google API客户端版本以修复OAuth问题

  • [AIRFLOW-1145] 修复closest_date_partition函数中before参数设为True时的问题 如果我们要查找之前最近的日期,应该取日期列表中之前的最新日期。

  • [AIRFLOW-1180] 修复test_csrf_rejection中的flask-wtf版本

  • [AIRFLOW-993] 更新日期推断逻辑

  • [AIRFLOW-1170] DbApiHook的insert_rows方法单独插入参数

  • [AIRFLOW-1041] 不要覆盖xcom_push方法[]

  • [AIRFLOW-860][AIRFLOW-935] 修复插件执行器导入循环和执行器选择问题

  • [AIRFLOW-1189] 修复使用BigQueryHook获取DataFrame失败的问题

  • [AIRFLOW-1184] SparkSubmitHook 未拆分参数

  • [AIRFLOW-1182] SparkSubmitOperator模板字段

  • [AIRFLOW-823] 允许在task_info API中指定执行日期

  • [AIRFLOW-1175] 将Pronto工具添加到Airflow用户列表

  • [AIRFLOW-1150] 修复sparksql钩子中的脚本执行问题[]

  • [AIRFLOW-1141] 移除 crawl_for_tasks

  • [AIRFLOW-1193] 使用Airflow为公司添加Checkr

  • [AIRFLOW-1168] 为所有连接和游标添加 closing() 方法

  • [AIRFLOW-1188] 为GoogleCloudStorageToBigQueryOperator添加max_bad_records参数

  • [AIRFLOW-1187][AIRFLOW-1185] 修复文档中的PyPi包名称

  • [AIRFLOW-1185] 修复模板中的PyPi URL

  • [AIRFLOW-XXX] 在1.8.1版本发布后更新CHANGELOG、README和UPDATING文件

  • [AIRFLOW-1181] 为gcs_hook添加删除和列表功能

  • [AIRFLOW-1179] 修复Pandas 0.2x版本导致的Google BigQuery兼容性问题

  • [AIRFLOW-1167] 支持在FTPHook修改时间中使用微秒

  • [AIRFLOW-1173] 将Robinhood添加到Airflow用户列表

  • [AIRFLOW-945][AIRFLOW-941] 移除psycopg2连接变通方案

  • [AIRFLOW-1140] DatabricksSubmitRunOperator 应该对 "json" 字段进行模板化。

  • [AIRFLOW-1160] 更新Mesos的Spark参数

  • [AIRFLOW 1149][AIRFLOW-1149] 允许在Jinja2模板中使用自定义过滤器

  • [AIRFLOW-1036] 随机化指数退避

  • [AIRFLOW-1155] 将Tails.com添加到社区

  • [AIRFLOW-1142] 不要重置回填任务的孤立状态

  • [AIRFLOW-492] 确保状态更新不会导致任务失败

  • [AIRFLOW-1119] 修复卸载查询使标题显示在第一行[]

  • [AIRFLOW-1089] 添加Spark应用程序参数

  • [AIRFLOW-1125] 记录加密连接

  • [AIRFLOW-1122] 增加用户界面中的线条宽度

  • [AIRFLOW-1138] 为scripts目录中的文件添加缺失的许可证

  • [AIRFLOW-11-38][AIRFLOW-1136] 捕获Sqoop的无效参数

  • [AIRFLOW-1127] 将许可证声明移至LICENSE文件

  • [AIRFLOW-1118] 将evo.company添加到Airflow用户

  • [AIRFLOW-1121][AIRFLOW-1004] 修复 airflow webserver --pid 以正确写入pid文件

  • [AIRFLOW-1124] 在回填时不要将所有任务设置为已调度

  • [AIRFLOW-1120] 更新版本视图以包含Apache前缀

  • [AIRFLOW-1091] 添加可比较Jira目标与合并内容的脚本

  • [AIRFLOW-1107] 添加对FTPS非默认端口的支持

  • [AIRFLOW-1000] 将发行版更名为Apache Airflow

  • [AIRFLOW-1094] 在Travis中运行contrib下的单元测试

  • [AIRFLOW-1112] 当调度器中池满时记录是哪个池

  • [AIRFLOW-1106] 在ReadMe中添加Groupalia/Letsbonus

  • [AIRFLOW-1109] 使用终止信号来终止进程并记录结果

  • [AIRFLOW-1074] 不计入队列中的任务以限制并发数

  • [AIRFLOW-1095] 使ldap_auth的memberOf可从配置中获取

  • [AIRFLOW-1090] 添加HBO

  • [AIRFLOW-1035] 使用二进制指数退避算法

  • [AIRFLOW-1081] 提升持续时间图表的性能

  • [AIRFLOW-1078] 修复旧版Flask中的latest_runs端点

  • [AIRFLOW-1085] 增强SparkSubmitOperator

  • [AIRFLOW-1050] 不要将up_for_retry状态计为未就绪

  • [AIRFLOW-1028] 用于Airflow的Databricks Operator

  • [AIRFLOW-1075] 安全文档清理

  • [AIRFLOW-1033][AIFRLOW-1033] 修复无调度DAG的ti_deps问题

  • [AIRFLOW-1016] 允许在HTTPSensor上使用HTTP HEAD请求方法

  • [AIRFLOW-970] 在主页异步加载 latest_runs

  • [AIRFLOW-111] 在调度器并发检查中包含排队任务

  • [AIRFLOW-1001] 修复无后续调度时的着陆时间问题

  • [AIRFLOW-1065] 添加对wasb://协议下Azure Blob存储的功能支持

  • [AIRFLOW-947] 改进Presto集群不可用时的异常处理

  • [AIRFLOW-1067] 在示例中使用example.com

  • [AIRFLOW-1064] 将TaskInstanceModelView的默认排序改为job_id

  • [AIRFLOW-1030][AIRFLOW-1] 修复HttpSensor的hook导入问题

  • [AIRFLOW-1051] 为CliTests添加resetdb测试

  • [AIRFLOW-1004][AIRFLOW-276] 修复 airflow webserver -D 使其能在后台运行

  • [AIRFLOW-1062] 修复DagRun#find以返回正确结果

  • [AIRFLOW-1011] 修复BackfillJob._execute()中关于SubDAGs的bug

  • [AIRFLOW-1038] 明确指定celery序列化选项

  • [AIRFLOW-1054] 修复test_dag中的导入错误

  • [AIRFLOW-1007] 为chart_data端点使用Jinja沙盒

  • [AIRFLOW-719] 修复ShortCircuit、Branch和LatestOnly中的竞态条件

  • [AIRFLOW-1043] 修复操作器的文档字符串

  • [AIRFLOW-840] 使票据续订器兼容python3

  • [AIRFLOW-985] 扩展sqoop操作器和钩子

  • [AIRFLOW-1034] 实现连接到S3的sigv4区域功能

  • [AIRFLOW-1045] 使日志级别可通过airflow.cfg配置

  • [AIRFLOW-1047] 对传递给Markup的字符串进行消毒处理

  • [AIRFLOW-1040] 修复注释和文档字符串中的一些小拼写错误

  • [AIRFLOW-1017] 当没有任务实例时,get_task_instance 不应抛出异常

  • [AIRFLOW-1006] 将config_templates添加到MANIFEST

  • [AIRFLOW-999] 添加对Redis数据库的支持

  • [AIRFLOW-1009] 从概念页面移除SQLOperator

  • [AIRFLOW-1006] 将配置模板移至单独文件

  • [AIRFLOW-1005] 优化Airflow启动时间

  • [AIRFLOW-1010] 添加用于签署发布的便捷脚本

  • [AIRFLOW-995] 移除对实际Airflow问题的引用

  • [AIRFLOW-681] 主页文档链接应指向Apache仓库而非Airbnb仓库

  • [AIRFLOW-705][AIRFLOW-706] 修复run_command的bug

  • [AIRFLOW-990] 修复DockerOperator中Py27的unicode日志问题

  • [AIRFLOW-963] 修复未渲染的代码示例

  • [AIRFLOW-969] 捕获错误的python_callable参数

  • [AIRFLOW-984] 允许SubDagOperator的子类化

  • [AIRFLOW-997] 更新 setup.cfg 指向 Apache

  • [AIRFLOW-994] 将MiNODES添加到官方Airflow用户列表

  • [AIRFLOW-995][AIRFLOW-1] 更新GitHub PR模板

  • [AIRFLOW-989] 如果存在未完成任务,不要将DAG运行标记为成功

  • [AIRFLOW-903] 默认DAG视图的新配置设置

  • [AIRFLOW-979] 添加GovTech GDS

  • [AIRFLOW-933] 用literal_eval替换eval以防止远程代码执行(RCE)

  • [AIRFLOW-974] 修复mkdirs竞态条件

  • [AIRFLOW-917] 修复错误消息的格式

  • [AIRFLOW-770] 重构BaseHook以便始终读取环境变量

  • [AIRFLOW-900] 双重触发不应终止原始任务实例

  • [AIRFLOW-900] 修复了LocalTaskJob中防止重复运行的双重保护机制漏洞

  • [AIRFLOW-932][AIRFLOW-932][AIRFLOW-921][AIRFLOW-910] 在回填时不要标记已移除的任务

  • [AIRFLOW-961] 在收到SIGTERM信号时执行onkill操作

  • [AIRFLOW-910] 使用并行任务执行进行回填

  • [AIRFLOW-967] 为兼容Python 2的LDAP封装字符串

  • [AIRFLOW-958] 提升工具提示的可读性

  • AIRFLOW-959 清理并重组.gitignore文件

  • AIRFLOW-960 添加 .editorconfig 文件

  • [AIRFLOW-931] 不在TaskInstances中设置QUEUED状态

  • [AIRFLOW-956] 让文档在readthedocs.org上正常工作

  • [AIRFLOW-954] 修复configparser导入错误

  • [AIRFLOW-941] 为psycopg2使用已定义的参数

  • [AIRFLOW-943] 在用户列表中更新Digital First Media

  • [AIRFLOW-942] 将mytaxi添加到Airflow用户列表

  • [AIRFLOW-939] 将.swp添加到gitignore

  • [AIRFLOW-719] 防止DAG过早结束

  • [AIRFLOW-938] 在task_stats查询中使用test替代True

  • [AIRFLOW-937] 提升task_stats的性能

  • [AIRFLOW-933] 使用ast.literal_eval替代eval,因为ast.literal_eval不会执行输入内容。

  • [AIRFLOW-925] 回滚被cherry-pick选中的airflow.hooks变更

  • [AIRFLOW-919] 运行没有开始日期的任务不应破坏DAGs用户界面

  • [AIRFLOW-802][AIRFLOW-1] 添加spark-submit操作符/钩子

  • [AIRFLOW-725] 使用密钥环存储JIRA凭证

  • [AIRFLOW-916] 移除已弃用的readfp函数

  • [AIRFLOW-911] 为测试添加颜色和计时功能

  • [AIRFLOW-906] 将代码图标从闪电螺栓更新为文件

  • [AIRFLOW-897] 防止DAG运行因未完成任务而失败

  • [AIRFLOW-896] 移除BigQueryOperator中的Unicode转8位转换

  • [AIRFLOW-899] 处于SCHEDULED状态的任务在UI中应显示为白色而非黑色

  • [AIRFLOW-895] 解决Apache版本兼容性问题

  • [AIRFLOW-893][AIRFLOW-510] 修复当DAG运行没有开始日期时导致webserver崩溃的问题

  • [AIRFLOW-880] 让Web服务器以合理的方式提供远程日志

  • [AIRFLOW-889] 修复BaseOperator文档字符串中的小错误

  • [AIRFLOW-809][AIRFLOW-1] 测试布尔值时使用 __eq__ 列操作符

  • [AIRFLOW-875] 为HttpSensor参数添加模板

  • [AIRFLOW-866] 添加FTPSensor

  • [AIRFLOW-881] 检查SubDagOperator是否在DAG上下文管理器中

  • [AIRFLOW-885] 将change.org添加到用户列表

  • [AIRFLOW-836] 对状态变更端点使用POST和CSRF

  • [AIRFLOW-862] 修复DaskExecutor的单元测试

  • [AIRFLOW-887] 支持未来版本v0.16

  • [AIRFLOW-886] 将结果传递给post_execute()钩子

  • [AIRFLOW-871] 将logging.warn()改为warning()

  • [AIRFLOW-882] 移除文档中不必要的dag>>op赋值

  • [AIRFLOW-861] 将pickle_info端点设为需要登录

  • [AIRFLOW-869] 重构标记成功功能

  • [AIRFLOW-877] 从GCS下载操作符中移除.sql模板扩展名

  • [AIRFLOW-826] 添加Zendesk钩子

  • [AIRFLOW-842] 不要使用空的IN子句查询数据库

  • [AIRFLOW-834] 将 raise StopIteration 改为 return

  • [AIRFLOW-832] 允许调试服务器在不使用SSL的情况下运行

  • [AIRFLOW-862] 新增DaskExecutor

  • [AIRFLOW-858] 可配置数据库操作符的数据库名称

  • [AIRFLOW-863] 示例DAG应设置最近的开始日期

  • [AIRFLOW-853] 使用utf8编码进行stdout行解码

  • [AIRFLOW-857] 使用库断言语句替代条件判断

  • [AIRFLOW-856] 确保本地客户端设置了执行日期

  • [AIRFLOW-854] 添加OKI作为Airflow用户

  • [AIRFLOW-830][AIRFLOW-829][AIRFLOW-88] 减少Travis日志的冗长信息

  • [AIRFLOW-814] 修复 Presto*CheckOperator.__init__

  • [AIRFLOW-793] 在S3ToHiveTransfer中启用压缩加载

  • [AIRFLOW-844] 修复cgroups目录创建问题

  • [AIRFLOW-831] 恢复导入以修复损坏的测试

  • [AIRFLOW-794] 仅从settings访问DAGS_FOLDER和SQL_ALCHEMY_CONN

  • [AIRFLOW-694] 修复空环境变量的配置行为

  • [AIRFLOW-365] 显式设置dag.fileloc并用于代码视图

  • [AIRFLOW-781] 允许DataFlowOperators接受存储在GCS中的作业

Airflow 1.8.2 (2017-09-04)

重大变更

无重大变更。

更新日志

  • [AIRFLOW-809][AIRFLOW-1] 测试布尔值时使用 __eq__ 列操作符

  • [AIRFLOW-1296] 将SKIPPED状态传播至所有下游任务

  • 重新启用hadoop组件的缓存

  • 将Hive和Hadoop固定到特定版本并创建可写的仓库目录

  • [AIRFLOW-1308] 禁用Dask的保姆进程

  • 更新1.8.2rc1版本的变更日志

  • [AIRFLOW-1294] 回填操作可能导致任务执行丢失

  • [AIRFLOW-1291] 更新NOTICE和LICENSE文件以符合ASF要求

  • [AIRFLOW-XXX] 将版本设置为1.8.2rc1

  • [AIRFLOW-1160] 更新Mesos的Spark参数

  • [AIRFLOW 1149][AIRFLOW-1149] 允许在Jinja2模板中使用自定义过滤器

  • [AIRFLOW-1119] 修复卸载查询使标题显示在第一行[]

  • [AIRFLOW-1089] 添加Spark应用程序参数

  • [AIRFLOW-1078] 修复旧版Flask中的latest_runs端点

  • [AIRFLOW-1074] 不计入队列中的任务以限制并发数

  • [AIRFLOW-1064] 将TaskInstanceModelView的默认排序改为job_id

  • [AIRFLOW-1038] 明确指定celery序列化选项

  • [AIRFLOW-1036] 随机化指数退避

  • [AIRFLOW-993] 更新日期推断逻辑

  • [AIRFLOW-1167] 支持在FTPHook修改时间中使用微秒

  • [AIRFLOW-1179] 修复pandas 0.2x版本导致的Google BigQuery兼容性问题

  • [AIRFLOW-1263] 图表动态高度

  • [AIRFLOW-1266] 增加甘特图Y轴宽度

  • [AIRFLOW-1290] 将文档作者设置为 'Apache Airflow'

  • [AIRFLOW-1282] 修复已知事件列排序问题

  • [AIRFLOW-1166] 加速 _change_state_for_tis_without_dagrun

  • [AIRFLOW-1192] 对qubole_operator的一些增强

  • [AIRFLOW-1281] 默认按关键字段对变量进行排序

  • [AIRFLOW-1244] 禁止创建名称为空的池

  • [AIRFLOW-1243] DAGs表格默认没有显示任何条目

  • [AIRFLOW-1227] 移除日志视图中的空列

  • [AIRFLOW-1226] 移除Jobs视图中的空列

  • [AIRFLOW-1199] 修复创建模态框

  • [AIRFLOW-1200] 禁止创建键为空的变量

  • [AIRFLOW-1186] 按execution_date对dag.get_task_instances进行排序

  • [AIRFLOW-1145] 修复closest_date_partition函数中before参数设为True时的问题 如果我们要查找之前最近的日期,应该取日期列表中之前的最新日期。

  • [AIRFLOW-1180] 修复test_csrf_rejection中的flask-wtf版本

  • [AIRFLOW-1170] DbApiHook的insert_rows方法单独插入参数

  • [AIRFLOW-1150] 修复sparksql钩子中的脚本执行问题[]

  • [AIRFLOW-1168] 为所有连接和游标添加 closing() 方法

  • [AIRFLOW-XXX] 在1.8.1版本发布后更新CHANGELOG、README和UPDATING文件

Airflow 1.8.1 (2017-05-09)

重大变更

在此次发布中,Airflow的包名从airflow更改为apache-airflow。在安装1.8.1版本之前,您必须先卸载之前安装的Airflow版本。

更新日志

  • [AIRFLOW-1142] 子DAG任务未执行即使所有依赖条件已满足

  • [AIRFLOW-1138] 为脚本目录中的文件添加许可证

  • [AIRFLOW-1127] 将许可证声明移至LICENSE文件而非NOTICE文件

  • [AIRFLOW-1124] 在回填时不要将所有任务实例设置为已调度状态

  • [AIRFLOW-1120] 更新版本视图以包含Apache前缀

  • [AIRFLOW-1062] 如果指定了external_trigger=False,DagRun#find会返回错误结果

  • [AIRFLOW-1054] 修复test_dag上的导入错误

  • [AIRFLOW-1050] 重试被忽略 - 回归问题

  • [AIRFLOW-1033] 类型错误:无法将datetime.datetime与None进行比较

  • [AIRFLOW-1017] get_task_instance 对于不存在的任务实例应该返回 None 而不是抛出异常

  • [AIRFLOW-1011] 修复BackfillJob._execute()中关于SubDAGs的bug

  • [AIRFLOW-1004] airflow webserver -D 在前台运行

  • [AIRFLOW-1001] 在example_subdag_operator上,Landing Time显示不支持的操作数类型 for -: 'datetime.datetime' 'NoneType'

  • [AIRFLOW-1000] 将品牌名称从Airflow更改为Apache Airflow

  • [AIRFLOW-989] 清除任务回归

  • [AIRFLOW-974] airflow.util.file 中的 mkdir 存在竞态条件

  • [AIRFLOW-906] 将代码图标从闪电螺栓更新为文件

  • [AIRFLOW-858] 可配置数据库操作符的数据库名称

  • [AIRFLOW-853] ssh_execute_operator.py 标准输出默认解码为ASCII

  • [AIRFLOW-832] 修复调试服务器

  • [AIRFLOW-817] 使用CLI + API时触发dag失败

  • [AIRFLOW-816] 确保从本地资源拉取nvd3

  • [AIRFLOW-815] 将前次/下次执行日期添加为可用的默认变量。

  • [AIRFLOW-813] 修复 tests.job 中未终止的单元测试 (tests/job.py)

  • [AIRFLOW-812] 当没有DAG文件时调度器任务终止

  • [AIRFLOW-806] 当DAG文档为None时,UI应正确忽略它

  • [AIRFLOW-794] 统一访问DAGS_FOLDER和SQL_ALCHEMY_CONN的方式

  • [AIRFLOW-785] 如果未安装cgroupspy则抛出ImportError错误

  • [AIRFLOW-784] 无法安装版本大于1.0.0的funcsigs

  • [AIRFLOW-780] 用户界面不再显示损坏的DAG

  • [AIRFLOW-777] dag_is_running 被初始化为 True 而不是 False

  • [AIRFLOW-719] 跳过操作导致DAG提前完成

  • [AIRFLOW-694] 空环境变量不会覆盖非空配置值

  • [AIRFLOW-492] 向dag_stats表插入数据导致任务失败,而任务本身却成功了

  • [AIRFLOW-139] 使用PostgresOperator执行VACUUM操作

  • [AIRFLOW-111] DAG并发性未被遵守

  • [AIRFLOW-88] 提升Travis CI报告的清晰度

Airflow 1.8.0 (2017-03-12)

重大变更

数据库

数据库架构需要升级。请确保先关闭Airflow并对数据库进行备份。要升级架构,请执行命令airflow upgradedb

升级systemd单元文件

Systemd单元文件已更新。如果您使用systemd,请确保更新这些文件。

请注意,webserver未能正确分离,此问题将在未来版本中修复。

尽管依赖项已满足,但由于更严格的池检查导致任务未启动

Airflow 1.7.1版本存在资源池超额订阅的问题,即可能使用超过可用数量的任务槽。该问题已在Airflow 1.8.0中修复,但由于历史遗留问题,升级后即使满足依赖条件,任务仍可能无法启动。临时解决方案是:要么暂时增加任务槽数量使其超过排队任务数,要么使用新的资源池。

动态start_date上更严格的调度器

使用动态的start_date(例如start_date = datetime.now())不被视为最佳实践。1.8.0版本的调度程序在这方面限制更严格。如果遇到DAG未被调度的情况,可以尝试使用固定的start_date并重命名DAG。最后一步是确保从零开始,否则旧的调度可能会产生干扰。

新增及更新的调度器选项

请仔细阅读新的调度器选项,自1.7.1版本以来默认值已更改。

子进程日志目录

为了提高调度器的健壮性,DAG现在在独立进程中处理。因此每个DAG都有其专属的调度器日志文件。这些日志文件存放在child_process_log_directory目录下,默认路径为/scheduler/latest。您需要确保定期清理这些日志文件。

DAG日志或处理器日志会忽略命令行设置的日志文件位置。

运行时长

之前使用命令行选项num_runs来让调度程序在运行一定次数的循环后终止。现在改为时间限制,默认值为-1,表示持续运行。另请参阅num_runs。

运行次数

之前使用num_runs来让调度器在完成一定数量的循环后终止。现在num_runs指定在run_duration时间内尝试调度每个DAG文件的次数。默认为-1,表示无限次尝试。此选项仅在命令行中可用。

min_file_process_interval

经过多长时间应从文件系统中获取更新的DAG。

最小文件解析循环时间

由于存在错误,当前已禁用 为了防止日志被刷屏,文件解析循环之间需要等待的秒数。

dag目录列表间隔

调度器重新列出DAG目录内容的频率。如果在开发dag时发现它们未被识别,请查看此数值并根据需要调低。

默认启用追赶模式

默认情况下,调度器会填补上次执行日期与当前日期之间所有缺失的间隔DAG运行。此设置将行为更改为仅执行最新的间隔。这也可以按DAG指定为catchup = False / True。命令行回填仍然有效。

有问题的DAG在Web界面中不会显示错误

由于Airflow处理DAG的方式发生变化,Web界面在处理有问题的DAG时不会显示错误。要查找处理错误,请前往child_process_log_directory,该目录默认为/scheduler/latest

默认情况下新建的DAG会被暂停

之前,新的DAG会立即被调度。要保留旧的行为,请将以下内容添加到airflow.cfg中:

[core]
dags_are_paused_at_creation = False

如果指定了conf参数,Airflow上下文变量会传递给Hive配置

如果你在HiveHook的run_cli命令中指定了hive配置,Airflow会向配置中添加一些便捷变量。在安全Hadoop环境中运行时,可能需要通过调整hive配置来允许这些变量,将airflow\.ctx\..*添加到用户可编辑配置属性的正则表达式中。更多信息请参阅Hive文档中的配置属性章节

Google Cloud 操作器与钩子对齐

所有Google Cloud操作器和钩子都经过统一调整,使用相同的客户端库。现在您可以为各类Google Cloud操作器使用单一连接类型。

如果您遇到与运营商连接的问题,请确保将连接类型设置为"Google Cloud"。

此外,不再支持旧的P12密钥文件类型,仅支持新的JSON密钥文件作为服务账户。

已弃用的功能

这些功能已被标记为弃用。它们可能仍然有效(并引发DeprecationWarning),但不再受支持,并将在Airflow 2.0中完全移除

  • 钩子和算子必须从各自的子模块中导入

    airflow.operators.PigOperator 不再支持;from airflow.operators.pig_operator import PigOperator 是支持的。 (AIRFLOW-31, AIRFLOW-200)

  • 操作符不再接受任意参数

    之前,Operator.__init__()会无警告地接受任何参数(无论是位置参数*args还是关键字参数**kwargs)。现在,无效参数将被拒绝。(https://github.com/apache/airflow/pull/1285)

  • 配置项secure_mode将默认设为True,这会禁用一些不安全的端点/功能

已知问题

有报告称,将num_runs的默认值设为“-1”会导致解析任务时出现错误报告的问题。 虽然尚未确认,但通过将默认值改回None找到了一个临时解决方案。

要执行此操作,请编辑cli.py,找到以下内容:

'num_runs': Arg(
    ("-n", "--num_runs"),
    default=-1, type=int,
    help="Set the number of runs to execute before exiting"),

并将 default=-1 改为 default=None。如果您遇到此问题,请在邮件列表中报告。

更新日志

  • [AIRFLOW-900] 双重触发不应终止原始任务实例

  • [AIRFLOW-900] 修复了LocalTaskJob中防止重复运行的双重保护机制漏洞

  • [AIRFLOW-932] 回填时不要标记已移除的任务

  • [AIRFLOW-961] 在收到SIGTERM信号时执行onkill操作

  • [AIRFLOW-910] 使用并行任务执行进行回填

  • [AIRFLOW-967] 为兼容Python 2的LDAP封装字符串

  • [AIRFLOW-941] 为psycopg2使用已定义的参数

  • [AIRFLOW-719] 防止DAG过早结束

  • [AIRFLOW-938] 在task_stats查询中使用test替代True

  • [AIRFLOW-937] 提升task_stats的性能

  • [AIRFLOW-933] 使用ast.literal_eval替代eval,因为ast.literal_eval不会执行输入内容。

  • [AIRFLOW-925] 回滚被cherry-pick选中的airflow.hooks变更

  • [AIRFLOW-919] 运行没有开始日期的任务不应破坏DAGs用户界面

  • [AIRFLOW-802] 添加spark-submit操作符/钩子

  • [AIRFLOW-897] 防止DAG运行因未完成任务而失败

  • [AIRFLOW-861] 使pickle_info端点需要登录

  • [AIRFLOW-853] 使用utf8编码解码标准输出行

  • [AIRFLOW-856] 确保本地客户端设置了执行日期

  • [AIRFLOW-830][AIRFLOW-829][AIRFLOW-88] 减少Travis日志的冗长信息

  • [AIRFLOW-831] 恢复导入以修复损坏的测试

  • [AIRFLOW-794] 仅从settings访问DAGS_FOLDER和SQL_ALCHEMY_CONN

  • [AIRFLOW-694] 修复空环境变量的配置行为

  • [AIRFLOW-365] 显式设置dag.fileloc并用于代码视图

  • [AIRFLOW-931] 不在TaskInstances中设置QUEUED状态

  • [AIRFLOW-899] 处于SCHEDULED状态的任务在UI中应显示为白色而非黑色

  • [AIRFLOW-895] 解决Apache版本兼容性问题

  • [AIRFLOW-893][AIRFLOW-510] 修复当DAG运行没有开始日期时导致webserver崩溃的问题

  • [AIRFLOW-793] 在S3ToHiveTransfer中启用压缩加载

  • [AIRFLOW-863] 示例DAG应设置最近的开始日期

  • [AIRFLOW-869] 重构标记成功功能

  • [AIRFLOW-856] 确保本地客户端设置了执行日期

  • [AIRFLOW-814] 修复 Presto*CheckOperator.__init__

  • [AIRFLOW-844] 修复cgroups目录创建问题

  • [AIRFLOW-816] 使用静态nvd3和d3

  • [AIRFLOW-821] 修复Python 3兼容性问题

  • [AIRFLOW-817] 检查端点中execution_date的None值

  • [AIRFLOW-822] 在异常发生前关闭数据库

  • [AIRFLOW-815] 在模板变量中添加前/后执行日期

  • [AIRFLOW-813] 修复SchedulerJobTest中未终止的单元测试

  • [AIRFLOW-813] 修复未终止的调度器单元测试

  • [AIRFLOW-806] 当DAG文档为None时,UI应正确忽略它

  • [AIRFLOW-812] 修复调度器终止错误。

  • [AIRFLOW-780] 修复DAG导入错误不再有效的问题

  • [AIRFLOW-783] 修复 BaseTaskRunner 在 Python 3 中的不兼容问题

  • [AIRFLOW-810] 修正了down_revision dag_id/state索引的创建

  • [AIRFLOW-807] 提升调度器处理大型DAG的性能

  • [AIRFLOW-798] 在强制终止前检查返回码

  • [AIRFLOW-139] 让psycopg2处理PostgresHook的自动提交

  • [AIRFLOW-776] 添加缺失的cgroups开发依赖项

  • [AIRFLOW-777] 修复检查DagRun是否处于运行状态的表达式

  • [AIRFLOW-785] 不要在全局作用域导入CgroupTaskRunner

  • [AIRFLOW-784] 将 funcsigs 固定为 1.0.0 版本

  • [AIRFLOW-624] 修复setup.py使其不再导入airflow.version作为版本

  • [AIRFLOW-779] 当任务被删除时应该显示特定的失败信息

  • [AIRFLOW-778] 修复完全损坏的 MetastorePartitionSensor

  • [AIRFLOW-739] 将pickle_info日志级别设置为debug

  • [AIRFLOW-771] 使S3日志追加而非覆盖

  • [AIRFLOW-773] 修复API测试中不稳定的日期时间加法

  • [AIRFLOW-219][AIRFLOW-398] Cgroups + 身份模拟

  • [AIRFLOW-683] 添加Jira钩子、操作器和传感器

  • [AIRFLOW-762] 添加Google DataProc删除操作符

  • [AIRFLOW-760] 更新systemd配置

  • [AIRFLOW-759] 使用之前的dag_run来验证depend_on_past

  • [AIRFLOW-757] 设置更合理的子进程日志目录默认值

  • [AIRFLOW-692] 仅向超级管理员开放XCom页面

  • [AIRFLOW-737] 修复HDFS传感器目录。

  • [AIRFLOW-747] 修复retry_delay未被遵守的问题

  • [AIRFLOW-558] 添加对dag.catchup=(True|False)选项的支持

  • [AIRFLOW-489] 允许在trigger_dag API中指定执行日期

  • [AIRFLOW-738] 在插入前提交已删除的xcom条目

  • [AIRFLOW-729] 新增Google Cloud Dataproc集群创建操作器

  • [AIRFLOW-728] 添加Google BigQuery表传感器

  • [AIRFLOW-741] 将app.py的日志级别从info改为debug

  • [AIRFLOW-731] 修复NamedHivePartitionSensor的时间周期bug

  • [AIRFLOW-740] 将jinja2版本锁定在2.9.0以下

  • [AIRFLOW-663] 改进任务性能图表的时间单位

  • [AIRFLOW-665] 修复邮件附件问题

  • [AIRFLOW-734] 修复未使用用户名/密码时的SMTP认证回归问题

  • [AIRFLOW-702] 修复LDAP正则表达式错误

  • [AIRFLOW-717] 添加云存储更新传感器

  • [AIRFLOW-695] 重试未执行,因为dagrun处于FAILED状态

  • [AIRFLOW-673] 为SchedulerJob添加操作指标测试

  • [AIRFLOW-727] try_number 未增加

  • [AIRFLOW-715] 一个更高效的HDFS传感器:

  • [AIRFLOW-716] 允许AVRO格式的BigQuery加载作业无需schema

  • [AIRFLOW-718] 允许为DataProc Pig配置查询URI

  • 日志需要包含在try/catch代码块中

  • [AIRFLOW-721] 子进程可能在终止前消失

  • [AIRFLOW-403] Bash操作符的kill方法会导致底层进程继续运行

  • [AIRFLOW-657] 为MSSQL添加自动提交参数

  • [AIRFLOW-641] 改进拉取请求说明

  • [AIRFLOW-685] 为MySqlHook.bulk_load()添加测试

  • [AIRFLOW-686] 匹配认证后端配置部分

  • [AIRFLOW-691] 为SSH_hook添加SSH保持连接选项

  • [AIRFLOW-709] 为迁移和反射使用相同的引擎

  • [AIRFLOW-700] 更新网页认证文档的引用

  • [AIRFLOW-649] 在LatestOnlyOp中支持非调度DAG

  • [AIRFLOW-712] 修复AIRFLOW-667以使用正确的HTTP错误属性

  • [AIRFLOW-710] 添加OneFineStay为官方用户

  • [AIRFLOW-703][AIRFLOW-1] 修复Xcom过早被清除的问题

  • [AIRFLOW-679] 停止并发任务实例运行

  • [AIRFLOW-704][AIRFLOW-1] 修复BQ钩子中的无效语法

  • [AIRFLOW-667] 处理BigQuery 503错误

  • [AIRFLOW-680] 禁用命令的连接池

  • [AIRFLOW-678] 防止调度器重复触发任务实例

  • [AIRFLOW-677] 如果任务心跳失败则终止

  • [AIRFLOW-674] 为DAG添加描述的功能

  • [AIRFLOW-682] 提升MAX_PERIODS参数值以使mark_success功能支持大型DAG

  • 使用jdk选择器设置所需的jdk

  • [AIRFLOW-647] 恢复 dag.get_active_runs

  • [AIRFLOW-662] 将项目描述中的季节改为月份

  • [AIRFLOW-656] 在xcom表中添加dag/task/日期索引

  • [AIRFLOW-658] 改进GCP中的schema_update_options

  • [AIRFLOW-41] 修复资源池超额分配问题

  • [AIRFLOW-489] 添加API框架

  • [AIRFLOW-653] 添加一些缺失的端点测试

  • [AIRFLOW-652] 移除废弃的端点

  • [AIRFLOW-345] 新增contrib ECSOperator

  • [AIRFLOW-650] 将Celect添加到用户列表

  • [AIRFLOW-510] 筛选暂停的DAG,显示最后一次运行并触发DAG

  • [AIRFLOW-643] 改进sf_hook的日期处理

  • [AIRFLOW-638] 为GCP操作添加schema_update_options参数

  • [AIRFLOW-640] 安装并启用 nose-ignore-docstring

  • [AIRFLOW-639]AIRFLOW-639] 按字母顺序排列包名

  • [AIRFLOW-375] 修复pylint错误

  • [AIRFLOW-347] 在树状视图中显示空的DAG运行记录

  • [AIRFLOW-628] 在contrib/hooks中添加SalesforceHook

  • [AIRFLOW-514] hive hook 从 pandas DataFrame 加载数据到 hive 并推断类型

  • [AIRFLOW-565] 修复Python3.x上的DockerOperator问题

  • [AIRFLOW-635] S3钩子的加密选项

  • [AIRFLOW-137] 修复清除任务时的max_active_runs问题

  • [AIRFLOW-343] 修复HiveServer2Hook中的模式管道问题

  • [AIRFLOW-130] 修复ssh操作符在macosx上的问题

  • [AIRFLOW-633] 在任务实例视图中显示任务实例属性

  • [AIRFLOW-626][AIRFLOW-1] HTML Content does not show up when sending email with attachment

  • [AIRFLOW-533] 通过set_autocommit设置自动提交

  • [AIRFLOW-629] 停止固定lxml版本

  • [AIRFLOW-464] 为Variable添加setdefault方法

  • [AIRFLOW-626][AIRFLOW-1] HTML Content does not show up when sending email with attachment

  • [AIRFLOW-591] 添加Datadog钩子和传感器

  • [AIRFLOW-561] 新增RedshiftToS3Transfer操作器

  • [AIRFLOW-570] 在甘特图上将根节点传递给日期表单

  • [AIRFLOW-504] 在MySQL表中存储毫秒级时间

  • [AIRFLOW-623] LDAP属性不总是列表

  • [AIRFLOW-611] BigQueryBaseCursor中的source_format参数

  • [AIRFLOW-619] 修复甘特图中的异常

  • [AIRFLOW-618] 转换DateTime类型以避免sqlite错误

  • [AIRFLOW-422] 添加任务信息的JSON端点

  • [AIRFLOW-616][AIRFLOW-617] 对PR工具的UX进行小修复

  • [AIRFLOW-179] 修复DbApiHook中非ASCII字符的问题

  • [AIRFLOW-566] 在获取日志时添加超时设置

  • [AIRFLOW-615] 首先设置图形图标

  • [AIRFLOW-609] 在PostgresHook中添加application_name

  • [AIRFLOW-604] 将.first()恢复为.one()

  • [AIRFLOW-370] 在exceptions.py中创建AirflowConfigException

  • [AIRFLOW-582] 修复TI.get_dagrun过滤器(移除start_date参数)

  • [AIRFLOW-568] 修复如果DagRun处于活动状态时的双重task_stats计数问题

  • [AIRFLOW-585] 修复回填执行循环中的竞态条件

  • [AIRFLOW-580] 防止在.format上出现横向警告

  • [AIRFLOW-597] 检查内容是否为None,而非假值等效

  • [AIRFLOW-586] test_dag_v1 在凌晨0点到3点之间失败

  • [AIRFLOW-453] 添加XCom管理页面

  • [AIRFLOW-588] 添加Google云存储对象传感器[]

  • [AIRFLOW-592] example_xcom 导入错误

  • [AIRFLOW-587] 修复Google Auth范围错误[]

  • [AIRFLOW-589] 添加可模板化的job_name[]

  • [AIRFLOW-227] 在配置视图中显示运行中的配置

  • [AIRFLOW-319] HTTP操作符中的xcom推送响应

  • [AIRFLOW-385] 添加指向最新调度器日志目录的符号链接

  • [AIRFLOW-583] 修复gcs_to_bq中的解码错误

  • [AIRFLOW-96] 使用环境变量的s3_conn_id

  • [AIRFLOW-575] 澄清教程和FAQ中关于schedule_interval总是继承自DAG对象的说明

  • [AIRFLOW-577] 输出BigQuery作业以改进调试

  • [AIRFLOW-560] 从Connection获取URI和SQLA引擎

  • [AIRFLOW-518] 变量CRUD需要DataProfilingMixin

  • [AIRFLOW-553] 修复 filters.js 的加载路径

  • [AIRFLOW-554] 为Spark-sql添加Jinja支持

  • [AIRFLOW-550] 使ssl配置检查空字符串安全

  • [AIRFLOW-500] 使用ID作为GitHub允许的团队

  • [AIRFLOW-556] 添加用户界面PR指南

  • [AIRFLOW-358][AIRFLOW-430] 新增 connections 命令行接口

  • [AIRFLOW-548] 立即并持续加载DAGs

  • [AIRFLOW-539] 更新了BQ钩子和BQ操作器以支持标准SQL。

  • [AIRFLOW-378] 为spark-sql操作符的参数添加字符串类型转换

  • [AIRFLOW-544] 添加暂停/恢复切换按钮

  • [AIRFLOW-333][AIRFLOW-258] 修复非模块插件组件

  • [AIRFLOW-542] 为DAG链接图标添加工具提示

  • [AIRFLOW-530] 更新文档以说明连接环境变量必须使用大写字母

  • [AIRFLOW-525] 更新Qubole操作中的template_fields

  • [AIRFLOW-480] 支持从GCS下载二进制文件

  • [AIRFLOW-198] 实现latest_only_operator

  • [AIRFLOW-91] 为webserver添加SSL配置选项

  • [AIRFLOW-191] 修复PostgreSQL后端的连接泄漏问题

  • [AIRFLOW-512] 修复文档和注释中的'bellow'拼写错误

  • [AIRFLOW-509][AIRFLOW-1] 创建用于删除BigQuery中表的操作符

  • [AIRFLOW-498] 移除硬编码的GCP项目ID

  • [AIRFLOW-505] 支持作者姓名中的Unicode字符

  • [AIRFLOW-494] 添加每个操作符的成功/失败指标

  • [AIRFLOW-488] 修复 test_simple 测试失败

  • [AIRFLOW-468] 将panda需求更新至0.17.1

  • [AIRFLOW-159] 添加云集成章节 + GCP文档

  • [AIRFLOW-477][AIRFLOW-478] 重构安全章节以提高可读性

  • [AIRFLOW-467] 允许在BigQueryHook中定义project_id

  • [AIRFLOW-483] 将print改为日志记录语句

  • [AIRFLOW-475] 使Druid钩子中的段粒度可配置

Airflow 1.7.1.2 (2016-05-20)

重大变更

配置变更

邮件配置变更

要继续使用默认的smtp邮件后端,请将配置文件中的email_backend行从:

[email]
email_backend = airflow.utils.send_email_smtp

收件人:

[email]
email_backend = airflow.utils.email.send_email_smtp
S3配置变更

要继续使用S3日志记录功能,请按以下方式更新您的配置文件:

s3_log_folder = s3://my-airflow-log-bucket/logs

变为:

remote_base_log_folder = s3://my-airflow-log-bucket/logs
remote_log_conn_id = <your desired s3 connection>

更新日志

  • [AIRFLOW-463] 将Airflow图标链接到首页

  • [AIRFLOW-149] 任务依赖引擎 + 为什么我的任务没有运行视图

  • [AIRFLOW-361] 为Qubole Operator添加默认失败处理器

  • [AIRFLOW-353] 修复DAG运行状态更新失败问题

  • [AIRFLOW-447] 将源URI存储在Python 3兼容的列表中

  • [AIRFLOW-443] 导入时确保模块名称唯一

  • [AIRFLOW-444] 添加Google认证后端

  • [AIRFLOW-446][AIRFLOW-445] 添加缺失的dataproc提交选项

  • [AIRFLOW-431] 为资源池的增删改查操作添加命令行界面

  • [AIRFLOW-329] 更新DAG概览页面,优化状态列显示

  • [AIRFLOW-360] 修复 models.py 中的样式警告

  • [AIRFLOW-425] 在树状视图中为空白状态任务添加白色填充。

  • [AIRFLOW-69] 在回填作业中使用DAG运行

  • [AIRFLOW-415] 使dag_id未找到的错误提示更清晰

  • [AIRFLOW-416] 在README的公司列表中使用序数词

  • [AIRFLOW-369] 允许设置默认的DAG布局方向

  • [AIRFLOW-410] 在文档FAQ部分新增2个问答

  • [AIRFLOW-407] 为部分传感器添加不同颜色

  • [AIRFLOW-414] 改进缺失FERNET_KEY时的错误提示信息

  • [AIRFLOW-406] Sphinx/rst 修复

  • [AIRFLOW-412] 修复lxml依赖问题

  • [AIRFLOW-413] 修复通过pickle回填时路径未设置的bug

  • [AIRFLOW-78] Airflow clear 操作遗留 dag_runs

  • [AIRFLOW-402] 移除 NamedHivePartitionSensor 静态检查,添加文档

  • [AIRFLOW-394] 为任务时长图表添加显示累计时间的选项

  • [AIRFLOW-404] 如果解压hive失败则重试下载

  • [AIRFLOW-276] Gunicorn滚动重启

  • [AIRFLOW-399] 移除 dags/testdruid.py

  • [AIRFLOW-400] models.py/DAG.set_dag_runs_state() 未能正确设置状态

  • [AIRFLOW-395] 修复默认配置中资源部分的冒号/等号拼写错误

  • [AIRFLOW-397] 文档:修正单词“instantiating”的拼写错误

  • [AIRFLOW-395] 从配置的资源中移除尾部逗号

  • [AIRFLOW-388] 为每个DAG添加新的Task_Tries图表

  • [AIRFLOW-322] 修复FAQ部分的拼写错误

  • [AIRFLOW-375] Pylint问题修复

  • 将范围限制仅限用户邮箱 AIRFLOW-386

  • [AIRFLOW-383] 清理示例Qubole操作符DAG

  • [AIRFLOW-160] 通过子进程解析DAG文件

  • [AIRFLOW-381] 手动UI创建DAG运行:需要dag_id字段

  • [AIRFLOW-373] 增强CLI变量功能

  • [AIRFLOW-379] 增强变量页面功能:导入/导出变量

  • [AIRFLOW-331] 修改'Security'示例代码中的LDAP认证配置行

  • [AIRFLOW-356][AIRFLOW-355][AIRFLOW-354] 替换nobr标签,启用仅本地存在的DAG消息提示,修改编辑DAG图标

  • [AIRFLOW-362] 导入 __future__ 除法功能

  • [AIRFLOW-359] 将flask-login固定到0.2.11版本

  • [AIRFLOW-261] 为EmailOperator添加密送(bcc)和抄送(cc)字段

  • [AIRFLOW-348] 修复代码风格警告

  • [AIRFLOW-349] 添加杀死僵尸进程数量的指标

  • [AIRFLOW-340] 移除对Babel的未使用依赖

  • [AIRFLOW-339]: 支持传递flower配置文件的功能

  • [AIRFLOW-341][操作符] 为操作符添加资源需求属性

  • [AIRFLOW-335] 修复简单样式错误/警告

  • [AIRFLOW-337] 为VariableAccessor和VariableJsonAccessor添加__repr__方法

  • [AIRFLOW-334] 修复使用未定义变量的问题

  • [AIRFLOW-315] 修复空行代码风格警告

  • [AIRFLOW-306] 添加Spark-sql Hook和Operator

  • [AIRFLOW-327] 为FTPHook添加重命名方法

  • [AIRFLOW-321] 修复了关于tests/dags的错误代码示例

  • [AIRFLOW-316] 执行回填任务时始终检查数据库状态

  • [AIRFLOW-264] 为Hive添加工作负载管理

  • [AIRFLOW-297] 支持重试延迟的指数退避选项

  • [AIRFLOW-31][AIRFLOW-200] 在updating.md中添加备注

  • [AIRFLOW-307] Python中没有__neq__魔术方法。

  • [AIRFLOW-309] 在文档中添加开发依赖项的要求

  • [AIRFLOW-307] 将 __neq__ 重命名为 __ne__ Python 魔术方法。

  • [AIRFLOW-313] 修复sqoop_hook.py的代码风格

  • [AIRFLOW-311] 修复CONTRIBUTING.md中的错误路径

  • [AIRFLOW-24] DataFlow Java操作器

  • [AIRFLOW-308] 在DAG视图头部添加刷新DAG的链接

  • [AIRFLOW-314] 修复BigQuery游标的run_table_upsert方法

  • [AIRFLOW-298] 修复文档中的孵化器免责声明

  • [AIRFLOW-284] HiveServer2Hook 修复了 get_results 的游标作用域问题

  • [AIRFLOW-260] 当问题无法关闭时更优雅地退出

  • [AIRFLOW-260] 处理未找到版本的情况

  • [AIRFLOW-228] 在PR工具中处理空版本列表

  • [AIRFLOW-302] 改进默认的压缩提交消息

  • [AIRFLOW-187] 改进提示样式

  • [AIRFLOW-187] 修复参数名称中的拼写错误

  • [AIRFLOW-187] 将"Close XXX"消息移至压缩提交的末尾

  • [AIRFLOW-247] 添加EMR钩子、操作器和传感器。添加AWS基础钩子

  • [AIRFLOW-301] 修复损坏的单元测试

  • [AIRFLOW-100] 为ExternalTaskSensor添加execution_date_fn参数

  • [AIRFLOW-282] 移除依赖版本格式化的PR工具逻辑

  • [AIRFLOW-291] 为TI表中的state字段添加索引

  • [AIRFLOW-269] 为PostgreSQL添加一些单元测试

  • [AIRFLOW-296] 在qubole操作符中,template_ext被当作字符串而非元组处理

  • [AIRFLOW-286] 改进FTPHook以支持上下文管理器接口

  • [AIRFLOW-243] 创建NamedHivePartitionSensor

  • [AIRFLOW-246] 改进dag_stats端点查询

  • [AIRFLOW-189] 在图表中高亮显示父/子节点

  • [ARFLOW-255] 在比较活跃运行时检查dagrun超时

  • [AIRFLOW-281] 为mssql_hook添加端口参数

  • [AIRFLOW-285] 对所有剩余的钩子/操作器使用Airflow 2.0风格的导入

  • [AIRFLOW-40] 添加LDAP组过滤功能。

  • [AIRFLOW-277] 如果使用SQLite后端,任务实例视图中的批量删除功能无法正常工作

  • [AIRFLOW-200] 实现hook/operator的延迟导入,并打印正确的异常信息

  • [AIRFLOW-283] 将GoogleCloudStorageDownloadOperator中的store_to_xcom_key设为可模板化字段

  • [AIRFLOW-278] 支持SQL的utf-8编码

  • [AIRFLOW-280] 无论数据摄取作业成功与否,都清理临时Druid表

  • [AIRFLOW-274] 为GoogleCloudStorageDownloadOperator添加XCom功能

  • [AIRFLOW-273] 创建Airflow标志的SVG版本。

  • [AIRFLOW-275] 更新贡献指南

  • [AIRFLOW-244] 修改hive操作符以注入分析数据

  • [AIRFLOW-162] 允许变量在模板中可访问

  • [AIRFLOW-248] 为所有文件添加Apache许可证头部

  • [AIRFLOW-263] 移除临时反引号文件

  • [AIRFLOW-252] 在WebUI中删除任务实例时抛出Sqlite异常

  • [AIRFLOW-180] 修复传感器的超时行为

  • [AIRFLOW-262] 简化 MANIFEST.in 中的命令

  • [AIRFLOW-31] 添加zope依赖

  • [AIRFLOW-6] 移除对Highcharts的依赖

  • [AIRFLOW-234] 使非running状态的任务自动终止

  • [AIRFLOW-256] 修复 test_scheduler_reschedule 的心跳频率

  • 添加Python 3兼容性修复

  • [AIRFLOW-31] 对hooks/operators使用标准导入

  • [AIRFLOW-173] FileSensor的初始实现

  • [AIRFLOW-224] 收集孤立任务并重新调度它们

  • [AIRFLOW-239] 修复测试缩进问题

  • [AIRFLOW-225] 任务持续时间图表的优化单位

  • [AIRFLOW-241] 在PR模板中添加测试完成部分

  • [AIRFLOW-222] 在用户界面中显示任务实例的持续时间

  • [AIRFLOW-231] 不要在PrestoHook中评估用户输入

  • [AIRFLOW-216] 添加Sqoop Hook和Operator

  • [AIRFLOW-171] 添加关于邮件和S3升级到1.7.1.2版本的说明

  • [AIRFLOW-238] 兼容 flask-admin 1.4.1 版本

  • [AIRFLOW-230][HiveServer2Hook] 添加多语句支持

  • [AIRFLOW-142] 如果指定hdp作为发行版,setup_env.sh脚本不会下载hive压缩包

  • [AIRFLOW-223] 使Flower绑定的IP可参数化

  • [AIRFLOW-218] 新增选项以启用webserver gunicorn访问/错误日志

  • [AIRFLOW-213] 在提交信息中添加“关闭 #X”短语

  • [AIRFLOW-68] 将开始日期与调度间隔对齐

  • [AIRFLOW-9] 改进文档以符合Apache标准

  • [AIRFLOW-131] 使XCom.clear更具选择性

  • [AIRFLOW-214] 修复偶发的任务实例分离问题

  • [AIRFLOW-206] 添加提交以关闭PR

  • [AIRFLOW-206] 如果本地日志文件存在则始终加载

  • [AIRFLOW-211] 修复JIRA中“resolve”与“close”行为的问题

  • [AIRFLOW-64] 添加关于相对DAGS_FOLDER路径的说明

  • [AIRFLOW-114] 排序插件下拉菜单

  • [AIRFLOW-209] 添加调度器测试并改进血缘关系处理

  • [AIRFLOW-207] 改进JIRA认证流程

  • [AIRFLOW-187] 改进PR工具用户体验

  • [AIRFLOW-155] Qubole操作符文档

  • 优化并重构 process_dag

  • [AIRFLOW-185] 处理空版本列表

  • [AIRFLOW-201] 修复HiveMetastoreHook与kerberos的问题

  • [AIRFLOW-202]: 修复多余的打印行

  • [AIRFLOW-196] 修复HttpSensor中异常未被处理的bug

  • [AIRFLOW-195] : 在CLI中添加对子DAG清除的切换支持

  • [AIRFLOW-23] 支持Google Cloud DataProc

  • [AIRFLOW-25] Celery 配置始终为必填项

  • [AIRFLOW-190] 添加代码覆盖率统计并移除下载计数

  • [AIRFLOW-168] 修正@once调度的评估

  • [AIRFLOW-183] 当工作节点返回4xx/5xx响应时从远程获取日志

  • [AIRFLOW-181] 通过重新下载修复hadoop解包失败的问题

  • [AIRFLOW-176] 移除未使用的格式化键

  • [AIRFLOW-167]: 在cli中添加dag_state选项

  • [AIRFLOW-178] 修复bug以便在DAG文件夹中检测到zip文件

  • [AIRFLOW-176] 改进PR工具的JIRA工作流程

  • AIRFLOW-45: 支持隐藏的Airflow变量

  • [AIRFLOW-175] 在PR工具中执行检出前先运行git-reset

  • [AIRFLOW-157] 使PR工具兼容Python3;添加JIRA命令

  • [AIRFLOW-170] 添加缺失的@apply_defaults

Airflow 1.7.1 (2016-05-19)

  • 修复:不要将未成熟任务视为无法运行的任务

  • AIRFLOW-92 避免不必要的上游失败会话关闭 apache/airflow#1485

  • 添加逻辑以锁定数据库并避免竞态条件

  • 处理来自多个作业/执行器的排队任务

  • AIRFLOW-52 警告关于在DAG中覆盖任务

  • 修复了连接进程/队列时的边界情况 (#1473)

  • [AIRFLOW-52] 修复处理大量任务时的性能瓶颈

  • 添加列以在连接列表视图中切换额外详细信息。

  • 记录导入DAG时的错误数量

  • 将队列中重复的dagbag指标日志消息记录到StatsD (#1406)

  • 清理问题模板 (#1419)

  • 在cli中将错误的arg.foreground修正为arg.daemon

  • 恢复对GitHub企业版认证的导入支持

  • 在webserver中使用os.execvp替代subprocess.Popen

  • 将使用“--foreground”恢复为“--daemon”

  • 实现一个Cloudant钩子

  • airflow clear添加缺失的参数

  • 修复了调度器中的一个错误:使用了num_runs而实际应该使用runs

  • 为调度器添加多进程支持

  • 部分修复以确保next_run_date不能为None

  • 支持在CLI中列出/获取/设置变量

  • 在BigQuery hook中正确处理BigQuery布尔值。

  • 新增了在网页服务器中查看XCom变量的功能

  • 将DAG.tasks从列表改为字典

  • 添加对压缩DAGs的支持

  • 在实例化S3操作符时停止创建钩子

  • 在视图中使用子查询来查找正在运行的DAG

  • 防止每次调度器迭代时重新加载DAG

  • 为文档添加缺失的单词

  • 记录DbApiHook的参数

  • 添加了带有现有oracle钩子的oracle操作符

  • 将PyOpenSSL添加到Google Cloud gcp_api。

  • 移除执行器错误单元测试

  • 添加DAG推断、延迟和上下文管理器

  • 写入文件到Google云存储时不返回错误。

  • 修复gcp_api的GCS日志记录。

  • 确保属性在错误消息的作用域内

  • 修复错误命名的PULL_REQUEST_TEMPLATE

  • 将 non_pooled_task_slot_count 提取为配置参数

  • 更新 plugins.rst 以更清晰地说明示例 (#1309)

  • 修复S3日志记录问题

  • 添加Twitter订阅示例DAG

  • GitHub ISSUE_TEMPLATE & PR_TEMPLATE 清理

  • 减少日志冗长程度

  • 添加PR模板

  • 将Lucid添加到用户列表

  • 修复asciiart的使用问题

  • 在are_dependencies_met中使用session替代已过时的main_session

  • 修复Celery Flower端口分配问题

  • 修复因flask-admin升级导致的编辑操作缺失问题

  • 修复prioritize_queued方法注释中的拼写错误

  • 添加HipchatOperator

  • 在回填单元测试中包含所有示例DAG

  • 确保跳过的作业确实被跳过

  • 修复一个损坏的示例DAG,example_skip_dag.py

  • 添加一致且全面的信号处理和日志记录

  • 允许操作员在内部指定跳过状态

  • 更新执行器陷阱单元测试的文档字符串

  • 文档:解释Jinja模板在模板参数中的用法

  • 不要在DAG的start_date之前安排运行

  • 修复了使用池时的无限重试问题,并附带测试

  • 修复死锁作业的处理问题

  • 仅显示Airflow的弃用警告

  • 为单元测试设置DAG_FOLDER

  • setup.py 中缺少逗号

  • 弃用BaseOperator中的args和kwargs

  • 抛出深度调度器异常以强制进程重启。

  • 修改不一致的示例DAG所有者

  • 修复配置中send_email_smtp的模块路径

  • 将Gentner实验室添加到用户列表中

  • 增加单元测试的超时时间

  • 修复从配置中读取字符串的问题

  • 杂项 - 移除尾部空格

  • 修复SSHExecuteOperator在使用自定义SSH端口时崩溃的问题

  • 在模板中添加关于Airflow组件的说明

  • 重写BackfillJob逻辑以提高清晰度

  • 添加单元测试

  • 修复各种错误并清理代码

  • 修复确定DagRun状态的逻辑

  • 使SchedulerJob不运行每个排队的任务

  • 改进BackfillJob对排队/死锁任务的处理

  • 引入 ignore_depends_on_past 参数

  • 将Popen与CeleryExecutor一起使用

  • 将用户表重命名为users以避免与postgres冲突

  • 注意负数的池槽位。

  • 添加对从boto调用_format到S3_Hook的支持

  • 添加PyPI元数据并同步版本号

  • 将dags_are_paused_at_creation的默认值设置为True

  • 重新恢复被rebase/push -f操作覆盖的S3Log类

  • 在initdb结束时添加缺失的session.commit()

  • 验证子DAG任务是否有可用的池槽位,并进行测试

  • 对远程GCS日志使用urlparse,并添加单元测试

  • 使webserver工作线程超时可配置

  • 修复了@once间隔的固定调度问题

  • 使用psycopg2的API来序列化postgres单元格值

  • 使provide_session装饰器更加健壮

  • 更新Lyft官网链接

  • 使用num_shards替代partitions以保持与批量数据摄入的一致性

  • 在README中添加文档链接

  • 更新文档,添加独立的配置章节

  • 修复 airflow.utils 弃用警告代码与 Python 3 不兼容的问题

  • 将dbapi单元格序列化提取到独立的方法中

  • 仅在服务器版本低于7.4时设置Postgres自动提交

  • 在单元测试导入中使用重构后的utils模块

  • 添加1.7.0版本的变更日志

  • 在Travis上尽可能使用LocalExecutor

  • 移除未使用的logging、errno和MiniHiveCluster导入

  • 移除日志库的多余导入

  • 修复所需的gcloud版本

  • 将utils重构为更小的子模块

  • 正确测量任务重试次数

  • 新增功能以字典形式获取配置,并添加单元测试

  • 将分支'master'合并到hivemeta_sasl

  • 在README.md中添加维基链接

  • [修复] 将email.Utils改为email.utils以兼容Python3

  • 在警告邮件中添加缺失的“日期”标头

  • 在警告邮件中添加缺失的“日期”标头

  • 检查SubDag类的名称而非类本身

  • [热修复] 从.coveralls.yml中移除repo_token

  • 在coverals.yml中设置service_name

  • 修复 #1223

  • 更新Airflow文档以支持远程日志记录

  • 添加单元测试以捕获Executor错误

  • 确保执行器(Executors)能正确捕获错误

  • 修复 HttpOpSensorTest 以使用模拟请求会话

  • 代码检查

  • 在文档中添加一个关于池(pool)使用示例

  • 向bigquery hook的基础游标添加两个方法:run_table_upsert,用于添加表或更新现有表;以及run_grant_dataset_view_access,用于授予给定表对给定数据集的视图访问权限。

  • 任务使用字符串而非引用来引用上游和下游任务

  • 修复 models.py 中的拼写错误

  • 修复文档中的损坏链接

  • [热修复] 修复Scheduler CLI使dag_id变为可选参数

  • 更新README中指向常见陷阱维基页面的链接

  • 允许在通过DbApiHook插入行时禁用定期提交

  • 将Glassdoor添加到“谁在使用airflow”中

  • 修复阻止启动webserver的拼写错误

  • 文档徽章

  • 修复 ISSUE_TEMPLATE 名称以包含 .md 后缀

  • 添加ISSUE_TEMPLATE以确保问题被充分定义

  • 代码检查与调试

  • 重构CLI使其数据驱动

  • 更新Contributing.md文件中的Bug报告协议

  • 修复文档

  • 清理对旧会话的引用

  • 移除会话引用

  • 解决冲突

  • 任务实例开始时清除xcom数据

  • 将 main_session 替换为 @provide_session

  • 向installation.rst添加额外内容

  • 更新贡献指南以更准确地反映当前开发状态。

  • 修改README文件以链接至维基贡献者列表

  • 文档:修复了默认配置中的一个拼写错误

  • 将webservice.service的killMode设置为'control-group'

  • 将worker.service的KillMode设置为'control-group'

  • 代码检查

  • 修复WebHdfsSensor

  • 添加更多许可证以通过检查

  • 修复landscape的配置

  • [热修复] 主分支中存在的拼写错误

  • [热修复] 修复景观需求检测问题

  • 使Hive测试变为条件性

  • 将远程跟踪分支 'upstream/master' 合并到 minicluster 中

  • 更新 README.md

  • 添加一些许可证以通过构建

  • 为landscape.io添加reqs.txt文件

  • 指向一个 reqs 文件

  • 一些代码检查

  • 添加一个.landscape.yml文件

  • PyPI版本徽章

  • 为SQL和CSV文件添加许可证和忽略规则

  • 使用正确的连接ID

  • 使用正确的表名

  • 为CI测试提供数据

  • 新增显示需求过时状态的徽章

  • 移除requirements.txt文件,因为它是单一维度的

  • 使其在Python 3上运行

  • 移除日志解码

  • 同时保持与py2兼容

  • 更多 Python 3 修复

  • 转换为字节以兼容Python 3

  • 确保兼容Python 3

  • 使用unicodecsv使其兼容Python 3

  • 将制表符替换为空格 移除未使用的导入

  • 合并远程跟踪分支 'upstream/master'

  • 支持MySQL中的decimal类型到GCS

  • 确保将二进制数据写成字符串形式,因为字符串可能是Unicode编码

  • 忽略元存储

  • 更多impyla修复

  • 测试HivemetaStore(如果使用Python 2)

  • 允许用户在HDFSHook配置中设置hdfs_namenode_principal

  • 为Hiveserver2添加测试并修复impyla中的一些问题

  • 将分支 'impyla' 合并到 minicluster

  • 该补丁允许测试hive操作符和钩子。使用了Sasl(连接字符串中不能使用NoSasl)。测试已相应调整。

  • 在评估 depends_on_past=True 时,将 SKIPPED 和 SUCCESS 视为相同处理

  • 修复bigquery hook

  • gcp_api的版本上限

  • 修复返回VerticaHook时的拼写错误

  • 添加fernet密钥以将其作为标准输出命令的一部分使用

  • 添加对ssl参数的支持。(基于jthomas123的工作)

  • 错误信息中有更多详情。

  • 确保路径不会因为末尾的 / 而产生冲突

  • 将 gcs_hook 改为 self.hook

  • 重构远程日志读写功能并添加GCS支持

  • 仅当文件足够大时,才在S3Hook中使用多部分上传

  • 合并分支 'airbnb/master'

  • 为HiveMetaStoreHook添加GSSAPI SASL支持。

  • 为已弃用的设置添加警告

  • 使用 kerberos_service_name = 'hive' 作为标准,而非 'impala'。

  • 使用GSSAPI替代KERBEROS并提供向后兼容性

  • ISSUE-1123 使用impyla替代pyhs2

  • 设置celery_executor以使用队列名称作为交换

这篇内容对您有帮助吗?