1、Airflow简介

Airflow是一个以编程方式创作,安排和监控工作流程的平台。

当工作流被定义为代码时,它们变得更易于维护,可版本化,可测试和协作。

使用Airflow将工作流作为任务的有向非循环图(DAG)。 Airflow调度程序在遵循指定的依赖项的同时在一组worker上执行您的任务。 丰富的命令行实用程序可以轻松地在DAG上执行复杂的手术。 丰富的用户界面使您可以轻松地可视化生产中运行的管道,监控进度以及在需要时解决问题。

Airflow的英文官网:

https://airflow.apache.org/project.html

Airflow是由Airbnb开源的一款工具,目前在github上已经近一万颗星,从该项目的github地址可获取源码和很多示例文件:

https://github.com/apache/incubator-airflow

https://github.com/apache/incubator-airflow/tree/master/airflow/example_dags

设计原则

  • 动态:Airflow配置为代码(Python),允许动态生成pipeline。 这允许编写动态实例化的pipelines代码。

  • 可扩展:轻松定义自己的opertators,执行程序并扩展库,使其符合适合您环境的抽象级别。

  • 优雅:Airflow精益而明确。 使用强大的Jinja模板引擎将参数化脚本内置于Airflow的核心。

  • 可扩展:Airflow具有模块化体系结构,并使用消息队列来协调任意数量的工作者。 Airflow已准备好扩展到无限远。

在查阅国内使用airflow的相关资料时,看到大部分网友是拿来作为代替crontab的一个高级定时任务管理工具使用,考虑到airflow的调度管理特性,确实也很擅长于做这些。不过airflow的核心价值应该是在于它是一个有向非循环的组织结构。在我们有一些比较复杂的后台工作任务需要进行自动化地处理时,airflow是一个非常好用的任务工作流编排和管理的工具。

2、快速开始

mkdir -p ~/airflow
export AIRFLOW_HOME=~/airflow
export SLUGIFY_USES_TEXT_UNIDECODE=yes
pip install apache-airflow# initialize the database
airflow initdb# start the web server, default port is 8080
airflow webserver -p 8080# start the scheduler
airflow scheduler

通过浏览器访问以下地址:

http://localhost:8080

Airflow服务的配置文件为airflow.cfg,可以通过UI界面配置相关参数。

默认情况下,airflow使用一个sqlite数据库和SequentialExecutor执行器,这种使用方式时将仅支持按顺序得运行任务,只用于学习和实验用途。

我们先看两个演示的任务实例:

# run your first task instance
airflow run example_bash_operator runme_0 2018-09-06
# run a backfill over 2 days
airflow backfill example_bash_operator -s 2018-09-06 -e 2018-09-07

如果需要部署一个用于生产的环境,则按下面两个链接中的信息,安装其他类型的数据库并对配置文件进行变更。

https://airflow.apache.org/installation.html

https://airflow.apache.org/howto/initialize-database.html

3、定义一个DAG

人们有时会将DAG定义文件视为可以进行实际数据处理的地方 - 事实并非如此! 该脚本的目的是定义DAG对象。 它需要快速评估(秒级,而不是几分钟),因为调度程序将定期执行它以反映出变更(如果有的话)。Airflow 只是一个Python脚本,用来定义了Airflow DAG对象。 

下面是一个airflow pipeline的示例:

https://raw.githubusercontent.com/apache/incubator-airflow/master/airflow/example_dags/tutorial.py

# -*- coding: utf-8 -*-
#
# 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.
"""
### Tutorial Documentation
Documentation that goes along with the Airflow tutorial located
[here](https://airflow.incubator.apache.org/tutorial.html)
"""
# 导入依赖库
import airflow
from airflow import DAG
# 导入特定的执行器
from airflow.operators.bash_operator import BashOperator
from datetime import timedelta# these args will get passed on to each operator
# you can override them on a per-task basis during operator initialization
# 显式地将一组参数传递给每个任务的构造函数作为默认参数
default_args = {'owner': 'airflow','depends_on_past': False,'start_date': airflow.utils.dates.days_ago(2),'email': ['airflow@example.com'],'email_on_failure': False,'email_on_retry': False,'retries': 1,'retry_delay': timedelta(minutes=5),# 'queue': 'bash_queue',# 'pool': 'backfill',# 'priority_weight': 10,# 'end_date': datetime(2016, 1, 1),# 'wait_for_downstream': False,# 'dag': dag,# 'adhoc':False,# 'sla': timedelta(hours=2),# 'execution_timeout': timedelta(seconds=300),# 'on_failure_callback': some_function,# 'on_success_callback': some_other_function,# 'on_retry_callback': another_function,# 'trigger_rule': u'all_success'
}
# 我们需要一个DAG对象来嵌入我们的任务。 这里我们需要传递一个定义dag_id的字符串,它用作DAG的唯一标识符。 我们还传递我们刚刚定义的默认参数字典,并为DAG定义1天的schedule_interval。
dag = DAG('tutorial',default_args=default_args,description='A simple tutorial DAG',schedule_interval=timedelta(days=1))
# 生成任务。 从operator实例化的对象称为构造器。 第一个参数task_id充当任务的唯一标识符。任务必须包含或继承参数task_id和owner,否则Airflow将引发异常。
# t1, t2 and t3 are examples of tasks created by instantiating operators
t1 = BashOperator(task_id='print_date',bash_command='date',dag=dag)t1.doc_md = """\
#### Task Documentation
You can document your task using the attributes `doc_md` (markdown),
`doc` (plain text), `doc_rst`, `doc_json`, `doc_yaml` which gets
rendered in the UI's Task Instance Details page.
![img](http://montcs.bloomu.edu/~bobmon/Semesters/2012-01/491/import%20soul.png)
"""dag.doc_md = __doc__t2 = BashOperator(task_id='sleep',depends_on_past=False,bash_command='sleep 5',dag=dag)
# Airflow充分利用了Jinja Templating的强大功能,并提供了一组内置参数和宏。 Airflow还支持自定义参数、宏和模板的钩子。下面的示例使用到了最常见的模板变量:{{ ds}}(今天的“日期戳”)
templated_command = """
{% for i in range(5) %}echo "{{ ds }}"echo "{{ macros.ds_add(ds, 7)}}"echo "{{ params.my_param }}"
{% endfor %}
"""t3 = BashOperator(task_id='templated',depends_on_past=False,bash_command=templated_command,params={'my_param': 'Parameter I passed in'},dag=dag)
# 配置任务之间的依赖关系,使得任务t2和t3依赖于t1
t2.set_upstream(t1)
t3.set_upstream(t1)

