1. 説明
今日は、Python の基本を理解して最初のデータ エンジニアリング プロジェクトを開始する方法を見ていきます。
このガイドは、Python にある程度の知識があり、Dagster を使い始めたばかりの場合に最も役立ちます。データ エンジニアリングが初めてで、Python でデータ エンジニアリングがどのように機能するかを理解するための場所が必要な場合にも役立ちます。
このステップバイステップ ガイドでは、成功するデータ エンジニアリング パイプラインを作成する方法を理解できるように、 Dagster のアセットに焦点を当てます。その過程で、ベスト プラクティスに従ってクリーンで保守可能な Python コードを作成するためのさらに役立つヒントやコツを共有します。
はじめましょう!
2. Python によるデータ エンジニアリング
データ エンジニアリングには、データを大規模に保存、処理、分析できるシステムの構築が含まれます。
たとえば、データ エンジニアは、固定スケジュールでさまざまなソースからデータを抽出し、それを有用な形式に変換し、さらに分析するためにデータベースにロードするパイプラインを作成する場合があります。これは従来の ETL タスクですが、データの統合、クリーンアップ、検証、および複雑な計算を自動的に実行できるシステムを構築することもできます。
これらのツールは、組織が大規模で複雑なデータ セットを高速かつ信頼性が高く、スケーラブルな方法で処理できるようにするために役立ちます。
Python は、 pandas や NumPy などの強力なデータ操作ライブラリがあるため、データ エンジニアリング言語として人気があり、 幅広いタスクに使用できる汎用言語でもあります。
Dagster は、データ オーケストレーション、つまりアプリケーションとビジネス プロセスをサポートする情報を集約、処理、保存するデータ パイプラインを自動化するプロセスのためのオープン ソース ソリューションです。データ オーケストレーションは、社内のビジネス インテリジェンスから重要な顧客対応サービスまで、さまざまなアプリケーションをサポートします。最新のデータ オーケストレーション プロセスには、数分で実行される単純な線形データ プロセスから、実行に数日かかる大規模で複雑なデータ処理タスクに至るまで、機械学習、データ サイエンス、分析のユース ケースが含まれる場合があり、作業は数十、場合によっては数百に分散されます。マシン、別のコンピュータ上で。
Dagster は、ユーザーが資産、操作、ジョブなどのデータ パイプラインを構築および実行するのに役立ついくつかの主要なコンポーネントを提供します。
アセット、操作、ジョブをさらに詳しく調べたい場合は、 Dagster のドキュメントを参照してください。
3. プロジェクトのルートディレクトリを設定します
新しい Dagster プロジェクトを開始した後は、すべてのプロジェクト フォルダーとファイルをルート ディレクトリに保存することが重要です。ルート ディレクトリは、プロジェクト ファイル システム内の最初または最上位のディレクトリであり、他のすべてのフォルダが含まれます。ここでは Dagster プロジェクトをコーディングします。2 つの理由から、このように整理しておくことが重要です。
まず、ルート ディレクトリは、相対パスを使用するときに共通の参照ポイントを提供します。これにより、ファイルの場所に関係なく、ファイルを一貫して検索して参照できるようになります。
第 2 に、プロジェクトをデプロイする場合、パッケージ化およびデプロイメント プロセスの開始点としてルート ディレクトリがよく使用されます。これにより、必要なファイルがすべて含まれ、プロジェクトが正しい構造でデプロイされることが保証されます。
これを念頭に置いて、プロジェクト用に新しいディレクトリを作成しましょう。
mkdir my_dagster_project
次に、次のコマンドを使用して、作業ディレクトリをプロジェクトのルート ディレクトリに変更します。cd
cd my_dagster_project
4.仮想環境の起動
次に、ルート ディレクトリに仮想環境をセットアップします。これにより、異なるバージョンの Python とライブラリを、相互に干渉することなく別々のプロジェクトで使用できるようになります。
仮想環境には任意の名前を付けることができます。この例では を使用します。.dag-venv
Linux や macOS などの Unix ベースのオペレーティング システムでは、ファイル名の前のドット (.) は、ファイルを非表示にする必要があることを示します。これらは通常、ユーザーが直接アクセスしたり変更したりすることを通常は意図していないシステム ファイルです。
ドットは、そのようなファイルを隠しファイルとして識別するためにオペレーティング システムで使用される規則です。デフォルトでは、同様のコマンドを使用してディレクトリの内容を一覧表示する場合、これらのファイルは表示されません。ただし、ファイル名を明示的に指定するか、隠しファイルを表示するコマンド ( など) を使用することで、これらのファイルにアクセスすることはできます。ls
ls -la
python3 -m venv .dag-venv
次に、仮想環境をアクティブ化します。
source ./.dag-venv/bin/activate
このオプションのコマンドを使用して、使用している Python のバージョンを確認できます。
$(dag-venv) python3 --version
参考までに、このブログ投稿の執筆時点では、バージョン 3.10.9 を使用しています。
5. Dagster のインストールと初期プロジェクトの足場作成
まず、ターミナルで次のコマンドを実行して、Dagster と必要なその他の Python パッケージをインストールしましょう。
# run in a terminal in your favorite python environment
pip install dagster dagit pandas
インストールした Dagster のバージョンを確認することをお勧めします。
dagster --version
参考までに、このブログ投稿の執筆時点では、Dagster のバージョン 1.2.6 を使用しています。
Dagster は、次のコマンドを使用して便利な「足場」プロジェクトを提供します。
dagster project scaffold --name dagster-tutorial
プロジェクトに「dagster-tutorial」という名前を付けますが、任意の名前に置き換えることができます。
この時点で、正しい軌道に乗っていることを示すメッセージが表示されるはずです。
Success! Created dagster-tutorial at /Users/<your_name>/my_dagster_project/dagster-tutorial
5.1 足場とは何ですか?
先に進む前に、実行時に何が起こるかを理解しておくと役立ちます。これにより、ルート ディレクトリに大量のファイルが作成されることがわかります。dagster project scaffold --name dagster-tutorial
これは標準の Dagster テンプレートであり、必要なファイルをすべて最初から作成しなくても簡単に開始できます。私たちはこのコードをスキャフォールディングと呼びます。つまり、ソフトウェア アプリケーションの基本構造またはコード フレームワークを自動的に生成します。アプリケーション構築の開始点を提供することで、開発者の時間を節約します。また、コードの一貫性と構造を確保するのにも役立ち、開発者が長期にわたってアプリケーションを理解し、保守しやすくなります。
5.2 setup.py ファイルとは何ですか?
前回の記事 では、さまざまなツールを使用して依存関係を管理する方法について詳しく説明しました。このファイルを使用すると、必要な Python パッケージを指定できます。dagster-tutorial/setup.py
setup.py ファイルには次のコードがあります。
from setuptools import find_packages, setup
setup(
name="dagster_tutorial",
packages=find_packages(exclude=["dagster_tutorial_tests"]),
install_requires=[
"dagster",
"dagster-cloud"
],
extras_require={"dev": ["dagit", "pytest"]},
)
依存関係とライブラリを定義すると、Dagster はそれらのインストールと実行を自動的に管理します。
5.3 __init__.py ファイルとは何ですか?またどこにありますか?
これらのファイルの一部は、Dagster を実行するために重要です。たとえば、フォルダーの下を見ると、次のコードを含むファイルが見つかります。dagster_tutorial
__init__.py
from dagster import Definitions, load_assets_from_modules
from . import assets
all_assets = load_assets_from_modules([assets])
defs = Definitions(
assets=all_assets,
)
どのようなアセットについては後で詳しく説明しますが、現時点では、このファイルは、アプリケーションがアクセスするために間もなく作成するアセットをロードします。アセット自体は、同じフォルダー内のassets.pyファイル内のコードで定義され、コマンド .__init__.pyfrom を使用してインポートされます。アセットのインポート
5.4 定義とは何ですか?
ファイル内に次のコード行があることがわかります。__init__.py
defs = Definitions(
assets=load_assets_from_modules([assets])
)
Dagster プロジェクトのコードの場所で使用されるすべての関数とパイプを収集するという名前のオブジェクト。これらには、アセット、プラン、センサー、ジョブ、リソース、アクター、ロガーが含まれます。これらすべてのオブジェクトを含めると、コードの管理と整理が容易になります。Definitions
defs
Definitions
注: これは、バージョン 1.2 以降の Dagster の最新の機能強化です。古いチュートリアルを参照すると、同様の概念が表示される場合があります。は、ボイラープレートを削減しながら、より多くの機能を提供する、より単純化された API です。Definitions
repositories
Definitions
Dagster は、ユーザー定義コードを Web サーバーやデーモンなどのシステム ツールから分離します。Dagster は、コードをこれらのツールに直接ロードするのではなく、シリアル化と呼ばれるプロセスを使用して、ツールがコードと対話できるようにします。この分離により、システムが組織化された状態に保たれ、システムの異なる部分間の直接の相互作用によって発生する可能性のある問題が防止されます。
最も重要なことは、これは次のことを意味します。
- ユーザーコードはクリーンなリポジトリで管理できるため、CI/CD をサポートできます。
- ユーザーコードにエラーがあったとしても、Dagster インスタンスはシャットダウンされません。
5.5 シリアル化とは何ですか?
シリアル化は、オブジェクト、リスト、辞書などの複雑なデータ構造を、保存、送信、共有しやすい形式に変換するプロセスです。
これは、大量のデータを保存、転送、またはさまざまなアプリケーション間で使用する必要があるデータ エンジニアリング ツールでは特に重要です。
これは Dagest ではどのように機能しますか? Dagster が「シリアル化境界」を使用する場合、これは、ユーザー定義コード (オブジェクトなど) とシステム ツールの間で渡されるデータは、まず、異なるシステム間で簡単に転送できる共通形式にシリアル化されることを意味します。Definitions
6. Dagsterで資産を宣言する
アセットはDagster の重要なコンポーネントです。前述したように、アセットは、テーブル、ファイル、永続的な機械学習モデルなど、永続ストレージ内のオブジェクトです。ソフトウェア定義アセットは、アセットを、そのコンテンツの生成に使用される関数と上流のアセットに結合するDagster オブジェクトです。ソフトウェア定義資産により、データ管理への宣言型アプローチが可能になります。コードは、どのデータ資産が存在すべきか、またその計算方法についての信頼できる情報源となります。
簡単に言えば、ソフトウェア定義資産は、データの保存方法と計算方法を定義する Dagster 内のオブジェクトです。データ (アセット) を、そのデータを生成した関数とその作成に使用された他のデータ (アップストリームアセット) に接続します。アセットは、 Dagster パイプラインの入力および出力として使用できる、再利用可能でバージョン管理されたデータまたはコードです。これらには、SQL スクリプト、データ ファイル、機械学習モデルが含まれます。
ソフトウェア定義資産を使用すると、宣言的アプローチを使用してデータを管理できます。つまり、どのようなデータが存在する必要があるか、またコードを通じてどのように計算されるかを定義できます。このアプローチは、データ管理の組織化と一貫性の維持に役立ち、コードがデータの処理方法の信頼できる情報源であることを保証します。
アセット が作成または更新されると、それは「実体化される」と言います。これは、アセットの新しいインスタンスが作成され、ストレージにコミットされたことを意味します。
HackerNews のトップ 10 記事 をダウンロードするための 2 つのアセットを作成しましょう。
Dagster プロジェクトで、次のコードをファイルに追加しましょう。dagster-tutorial/dagster_tutorial/assets.py
import pandas as pd
import requests
from dagster import Output, asset
@asset
def hackernews_top_story_ids():
"""
Get top stories from the HackerNews top stories endpoint.
API Docs: https://github.com/HackerNews/API#new-top-and-best-stories
"""
top_story_ids = requests.get(
"https://hacker-news.firebaseio.com/v0/topstories.json"
).json()
return top_story_ids[:10]
# asset dependencies can be inferred from parameter names
@asset
def hackernews_top_stories(context, hackernews_top_story_ids):
"""Get items based on story ids from the HackerNews items endpoint"""
results = []
for item_id in hackernews_top_story_ids:
item = requests.get(f"https://hacker-news.firebaseio.com/v0/item/{item_id}.json").json()
results.append({item['title'],item['by'],item['url']})
df = pd.DataFrame(results)
context.log.info(df)
return Output(value=df)
次に、ターミナルでコマンドを実行します。これにより、Dagster のユーザー インターフェイスが起動します。dagster dev
$ dagster dev
ブラウザで http://localhost:3000/に移動します。これは、ブラウザ上で実行中の Dagster アプリケーションを「見つける」ことができるローカル アドレスです。
「デプロイメント」タブで、「すべてマテリアライズ」をクリックしてパイプラインを実行し、アセットを作成します。マテリアライゼーションという用語は、アセットの作成または更新のプロセスを表すために使用されます。これは、アセットの新しいバージョンが作成および保存されることを意味します。このパイプラインは、Dagster のデフォルトを使用して、結果をディスク上の pickle ファイルに保存します。
このチュートリアルでは、コマンドを使用して Pandas データフレームの内容を Dagster のログ システムに出力します。上部メニューの「実行」タブをクリックすると、実行の詳細と生成されたデータが表示されます。context.log.info(df)