プロセス全体のスケジューリング - Airflow の導入と使用

エアフローの基本概念

概要

Airflow は、ワークフローをプログラムで作成、スケジュール設定、監視するためのプラットフォームです。

Airflow を使用して、タスクの有向非巡回グラフ (DAG) にワークフローを書き込みます。Airflow スケジューラは、指定された依存関係に従いながら、一連のワーカー スレッドでタスクを同時に実行します。豊富なコマンド ユーティリティにより、DAG で複雑なスケジュールを簡単に実行できます。豊富なユーザー インターフェイスにより、実稼働環境で実行中のパイプラインを確認したり、進行状況を監視したり、必要に応じて問題のトラブルシューティングを行ったりすることが簡単に行えます。

名詞

(1)動的: エアフロー構成には実用的な Python が必要であり、動的な制作パイプラインが可能になります。これによりダイナミクスを書くことが可能になります。これにより、パイプラインを動的にインスタンス化できるコードを作成できます。

(2)拡張可能: 独自の演算子を簡単に定義し、プログラムを実行し、環境に合わせてライブラリを拡張します。

(3)エレガント: Airlfow は、強力な Jinja テンプレート エンジンを使用し、Airflow のコアに組み込まれたスクリプト パラメータ化により合理化されています。

(4)スケーラブル: Airflow にはテンプレート ブロック アーキテクチャがあり、メッセージ キューを使用して任意の数の作業タスクをスケジュールします。

エアフローの設置

https://airflow.apache.org

Python環境をインストールする

Superset は Python 言語で書かれた Web アプリケーションであり、Python3.8 環境が必要です。

Minicondaをインストールする

Conda は、オープン ソース パッケージおよび環境マネージャーであり、異なる Python バージョンのソフトウェア パッケージとその依存関係を同じマシンにインストールするために使用でき、異なる Python 環境間で切り替えることができます。Anaconda には、Conda、Python、および多くのインストールされたツールキットが含まれています。例: numpy、pandas など。Miniconda には Conda と Python が含まれます。

ここでは、それほど多くのツールキットは必要ないので、MiniConda を選択します。

(1) Miniconda(Python3版)をダウンロード

ダウンロードアドレス: https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

(2) Minicondaのインストール

次のコマンドを実行してインストールし、インストールが完了するまでプロンプトに従います。

[atguigu@hadoop102 lib]$ bash Miniconda3-latest-Linux-x86_64.sh

インストール プロセス中に次のプロンプトが表示されたら、インストール パスを指定できます。

(3)環境変数設定ファイルを読み込んで有効にします。

[atguigu@hadoop102 lib]$ source ~/.bashrc

(4)基本環境を非アクティブ化する

Miniconda のインストールが完了すると、ターミナルを開くたびにデフォルトの基本環境がアクティブ化されますが、次のコマンドでデフォルトの基本環境のアクティブ化を無効にすることができます。

[atguigu@hadoop102 lib]$ conda config --set auto_activate_base false

Python3.8環境を作成する

(1) conda国内ミラーリングの設定

(base) [atguigu@hadoop102 ~]$ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
(base) [atguigu@hadoop102 ~]$ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
(base) [atguigu@hadoop102 ~]$ conda config --set show_channel_urls yes

(2) python3.8環境の作成

(base) [atguigu@hadoop102 ~]$ conda create --name airflow python=3.8

説明: conda 環境管理の一般的なコマンド:

  • 環境の作成: conda create -n env_name
  • すべての環境を表示: conda info --envs
  • 環境を削除します: conda delete -n env_name --all

(3) 空気の流れ環境を活性化する

(base) [atguigu@hadoop102 ~]$ conda activate airflow

説明: 現在の環境を終了します。

(superset) [atguigu@hadoop102 ~]$ conda deactivate

(4) python -Vコマンドを実行してPythonのバージョンを確認します。

(airflow) [atguigu@hadoop102 software]$ python -V
Python 3.8.13

エアフローをインストールする

(1) pipのソースを変更する

[atguigu@hadoop102 software]$ conda activate airflow
(airflow) [atguigu@hadoop102 software]$  pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
(airflow) [atguigu@hadoop102 software]$  sudo mkdir ~/.pip
(airflow) [atguigu@hadoop102 software]$  sudo vim  ~/.pip/pip.conf
#添加以下内容
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = https://pypi.tuna.tsinghua.edu.cn

