Modes (along with Resources) provide a way to control the behavior of multiple solids at pipeline execution time.
Name | Description |
---|---|
ModeDefinition | Base class used to define a pipeline mode |
For those familiar with dependency injection, modes and resources offer a similar capability, using pythonic idioms and Dagster’s configuration system.
Each pipeline can be defined with multiple modes, but each pipeline run uses exactly one mode. Each mode exposes:
A typical usage for modes is to vary pipeline behavior between different deployment environments. For example, you might define a local_dev
mode for running pipelines on a laptop against synthetic data and a “prod” mode for running pipelines against production data in the cloud.
Modes affect solid behavior by providing resources to the solids. For example, the local_dev
mode might reference a SQLiteDatabase
resource that solids can execute queries against. The prod
mode might instead reference an PostgresDatabase
resource.
To define a mode, we use the ModeDefinition
class:
ModeDefinition(name="prod", resources={...}, loggers={...}, executor_defs=[...])
In this example, we define two modes that contain a database
resource:
@pipeline(
mode_defs=[
ModeDefinition("local_dev", resource_defs={"database": sqlite_database}),
ModeDefinition("prod", resource_defs={"database": postgres_database}),
],
)
def query_pipeline():
do_query()
We can access the resource by resource name in the solid:
@solid(required_resource_keys={"database"})
def generate_table_1(context):
context.resources.database.execute_query("create table_1 as select * from table_0")
When the pipeline is run with the local_dev
mode, context.resources.database
will be an instance of SqliteDatabase
. When running in prod
mode, the same resource will be a PostgresDatabase
When Launching the pipeline via the Dagit Playground, you can select a mode from the mode selector dropdown:
When launching a pipeline via the CLI, you can use the -d
option to specify the mode.
$ dagster pipeline execute -d prod_mode my_pipeline