概述
- HdfsSensor主要用于检查hdfs文件或目录是否存在
实操
案例描述:
目前需要在airflow中增加一个任务,用于检测hdfs中的目标文件是否存在。文件绝对路径:/user/hdfs/for_test_2022-05-12.parquet
代码如下
from airflow import DAG
from datetime import datetime, timedelta
from airflow.providers.apache.hdfs.sensors.hdfs import HdfsSensor
# 自定义的方法,用于将日期格式化为指定格式。其中interval表示时区。默认返回格式:2022-05-12
def date_format(logical_date, format="%Y-%m-%d", interval=9):
new_date = (logical_date + timedelta(hours=interval))
result = new_date.strftime(format)
return result
# [START instantiate_dag]
with DAG(
dag_id='spark_sql',
schedule_interval=None,
user_defined_macros={
"date_format": date_format,
}, # 自定义的方法需要注册为宏变量,后续才能被引用
) as dag:
# 用于检查文件是否存在
check_hour_table= HdfsSensor(
task_id='check_task',
hdfs_conn_id='hdfs-conn', # hdfs_conn_id可通过ariflow web界面的Connection进行配置
mode='reschedule', # reschedule: 该模式在休眠期间不会占用slot,只有在执行时才会占用
poke_interval=300, # 两次检查的间隔时间,单位秒。使用reschedule模式时,建议该值不小于60。
# 需要检测文件路径。这里也可以使用*进行模糊匹配,例:/user/hdfs/for_test*.parquet。注意:这里面的date_format是我在上面自定义的宏变量,并非airflow自带的
filepath='/user/hdfs/for_test_{{date_format(logical_date)}}.parquet',
# timeout=600, # 超时时间,单位秒。可根据情况选择是否使用。
# soft_fail=False, # 如果设置为true,则失败时将任务标记为跳过。默认false
)
注意
- 需要装的python module:apache-airflow-providers-apache-hdfs
- 导包:from airflow.providers.apache.hdfs.sensors.hdfs import HdfsSensor
- hdfs_conn_id 是在web页面中添加,host需要指的namenode部署地址,端口一般是 8020
参考文档
说明: HdfsSensor继承于BaseSensorOperator,所以能够使用BaseSensorOperator中的全部参数