Airflow:HttpSensor实现API驱动数据流程

数据管道工作流通常依赖于api来访问、获取和处理来自外部系统的数据。为了处理这些场景,Apache Airflow提供了HttpSensor,这是一个内置的Sensor,用于监视HTTP请求的状态,并在满足指定条件时触发后续任务。在这篇博文中,我们将深入探讨HttpSensor,涵盖它的特性、用例、实现、自定义和最佳实践。

介绍HttpSensor

定义HttpSensor是 Airflow 中的一个传感器(Sensor)。传感器在 Airflow 中用于等待某些条件满足后再继续执行后续任务。HttpSensor专门用于检查 HTTP 端点是否返回预期的状态码,以此来判断某个 HTTP 服务是否可用或者某个网页是否可以正常访问等。
在这里插入图片描述

工作原理:它会发送 HTTP 请求到指定的端点(URL),然后检查响应的状态码。如果状态码符合预期(默认是 200),则传感器任务完成,允许工作流继续执行后续任务;如果状态码不符合预期或者请求出现错误(如连接超时、网络问题等),则传感器会按照一定的策略(如重试策略)不断地重新检查,直到满足条件或者达到重试上限。

应用场景:

HttpSensor 典型应用场景主要有以下几类:

  • 在数据管道方面,用于 ETL 流程中,在开始阶段检查数据来源(如 Web 服务、API)是否可用,确保数据能顺利提取,还用于数据仓库更新时监控外部数据源。
  • 在微服务架构里,用于服务依赖监控,检查一个微服务所依赖的其他微服务是否正常运行,同时在容器化环境的服务发现中,确定新部署或扩展后的微服务是否可访问。
  • 对于网页和 Web 应用,一是进行网站可用性监测,定期检查网站主要页面状态码,及时发现故障;二是用于内容更新验证,检查内容更新后页面是否可访问、内容是否更新成功,以保障 Web 应用正常运行。