(2) エアフローを設置する

(airflow) [atguigu@hadoop102 software]$  pip install "apache-airflow==2.4.3"

(3) エアフローの初期化

(airflow) [atguigu@hadoop102 software]$ airflow db init

(4) バージョンの表示

(airflow) [atguigu@hadoop102 software]$ airflow version
2.4.3

(5)エアフロー搭載収納路

(airflow) [atguigu@hadoop102 airflow]$ pwd
/home/atguigu/airflow

(6) airflow Webサービスを起動し、起動後ブラウザで http://hadoop102:8080 にアクセスします。

(airflow) [atguigu@hadoop102 airflow]$ airflow webserver -p 8080 -D

(7) エアフロースケジュールの開始

(airflow) [atguigu@hadoop102 airflow]$  airflow scheduler -D

(8) アカウントを作成する

(airflow) [atguigu@hadoop102 airflow]$ airflow users create \
>     --username admin \
>     --firstname atguigu \
>     --lastname atguigu \
>     --role Admin \
>     --email [email protected]

(9) スクリプトの開始と停止

[atguigu@hadoop102 bin]$ vim af.sh

#!/bin/bash

case $1 in
"start"){
    
    
    echo " --------启动 airflow-------"
    ssh hadoop102 "conda activate airflow;airflow webserver -p 8080 -D;airflow scheduler -D; conda deactivate"
};;
"stop"){
    
    
    echo " --------关闭 airflow-------"
    ps -ef|egrep 'scheduler|airflow-webserver'|grep -v grep|awk '{print $2}'|xargs kill -15 
};;
esac

データベースを MySQL に変更する

(1) MySQLでデータベースを構築する

mysql> CREATE DATABASE airflow_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

(2) Linux エラー: 1425F102: SSL ルーチン: ssl_choose_client_version: サポートされていないプロトコルというエラーが報告された場合は、MySQL SSL 証明書を閉じることができます。

查看SSL是否开启  YES为开启
mysql> SHOW VARIABLES LIKE '%ssl%';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| have_openssl  | YES             |
| have_ssl      | YES             |
| ssl_ca        | ca.pem          |
| ssl_capath    |                 |
| ssl_cert      | server-cert.pem |
| ssl_cipher    |                 |
| ssl_crl       |                 |
| ssl_crlpath   |                 |
| ssl_key       | server-key.pem  |
+---------------+-----------------+

(3) 設定ファイル my.cnf を変更し、次の内容を追加します。

# disable_ssl
skip_ssl

(4) Python 接続の依存関係を追加します。

公式サイトでは2つの方法が紹介されていますが、ここでは以下のコネクタを選択します。

(airflow) [atguigu@hadoop102 airflow]$ pip install mysql-connector-python

(5) エアフローの設定ファイルを変更します。

[database]
# The SqlAlchemy connection string to the metadata database.
# SqlAlchemy supports many different database engines.
# More information here:
# http://airflow.apache.org/docs/apache-airflow/stable/howto/set-up-database.html#database-uri
#sql_alchemy_conn = sqlite:home/atguigu/airflow/airflow.db
sql_alchemy_conn = mysql+mysqlconnector://root:123456@hadoop102:3306/airflow_db

(6) エアフローを閉じ、初期化後に再起動します。

(airflow) [atguigu@hadoop102 ~]$ af.sh stop
(airflow) [atguigu@hadoop102 airflow]$ airflow db init
(airflow) [atguigu@hadoop102 ~]$ af.sh start

(7) 初期化エラー 1067 - 「update_at」のデフォルト値が無効です:

理由: フィールド「update_at」はタイムスタンプ タイプであり、値の範囲は次のとおりです: 1970-01-01 00:00:00 ~ 2037-12-31 23:59:59 (1970-01 からは UTC +8 北京時間) 01 08: 00:00)、ここではデフォルトで null 値が指定されているため、失敗します。

mysql ストレージのタイムスタンプ形式を変更することをお勧めします。

mysql> set GLOBAL sql_mode ='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

MySQL を再起動するとパラメータが無効になるため、設定ファイル my.cnf にパラメータを書き込むことをお勧めします。

sql_mode = STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 

(8) アカウント ログインを再作成します。