Airflow所支持的更多变理和宏:https://airflow.apache.org/code.html#macros

4、测试

将脚本文件放在指定路径下,执行一次,如果没有报错,说明脚本文件中不存在语法错误。

python ~/airflow/dags/tutorial.py

命令行元数据验证

# print the list of active DAGsairflow list_dags# prints the list of tasks the "tutorial" dag_idairflow list_tasks tutorial# prints the hierarchy of tasks in the tutorial DAGairflow list_tasks tutorial --tree## Testing# testing print_date
airflow test tutorial print_date 2018-09-06# testing sleep
airflow test tutorial sleep 2018-09-06# testing templated
airflow test tutorial templated 2018-09-06## Backfill# optional, start a web server in debug mode in the background
airflow webserver --debug &# start your backfill on a date range
airflow backfill tutorial -s 2018-09-06 -e 2018-09-07

5、重要概念

5.1 DAGs

DAG不关心其组成任务的作用; 它的工作是确保一批任务可以在正确的时间或正确的顺序发生,或可以正确处理任何意外的问题。

DAG在标准Python文件中定义,这些文件放在Airflow的DAG_FOLDER中。 Airflow将执行每个文件中的代码以动态构建DAG对象。 您可以拥有任意数量的DAG,每个DAG都描述任意数量的任务。 通常,每个应该对应于单个逻辑工作流。

搜索DAG时,Airflow将仅考虑字符串“airflow”和“DAG”都出现在.py文件内容中的文件。

Scope

全局DAG和本地DAG

Airflow将加载它可以从DAG文件导入的任何DAG对象。 重要的是,这意味着DAG必须出现在globals()中。 

以下两个DAG,将只会加载dag_1; 另一个只出现在本地范围内。

dag_1 = DAG('this_dag_will_be_discovered')def my_function():dag_2 = DAG('but_this_dag_will_not')my_function()

有时这可以很好地利用。 例如,SubDagOperator的常见模式是定义函数内的子标记,以便Airflow不会尝试将其作为独立的DAG加载。

Default Arguments

如果将default_args字典传递给DAG,它将把它们应用于任何operator。 这使得很容易将公共参数应用于许多operator而无需多次的输入。

default_args = {'start_date': datetime(2016, 1, 1),'owner': 'Airflow'}dag = DAG('my_dag', default_args=default_args)
op = DummyOperator(task_id='dummy', dag=dag)
print(op.owner) # Airflow

Context Manager

DAG可用作上下文管理器,以自动将新operator分配给该DAG。

5.2 Operators

虽然DAG描述了如何运行工作流,但是由operator确定实际完成的工作。

operator描述工作流中的单个任务。 operators通常(但并非总是)是原子的,这意味着他们可以独立运行,而不需要与任何其他operators共享资源。 DAG将确保operators以正确的顺序运行; 除了这些依赖项之外,operators通常独立运行。 实际上,它们可能在两台完全不同的机器上运行。

这是一个微妙但非常重要的一点:通常,如果两个operators需要共享信息,如文件名或少量数据,您应该考虑将它们组合到一个运算符中。 如果无法绝对避免,Airflow确实也提供了operators交叉通信的功能,称为XCom,本文档的其他部分对此进行了描述。

Airflow为许多常见任务提供operator支持,包括:

  • BashOperator - executes a bash command

  • PythonOperator - calls an arbitrary Python function

  • EmailOperator - sends an email

  • SimpleHttpOperator - sends an HTTP request

  • MySqlOperator, SqliteOperator, PostgresOperator, MsSqlOperator, OracleOperator, JdbcOperator, etc. - executes a SQL command

  • Sensor - waits for a certain time, file, database row, S3 key, etc…

除了这些基本构建块之外,还有许多特定的operators:

DockerOperator, HiveOperator, S3FileTransformOperator, PrestoToMysqlOperator, SlackOperator

airflow/contrib/目录则包含了更多由社区构建的operators。 这些operators并不总是像主发行版中那样完整或经过良好测试,但允许用户更轻松地向平台添加新功能。