HttpSensor示例

  • 环境准备

    假设已经安装并配置好 Airflow。如果没有,请先安装 Airflow 并初始化数据库(例如,使用airflow initdb命令)。

  • 定义 DAG(有向无环图)和 HttpSensor 任务

    以下是简单的 Airflow DAG 示例,其中包含一个HttpSensor任务,用于检查一个示例网站(这里以https://www.example.com为例)是否可以正常访问。

from airflow import DAG
from airflow.operators.http_operator import SimpleHttpOperator
from airflow.sensors.http_sensor import HttpSensor
from datetime import datetime, timedelta

# 设置默认参数
default_args = {
    'owner': 'airflow',
   'start_date': datetime(2023, 1, 1),
   'retries': 3,
   'retry_delay': timedelta(minutes=5)
}
# 创建DAG对象
dag = DAG(
    'http_sensor_example',
    default_args=default_args,
    schedule_interval='@daily'
)
# 创建HttpSensor任务
check_website = HttpSensor(
    task_id='check_website',
    http_conn_id='http_default',
    endpoint='https://www.example.com',
    poke_interval=60,  # 每60秒检查一次
    dag=dag
)

# 创建一个简单的后续任务,用于在网站可访问后执行
def print_message():
    print("网站可以正常访问!")
    
send_message = SimpleHttpOperator(
    task_id='send_message',
    http_conn_id='http_default',
    endpoint='/',
    method='GET',
    python_callable=print_message,
    dag=dag
)
# 设置任务依赖关系
check_website >> send_message

代码解释

  • 导入模块

    首先导入必要的 Airflow 模块,包括DAG用于定义工作流,SimpleHttpOperator用于发送简单的 HTTP 请求操作(这里用于后续的简单演示),HttpSensor用于检查 HTTP 端点的传感器,以及日期时间相关的模块用于设置工作流的开始日期等参数。

  • 设置默认参数

    定义default_args字典,其中包含工作流的所有者(owner)、开始日期(start_date)、重试次数(retries)和重试延迟(retry_delay)等参数。这些参数将被应用到 DAG 中的所有任务。

  • 创建 DAG 对象

    使用DAG类创建一个名为http_sensor_example的 DAG 对象,指定了之前定义的默认参数和调度间隔(schedule_interval),这里设置为每天执行一次(@daily)。

  • 创建 HttpSensor 任务

    创建HttpSensor任务,命名为check_websitehttp_conn_id通常用于指定 Airflow 中预定义的 HTTP 连接配置(这里使用http_default,可以根据实际情况修改和配置),endpoint是要检查的 HTTP 端点的 URL。poke_interval表示检查的间隔时间,单位是秒。

  • 创建后续任务

    定义一个简单的函数print_message,用于在网站可以正常访问后打印一条消息。然后使用SimpleHttpOperator创建一个名为send_message的任务,这个任务在check_website任务成功后执行,它会发送一个简单的 GET 请求到网站根目录(/),并且在请求时调用print_message函数。

  • 设置任务依赖关系

    通过check_website >> send_message设置任务的依赖关系,确保check_website任务成功完成后才会执行send_message任务。

运行和监控 DAG

  • 启动 Airflow 服务

    启动 Airflow 的 Web 服务器(airflow webserver)和调度器(airflow scheduler),以便可以在 Web 界面中查看和管理 DAG。

  • 在 Web 界面中操作

    打开 Airflow 的 Web 界面(通常是http://localhost:8080),在 DAG 列表中找到http_sensor_example,可以手动触发 DAG 执行,或者等待按照调度间隔自动执行。在执行过程中,可以在任务实例页面查看HttpSensor任务的状态,观察它是否成功检查到网站可以正常访问,以及后续任务是否正确执行。

请注意,在实际使用中,可能需要根据具体的网络环境、要检查的 HTTP 端点的特性以及业务需求等因素,调整HttpSensor的参数(如poke_intervalretriesretry_delay等)和其他相关任务的设置。同时,要确保 Airflow 的配置正确,并且具有访问目标 HTTP 端点的网络权限。

自定义HttpSensor 行为

HttpSensor提供了几个参数,你可以用它们来定制它的行为:

  • http_conn_id: HTTP服务器的连接ID,引用Airflow界面中建立的连接。

  • endpoint:发送请求的API端点(路径)。

  • method:用于请求的HTTP方法(例如,‘GET’、‘POST’、‘PUT’等)。

  • headers:要包含在HTTP请求中的header字典。

  • data:在POST和PUT等方法的请求体中发送的数据。

  • response_check:一个Python可调用函数(例如lambda函数),它接受HTTP响应作为参数并返回bool值

  • mode:传感器的工作模式。默认情况下,它使用“poke”模式,定期检查所需的条件。

  • timeout:传感器在失败前等待所需条件满足的最大时间(以秒为单位)。缺省情况下,没有超时。

  • poke_interval:检查所需条件之间的时间间隔(以秒为单位)。默认值是60秒。
    在这里插入图片描述

最佳实践

  • 使用描述性的task_id:确保为HttpSensors使用清晰且有意义的task_id,以提高dag的可读性和可维护性。

  • 设置适当的超时:为HttpSensor设置合理的超时,以避免让任务无限期地等待API可用或完成处理。这有助于防止资源耗尽,并确保如果在预期的时间范围内没有满足所需的条件,管道可以正常失败。

  • 调整间隔:根据具体用例自定义poke_interval。如果API的响应时间不确定,你可能希望使用更长的间隔来避免过多的轮询。相反,如果希望API快速响应,则较短的间隔可能更合适。

  • 处理API身份验证:如果你的API需要身份验证,请确保在HTTP连接设置中设置适当的身份验证方法(例如,基本身份验证,令牌身份验证等)。

  • 使用response_check可调用对象:始终定义一个response_check可调用对象,它准确地反映了HttpSensor所需的条件。这允许传感器在继续执行下一个任务之前确定API的响应是否满足要求。

总结

Apache Airflow HttpSensor是功能强大的通用工具,用于监控数据管道中外部api的状态。通过了解它的各种用例和参数,你可以创建高效的工作流,可以在继续之前等待特定的API条件得到满足。在继续使用Apache Airflow 时,请记住利用HttpSensor的强大功能来有效地监视和管理dag中api驱动的依赖项。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950351.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图数据库 | 17、高可用分布式设计(上)

我们在前面的文章中,探索了多种可能的系统扩展方式,以及每种扩展方式的优劣。 本篇文章将通过具体的架构设计方案来对每一种方案的设计、投入产出比、各项指标与功能,以及孰优孰劣等进行评价。 在设计高性能、高可用图数据库的时候&#xf…

JAVA学习记录1

文章为个人学习记录,仅供参考,如有错误请指出。 什么是JAVA? JAVA是一种高级的编程语言,可以用于开发大部分场景的软件,但主要用于服务器的开发。 什么是JDK? 类似于python使用PyCharm来编写代码&#…

css中的部分文字特性

文章目录 一、writing-mode二、word-break三、word-spacing;四、white-space五、省略 总结归纳常见文字特性,后续补充 一、writing-mode 默认horizontal-tbwriting-mode: vertical-lr; 从第一排开始竖着排,到底部再换第二排,文字与文字之间从…

Android wifi常见问题及分析

参考 Android Network/WiFi 那些事儿 前言 本文将讨论几个有意思的网络问题,同时介绍 Android 上常见WiFi 问题的分析思路。 网络基础Q & A 一. 网络分层缘由 分层想必大家很熟悉,是否想过为何需要这样分层? 网上大多都是介绍每一层…

【C语言】_指针与数组

目录 1. 数组名的含义 1.1 数组名与数组首元素的地址的联系 1.3 数组名与首元素地址相异的情况 2. 使用指针访问数组 3. 一维数组传参的本质 3.1 代码示例1:函数体内计算sz(sz不作实参传递) 3.2 代码示例2:sz作为实参传递 3…

IDEA 字符串拼接符号“+”位于下一行的前面,而不是当前行的末尾

效果图 IDEA 默认效果是“历史效果”,经过修改后为“预期效果” 设置方式 在设置中找到Editor > Code Style > Java > Wrapping and Braces > Binary expressions > 勾选 Operation sign on next line 即可实现。具体设置如图。

牛客网刷题 ——C语言初阶(2分支和循环-for)——打印菱形

1. 题目描述 用C语言在屏幕上输出以下图案: 2. 思路 我是先上手,先把上半部分打印出来,然后慢慢再来分析,下面这是我先把整个上半部分打印出来,因为空格不方便看是几个,这里先用&代替空格了 然后这里…

C# 整型、浮点型 数值范围原理分析

总目录 前言 一、整型、浮点型 数值范围列表 二、什么是大小、范围 在上面的列表中,每个数据类型都有自己的Range (范围) 和 Size (大小)。 1. 范围 范围好理解,就是对应数据类型的数据范围,如 sbtyte 的数据范围是 -128~127,超…

安装vue脚手架出现的一系列问题

安装vue脚手架出现的一系列问题 前言使用 npm 安装 vue/cli2.权限问题及解决方法一:可以使用管理员权限进行安装。方法二:更改npm全局安装路径 前言 由于已有较长时间未进行 vue 项目开发,今日着手准备开发一个新的 vue 项目时,在…

Qt 5.14.2 学习记录 —— 칠 QWidget 常用控件(2)

文章目录 1、Window Frame2、windowTitle3、windowIcon4、qrc机制5、windowOpacity 1、Window Frame 在运行Qt程序后,除了用户做的界面,最上面还有一个框,这就是window frame框。对于界面的元素,它们的原点是Qt界面的左上角或win…

数据结构大作业——家谱管理系统(超详细!完整代码!)

目录 设计思路: 一、项目背景 二、功能分析 查询功能流程图: 管理功能流程图: 三、设计 四、实现 代码实现: 头文件 结构体 函数声明及定义 创建家谱树头结点 绘制家谱树(打印) 建立右兄弟…

springboot参数注解

在Spring Boot中,创建RESTful API时,通常会使用Spring MVC提供的注解来声明请求参数。以下是一些常用的注解及其用途: 1. RequestBody 用途:用于将HTTP请求的body部分绑定到方法参数上,通常用于接收JSON或XML格式的数…

uniapp实现在card卡片组件内为图片添加长按保存、识别二维码等功能

在原card组件的cover属性添加图片的话&#xff0c;无法在图片上面绑定 show-menu-by-longpress"true"属性&#xff0c;通过将图片自定义添加可使用该属性。 代码&#xff1a; <uni-card title"标题" padding"10px 0" :thumbnail"avata…

【Springer斯普林格出版,Ei稳定,往届快速见刊检索】第四届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2025)

第四届电子信息工程、大数据与计算机技术国际学术会议&#xff08;EIBDCT 2025&#xff09;将于2025年2月21-23日在中国青岛举行。该会议主要围绕电子信息工程、大数据、计算机技术等研究领域展开讨论。会议旨在为从事相关科研领域的专家学者、工程技术人员、技术研发人员提供一…

docker内外如何实现ROS通信

写在前面 在一台电脑上装有docker&#xff0c;docker内外均装有ROS系统&#xff0c;现在想要实现docker内外的ROS通信&#xff0c;怎么办呢&#xff1f; 首先&#xff0c;因为是同一台电脑的docker内外&#xff0c;所以IP本身是互通的&#xff0c;不需要在/etc/hosts中添加IP…

2025年01月07日Github流行趋势

项目名称&#xff1a;khoj 项目地址url&#xff1a;https://github.com/khoj-ai/khoj项目语言&#xff1a;Python历史star数&#xff1a;20105今日star数&#xff1a;363项目维护者&#xff1a;debanjum, sabaimran, MythicalCow, aam-at, shantanuSakpal项目简介&#xff1a;你…

web3与AI结合-Sahara AI 项目介绍

背景介绍 Sahara AI 于 2023 年创立&#xff0c;是一个 "区块链AI" 领域的项目。其项目愿景是&#xff0c;利用区块链和隐私技术将现有的 AI 商业模式去中心化&#xff0c;打造公平、透明、低门槛的 “协作 AI 经济” 体系&#xff0c;旨在重构新的利益分配机制以及…

patchwork++地面分割学习笔记

参考资料&#xff1a;古月居 - ROS机器人知识分享社区 https://zhuanlan.zhihu.com/p/644297447 patchwork算法一共包含四部分内容&#xff1a;提出了以下四个部分&#xff1a;RNR、RVPF、A-GLE 和 TGR。 1&#xff09;基于 3D LiDAR 反射模型的反射噪声消除 (RNR)&#xff…

渗透测试-非寻常漏洞案例

声明 本文章所分享内容仅用于网络安全技术讨论&#xff0c;切勿用于违法途径&#xff0c;所有渗透都需获取授权&#xff0c;违者后果自行承担&#xff0c;与本号及作者无关&#xff0c;请谨记守法. 此文章不允许未经授权转发至除先知社区以外的其它平台&#xff01;&#xff0…

全局变量(PHP)(小迪网络安全笔记~

免责声明&#xff1a;本文章仅用于交流学习&#xff0c;因文章内容而产生的任何违法&未授权行为&#xff0c;与文章作者无关&#xff01;&#xff01;&#xff01; 附&#xff1a;完整笔记目录~ ps&#xff1a;本人小白&#xff0c;笔记均在个人理解基础上整理&#xff0c;…