(airflow) [atguigu@hadoop102 airflow]$ airflow users create \
--username admin \
--firstname atguigu \
--lastname atguigu \
--role Admin \
--email [email protected]

エグゼキュータを変更する

公式 Web サイトでは、開発中にシーケンシャル エグゼキュータを使用することは推奨されていません。これにより、タスク スケジュールのブロックが発生します。

airflow の設定ファイルを変更します

[core]
# The executor class that airflow should use. Choices include
# ``SequentialExecutor``, ``LocalExecutor``, ``CeleryExecutor``, ``DaskExecutor``,
# ``KubernetesExecutor``, ``CeleryKubernetesExecutor`` or the
# full import path to the class when using a custom executor.
executor = LocalExecutor

公式に推奨されているいくつかのアクチュエータを使用したり、カスタマイズしたりできます。ここではローカルのエグゼキューターを選択します。

導入

(1) テスト環境の起動

このテストでは、Spark の公式ケース、Hadoop と Spark を開始する必要があるすべての過去のサーバーを使用します。

[atguigu@hadoop102 bin]$ myhadoop.sh start
[atguigu@hadoop102 bin]$ cd /opt/module/spark-yarn/sbin/start-history-server.sh

(2) Airflow 設定ファイルを表示する

(python3) [root@airflow work-py]# vim ~/airflow/airflow.cfg

(3) .py スクリプトを記述し、Python スケジュール スクリプトを保存するための work-py ディレクトリを作成します。

(airflow) [atguigu@hadoop102 airflow]$ mkdir ~/airflow/dags 
(airflow) [atguigu@hadoop102 airflow]$ cd dags/
(airflow) [atguigu@hadoop102 dags]$ vim test.py
#!/usr/bin/python
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta

default_args = {
    
    
    # 用户
    'owner': 'test_owner',
    # 是否开启任务依赖
    'depends_on_past': True, 
    # 邮箱
    'email': ['[email protected]'],
    # 启动时间
    'start_date':datetime(2022,11,28),
    # 出错是否发邮件报警
    'email_on_failure': False,
    # 重试是否发邮件报警
    'email_on_retry': False,
    # 重试次数
    'retries': 1,
    # 重试时间间隔
    'retry_delay': timedelta(minutes=5),
}
# 声明任务图
dag = DAG('test', default_args=default_args, schedule_interval=timedelta(days=1))
 
# 创建单个任务
t1 = BashOperator(
    # 任务id
    task_id='dwd',
    # 任务命令
    bash_command='ssh hadoop102 "/opt/module/spark-yarn/bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn /opt/module/spark-yarn/examples/jars/spark-examples_2.12-3.1.3.jar 10 "',
    # 重试次数
    retries=3,
    # 把任务添加进图中
    dag=dag)

t2 = BashOperator(
    task_id='dws',
    bash_command='ssh hadoop102 "/opt/module/spark-yarn/bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn /opt/module/spark-yarn/examples/jars/spark-examples_2.12-3.1.3.jar 10 "',
    retries=3,
    dag=dag)

t3 = BashOperator(
    task_id='ads',
    bash_command='ssh hadoop102 "/opt/module/spark-yarn/bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn /opt/module/spark-yarn/examples/jars/spark-examples_2.12-3.1.3.jar 10 "',
    retries=3,
    dag=dag)
    
    # 设置任务依赖
t2.set_upstream(t1)
t3.set_upstream(t2)
  • パッケージをインポートする必要があります

    from airflow import DAG
    from airflow.operators.bash_operator import BashOperator
    
  • default_args はデフォルトの引数を設定します。

  • depend_on_past タスクの依存関係を有効にするかどうか。

  • schedule_interval スケジュール頻度。

  • retries 再試行の回数。

  • start_date 開始時刻。

  • BashOperator は特にタスクを実行します。true の場合、次の依存タスクに進む前にプレタスクが正常に完了する必要があります。false の場合、正常に完了したかどうかは無視されます。

  • task_id タスクの一意の ID (必須)。

  • bash_command 特定のタスクの実行コマンド。

  • set_upstream の依存関係の設定 上の図に示すように、ads タスクは dws タスクに依存し、また dwd タスクにも依存します。

(4)しばらく待ってからタスクリストを更新します