Airflow operator的使用方法参见:https://airflow.apache.org/howto/operator.html

DAG Assignment

operator不必立即分配给DAG(之前的dag是必需参数)。 但是,一旦将operator分配给DAG,就无法转移或取消分配。 在创建operator时,通过延迟赋值或甚至从其他operator推导,可以显式地完成DAG分配。

dag = DAG('my_dag', start_date=datetime(2016, 1, 1))# sets the DAG explicitlyexplicit_op = DummyOperator(task_id='op1', dag=dag)# deferred DAG assignmentdeferred_op = DummyOperator(task_id='op2')deferred_op.dag = dag# inferred DAG assignment (linked operators must be in the same DAG)inferred_op = DummyOperator(task_id='op3')inferred_op.set_upstream(deferred_op)

Bitshift Composition 位移组合结构

传统上,使用set_upstream()和set_downstream()方法设置operators之间的依赖关系。 在Airflow 1.8中,这可以通过Python bitshift操作符">>"和"<<"来完成。 

例如,以下四个语句在功能上都是等效的:

op1 >> op2
op1.set_downstream(op2)op2 << op1
op2.set_upstream(op1)

当使用bitshift组合运算符时,关系设置在bitshift运算符指向的方向上。 例如,op1 >> op2表示op1先运行,op2运行第二。 可以组成多个运算符 - 请记住,链从左到右执行,并且始终返回最右边的对象。 例如:

op1 >> op2 >> op3 << op4

上面这行配置的效果相当于下面的依赖关系设置:

op1.set_downstream(op2)op2.set_downstream(op3)op3.set_upstream(op4)

bitshift操作符同样也能使用于DAGs,例如:

dag >> op1 >> op2

相当于:

op1.dag = dagop1.set_downstream(op2)

通过使用bitshift操作符,我们可以把下面多个operators打包成为一个简单的pipeline:

with DAG('my_dag', start_date=datetime(2016, 1, 1)) as dag:(DummyOperator(task_id='dummy_1')>> BashOperator(task_id='bash_1',bash_command='echo "HELLO!"')>> PythonOperator(task_id='python_1',python_callable=lambda: print("GOODBYE!")))

5.3 Tasks

一旦operator被实例化,它就被称为“任务”。 实例化的过程中会调用抽象运算符时定义特定值,参数化后的任务便成为了DAG中的一个节点。

任务实例表示任务的特定运行时,其特征在于dag、任务和时间点的组合。 任务实例也有一个运行状态,可以是“运行”、“成功”、“失败”、“跳过”、“重试”等。

Workflows

您现在熟悉了Airflow的核心构建模块。 有些概念可能听起来非常相似,但词汇表可以概念化如下:

  • DAG: 描述工作应该发生的顺序

  • Operator: 作为执行某些工作的模板的类

  • Task: operator的参数化实例

  • Task Instance: task的运行时实例

  • 已经被分配了DAG

  • 具有与DAG的特定运行相关联的状态

通过组合DAG、Operators来创建TaskInstances,您可以构建出复杂的工作流程。

6、附加功能

除了核心Airflow对象之外,还有许多更复杂的功能可以实现限制同时访问资源、交叉通信、条件执行等行为。

6.1 Hooks

钩子是外部平台和数据库的接口,如Hive,S3,MySQL,Postgres,HDFS和Pig。 Hooks尽可能实现通用接口,并充当operator的构建块。 他们使用airflow.models.Connection模型来获取主机名和身份验证信息。 钩子将身份验证代码和信息保存在pipeline之外,集中在元数据数据库中。

钩子在Python脚本,Airflow airflow.operators.PythonOperator以及iPython或Jupyter Notebook等交互式环境中使用它们也非常有用。

6.2 Pools

当有太多进程同时需要执行时,某些系统可能会被淹没。 Airflow pools可用于限制任意任务集上的并发执行。 要以在UI(菜单 - >管理 - >pools)中管理pools列表,通过为pools命名并为其分配多个worker slots。 然后在创建任务时(即实例化operators),可以通过使用pools参数将task与现有pools之一相关联。

aggregate_db_message_job = BashOperator(task_id='aggregate_db_message_job',execution_timeout=timedelta(hours=3),pool='ep_data_pipeline_db_msg_agg',bash_command=aggregate_db_message_job_cmd,dag=dag)aggregate_db_message_job.set_upstream(wait_for_empty_queue)

pool参数可以与priority_weight结合使用,以定义队列中的优先级,以及在pool中打开的slot时首先执行哪些任务。 默认的priority_weight是1,可以使用任何数字。 在对队列进行排序以评估接下来应该执行哪个任务时,我们使用priority_weight,与来自此任务下游任务的所有priority_weight值相加。 您可以使用它来执行特定的重要任务,并相应地优先处理该任务的整个路径。

当slot被填满时,任务将照常安排。 达到容量后,可运行的任务将排队,其状态将在UI中显示。 当插槽空闲时,排队的任务将根据priority_weight(任务及其后代)开始运行。

请注意,默认情况下,任务不会分配给任何池,并且它们的执行的并行性仅限于执行程序的设置。

6.3 Connections

外部系统的连接信息存储在Airflow元数据数据库中并在UI中进行管理(菜单 - >管理 - >连接)。在那里定义了conn_id,并附加了主机名/登录/密码/schema信息。 Airflow pipelines可以简单地引用集中配置管理中的conn_id,而无需在任何地方硬编码任何此类信息。

