Apache Zeppelin结合Apache Airflow使用1

发布时间:2024年01月19日

Apache Zeppelin结合Apache Airflow使用1


前言

之前学了Zeppelin的使用,今天开始结合Airflow串任务。

Apache Airflow和Apache Zeppelin是两个不同的工具,各自用于不同的目的。Airflow用于编排和调度工作流,而Zeppelin是一个交互式数据分析和可视化的笔记本工具。虽然它们有不同的主要用途,但可以结合使用以满足一些复杂的数据处理和分析需求。

下面是一些结合使用Airflow和Zeppelin的方式:

  1. Airflow调度Zeppelin Notebooks:

    • 使用Airflow编写调度任务,以便在特定时间或事件触发时运行Zeppelin笔记本。
    • 在Airflow中使用Zeppelin的REST API或CLI命令来触发Zeppelin笔记本的执行。
  2. 数据流管道:

    • 使用Airflow编排数据处理和转换任务,例如从数据源提取数据、清理和转换数据。
    • 在Zeppelin中创建笔记本,用于进一步的数据分析、可视化和报告生成。
    • Airflow任务完成后,触发Zeppelin笔记本执行以基于最新数据执行分析。
  3. 参数传递:

    • 通过Airflow参数传递,将一些参数值传递给Zeppelin笔记本,以便在不同任务之间共享信息。
    • Zeppelin笔记本可以从Airflow任务中获取参数值,以适应特定的数据分析需求。
  4. 日志和监控:

    • 使用Airflow监控工作流的运行情况,查看任务的日志和执行状态。
    • 在Zeppelin中记录和可视化Airflow工作流的关键指标,以获得更全面的工作流性能洞察。
  5. 整合数据存储:

    • Airflow可以用于从不同数据源中提取数据,然后将数据传递给Zeppelin进行进一步的分析。
    • Zeppelin可以使用Airflow任务生成的数据,进行更深入的数据挖掘和分析。

结合使用Airflow和Zeppelin能够充分发挥它们各自的优势,实现更全面、可控和可视化的数据处理和分析工作流。


一、安装Airflow

安装参考:
https://airflow.apache.org/docs/apache-airflow/stable/start.html

CentOS 7.9安装后启动会报错,还需要配置下sqlite,参考:https://airflow.apache.org/docs/apache-airflow/2.8.0/howto/set-up-database.html#setting-up-a-sqlite-database

[root@slas bin]# airflow standalone
Traceback (most recent call last):
  File "/root/.pyenv/versions/3.9.10/bin/airflow", line 5, in <module>
    from airflow.__main__ import main
  File "/root/.pyenv/versions/3.9.10/lib/python3.9/site-packages/airflow/__init__.py", line 52, in <module>
    from airflow import configuration, settings
  File "/root/.pyenv/versions/3.9.10/lib/python3.9/site-packages/airflow/configuration.py", line 2326, in <module>
    conf.validate()
  File "/root/.pyenv/versions/3.9.10/lib/python3.9/site-packages/airflow/configuration.py", line 718, in validate
    self._validate_sqlite3_version()
  File "/root/.pyenv/versions/3.9.10/lib/python3.9/site-packages/airflow/configuration.py", line 824, in _validate_sqlite3_version
    raise AirflowConfigException(
airflow.exceptions.AirflowConfigException: error: SQLite C library too old (< 3.15.0). See https://airflow.apache.org/docs/apache-airflow/2.8.0/howto/set-up-database.html#setting-up-a-sqlite-database

二、使用步骤

1.目标

我想做个简单的demo,包括两个节点,实现如图所示功能,读取csv,去重:
在这里插入图片描述
csv文件输入在airflow上实现,去重在zeppelin上实现。

2.编写DAG

先实现extract_data_script.py,做个简单的读取csv指定列数据写入新的csv文件。

import argparse
import pandas as pd

def extract_and_write_data(date, input_csv, output_csv, columns_to_extract):
    # 读取指定列的数据
    csv_file_path = f"/home/works/datasets/data_{date}.csv"
    df = pd.read_csv(csv_file_path, usecols=columns_to_extract)

    # 将数据写入新的 CSV 文件
    df.to_csv(output_csv, index=False)

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--date", type=str, required=True, help="Date parameter passed by Airflow")
    args = parser.parse_args()

    # 输出 CSV 文件路径(替换为实际的路径)
    output_csv_path = "/home/works/output/extracted_data.csv"

    # 指定要提取的列
    columns_to_extract = ['column1', 'column2', 'column3']

    # 调用函数进行数据提取和写入
    extract_and_write_data(args.date, input_csv_path, output_csv_path, columns_to_extract)

然后在 Zeppelin 中创建一个 Python 笔记本(Notebook),其中包含被 Airflow DAG 调用的代码。加载先前从 output/extracted_data.csv 文件中提取的数据:

%python

# 导入必要的库
import pandas as pd

# 加载先前从 CSV 文件中提取的数据
csv_file_path = "/home/works/output/extracted_data.csv"
# 读取 CSV 文件
df = pd.read_csv(csv_file_path)

# 过滤掉 column1 为空的行
df = df[df['column1'].notnull()]

# 去重,以 column2、column3 字段为联合去重依据
deduplicated_df = df.drop_duplicates(subset=["column2", "column3"])

# 保存去重后的结果到新的 CSV 文件
deduplicated_df.to_csv("/home/works/output/dd_data.csv", index=False)

将这个 Zeppelin 笔记本保存,并记住笔记本的 ID, Airflow DAG 需要使用这个 ID 来调用 Zeppelin 笔记本。

接下来,用VSCode编写zeppelin_integration.py代码如下,上传到$AIRFLOW_HOME/dags目录下:

from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime(2024, 1, 1),
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=5),
}

dag = DAG(
    'zeppelin_integration',
    default_args=default_args,
    schedule_interval=timedelta(days=1),
)

extract_data_task = BashOperator(
    task_id='extract_data',
    bash_command='python /home/works/z/extract_data_script.py --date {{ ds }}',
    dag=dag,
)


run_zeppelin_notebook_task = BashOperator(
    task_id='run_zeppelin_notebook',
    bash_command='curl -X POST http://zeppelin-server:zeppelin-port/api/notebook/job/notebook-id',
    dag=dag,
)

# 设置关联度
extract_data_task >> run_zeppelin_notebook_task

2.加载、执行DAG

如下命令:

[root@slas dags]# airflow dags trigger zeppelin_integration
[2024-01-19T11:23:54.331+0800] {__init__.py:42} INFO - Loaded API auth backend: airflow.api.auth.backend.session
conf | dag_id               | dag_run_id                        | data_interval_start       | data_interval_end         | end_date | external_trigger | last_scheduling_decision | logical_date              | run_type | start_date | state 
=====+======================+===================================+===========================+===========================+==========+==================+==========================+===========================+==========+============+=======
{}   | zeppelin_integration | manual__2024-01-19T03:23:54+00:00 | 2024-01-18T03:23:54+00:00 | 2024-01-19T03:23:54+00:00 | None     | True             | None                     | 2024-01-19T03:23:54+00:00 | manual   | None       | queued

页面上会增加一个DAG,如图:
在这里插入图片描述
在Actions里点击执行。


总结

以上就是今天要讲的内容,总体来说集成两个工具还是很方便的,期待后面更多的应用。

文章来源:https://blog.csdn.net/sencloud/article/details/135689077
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。