(airflow) [atguigu@hadoop102 airflow]$  airflow dags list
-------------------------------------------------------------------
DAGS
-------------------------------------------------------------------
example_bash_operator
example_branch_dop_operator_v3
example_branch_operator
example_complex
example_external_task_marker_child
example_external_task_marker_parent
example_http_operator
example_kubernetes_executor_config
example_nested_branch_dag
example_passing_params_via_test_command
example_pig_operator
example_python_operator
example_short_circuit_operator
example_skip_dag
example_subdag_operator
example_subdag_operator.section-1
example_subdag_operator.section-2
example_trigger_controller_dag
example_trigger_target_dag
example_xcom
latest_only
latest_only_with_trigger
test
test_utils
tutorial

(5) テストタスクが表示されるので、ページを更新します

(6) クリックして実行

(7) 成功したタスクをクリックしてログを表示します。

(8) ダグチャート、ガントチャートの表示

(9) スクリプトコードの表示

DAGタスクの操作

Dagタスクの削除

DAG タスクの主な削除では、基礎となるファイルは削除されず、しばらくすると自動的に再度ロードされます。

現在のすべての DAG タスクを表示する

# 查看所有任务
(airflow) [atguigu@hadoop102 airflow]$ airflow list_dags 
# 查看单个任务
(airflow) [atguigu@hadoop102 airflow]$ airflow tasks list test --tree

メールサーバーの設定

(1) メールボックスが SMTP サービスを開いていることを確認します。

(2)エアフロー設定ファイルを変更し、stmpsサービスをポート587に対応させる

(airflow) [atguigu@hadoop102 airflow]$ vim ~/airflow/airflow.cfg  
smtp_host = smtp.qq.com
smtp_starttls = True
smtp_ssl = False
smtp_user = 403627000@qq.com
# smtp_user =
smtp_password = qluxdbuhgrhgbigi
# smtp_password =
smtp_port = 587
smtp_mail_from = 403627000@qq.com

(3) エアフローを再開する

[atguigu@hadoop102 bin]$ af.sh stop
[atguigu@hadoop102 bin]$ af.sh start

(4) test.pyスクリプトを編集して置き換えます。

[root@airflow ~]# cd /opt/module/work-py/
[root@airflow work-py]# vim test.py
#!/usr/bin/python
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.email_operator import EmailOperator
from datetime import datetime, timedelta

default_args = {
    
    
    # 用户
    'owner': 'test_owner',
    # 是否开启任务依赖
    'depends_on_past': True, 
    # 邮箱
    'email': ['[email protected]'],
    # 启动时间
    'start_date':datetime(2022,11,28),
    # 出错是否发邮件报警
    'email_on_failure': False,
    # 重试是否发邮件报警
    'email_on_retry': False,
    # 重试次数
    'retries': 1,
    # 重试时间间隔
    'retry_delay': timedelta(minutes=5),
}
# 声明任务图
dag = DAG('test', default_args=default_args, schedule_interval=timedelta(days=1))

# 创建单个任务
t1 = BashOperator(
    # 任务id
    task_id='dwd',
    # 任务命令
    bash_command='ssh hadoop102 "/opt/module/spark-yarn/bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn /opt/module/spark-yarn/examples/jars/spark-examples_2.12-3.1.3.jar 10 "',
    # 重试次数
    retries=3,
    # 把任务添加进图中
    dag=dag)

t2 = BashOperator(
    task_id='dws',
    bash_command='ssh hadoop102 "/opt/module/spark-yarn/bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn /opt/module/spark-yarn/examples/jars/spark-examples_2.12-3.1.3.jar 10 "',
    retries=3,
    dag=dag)

t3 = BashOperator(
    task_id='ads',
    bash_command='ssh hadoop102 "/opt/module/spark-yarn/bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn /opt/module/spark-yarn/examples/jars/spark-examples_2.12-3.1.3.jar 10 "',
    retries=3,
    dag=dag)

email=EmailOperator(
   task_id="email",
   to="[email protected] ",
    subject="test-subject",
    html_content="<h1>test-content</h1>",
    cc="[email protected] ",
   dag=dag)

t2.set_upstream(t1)
t3.set_upstream(t2)
email.set_upstream(t3)

(5) ページが有効かどうかを確認します

(6) テストを実行する

おすすめ

転載: blog.csdn.net/qq_44766883/article/details/131184598