可以定义具有相同conn_id的许多连接,并且在这种情况下,并且当hooks使用来自BaseHook的get_connection方法时,Airflow将随机选择一个连接,允许提供一些基本的负载平衡和容错。

Airflow还能够通过操作系统中的环境变量引用连接信息。 但它只支持URI格式。 如果您需要为连接指定extra内容,请使用Web UI。

如果在Airflow元数据数据库和环境变量中都定义了具有相同conn_id的连接,则Airflow将仅引用环境变量中的连接(例如,给定conn_id postgres_master,Airflow将首先在环境变量中搜索AIRFLOW_CONN_POSTGRES_MASTER并直接引用它)。

任何钩子都有一个默认的conn_id,其中使用该钩子的operators不需要显式提供conn_id。 例如,PostgresHook的默认conn_id是postgres_default。

更多的关于Connections的使用方法请参照:https://airflow.apache.org/howto/manage-connections.html

6.4 Queues

使用CeleryExecutor时,可以指定发送任务的celery队列。 queue是BaseOperator的一个属性,因此任何任务都可以分配给任何队列。 环境的默认队列在airflow.cfg的celery - > default_queue中定义。 这定义了未指定任务时分配给的队列,以及Airflow工作程序在启动时侦听的队列。

Workers可以监听一个或多个任务队列。 当工作程序启动时(使用airflow worker命令),可以指定一组由逗号分隔的队列名称(例如,airflow worker -q spark)。 然后,该工作人员将仅接收连接到指定队列的任务。

如果您需要专用的workers,从资源角度来看(例如,一个worker可以毫无问题地执行数千个任务)或者从环境角度(比如您希望worker从Spark群集中运行,这可能非常有用 本身,因为它需要一个非常具体的环境和安全权限)。

6.5 XComs

XComs允许任务间交换消息,允许更细微的控制形式和共享状态。 该名称是“cross-communication”的缩写。 XComs主要由一个key, value和timestamp所定义,但也跟踪创建XCom的task/DAG,以及何时应该可见的属性。 任何可以被pickled的对象都可以用作XCom值,因此用户应该确保使用适当大小的对象。

XComs支持“推”(发送)或“拉”(接收)的方式处理消息。 当任务推送XCom时,它通常可用于其他任务。 任务可以通过调用xcom_push()方法随时推送XComs。 此外,如果任务返回一个值(来自其Operator的execute()方法,或者来自PythonOperator的python_callable函数),则会自动推送包含该值的XCom。

Tasks可以调用xcom_pull()来检索XComs,可选地根据key、source task_ids和source dag_id等条件应用过滤器。 默认情况下,xcom_pull()会过滤出从执行函数返回时被自动赋予XCom的键(与手动推送的XCom相反)。

如果为task_ids传递xcom_pull单个字符串,则返回该任务的最新XCom值; 如果传递了task_ids列表,则返回相应的XCom值列表。

# inside a PythonOperator called 'pushing_task'def push_function():return value# inside another PythonOperator where provide_context=Truedef pull_function(**context):value = context['task_instance'].xcom_pull(task_ids='pushing_task')

也可以直接在模板中pull XCom,这是一个示例:

SELECT * FROM {{ task_instance.xcom_pull(task_ids='foo', key='table_name') }}

请注意,XCom与变量类似,但专门用于任务间通信而非全局设置。

6.6 Variables

变量是将任意内容或配置作为一个key/value简单键值存储的通用方法。 可以从UI(管理 - >变量),代码或CLI列出,创建,更新和删除变量。 此外,json配置文件可以通过UI批量上传。 虽然pipeline代码定义和大多数常量和变量应该在代码中定义并存储在源代码控制中,但是通过UI可以访问和修改某些变量或配置项会很有用。

from airflow.models import Variable
foo = Variable.get("foo")
bar = Variable.get("bar", deserialize_json=True)

第二个调用假设是json内容,并将其反序列化为bar。 请注意,Variable是sqlalchemy模型,可以这样使用。

你可以在jinja模板中按下面方法引用变量:

echo {{ var.value.<variable_name> }}

或者如果需要从变量反序列化json对象:

echo {{ var.json.<variable_name> }}

7.7 Branching

有时您需要一个工作流分支,或者只根据任意条件走下某条路径,这通常与上游任务中发生的事情有关。 一种方法是使用BranchPythonOperator。

BranchPythonOperator与PythonOperator非常相似,只是它需要一个返回task_id的python_callable。 返回task_id,并跳过所有其他路径。 Python函数返回的task_id必须直接引用BranchPythonOperator任务下游的任务。

请注意,在BranchPythonOperator的下游任务中使用depends_on_past = True,这在逻辑上是不合理的,因为skipped状态将总是

因为他们过去的successes而造成task的堵塞。

如果你想跳过一些任务,请记住你不能有一个空路径,如果是这样,那就做一个虚设任务。

像这样,跳过虚拟任务“branch_false”

6.8 SubDAGs

SubDAG非常适合重复模式。 在使用Airflow时,定义一个返回DAG对象的函数是一个很好的设计模式。

Airbnb在加载数据时使用stage-check-exchange模式。 数据在临时表中暂存,然后对该表执行数据质量检查。 一旦检查全部通过,分区就会移动到生产表中。

再举一个例子,考虑以下DAG:

我们可以将所有并行task-* operators组合到一个SubDAG中,生成的DAG类似于以下内容:

请注意,SubDAG operators应包含返回DAG对象的工厂方法。 这将阻止SubDAG在main UI中被视为单独的DAG。

例如:

#dags/subdag.py
from airflow.models import DAG
from airflow.operators.dummy_operator import DummyOperator# Dag is returned by a factory method
def sub_dag(parent_dag_name, child_dag_name, start_date, schedule_interval):dag = DAG('%s.%s' % (parent_dag_name, child_dag_name),schedule_interval=schedule_interval,start_date=start_date,)dummy_operator = DummyOperator(task_id='dummy_task',dag=dag,)return dag

然后可以在主DAG文件中引用此SubDAG:

# main_dag.pyfrom datetime import datetime, timedeltafrom airflow.models import DAGfrom airflow.operators.subdag_operator import SubDagOperatorfrom dags.subdag import sub_dagPARENT_DAG_NAME = 'parent_dag'CHILD_DAG_NAME = 'child_dag'main_dag = DAG(dag_id=PARENT_DAG_NAME,schedule_interval=timedelta(hours=1),start_date=datetime(2016, 1, 1))sub_dag = SubDagOperator(subdag=sub_dag(PARENT_DAG_NAME, CHILD_DAG_NAME, main_dag.start_date,main_dag.schedule_interval),task_id=CHILD_DAG_NAME,dag=main_dag,)

您可以从主DAG的Graph视图放大SubDagOperator,以显示SubDAG中包含的任务:

使用SubDAG时的一些其他提示:

  • 按照惯例,SubDAG的dag_id应以其父级和点为前缀。 和在parent.child中一样。
  • 通过将参数传递给SubDAG operator来共享主DAG和SubDAG之间的参数(如上所示)。
  • SubDAG必须有一个计划并启用。 如果SubDAG的时间表设置为None或@once,SubDAG将成功完成而不做任何事情。
  • 清除SubDagOperator也会清除其中的任务状态。
  • 在SubDagOperator上标记成功不会影响其中的任务状态。
  • 避免在SubDAG中的任务中使用depends_on_past=True,因为这可能会造成混淆。
  • 可以为SubDAG指定执行程序。 如果要在进程中运行SubDAG并有效地将其并行性限制为1,则通常使用SequentialExecutor。 使用LocalExecutor可能会有问题,因为它可能会过度订阅你的worker,在单个插槽中运行多个任务。

6.9 SLAs

服务级别协议或任务/DAG应该成功的时间可以在任务级别设置为timedelta。 如果此时一个或多个实例未成功,则会发送警报电子邮件,详细说明错过其SLA的任务列表。 该事件也记录在数据库中,并可在Web UI中浏览,其中可以分析和记录事件。

6.10 Trigger Rules

虽然正常的工作流行为是在所有直接上游任务都成功时触发任务,但Airflow允许更复杂的依赖项设置。

所有operators 都有一个trigger_rule参数,该参数定义生成的任务被触发的规则。 trigger_rule的默认值是all_success,可以定义为“当所有直接上游任务都成功时触发此任务”。 此处描述的所有其他规则都基于直接父任务,并且是在创建任务时可以传递给任何operator:

  • all_success: (default) 所有的父任务都成功。

  • all_failed: 所有的父任务或上游任务都失败。

  • all_done: 所有的父任务都完成。

  • one_failed: 一旦至少一个父任务失败了就会被触发,它不会等待所有父任务完成。

  • one_success:  一旦至少有一个父任务成功了就会被触发,它不会等待所有父任务完成。

  • dummy: 依赖只是为了展示,任意触发。

请注意,这些可以与depends_on_past(boolean)结合使用,当设置为True时,如果任务的先前计划未成功,则不会触发任务。

6.11 Latest Run Only

标准工作流行为涉及为特定日期/时间范围内运行一系列任务。 但是,某些工作流执行的任务与运行时无关,但需要按计划运行,就像标准的cron作业一样。 在这些情况下,暂停期间错过的回填或运行作业会浪费CPU周期。

对于这种情况,您可以使用LatestOnlyOperator跳过在DAG的最近计划运行期间未运行的任务。 如果现在的时间不在其execution_time和下一个计划的execution_time之间,则LatestOnlyOperator将跳过所有直接下游任务及其自身。

必须意识到跳过的任务和触发器规则之间的相互作用。 跳过的任务将通过触发器规则all_success和all_failed级联,但不是all_done,one_failed,one_success和dummy。 如果您希望将LatestOnlyOperator与不级联跳过的触发器规则一起使用,则需要确保LatestOnlyOperator直接位于您要跳过的任务的上游。

例如,考虑以下dag:

#dags/latest_only_with_trigger.pyimport datetime as dtfrom airflow.models import DAGfrom airflow.operators.dummy_operator import DummyOperatorfrom airflow.operators.latest_only_operator import LatestOnlyOperatorfrom airflow.utils.trigger_rule import TriggerRuledag = DAG(dag_id='latest_only_with_trigger',schedule_interval=dt.timedelta(hours=4),start_date=dt.datetime(2016, 9, 20),)latest_only = LatestOnlyOperator(task_id='latest_only', dag=dag)
task1 = DummyOperator(task_id='task1', dag=dag)
task1.set_upstream(latest_only)
task2 = DummyOperator(task_id='task2', dag=dag)
task3 = DummyOperator(task_id='task3', dag=dag)
task3.set_upstream([task1, task2])
task4 = DummyOperator(task_id='task4', dag=dag,trigger_rule=TriggerRule.ALL_DONE)
task4.set_upstream([task1, task2])
  • 在这个dag的情况下,对于除最新运行之外的所有运行,latest_only任务将显示为跳过。 

  • task1直接位于latest_only的下游,并且除了最新的之外将跳过所有运行。

  • task2完全独立于latest_only,将在所有计划的时间段内运行。

  • task3是task1和task2的下游,由于默认的trigger_rule是all_success,因此将从task1接收级联跳过。 

  • task4是task1和task2的下游,但由于其trigger_rule设置为all_done,因此一旦跳过task1(有效的完成状态)并且task2成功,它将立即触发。

6.12 Zombies & Undeads

任务实例也会死掉,这通常是正常生命周期的一部分,但有时会出乎意料。

Zombies僵尸任务的特点是没有心跳(由job定期发出)和数据库中的运行状态。 当工作节点无法访问数据库,Airflow进程在外部被终止或者节点重新启动时,它们可能会发生。 调度程序的进程会定期执行查杀僵尸任务。

Undead进程的特点是存在进程和匹配的心跳,但Airflow不知道此任务在数据库中运行。 这种不匹配通常在数据库状态发生变化时发生,最有可能是通过删除UI中“任务实例”视图中的行。 任务会被指示验证其作为例行心跳的一部分的状态,并在确定它们处于这种“undead”状态时终止自己。

6.13 Cluster Policy

在您的本地airflow配置文件中可以定义一个policy函数,该函数根据其他任务或DAG属性改变任务属性。 它接收单个参数作为对任务对象的引用,并期望改变其属性。

例如,此函数可以在使用特定运算符时应用特定队列属性,或强制执行任务超时策略,确保没有任务运行超过48小时。 以下是airflow_settings.py中的内容示例:

def policy(task):if task.__class__.__name__ == 'HivePartitionSensor':task.queue = "sensor_queue"if task.timeout > timedelta(hours=48):task.timeout = timedelta(hours=48)

6.14 文档和注释

可以在Web界面中显示的dag和任务对象中添加文档或注释(dag为“Graph View”,任务为“Task Details”)。 Airflow提供了一组特殊的任务属性,用于呈现更为丰富的内容:

请注意,对于dags,doc_md是可使用的唯一注释属性。

如果您的任务是从配置文件动态构建的,则此功能特别有用,它允许您公开Airflow中相关任务的配置信息。

"""
### My great DAG
"""
dag = DAG('my_dag', default_args=default_args)
dag.doc_md = __doc__t = BashOperator("foo", dag=dag)
t.doc_md = """\
#Title"
Here's a [url](www.airbnb.com)
"""

此内容将分别在“图表视图”和“任务详细信息”页面中被煊染为markdown格式。

6.15 Jinja Templating

Airflow充分利用了Jinja Templating的强大功能,这可以成为与宏结合使用的强大工具。

例如,假设您希望使用BashOperator将执行日期作为环境变量传递给Bash脚本。

# The execution date as YYYY-MM-DD
date = "{{ ds }}"
t = BashOperator(task_id='test_env',bash_command='/tmp/test.sh ',dag=dag,env={'EXECUTION_DATE': date})

这里,{{ds}}是一个宏,并且由于BashOperator的env参数是使用Jinja模板化的,因此执行日期将作为Bash脚本中名为EXECUTION_DATE的环境变量提供。

您可以将Jinja模板与文档中标记为“templated”的每个参数一起使用。 模板替换发生在调用operator的pre_execute函数之前。

6.6 Packaged dags

虽然通常会在单个.py文件中指定dags,但有时可能需要将dag及其依赖项打包组合在一起。 

例如,您可能希望将多个dag组合在一起以将它们一起管理版本,或者您可能需要一个额外的模块,默认情况下在您运行airflow的系统上不可用。 为此,您可以创建一个zip文件,其中包含zip文件根目录中的dag,并在目录中解压缩额外的模块。

例如,您可以创建一个如下所示的zip文件:

my_dag1.py
my_dag2.py
package1/__init__.py
package1/functions.py

Airflow将扫描zip文件并尝试加载my_dag1.py和my_dag2.py。 它不会进入子目录,因为它们被认为是潜在的包。

如果您想将模块依赖项添加到DAG,您基本上也会这样做,但是更多的是使用virtualenv和pip。

virtualenv zip_dag
source zip_dag/bin/activatemkdir zip_dag_contents
cd zip_dag_contentspip install --install-option="--install-lib=$PWD" my_useful_package
cp ~/my_dag.py .zip -r zip_dag.zip *

注1:zip文件将插入模块搜索列表(sys.path)的开头,因此它将可用于驻留在同一解释器中的任何其他代码。

注2:打包的dags不能与打开pickling时一起使用。

注3:打包的dag不能包含动态库(例如libz.so),如果模块需要这些库,则需要在系统上使用这些库。 换句话说,只能打包纯python模块。

 

参考资料:

https://airflow.apache.org/concepts.html

系统研究Airbnb开源项目airflow http://www.cnblogs.com/harrychinese/p/airflow.html

Airflow使用入门指南  https://blog.csdn.net/qazplm12_3/article/details/53065654

Airflow实战  http://ju.outofmemory.cn/entry/245373

一个非常好用的data pipeline管理工具 airflow  https://www.jianshu.com/p/59d69981658a

使用 Airflow 替代你的 crontab  https://www.juhe.cn/news/index/id/2365

生产环境使用airflow  https://www.douban.com/note/620024057/

Airflow 中的技巧和陷阱  https://segmentfault.com/a/1190000005078547

airflow 简明指南  https://www.v2ex.com/t/331460

airflow探索篇  https://segmentfault.com/a/1190000012803744

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 激活函数详解

    激活函数详解 ELU函数 ELUs是“指数线性单元”,它试图将激活函数的平均值接近零,从而加快学习的速度。同时,它还能通过正值的标识来避免梯度消失的问题。根据一些研究,ELUs分类精确度是高于ReLUs的。具有relu的优势,且输出均值接近零,实际上prelu和LeakyReLU都有这…...

    2024/4/27 14:48:44
  2. 纪录一下我看过的那些书籍

    古语云:温故而知新.可谓道出学习的真谛.虽然读了很多书,写了很多博客,也不敢说都已经会了,只能说当时会了.而作为学习闭环的最后一个过程.温故是十分重要,故而写此篇博文,纪录那些我读过的书籍,忘有空暇时间,将其中值得再次品读的部分,好好回顾.1.技术类书籍<<设计模式&g…...

    2024/3/31 20:17:46
  3. 求解Ax=0:主变量,特解-线性代数课时7(MIT Linear Algebra , Gilbert Strang)

    这是Strang教授的第七讲,这节课是一个转折,它从定义转向算法,这节课主要内容是求解矩阵的零空间,通过一个例子讲解了通过消元法求解Ax=0,并在贯通例子的过程中介绍了几个新的概念:特解、主变量、自由变量、主列、自由列、阶梯矩阵U和简化的行阶梯形式,另外讲解了矩阵秩的…...

    2024/4/27 16:54:18
  4. 权力的游戏之零售业版

    凛冬将至。谁能生存下去? 如果零售业与HBO的热播电视连续剧有共同之处的话,那就是生存下去很难。在《权力的游戏》中,当身处困境时,即使拥有强大的实力和政治权力,也活不过几集。要想一直活下去,必须找准敌人的弱点,在敌人反应过来之前,充分运用各种计谋战胜他们。零售…...

    2024/4/17 8:25:34
  5. 做二级Hibernate二级缓存demo时配置出错提示及解决方法

    版本:Hibernate5.1.12报错1:Second-level cache is used in the application, but property hibernate.cache.region.factory_class is not given; please either disable second level cache or set correct region factory using the hibernate.cache.region.factory_class…...

    2024/4/27 14:40:17
  6. Pytorch实现一个用于学习正态分布的GAN网络

    2014 年,Ian Goodfellow 和他在蒙特利尔大学的同事发表了一篇震撼学界的论文《Generative Adversarial Nets》,这标志着生成对抗网络(GAN)的诞生,而这是通过对计算图和博弈论的创新性结合。研究显示:给定充分的建模能力,两个博弈模型能够通过简单的反向传播(backpropag…...

    2024/4/27 18:39:53
  7. Python持续点火,跟进还是观望?

    参加 2019 Python开发者日,请扫码咨询 ↑↑↑Python 这把火,到底烧了多久了?近日,李笑来带着他的 Python 编程书,一路狂收 Star、Fork,火速登顶 GitHub Trending 榜,直接 C 位出道。币圈大佬也玩 Python?或者,换句话说——Python,怎么又是你?早在 2015 年,知乎上就…...

    2024/4/27 13:51:41
  8. 深度学习(一)~常见激活函数

    深度学习(一)~常见激活函数常见激活函数1. Sigmoid型函数(1). Logistic函数(2). Tanh函数(3). Hard-Logistic函数和Hard-Tanh函数2. ReLU函数(1). Leaky ReLU(2). 带参数的ReLU(即PReLU)(3). ELU函数(4). Softplus函数3. Swish函数4. GELU函数5. Maxout单元 常见激活函数 为了…...

    2024/4/27 14:17:02
  9. Hibernate学习笔记:hibernate二级缓存攻略

    hibernate二级缓存对系统的性能影响巨大, 我没有这方面的经验,所以不打算写文章, 但是我看到了一篇好文章, 可以拿来学习. [原贴地址:http://www.javaeye.com/topic/18904]很多人对二级缓存都不太了解,或者是有错误的认识,我一直想写一篇文章介绍一下hibernate的二级缓存的,…...

    2024/4/19 12:39:11
  10. 哪种机械键盘更适合打游戏? 机械键盘5种常用机械轴详细介绍

    哪种机械键盘更适合打游戏? 机械键盘5种常用机械轴详细介绍 机械键盘 12-08(4)青轴 最具特点的就是青轴,青轴一般是打字员的梦想,很少用于游戏,不过是本人的最爱,特点是只有当声音响起的时候按键才被触发,因此打字的时候噼里啪啦,无论是指尖还是心理上都得到了极大满足。…...

    2024/4/27 15:21:19
  11. 机器学习基础 -[线性代数基础]

    1、矩阵与向量 (1)m*n维矩阵IRm∗nIR^{m*n}IRm∗n:(2)m维向量(IRmIR^{m}IRm):2、数据矩阵与参数矩阵数据矩阵中的每一行表示一条样本,参数矩阵中的每一列表示一个假设函数的参数向量...

    2024/4/27 17:21:22
  12. 神经网络常用激活函数总结

    神经网络中如果不加入激活函数,其一定程度可以看成线性表达,最后的表达能力不好,如果加入一些非线性的激活函数,整个网络中就引入了非线性部分,增加了网络的表达能力。目前比较流行的激活函数主要分为以下7种:1.sigmoid2.tanh3.ReLu4.Leaky ReLu5.PReLu6.RReLu7 Maxout8 …...

    2024/4/27 16:15:57
  13. 提升电磁兼容性的软件策略:EMC不只是硬件工程师的锅

    关注、星标嵌入式客栈,加群请添加作者微信[导读] EMC( Electromagnetic Compatibility) 电磁兼容性对于一个产品而言是一个非常重要的性能指标,一个产品遇到EMC的坑,很多测试很难通过,很多软件同学可能会觉得EMC更多的是硬件攻城师要去应对的难题,与软件没毛关系。个人认为…...

    2024/4/27 16:50:21
  14. 数学 线性代数

    索引开始向量矩阵行列式特征值和特征向量结束 开始 研究对象:向量、矩阵、行列式; 线性:一次形式来表达的; 代数:符号替代元素和运算; https://www.jianshu.com/p/21aea5108d83 pdf:线性代数的几何意义 向量 向量的矩阵表示法,向量的模,单位向量,法向量 在自由向量的意…...

    2024/4/27 16:30:06
  15. Hibernate二级缓存和查询缓存的简单测试

    利用二级缓存和查询缓存结合缓存一些属性,通过query.list()方法返回属性列表。 首先在hibernate.cfg.xml开启二级缓存和查询缓存:<?xml version=1.0 encoding=UTF-8?> <!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.…...

    2024/4/27 17:19:05
  16. hibernate进二阶之理解二级缓存

    Hibernate提供了基于应用程序级别(进程)的缓存, 可以跨多个session,即不同的session都可以访问缓存数据。 这个换存也叫二级缓存。 Hibernate提供的二级缓存有默认的实现,且是一种可插配的缓存框架!如果用户想用二级缓存,只需要在hibernate.cfg.xml中配置即可; 不想用,直…...

    2024/4/27 16:20:00
  17. 基于Silverlight4开发的工作流设计器

    好久没有更新案例了,下面上传一款基于Silverlight4开发的工作流设计器,这个工作流设计器适用于办公自动化系统和相关MIS系统,本工作流设计器集合了两大系统UI特色,下面请大家看一下界面效果。 Silverlight工作流登录窗口:登录窗口2:登录信息提示:流程设计器界面:动态菜…...

    2024/4/17 8:25:46
  18. 编程游戏:划拳机器人比赛-{ 咱们园子是否应该设立一个算法挑战/编程竞赛的平台? }...

    网友王集鹄组织了一个编程比赛:划拳机器人比赛。类似“Robocode” 的游戏。 早先Microsoft就推出过一款名为Terrarium的code game,其实这种游戏已经有相当久的历史了,很多人都将其看成是那些hacker们的游戏。 ------- 比赛相关帖子如下: 【编程游戏】编写一个会划拳的机器…...

    2024/4/17 8:24:35
  19. 深度学习(五)——解决梯度消失的三个思路

    1. 什么是梯度消散? 如下图u介绍,当用sigmod函数时,当z过大或过小会发现梯度(斜率)接近水平,变成0了,即梯度消失2. 解决方法 思路一使用relu函数,因为relu函数z小于0是,结果恒为0,z大于0时,结果为z本身,这样就是一条45度的直线,梯度永远不变,即不会消失 不饱和激…...

    2024/4/18 15:49:34
  20. 批量标准化(批量归一化)(BatchNormalization)

    批量标准化(批量归一化)(BatchNormalization) 由于翻译的缘故,归一化和标准化其实有别,个人认为应该叫成批量标准化,为防止歧义的原因,以下我将用BatchNormalization,而不用中文 背景 尽管使用He初始化和ELU(或任何 ReLU变体)可以显著减少训练开始阶段的梯度消失/爆炸…...

    2024/3/31 20:17:36

最新文章

  1. vue2中的文件命名规范

    在Vue 2中&#xff0c;文件命名规范是保持项目一致性和可读性的重要部分。以下是一些常见的文件命名规范&#xff1a; 文件夹命名&#xff1a; 使用小写字母&#xff0c;并用短横线(-)分隔单词&#xff0c;这种命名方式通常被称为kebab case。例如&#xff1a;user-profile、vi…...

    2024/4/27 19:04:15
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 游戏引擎架构01__引擎架构图

    根据游戏引擎架构预设的引擎架构来构建运行时引擎架构 ​...

    2024/4/23 6:16:08
  4. WPS二次开发专题:如何获取应用签名SHA256值

    作者持续关注WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 在申请WPS SDK授权版时候需要开发者提供应用包名和签…...

    2024/4/23 6:15:54
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/26 18:09:39
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/26 20:12:18
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/27 4:00:35
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/26 21:56:58
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/27 9:01:45
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/25 18:39:16
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/26 22:01:59
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/25 2:10:52
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57