From 8f280620bceb3a6e42ffffd0571eeb353b0feff2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Viveret?= Date: Fri, 7 Oct 2022 18:41:35 +0200 Subject: [PATCH 01/30] fix: Wrong UI data source type display (#3276) fix: wrong UI data source type display Signed-off-by: Jerome Viveret Signed-off-by: Jerome Viveret --- ui/src/pages/data-sources/DataSourcesListingTable.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/src/pages/data-sources/DataSourcesListingTable.tsx b/ui/src/pages/data-sources/DataSourcesListingTable.tsx index 50c1f933a9c..ad549f991e0 100644 --- a/ui/src/pages/data-sources/DataSourcesListingTable.tsx +++ b/ui/src/pages/data-sources/DataSourcesListingTable.tsx @@ -33,8 +33,8 @@ const DatasourcesListingTable = ({ name: "Type", field: "type", sortable: true, - render: (valueType: feast.types.ValueType.Enum) => { - return feast.types.ValueType.Enum[valueType]; + render: (valueType: feast.core.DataSource.SourceType) => { + return feast.core.DataSource.SourceType[valueType]; }, }, ]; From 1a446e2558cc52f8d3163ad106f790dc0e3a926b Mon Sep 17 00:00:00 2001 From: Danny Chiao Date: Mon, 10 Oct 2022 13:29:40 -0400 Subject: [PATCH 02/30] chore: Update the minimum Python requirement on PyPI (#3280) Signed-off-by: Danny Chiao Signed-off-by: Danny Chiao --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 2b09bcbe946..fbd3cf5368f 100644 --- a/setup.py +++ b/setup.py @@ -43,7 +43,7 @@ DESCRIPTION = "Python SDK for Feast" URL = "https://github.com/feast-dev/feast" AUTHOR = "Feast" -REQUIRES_PYTHON = ">=3.7.0" +REQUIRES_PYTHON = ">=3.8.0" REQUIRED = [ "click>=7.0.0,<9.0.0", From 69e4a7d10d912cd89f1e0c2a024d07cf2f44211e Mon Sep 17 00:00:00 2001 From: Max Zwiessele Date: Wed, 12 Oct 2022 17:54:46 +0100 Subject: [PATCH 03/30] fix: Dask zero division error if parquet dataset has only one partition (#3236) * fix: dask zero division error if parquet dataset has only one partition Signed-off-by: Max Zwiessle * Update file.py Signed-off-by: Max Zwiessle * Update file.py Signed-off-by: Max Zwiessle Signed-off-by: Max Zwiessle --- sdk/python/feast/infra/offline_stores/file.py | 31 ++++++++++++---- .../universal/data_sources/file.py | 35 +++++++++++++++++++ sdk/python/tests/utils/e2e_test_validation.py | 6 ++++ 3 files changed, 66 insertions(+), 6 deletions(-) diff --git a/sdk/python/feast/infra/offline_stores/file.py b/sdk/python/feast/infra/offline_stores/file.py index 09216ff8ff8..29897aef430 100644 --- a/sdk/python/feast/infra/offline_stores/file.py +++ b/sdk/python/feast/infra/offline_stores/file.py @@ -662,14 +662,33 @@ def _drop_duplicates( created_timestamp_column: str, entity_df_event_timestamp_col: str, ) -> dd.DataFrame: - if created_timestamp_column: - df_to_join = df_to_join.sort_values( - by=created_timestamp_column, na_position="first" - ) + column_order = df_to_join.columns + + # try-catch block is added to deal with this issue https://github.com/dask/dask/issues/8939. + # TODO(kevjumba): remove try catch when fix is merged upstream in Dask. + try: + if created_timestamp_column: + df_to_join = df_to_join.sort_values( + by=created_timestamp_column, na_position="first" + ) + df_to_join = df_to_join.persist() + + df_to_join = df_to_join.sort_values(by=timestamp_field, na_position="first") df_to_join = df_to_join.persist() - df_to_join = df_to_join.sort_values(by=timestamp_field, na_position="first") - df_to_join = df_to_join.persist() + except ZeroDivisionError: + # Use 1 partition to get around case where everything in timestamp column is the same so the partition algorithm doesn't + # try to divide by zero. + if created_timestamp_column: + df_to_join = df_to_join[column_order].sort_values( + by=created_timestamp_column, na_position="first", npartitions=1 + ) + df_to_join = df_to_join.persist() + + df_to_join = df_to_join[column_order].sort_values( + by=timestamp_field, na_position="first", npartitions=1 + ) + df_to_join = df_to_join.persist() df_to_join = df_to_join.drop_duplicates( all_join_keys + [entity_df_event_timestamp_col], diff --git a/sdk/python/tests/integration/feature_repos/universal/data_sources/file.py b/sdk/python/tests/integration/feature_repos/universal/data_sources/file.py index 7b8e5e80e67..124dd4c88d6 100644 --- a/sdk/python/tests/integration/feature_repos/universal/data_sources/file.py +++ b/sdk/python/tests/integration/feature_repos/universal/data_sources/file.py @@ -5,6 +5,8 @@ from typing import Any, Dict, List, Optional import pandas as pd +import pyarrow as pa +import pyarrow.parquet as pq from minio import Minio from testcontainers.core.generic import DockerContainer from testcontainers.core.waiting_utils import wait_for_logs @@ -87,6 +89,39 @@ def teardown(self): shutil.rmtree(d) +class FileParquetDatasetSourceCreator(FileDataSourceCreator): + def create_data_source( + self, + df: pd.DataFrame, + destination_name: str, + timestamp_field="ts", + created_timestamp_column="created_ts", + field_mapping: Dict[str, str] = None, + ) -> DataSource: + + destination_name = self.get_prefixed_table_name(destination_name) + + dataset_path = tempfile.TemporaryDirectory( + prefix=f"{self.project_name}_{destination_name}" + ) + table = pa.Table.from_pandas(df) + pq.write_to_dataset( + table, + base_dir=dataset_path.name, + compression="snappy", + format="parquet", + existing_data_behavior="overwrite_or_ignore", + ) + self.files.append(dataset_path.name) + return FileSource( + file_format=ParquetFormat(), + path=dataset_path.name, + timestamp_field=timestamp_field, + created_timestamp_column=created_timestamp_column, + field_mapping=field_mapping or {"ts_1": "ts"}, + ) + + class S3FileDataSourceCreator(DataSourceCreator): f: Any minio: DockerContainer diff --git a/sdk/python/tests/utils/e2e_test_validation.py b/sdk/python/tests/utils/e2e_test_validation.py index 43bdbefc004..bacc8c17206 100644 --- a/sdk/python/tests/utils/e2e_test_validation.py +++ b/sdk/python/tests/utils/e2e_test_validation.py @@ -27,6 +27,7 @@ ) from tests.integration.feature_repos.universal.data_sources.file import ( FileDataSourceCreator, + FileParquetDatasetSourceCreator, ) from tests.integration.feature_repos.universal.data_sources.redshift import ( RedshiftDataSourceCreator, @@ -211,6 +212,11 @@ def make_feature_store_yaml( offline_store_creator=FileDataSourceCreator, online_store=None, ), + IntegrationTestRepoConfig( + provider="local", + offline_store_creator=FileParquetDatasetSourceCreator, + online_store=None, + ), ] # Only test if this is NOT a local test From 104a918167499e52513c871bbfbc577048e13bc7 Mon Sep 17 00:00:00 2001 From: Achal Shah Date: Mon, 17 Oct 2022 10:49:12 -0700 Subject: [PATCH 04/30] docs: Add docs for redis ttl feature (#3293) Signed-off-by: Achal Shah Signed-off-by: Achal Shah --- docs/reference/online-stores/redis.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/reference/online-stores/redis.md b/docs/reference/online-stores/redis.md index 2078ee16b95..c08cef2a3e1 100644 --- a/docs/reference/online-stores/redis.md +++ b/docs/reference/online-stores/redis.md @@ -45,6 +45,23 @@ online_store: ``` {% endcode %} +Additionally, the redis online store also supports automatically deleting data via a TTL mechanism. +The TTL is applied at the entity level, so feature values from any associated feature views for an entity are removed together. +This TTL can be set in the `feature_store.yaml`, using the `key_ttl_seconds` field in the online store. For example: + +{% code title="feature_store.yaml" %} +```yaml +project: my_feature_repo +registry: data/registry.db +provider: local +online_store: + type: redis + key_ttl_seconds: 604800 + connection_string: "localhost:6379" +``` +{% endcode %} + + The full set of configuration options is available in [RedisOnlineStoreConfig](https://rtd.feast.dev/en/latest/#feast.infra.online_stores.redis.RedisOnlineStoreConfig). ## Functionality Matrix From af4bac377b918ff7a99fb8dd5aee0b3caaa1e568 Mon Sep 17 00:00:00 2001 From: Francisco Javier Arceo Date: Tue, 18 Oct 2022 01:35:06 -0600 Subject: [PATCH 05/30] test: Adding more tests to DQM to display behavior (#3295) * adding additional unit test to show profilers Signed-off-by: Francisco Javier Arceo * linted Signed-off-by: Francisco Javier Arceo * updated test case Signed-off-by: Francisco Javier Arceo Signed-off-by: Francisco Javier Arceo --- sdk/python/tests/integration/e2e/test_validation.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/sdk/python/tests/integration/e2e/test_validation.py b/sdk/python/tests/integration/e2e/test_validation.py index 771061b2069..f49ed80a265 100644 --- a/sdk/python/tests/integration/e2e/test_validation.py +++ b/sdk/python/tests/integration/e2e/test_validation.py @@ -104,6 +104,13 @@ def test_historical_retrieval_fails_on_validation(environment, universal_data_so features=_features, ) + ds = store.get_saved_dataset("my_other_dataset") + profiler_expectation_suite = ds.get_profile( + profiler=profiler_with_unrealistic_expectations + ) + + assert len(profiler_expectation_suite.expectation_suite["expectations"]) == 3 + with pytest.raises(ValidationFailed) as exc_info: job.to_df( validation_reference=store.get_saved_dataset( @@ -360,6 +367,7 @@ def profiler_with_feature_metadata(dataset: PandasDataset) -> ExpectationSuite: @ge_profiler def profiler_with_unrealistic_expectations(dataset: PandasDataset) -> ExpectationSuite: + # note: there are 4 expectations here and only 3 are returned from the profiler # need to create dataframe with corrupted data first df = pd.DataFrame() df["current_balance"] = [-100] @@ -371,5 +379,7 @@ def profiler_with_unrealistic_expectations(dataset: PandasDataset) -> Expectatio # this should pass other_ds.expect_column_min_to_be_between("avg_passenger_count", 0, 1000) + # this should fail + other_ds.expect_column_to_exist("missing random column") return other_ds.get_expectation_suite() From 54faf61ee18cd108e5c6abdf0b01a5d2ffda91b9 Mon Sep 17 00:00:00 2001 From: Achal Shah Date: Tue, 18 Oct 2022 10:19:03 -0700 Subject: [PATCH 06/30] docs: Fix broken links in roadmap page (#3299) Signed-off-by: Achal Shah Signed-off-by: Achal Shah --- README.md | 8 ++++---- docs/roadmap.md | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index d57247c60b5..f8f251ea4ef 100644 --- a/README.md +++ b/README.md @@ -167,7 +167,7 @@ The list below contains the functionality that contributors are planning to deve * [x] [Trino (contrib plugin)](https://github.com/Shopify/feast-trino) * [x] [Spark (contrib plugin)](https://docs.feast.dev/reference/offline-stores/spark) * [x] [In-memory / Pandas](https://docs.feast.dev/reference/offline-stores/file) - * [x] [Custom offline store support](https://docs.feast.dev/how-to-guides/adding-a-new-offline-store) + * [x] [Custom offline store support](https://docs.feast.dev/how-to-guides/customizing-feast/adding-a-new-offline-store) * **Online Stores** * [x] [Snowflake](https://docs.feast.dev/reference/online-stores/snowflake) * [x] [DynamoDB](https://docs.feast.dev/reference/online-stores/dynamodb) @@ -178,18 +178,18 @@ The list below contains the functionality that contributors are planning to deve * [x] [Azure Cache for Redis (community plugin)](https://github.com/Azure/feast-azure) * [x] [Postgres (contrib plugin)](https://docs.feast.dev/reference/online-stores/postgres) * [x] [Cassandra / AstraDB (contrib plugin)](https://docs.feast.dev/reference/online-stores/cassandra) - * [x] [Custom online store support](https://docs.feast.dev/how-to-guides/adding-support-for-a-new-online-store) + * [x] [Custom online store support](https://docs.feast.dev/how-to-guides/customizing-feast/adding-support-for-a-new-online-store) * **Feature Engineering** * [x] On-demand Transformations (Alpha release. See [RFC](https://docs.google.com/document/d/1lgfIw0Drc65LpaxbUu49RCeJgMew547meSJttnUqz7c/edit#)) * [x] Streaming Transformations (Alpha release. See [RFC](https://docs.google.com/document/d/1UzEyETHUaGpn0ap4G82DHluiCj7zEbrQLkJJkKSv4e8/edit)) * [ ] Batch transformation (In progress. See [RFC](https://docs.google.com/document/d/1964OkzuBljifDvkV-0fakp2uaijnVzdwWNGdz7Vz50A/edit)) * **Streaming** - * [x] [Custom streaming ingestion job support](https://docs.feast.dev/how-to-guides/creating-a-custom-provider) + * [x] [Custom streaming ingestion job support](https://docs.feast.dev/how-to-guides/customizing-feast/creating-a-custom-provider) * [x] [Push based streaming data ingestion to online store](https://docs.feast.dev/reference/data-sources/push) * [x] [Push based streaming data ingestion to offline store](https://docs.feast.dev/reference/data-sources/push) * **Deployments** * [x] AWS Lambda (Alpha release. See [RFC](https://docs.google.com/document/d/1eZWKWzfBif66LDN32IajpaG-j82LSHCCOzY6R7Ax7MI/edit)) - * [x] Kubernetes (See [guide](https://docs.feast.dev/how-to-guides/running-feast-in-production#4.3.-java-based-feature-server-deployed-on-kubernetes)) + * [x] Kubernetes (See [guide](https://docs.feast.dev/how-to-guides/running-feast-in-production)) * **Feature Serving** * [x] Python Client * [x] [Python feature server](https://docs.feast.dev/reference/feature-servers/python-feature-server) diff --git a/docs/roadmap.md b/docs/roadmap.md index cea646a8f5f..e75e58849bf 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -25,7 +25,7 @@ The list below contains the functionality that contributors are planning to deve * [x] [Trino (contrib plugin)](https://github.com/Shopify/feast-trino) * [x] [Spark (contrib plugin)](https://docs.feast.dev/reference/offline-stores/spark) * [x] [In-memory / Pandas](https://docs.feast.dev/reference/offline-stores/file) - * [x] [Custom offline store support](https://docs.feast.dev/how-to-guides/adding-a-new-offline-store) + * [x] [Custom offline store support](https://docs.feast.dev/how-to-guides/customizing-feast/adding-a-new-offline-store) * **Online Stores** * [x] [Snowflake](https://docs.feast.dev/reference/online-stores/snowflake) * [x] [DynamoDB](https://docs.feast.dev/reference/online-stores/dynamodb) @@ -36,18 +36,18 @@ The list below contains the functionality that contributors are planning to deve * [x] [Azure Cache for Redis (community plugin)](https://github.com/Azure/feast-azure) * [x] [Postgres (contrib plugin)](https://docs.feast.dev/reference/online-stores/postgres) * [x] [Cassandra / AstraDB (contrib plugin)](https://docs.feast.dev/reference/online-stores/cassandra) - * [x] [Custom online store support](https://docs.feast.dev/how-to-guides/adding-support-for-a-new-online-store) + * [x] [Custom online store support](https://docs.feast.dev/how-to-guides/customizing-feast/adding-support-for-a-new-online-store) * **Feature Engineering** * [x] On-demand Transformations (Alpha release. See [RFC](https://docs.google.com/document/d/1lgfIw0Drc65LpaxbUu49RCeJgMew547meSJttnUqz7c/edit#)) * [x] Streaming Transformations (Alpha release. See [RFC](https://docs.google.com/document/d/1UzEyETHUaGpn0ap4G82DHluiCj7zEbrQLkJJkKSv4e8/edit)) * [ ] Batch transformation (In progress. See [RFC](https://docs.google.com/document/d/1964OkzuBljifDvkV-0fakp2uaijnVzdwWNGdz7Vz50A/edit)) * **Streaming** - * [x] [Custom streaming ingestion job support](https://docs.feast.dev/how-to-guides/creating-a-custom-provider) + * [x] [Custom streaming ingestion job support](https://docs.feast.dev/how-to-guides/customizing-feast/creating-a-custom-provider) * [x] [Push based streaming data ingestion to online store](https://docs.feast.dev/reference/data-sources/push) * [x] [Push based streaming data ingestion to offline store](https://docs.feast.dev/reference/data-sources/push) * **Deployments** * [x] AWS Lambda (Alpha release. See [RFC](https://docs.google.com/document/d/1eZWKWzfBif66LDN32IajpaG-j82LSHCCOzY6R7Ax7MI/edit)) - * [x] Kubernetes (See [guide](https://docs.feast.dev/how-to-guides/running-feast-in-production#4.3.-java-based-feature-server-deployed-on-kubernetes)) + * [x] Kubernetes (See [guide](https://docs.feast.dev/how-to-guides/running-feast-in-production)) * **Feature Serving** * [x] Python Client * [x] [Python feature server](https://docs.feast.dev/reference/feature-servers/python-feature-server) From b5e734b8e123d5a2d0ba8da7970a451bbc5102b9 Mon Sep 17 00:00:00 2001 From: Danny Chiao Date: Wed, 19 Oct 2022 13:25:35 -0400 Subject: [PATCH 07/30] docs: Add docs on using Feast with dbt + Airflow + missing m13n docs (#3304) * docs: Add documentation on using Feast with dbt + Airflow + adding missing docs Signed-off-by: Danny Chiao * fix SUMMARY Signed-off-by: Danny Chiao * revert Signed-off-by: Danny Chiao * fix Signed-off-by: Danny Chiao * fix Signed-off-by: Danny Chiao * fix Signed-off-by: Danny Chiao * link to lambda docker Signed-off-by: Danny Chiao * link to lambda docker Signed-off-by: Danny Chiao Signed-off-by: Danny Chiao --- README.md | 4 +-- docs/SUMMARY.md | 2 ++ docs/assets/feast-marchitecture.png | Bin 79558 -> 0 bytes docs/assets/feast_marchitecture.png | Bin 0 -> 224458 bytes docs/getting-started/quickstart.md | 1 + .../running-feast-in-production.md | 32 ++++++++++-------- .../reference/batch-materialization/README.md | 4 +++ .../reference/batch-materialization/lambda.md | 24 +++++++++++++ docs/reference/batch-materialization/spark.md | 21 ++++++++++++ infra/templates/README.md.jinja2 | 4 +-- sdk/python/docs/index.rst | 12 +++++++ .../docs/source/feast.infra.online_stores.rst | 8 +++++ sdk/python/docs/source/index.rst | 12 +++++++ ui/feature_repo/features.py | 27 +++++++++++---- 14 files changed, 127 insertions(+), 24 deletions(-) delete mode 100644 docs/assets/feast-marchitecture.png create mode 100644 docs/assets/feast_marchitecture.png create mode 100644 docs/reference/batch-materialization/lambda.md create mode 100644 docs/reference/batch-materialization/spark.md diff --git a/README.md b/README.md index f8f251ea4ef..1b48f19f8f6 100644 --- a/README.md +++ b/README.md @@ -27,10 +27,10 @@ Feast allows ML platform teams to: * **Avoid data leakage** by generating point-in-time correct feature sets so data scientists can focus on feature engineering rather than debugging error-prone dataset joining logic. This ensure that future feature values do not leak to models during training. * **Decouple ML from data infrastructure** by providing a single data access layer that abstracts feature storage from feature retrieval, ensuring models remain portable as you move from training models to serving models, from batch models to realtime models, and from one data infra system to another. -Please see our [documentation](https://docs.feast.dev/) for more information about the project. +Please see our [documentation](https://docs.feast.dev/) for more information about the project, or sign up for an [email newsletter](https://feast.dev/). ## 📐 Architecture -![](docs/assets/feast-marchitecture.png) +![](docs/assets/feast_marchitecture.png) The above architecture is the minimal Feast deployment. Want to run the full Feast on Snowflake/GCP/AWS? Click [here](https://docs.feast.dev/how-to-guides/feast-snowflake-gcp-aws). diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index cb4a2664cd6..1bab8a61ef2 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -104,6 +104,8 @@ * [Batch Materialization Engines](reference/batch-materialization/README.md) * [Bytewax](reference/batch-materialization/bytewax.md) * [Snowflake](reference/batch-materialization/snowflake.md) + * [AWS Lambda (alpha)](reference/batch-materialization/lambda.md) + * [Spark (contrib)](reference/batch-materialization/spark.md) * [Feature repository](reference/feature-repository/README.md) * [feature\_store.yaml](reference/feature-repository/feature-store-yaml.md) * [.feastignore](reference/feature-repository/feast-ignore.md) diff --git a/docs/assets/feast-marchitecture.png b/docs/assets/feast-marchitecture.png deleted file mode 100644 index 0a7b044b098864001876e11fbb35bfe04007bb60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79558 zcmbq*cRW@9AOAtZl~G99eJVsoWy?rI_Q<7NqatKod+(woqkQb_eQ&Oed#`m7A(`1+ zGi6^R?!CCi@92~7@Av=jJRUu|&bjBD*Zcii&)2$<`nu{&5H1J+08AS9?-&9AZ6g5C z*wCK@&rApki-P|#xZHo_4ghB_AN`}!Fub%500MxG&1Xd9bsK(pgwcaWr_3M&h- zbb_w4h4xK!z$p~_xwp3ts$*OoFXVr_LKpY)8MpOwG;+`)54X3pX_uLg#o8A57uXg^ zteHTES30*mR3`dgkM;zRDN@?n+UGz*{~YB7@4VUnevZ3)V*2mL5bb{ex<8+VZ{NP% z904AY^c_f|LJt!YQ<84XCa@+Qa`U-NYwro3KVK8bAubQ6MRUtW1bshm`@!`d&MjFe zGoa7RYxG$`ZEbDZReIG7sZD2^Ki~dWubPA`9V)5f2J}x*$^AK}+G_5%m~ZnmtO*Y6 z+-7n4a}oel1y6_kchf+!->WIN4zU6(c6e`ZUPYGE%q3J1@xgSUloBmFDJ&<93u<}8 z@nE?pQ)SAz#|J|Q+<%~_B#q7pR!n$%yL3PT#rcOp5W_hAnCceF3QI_)@ zU%dthN1PS@@0HR8aSyXA=JGr~qm!D^NCB8nG%aK<-nncI}hc`DdYS~1ezDBC^{|^pYT1#VlB*$_A4Zf*J-|8DD$c!d(3ra+R>wz)IsM= zr=U^G(kPusq&{bKKkOHwb(N11@p}kU>2!FGDvO=^KkkGmxKdSQGA7`%tDCHcQD3+P z{5i%ft{AjE5v2Joz?I4P!`x-H71e8|RaUml7@k!>8&0AFT6$^zlbI}P#C_vIcX>_X z0?DmJ=M7X<)XW&*HFC1h9&r^;_L`~md-v+mlus*4)ogJ6iN!o`d{B%V3TVux{ws8} zW<`X|hvkVmCzqY~-7M#ONhegRi~dUPeJaiXb*A{)pCwJkgZ?9r$8fqO1_Nu{fPFaR zFa7K;7s?%k&U_(`q0WY{KWUvY>2?4Fn2*)q%CumtQ6tWEwzZLp)9IZ;eg4+uoQ%DO#n}ymm<3Lg6fDq65y4Bu^J7 zc1#e5{s{8hFT<#&ADYF%7~~0)$19|r19HRE&BMJ-k~}Ik% z6NfD`5huxgR({=3r2q2(NUJ&PYSlEXheq`Smmqk^<^HEGi-qej=tvH0&Dh{H5a(g^ zS6lN!nw*BO-y!IRRWS&11h56s0LSkX5$^RWxh)l$=Y6Jga&q!{Y&C-rmB5-^DD|Hw z#+`xGNK{QzEACidfV3~>GXZVKN)vY`)#dk~i6xrtUWRMy`Tmn#cisb%Y#h`7kphHh z=lm570Ep8#-Zk*_u{8q#>ob4J0IhO7eIwQ1J5%le|LG+Fe7*FSdH=8R0f6g~z<*Nr z|MTcPn@Qt8Zw&F^mUkQA;pM$?@uGU?_V&y3%5DREJqrs(fj2*5hR)X7Jg|E4JVmKP zN=AAN|ER0W#@LyDG8dC_cRXZPjQDdxNO zPYmJqNqzFz36Dzb=?I$pCywR$gnqvFVfN>N@X7Eh$vR~2gp`bopnDu}J@)VJWX0^# zoz#I(sp|Oq4x8Gl*D^KZg@i^=gqU9VOH5JO#)d1mADP6Gys@!&=LQ0@wz~8wR1O%R zK9-Q^B6Rz~WDty)Zo9-X**~Gd%AB=y%q)a9#}vh%W%Lca4q08@&Z7=qeDlAHmr6@? za}4ipGceXHo@N&CIu-(`q@d zJ86c$$ODMn{VNizY-ok=my#+Ki_JP#9$~o5uz#_XD=+hU zDJ4^c+$nGB%Fc{uXVX1+F35%C96wrZf&ZM;+KS5k?R0^c(}3nNUxaVXV8=29e5K^) za^la9Nb&%C+kU71$XOPB)0*{zyY*vzz45%Ntj7zarf=vEW#v)5aJ

;E9&-X?69s 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

hOcNPrQ4j9 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 Fe*ksxxm^GN diff --git a/docs/assets/feast_marchitecture.png b/docs/assets/feast_marchitecture.png new file mode 100644 index 0000000000000000000000000000000000000000..2b162ec06e99be8bda7748226c958f217e0ad4e3 GIT binary patch literal 224458 zcma&O1ymeO6E+G91Pu_J1Shy}NN|VX?(XguoFD-bba8igcXx*bf(1=rad+n~vG=?8 zKmR@9%r3)B_e^(Hb=6bSe3Fw9eTwuP2?`48skoT10u&THGZYkz48jx074NGgYA7gZ zeRClpIdLH&5;+H36LTwLC@AVkYf!6Xw;p<5y0=&^lFFtLArL!&_IZe(W|+nYvP|XM z*$GzZ0PmKUUw)7w*!-Zqhm(;(#lfZVd+(dINsnqnW+W%sQZGMWbYRcje(`;u9rZ8} zt1s9aD!0lwC;C;__O~W>nzU@E>2oQ5y!Zjq zkaOsX=&7_yF0Z#QY$){J>!?4N8XCr*fF2SUF+in3g2w-tkVQbn^vSJh^1e*t zUY))k3@1{BnV=s*AQ|fqxR^`>EEa=jhB0LA7YAH*EsNaDgcP&pZXuc-bLgKh7LK!Q zPx;^&%M%Q!`DV^$yHZ3T^G@%l1IKv^Jz=U!2yOndutl}N=Ksn!FdVMz}d&Ty_ z1445ZV>NLTX=x~0$T8QAk`I@>|i+!PwZw(ahFKB;ghZ@~9beB{e5CX(>)aTWdyrBU=MwMptXQ$1YIZ zuAGolYhx#U5?5<08%Iu896I5;?%n1M_{AOoZYgQJ^` zlfEm1jU)N5hx~btu(6||gSnlPxvdS!<8$>5Y@MBW$jBaF^!Ml2IE`J+|9g{-d&tB)S)f0`Ac6j;V*uzI82E%{)ZvAz>pyjXJon?X48W^E zKf0IvfPXpWDEZ+`>c*iWWdEu8OLTHbdlWcTF(24}IjW?6kVdT1p^4J}sks=*TS$96 zq%sf`;=de5$xzq{bG$Izy#Lf3#2*T2&w`~z`j7N~15L|Z?e)af^WUiNiw9|MNZla# zZ?pti1C;bkZcq*{|AkYKHY||#eR6gI|47Su*n*CcbNrPf@qc5M0i=Cs<_gk3(y|Uw z&Np%IRmW=dzcH%^LCzOns1y4iX=#NC5#)JOpMI);W7fxK)Dflje`s_3f#1~BG_59P z^ri15tb~Nb4^v>i8RFrUN=<$m;jc#yumEDF9CklcaEK$yg-Zp0gnJa}j0^-U{}Msu z5x*v*IsAVb?0_wxreoybq<{L66#PpVD>IpH9^12rD9<+cc;rxYXN?h#d{igr9XVH? zf}#JiBMM`4*dz5=L!pHpJ&0eoteIUInD~>q8T^PwKT;!ifXEEY$frMy>;En`q-cIh z*sonLyLBS}FJ#Y=Aere;DCm$nld2;4zw+`WDQL&vS3GHam;Tv`b2P;vH~r7H{9_my z$a5(?udVPN|6b$s^}U3CgWf;z@T!w&4arxkab3)5(R3THv5P+bTjWQNyl)(kyGoks zXuscu1@vtjQu?&CpIB=jDp)U=D^*<09_sD%%Ld!^UYCM9kkLCBcNn7!=!T8^)Z%wz90)cRGJM-MhCy zfzCa?Ra3)s6G%ukc@{wEZ~klKccLUxDx1UAJSA-v(?NvfQ(oQMl5Al}BTkzs2lbgsJ3jq%=%s_KtscV zFmsDzBtn`_4nR8N_$i0RK2N=cUwqxAUa-txm=MX!`=~Jv0srLpY%^40B{(Go-?Pc- z>|o36e@%x4lFC}#2!coMt=M)be~xN^z!&5qz%oD&(N6mq2GWmjm2-k^q9MjS<(&lY z%3VUoSuEC}8Dij31N3K1%*C%KBj)38_0O)nDjmF&O6S`?4XMo;goep-ddWJcD-F+8 z%BT5DzV&DMEh4AH&=+k_QJysUcChl1oLq>XF3C~`1?(kTrQc_FCrwhIzq^l`ik#rR z1WALtodiWqMLB!b<9-SV2^zwOR^%$4zBR)grbLQ6dDeDit$)-JB)%vZ8E_^~^s8te z7dEvKL{P3joU!S1c=8lI{0I=f3EYp*X>;w@=R`CL;SV~!ea@LUjMmK5)n;-sS(0)# zI$m9)ho2J^TYVfr6m*2J$Z9DVj3^+@47sF0e!nJMwtwE;w3re z1THcH`vb+Qj_;lXV!M!|b2BXhTf>aN7+{xSfI~MIGkCAEfdOZF?V#F z-*C&9j8d;keU^(Y4&FLu5XFA2GHPreAB1o9K-Q;8pj~fC{!KIGMlO*>4z;(tjLScc zdVDAc!?Y+(DZCf>i!D5e{6qsi)wA(*erEyeS6QDfP`5KzPKVE|yxVi-eCKS<)PKr2 z))U{AVMd*D_n66e9p=$HVPyGB*x~PZg?YV}vdj?Op@(nt$e>%xAzZ*@VK$SoJzwm0 zyWZivf%WO6AGk8rqOrp3gktnMp`=wG+%>_;>Cps(N@v=SJd7+^eLVQ1Z8y2ZX8pJ6 z<*col zH{ny5$2Z@Oqk0kNQ>;vXKglS@=Rs<}+=V+_-?@Jc%}ca*BI^K)sz0ZoqQ>`Bjcu)}2NB}j!4g1rYynuc{P87CAqr;VyJffRab35QK%yVlN6BU)U zq~=TCc?n_wTs~)*!!_^pT!1Oexx%dLZ#(TT1$D(cbY6G%@3&U8SRL)`*q6! zjx%30dg9_1lczGR8{T~IBwSuiP*F2nqZqmfc8L9BP)LMeNnip71@5^x5+YiZCax!X z^zI6VzhTAA#2eZ#BS5bvhl;8-5}7aA8ZQ5!s3YPLi@0Oup&zwX%<_DE*3Ng%U#i_3 zy~Bg=OEdBKo$wXS8HS<6^}YlSGb*-cd@omBYs3$5KNk*m!qEV8>d$v)xWHyHvA1;i zF|o7@df1bW>ed4b^C)O--9p7l;t}~>k#!CRC!|((>U5RNx3Cfg1YW@fm@vNDww`Y~ z5|Q>;v=RfJ znhQTBF4)P1cl30y1tPren)Vu6!wNfg894Sue`*?ZQuIsvK;ic*%hn$L zSLX_+lXt8+mJ-x_Vx{+ zX3qCbM4?l;k6pUmySLo=8Q-q<%u}fa&i@(@QKd+wU3vVYHK^sPntF-3p^Zs;xHtg`5 z3+#xO#{sRcJg;&!+uFY0e%^y|m$f+>K6U0P$4ZDiIw-(fQFDf$R>fOLhYgPR;ngR5 z!1m>JzuxjyZ1F@c-#8cC+1y@ER)$2Em? zG)=uOqF4Xy+T6R5`C{6;Z4Woj#O-4=_{R7@9)pOWqk|6HYJ1B&kGm&8L2x&4!vVQh z&MPhrVQ_ut%85NjAhqYg=649*Ns^!WJ{^~!tggX^8n#679NU*=ZSq`P9;FZos!^t~YA#%&7Bhe<|N6+VTEkRoy0JS)n~N7k;vWP)bOfCb!VZuX51_ zI!l~&u)KST%{yt&)NK}ZxZVM0BMeY21V1?cZ9ccQcC?ppk8omNCeAqkq5}DC5n{H5 z@{}H8w)EWG+!~c);>Fd~6D4<~y%vIC{a_D)e!#q%93=_6P8JY8iMr?i5yVN+84SSSW)n)I3p4JDhf+^N5ez2*HrRGF3~&yLT) zP*h>n&9A$*=EPqR%D^#g_9h7SIL0Tuxyg4%feorSn39@xSVB2boiP?0tYosj<+dkX zjoFHE+cN8Z`ZP<{_$UHXTj5ngnc5fm$CI0*`TS zIq64#2)n5S+T%iV)oaseTk5-2*1QD1wD=S|<(z^`zc0id_H0*6eHY^@=(myt!0vke z=*N=;icn5lTMfQDTV}ZDJhq-UkgT>2VOWf)4EF)P*X8q%;z|Si>2Vd)EhIj}FV`Y>V-k`AEPK2``l&NgIw{I;9DEQiFJSjEHT_@=rwO=| zF&BjfUVWcBuRLbt0Wun>M_$EP(Sb|{MX;${B|h#@9i4hm>HhgKd*WbzIxGJ9=L-~h7Ka%yQt7@ zPK8eispw@IcK&VT#DqJRc5t$-dO{2eL!^BX11P7DP=SpwH?!`Cc;{t;?rM#$=F|t< zp+i(Mk%b3+D+^01W43G)3Qsw5JFJ3!C_vX2B+tghspJnx)soXg)F?SjfF=_wayL@A-Le%%TbViY~#-$)7; zF0`Uv)(mKFH~ZBKg59T2b@%-i)@`$SB}49}gNb@*Sa~S&Vt1rpG{`a`3LA@IW2d%k zT2!(wGIK0gxXj2p(PF1;tTfg+g#LD6GwNZjq!4cmxru?ngLHXcrIgr~q|fiGW@WqE z3R~KxY*<9{xbmp#Us?!dwWP@D0Z`T(tSoFI-)d(JJW9v_A)unC2M|B@dMZ{yTlqVY zRv~wbLq4vRI5*(jVO!eUPWJ)cyXE>3dXbuY zRSBN=)(6w0*&p7EBuxc5Bdajdj}NU0TJ1?q3 zf+Iykt-VIUFwm=LY*hbt#s)M(q$1yf(oQJB8diN77cskrTmlb{tYA$qnDS?xpOHNo zc4)nT4Ye+LLd|gINlsGdtHH;hqM~XSZU}5k@BAY(n^XWB0`lv7UySNpxTZQrwo7&^ zIg<{Lk%^4M8a;E6*RHmy8=_$g?I^7xm;hNNXv%WyBLmt_=WPicb7q5;yrq9%o{2K3 zAbqKT*{AQ3hif>{YGTW_Rt{+G0YxZIppAq<} zOG=8I{D_|PdP0|dzE0Y?>(s+cGxzKVUnd&e{B{KO^bq;q*g5!VOp)4HS>=qpsmLeU zh+P&9)5hbUQ_O2_p73Xv6L+ z9aQqu z6nRgXZ1u#gJAPb_s!n@u1v<-(GW&y3|Kj-2x3;70dWYWUFNoV85GPxfJIC&UoFC0^ zR=DQ{*Lju8e!*)af1g1-3Tz4mMU7RIDCRNPL^wCf>V`Q-rx%?|x;W%daZ(U$(l=+B zmb|?2RXgr8XkWN=GRN6))mO2le+rQ&( z8b?Lyw*@kXz+XgS3-US_rTWS|*6peb;%&qs8kI1*)d;Tdgc?~u6xKwYkM-@UJ*6fh zzH?=5PRU7{iz)GHrjM(g4}b@6BTqp|4?OCiDJ~4=fjuc_v$7WiEM>GS=D5zEA6Mh* zb-5=%Og9JvdO;Qsg-(@iagkE%V!zcDI}!bp=R=zlz=)Zl=$W%%&eWoI+U~mqrGQ}@ zF7RfcM_i`$H`@~b*cYw}F1n9|`+b0Dp$E_}4^g126f{qTbg6VV`3WaT40B$1a*S=i z)sPDOq_T;Xgt*4`e%WbW?i4J|8$J{QdeQAS2x{dR*FR$k`)wkx{h<~H1x)H z*{Dc+Dj9wp41CQed%Q!#*QAV9Dz$|lN^JQhUNNW%wNB6cG7{(9uj;3Ub(e*bkn+Ty z`8K^xTgkLOUr&T1_Y-Fo~r z_b~e=*4vQZF)Iim3egL`UgeS)b|7J{>QK@(vU5(GPPlz!Q=qE$2_>(w@kHa> z+R|NK3~V_HQIawwW^zjI8-9-3=yBj%vwdfcmgdb(P(1bwa2_Rb8Z{W1SB3u)6c3w% zZSr+gROcOu?DH@ID$h>?rs`=a%x|K9bI1V%6%#FIfJ(%j02Dz@OTRb6SQDjXy78yq z`4wl_lm+13bhu7}NQI7n@Vv>uNhq}t`8>Ojm9)r6mv+yMUy=+frl*InLLU64wfseL z@?r{F?Djc`ln*f{%cl-Vusc5PIHIzF2EAa2hu7)%X}Z$-LOV#y+vyi)Pi+LtX{|lO z1#cGr-*XTn*+5{YFfq=pwlbSu?xPHHj(ckanvlVsRx zPavTFJGxn~R~e(@&{vdJ`jzPlJNLmfJm}ks@Ee0F!AF&LE!^=$REk}AfuZ3j)=Y!7 z%WE!Mt3LJkJ^9pq;xPu#yPc2OD4mFmu2%%Z4?Dg*5Uucd_-c`?7$M(#}u>~an3X>>i5+o_s3ia6M45fP$ z&j?&4C-_Yuv|2-hcEo%NXX2bFgOtK2Z7S&xYjBNz`ys>zcIXh^9twd?JcAg4-xqO4 z36z`Cfy@4u{wbPPt1{^=DTC|#z+83ZcM-|xTN5XD&^8eaVWsbDp(H^6~+yK@T5W;=CmxFA9jYOVJC zoEd*&JZKl;Dg|hSt626cxVXjy-7-!)Cfg8dJ>7Wp4GRDRA(TF*54MT9W%AgAya3$@H}BLr`BSD?h${nwWwi>2 zb&fH#%2>Vi5)=(fB4yx9g5L_a*s5A|LQgvDr8bc{#O@pr?15t=zt?ugg)LR>#Xxwo z{l%bJ&6}RIU$unTEU%QjkB{%^&gKjFGytwreU{CyXTPm06$UT~Y#3&J%#Gh9DopdYPDh26Tl7vVIr zX1ntlTK}Wm<)~o~^-*IIE)S9Rjl4K|4zi;qPqjZn*{XOSE*G}l{>Z-pFLD~;4bXpV z-S&f!2K;XLl2}da&6`>=QLc^F5q2#VF#v}|hIVX%H0Lq{gg`%?hcz;2-Hfr`^U9y0 z@1KU`O1h(j*&k`(c3;`Pp2#uf3A|NEGJ?mitSMw1D_53>E1hF7YI42_d%WkxaFj9m zpJ(d|&WuH=9#fQakQ5~fmhXAEj5GcsvQQT~j2 z)utC`PMq$P>GPBCeyMO0-;!rOuVG>m^nnSv0lnV-49l{s?tzFM*Ik+!EvGO~GzvRT zKiT~b{h%YRcm<)ASH!%{r}QK6i_aM($5~b0I?l4s(fSbFZj;hALC>VVP>v*J8ZfmG zxb)Hz{?R!=3WdUommV#hD4b3}xe_2bHSU^>C#H%hrAGoZh>~BJUo_D1_;oIa$3!5- zK}*DKP#JbSc|an)^g6mh%H*EIeIM}o{kiX7mEH`?oR5W-&}IxU!f@^5C(uekc)}uu zJB)k|wWZ&=Mnu&gfQvXEW)2MqPtUtbvA?J0dctr2%dBOPAo9N}EGtu?Fqwf@qm1T< z-O`8{Vp+P31Ve|GYVLLmCc$|e^cj&1AO7%mCPmIHQKov>wTN;tDuYlJixrwXR3jTF z!5D6F^7bI*;RnJ_7#M!FqUtdR1#!_qg;s}jRj9tqKgNc_%`T{q8T5#Agb->yLs-xa zcT|=P-h=vvF3nXKaSbffmvNGtND}&?snaoL{`yeY(NIQIiUx09zb=f=dY6wN)HJBv zR${ONG8~~O$yE=%vm&%cv$?seG`uwLt=q4zY75F$Co&kW$2-m*{O-;18)k#}NihnF ziY91CHB*p1LzxOUGoh=H`;r#kN`=$xg@$ruerRPQzj0y;@7EM6( z%XQB*lcsFv2dY_1Hk>LDNv?QDHspQvfsXtzD;EHM_kx+BUd77Vl~3lipEB6x!L8fDayS zG~)WjB%ox+`cZhOh=5I}8qyl3nu@`TxI~J|N?I=W!&GxaRfwOvRNGnQjsL!N87sj| zD_KK_1)_?u*r2)L^&%O*>aO<(pc7u!$BTQjCY8SQ?V^He98y&f{9Jv5Rmq_LvLpo@ zV10p3kUb8lm+d(T+Dogh^m2_X@ZB_xXruh*>-HNrLR9HzcmRlt8Q~)o{>U1-E|KF7 zt?iZhJ2A=X*>kjMQ}AS%e7UY^)6IsL8#Pn*!)+TLX2>1)UkS;?WX8P&=`$1M{_uMe z%A@atU~e>k7iOjRnsWH^V4NAh4_oF)cE(hjW*=n1;)J4-@MtS~rJ>?xQ$2Ck_C)lU z5?l75Ady5k{*Ha2o_o$F6Z1G5^Rjt#>QuQo3gM>HP2%^&e664vFVZH^&0yQ#Y~I=v zXipy#$H*H8&7z&c)2w8v{3>EB2TB-&2b-%xB{dS`>u(1NwXB)DY9zQY%>qB&4-gJ? z%R@#>k7oixq)SnlxX6>_U7nr(d-oadvfx=_I!wvW*aM6*-U0?r1jENSqX5jOTOX#d zA1$>!rq3BgI_#Af;%o>7-iAy0tUJa46X240gqWYjQcBX%L3O2=jq0BCDVqMB(dfSZ zJUlFD-FAZv+tP*8y4s7rt}Raye)v~7>?cT~MBtzHlfs~kU%99<5se>UGL62eNFOxU zztNa4@vbLi3AH0yaXyJB5`6$vS5|&$ zr6NsVnfj`Q%GgnWM64kRK*3{MxE;hS>4esDLysl%kn%_z9FSIeZ>@P&h@?HtA&iet608&}~ zVJ|jphK?{Phk8C?8lP@{0h&9Mex07SaF=e;PLzQR$_HsHiwnGK7mi-xfyRP^QgUg2 zdHl4q4d;OVlQ(~sZn-+gJiNWy;cx(WLm{bl$`*6ta2!o#3~bK(2RcB8kHQK)U=9*l ziNlJ6BfLfB%?h4{~r{l<`3E_Vfs*~+zl{LZ?;Op<;feQ zu)*4OFSNVJj-~OCtCnd+?i7`@*k=paEVXR?7>;M+3IN~TT!5kD;L%`rW|?$4M%g`k z5DH5QK#|#R2L~dvjb=Y*0^LXO64}kGXj!SYfStXQ`QsqkyX%f8A6KUaoqh)s2C$$p zPj9bpSxe^M7$Cf7l#WffPY6xln2ELBnO1FIENk~Ry_5R0S|1Te9ir;zrb6(Hf`Nfy(TR>S zq`^J`D*$i4znC{ynU-0xt4DC|CDf?5qhjP{kF8LY;0D=#0TAtYSXdJbM5-@ zWTz-v7SoXwnrf5LI10(QA_d2&&=-6lL){u8bE^?B-@dj z+o--@3}<|IbyDTH@oui#wBFNmGefJvj?|<}OJ05pD<)esB67}gW8f>zq|xmMM4;QT zQQ{lxKq)zqRaa-k5OLFPKumnS&0>^dz6@tBSVTEIjnhp*hJcSTo=H1uemfY4(R^o$ zXOGLa9o+Utt;Oh5iDtdP8{Q^yl`<`GIGPAeOwN%_U4`MRFj$9J{;GJHvby9wGGD=$ zdR^&@@r0>_3IJR~(9`Vbr0nH5TYKiwC0YF|>JU9+GR>Otn^aoYJ`I2=R+NN`8X?7vZ%B&$MRi~k5v=uNRPWO7aa#x=E6TR=zOv()L!)LPJi zlHFTVg6Xp}6T!#(lFP*^9umkHX!9Z#kJfnGrG+0Xy}(|pm^W|?rZXCxFs@RHZ#-Ey zcMnh`i`z2VG0rts$O8{49W#X)dVLCyD-HnTIb(Aftckh!I~Nqs)t$dF4MVK2mNW4_ z{X#U?>Jjf*qLO}gcIHr0CNq}8%TRv5Yn;eo8OMFKmcLdg>!qN~rdp?&(W}%{WqJ__g*-ZtG{}M@IwbNcJJ&yw4w?OcmM@b^8Et8~+Vo-6N%RRC5t*9BSwh7?i_1ls)XWw0OzAQS zRn1<-(1%*;buf3aqeB|EeHV?MY7qt|lIrg8pV(w81=M#2>J|MC3R<>2Wrpn|xNcXj zkt>5Yp(patp)>EA^@&}5ir`zZtgaKi9zcA`!RF%_rqCnSUfU1q#KTyO7 zCuiP$Mk`T;H}QDlAfuSLN$Nn8ftJ}zP>UEHAO~2wTf=O0x{6w8_(C#2^}}I2jmKeE zEp@@n%q}k0t`{lb`z;)@@znNImFtlLeyNQP9UUEfPS_DDAbRV&#o4DTrb?}8-j30| zAmWyTg`u>WMot#l^-h=@3DsA;bJNR0%6d{|2H)e&;0~D==MPrC7`zk_U}j3rDv%N85Vq zWb2n(mR8Iv?e*UO78Me0z&;_8bS|nuE``U6*UnSTD_}&JXuy;ySi&h+S7+{mh;`6Q z8&3=h)-JL0ZqXkeZ7rJ1W$kmO|M9C-K8OCgQir>1XZS*ijc@`Ei`)w2o;Tw9}>!__j)E5fmucwp~ z%i_**1xR+~iKQTjcuIrFK(n7GRIiL49*t4q9h$96{6CsAqaEQ92GOK4_Iry`M1LXi5THDPR0*i#$GqYgnO9{RF^>+JgjS$|KH)y-j z2VNWV$NOBi5ExddNTrnN)>wd@uvKN`_9vb3D`5D4e*5lXbOiCpaeou#hnag$%M2g& z?ita}ajvAp;R^JI3HFI_nkq6zLs$TIPlNrc(Q0<`f>zWklaZLpCZ4w&EhP$IikiJE zoT8#4XPq$%^-6ePewc`0y;^6S*%`ap?7KlCk4N}I>&+*W=d5a*7O!^l1D+0`Lwg(<6>vg4?w24k=!d25 zCQQ7{LMe22BcV^~6S+N76_(@l1hg};@tw~K(^~cZr@Y)Kz=vtrI2W3mx@~>(fd>r9 zEhE}s68@Pm7c@0hC2VXoMd~7a@FD8cHqoQ~r+K;E(U4+WGvkU~h|OLT<-1IK1pILY zg0_22X8^jM!P;7u_D+0mt#;L^5+wD853SyJNm?zg@^zk=3%6~oNH*FwdcQf=w5FaU*pbyGoaO0vFS(R(`-Sk-Png$?r$HyS0X+bJon zPY-u?x4$&uK?3!Nv$pIZj%}S*B#0oNXFlkg?+0|%mi3U4y zXYu)k`JcvM->jOI{K;8}WvC&r2jm1ZQCgmwwnHkdWSbDTZOqN%go03q3ZwIlcH+>$ zd-Y2(rs*C!-baq@^xZ)bc0=V_>8u1M-3+6n6BFOa&Ni3^!c*tL{uj%!5$F4{n)Nn~ z;^Ub;$*(QztlW3)uVQtth-CzjaVry%NqLPJv@^8_Qq1Kj&nn7mIjmAY!S3( zC{M<2kN{8>=ud8&sR_XJ1w)TJY_VLW1^sx}7;E z6O~>LnRiw&h*+7URUlNmyF*#k@u% zu;JOx>fV;kEi<59b)?Jlt}g#=@jxG;mLlph2>LP?-rLe6T~X@J-mub-hOf?S4Ih$2sL$A;;c9)x*sMjVe%P17Rbka1D1 zvM0E|y-r=WpRZ%6GQD7&YjO_JYIP7vQqDv){=WGo+jx}RvX(eq*>X52b!RpyNx-IR zh7~Qk;_~WbV{P+$H^8NK!|Bcs*y5V0v%lPafRzZrxD$CuV@83-mrKtmKg-F*#l;l@ z8YSKqG|xi}NFxVBJfkKfG7f#rHyTBZx}ZO~vp=@~KkNQKSG*p#*DPP2x!bCdcI9q= z_!MnaP7B3%dkB+{!0mRN<9X1$9Jko~Zpc$vk5RWxkjU$l1;6No)@1&=T)ULe76RQg z>#dcG->OBV#W+c7LwtkC60KT^H&zQTSNp;o<3iXMnS1e)-Q7K(-I)YDzVu#1}=&`C* zmGI{?yjsImJCZ*Yc zNih^Vlz^oI`RqlYeiv*auVJ9#{oc1)A(?beie}|PM2f{u82A*)X$Z(~22SQlM-N6@ z!k5&_sR@cB?8s4{Y>%hMcZ;HO^@8{2>rdYK3> zEOop}K|<1VtDURsjWeHz=HgOT+kCyPWcS&Q!|Gdq2rvT`7kzH=yoyTUw%4*aKZyPm zO$n(lB!}p9IpcLL9$Vx^&X|dcACL7kKXYjdBv6?ZIsJO771oq$Nga42<7d_zO~Nk{ z%lF2e+pLKHIH>%~h^KF55I5;ki{G?Uv=&Y-L+Wq;$|48}T6g_$##%Q=ACZ=#d%`MR z$q?dvQ%psGDGLRy78;H$tQ!^9M^fn^7zfmpEehUEd?h0v$N}6KO+Ua&`Dsl;aJZ1W zGlhZ*;a2QSQxPS*+nzLN-$8Jg!$oxSw%=LWf;^a1tA?nUYg=of>&Nl8TFZS`LnVO* zr!8RO8?Pq%&*xTZ?VU778LYdKJ~wmgd6aDLDX>1u>FnQ_+3sGt94t+7(9lg$>`^D? zOH5Q+fH~w#)$$9B*OZj^{V3>P!e3MpUYxSaMd>st9gKBvP3G4yn1UyILuBmTx7QG9 zX53zx7InQ#J@@Jjjs;4`ey**p1q7H=#?*U#AMpAOH8a>?{kn{8w+CvyK2!bA<~?c) zK;*%<;OEd>e>cy8@BuI!@07COcjDz!Jm%kI7^$)tJ3**KF&^7V*qMT{fw9<4N-7931v}HF@nIIujZ)eRCS)A}bnD|SE(d92 z`fdU`UT4^Im4?YF99|k3H6;ZFprRs++7beA3AbvQ219bX>x8=3xw3kq#f|=_Chf%y zgE3jPKAk2fdF-}ygm0+0waG*tT4`?QZtA7`#-icR!4qbY_?cW*Vqsr5Te48*$kERW z>T6`2Wj{dC<*8|$PWf1Ss`>bsJ^@S|()$&gJeK?1Q~9`z;@=e@5|5FrEE*idA6J=a zB*w1~6>`f3Q;?zQ={A5EjwW^uUo4EPj2YzU+xLgKGuzEa=BTC7q2C#T?`qmg=1&I7 z$>~Smzfo8BupvF4IqHnJuc`VULz}^es5i0#3GY=d%Yzc7)*XNvO8Zr;17;Mo?=!XB z+!8G{)M+Njj@1i?yb!2u&D*qsSYi1B2{!NHkF`2CiRljV!ISO@DQ4!3)9I}rxtvf? zpm*;5SO;P+&Dx5BS8-Q5|11y^yZr@@{Q4tf>>R^+BlHk|a}W~<2U6s#9$G~i!GCTp z2g63oEWim51G_+3EBt|iL~F3^Vu{N}N2(z{!1(0{Eoyo?T2>YCQbv-1MQdSPkWkC66@HyIu+%C+QQG%IEo{qN_5>|I+X&0eSP&htH#iY zMiLe%1YgwPUa1d|Rk*h3vK;5K8d^f4p0tyfJgCu8&5Hs^tLg%S)xq5}YDnwzirX>qtZw{ZBp zRt+(YzH3IcxbJu&2~EECeR$0b{J6JpCQvAB;w1f$&3$vug1e1Vu@iTzNRk(^ard0q z32#6CQO=+ae#p*LM?JBi!B27P1`vS0E__J+OW(kWk|ZNZHGxLI3?l{$&{r@Ll&Huk z=E=mGPBk5DPtnuf<>YFJT? zmE)0Is-(l|CW{T~;1*~4TFG3s@%8Bz&}2l-IfS#T(VDP~<(qNRp;7f1JW#>&z1p(NU>(yFSPK6y44xcnUe>AN2g-7de1KBinyS~%;Jy*smuFU0P zT6wLheeZq!YJ4CLZ8;u|&sDb+$TYabkx z$Gs21R^)Tc7}N@Y2DY1P#xYALJfDg8m+2NOC-lk+k9DEHgbNZ+=`wZ%y8PklUAD23*eFP0j?cT-&)SyYB2S*WB$hCogGeKY+q zpGNZUs15~0mR}3L0Ch^)Go4<%dKX$vFQuYdbX7sk<9(a(=rb^vuk{C^Hd(91qAFU7 zsJV}&zLH(vzKu&5cIX>PEVC}0=92^KU2#ZkK=%TS>DJq{s*DnMmmeYtm8B%m(x5kuvEaK!5ce4AsxlTdZT&wu_q zgZJp3^1nlz?N^g$yE}TWSOV1LCX)KQ{R@vBaL;Z(>wdx7P*5k^b61q>MUZFKJA`dOrJ{_tv^l zB9i6saFG*Fw!|>R@)v=@GKH!;@(soTSx);cZZ;2c_z(C2G}Qc!_@JbQ=%~ycGjPLIWxA5$PD|cNzXz z<;VFwd$#$8x+tsi2CD4i_4s2J_vf@_o_$1B{C;OOomf~Cfi$8-eWr*%GH66KLP@(f znyL4cT`)FM&4Gq>hagRQRGM>qU1Y9sU+Mk*_V`yp`}74>Wcd+XMC8wiMJ=A^a~o@u zvV7!_;NW=f`b7~#1wrre?g`UCecRR3jboQI8^dsgKc)^355URoFYx?U|2M?=2{fo( z0hAZHuSnDij%ZN%Gr0o`IrPW%;qyOM<#MKShWm})LrJ!A*49*11A zoQ_~5{P19B(SSd;QD%VkeBHo{@^+l+IxB?$O3HF#K7Bt(yjdsB<6cC)(jhll79%b< z0PAfy0Y&>!`+c5ML4bMgn5c%jva;Bsq3(Z?qyO7J=Zxh?^<-;?sk-p_Gs(lv!?~%$ z#<{h6jq4}wwyU#Pa+IM2I7A|X8c(k{F6 zLziQz^AmYPldhR9SzV(yi1*QyvT@%AYsXp{*Bf@FZ}j9tI7A+^%fF5%X;AGI#IEby zWPjv>e;f8%QRR~wpB=65*YUUU6k?n=6~DIZK8nm5r1|0G@AtAy-g!QQ8hCnmX%tP`UX! zG4VsIr%bI<0jF@nVQj&z%JT{-5mG0o%xP<+3s@ifaJHQ*8NUYc0v@sL#=VkAE+l85 z>kvHbQDHX)zW1WPSoBOj3Rl-r$s76_si3S(14%}FF|Mf&Cgd>*4gF$G{hF#+0n?fo z=wwzNlXMh5`X{>tK?$Uv)BXMLCJmP9k2^wk?9k#6oXCL<{n z(fLx5l^VfR^&rzoWJVYV@#pd;~kge$mq7snPR%T z#@q1cg~2rfHjE+-l!Ti;zWme-`tqOPhK6}O-XX@6H7jkoZ~YL-@A2=dP>J<8Ss!)T z^WL76EsnC)Do;l4B@3S~DKk%2PINt9L%iC|=Be_yu-VAM**71K5p{D5P*RH7QP_%U zi&pynakWdM3X*TYXM0zYS3H$Z3+x75!{Sy~dv`H<}UYeUnikCT2JSX5F8)ROTG@#Eg-`08yAv7ySw3;ghE zWNC^4OXqu<%Jz+#=LgGFPc6(5d&#goD-?QK;viUC@QszLQr>vNRta%&aq$lgp1cWo zYKe#)?xY08lTx;2yM2R9y$@Z_7FOQAo8Fz1(QnfGPG-8-D5b8fq_S-bt@tfFcoH6Mf4C5n>M_V&C0i=VcYg``s@t#_b$pUz#!y$p z3I~c@?Hdh_cHUwbb2W4cNit&D#=XtqugAAzLAh5~TV)U^zdSynMG&jU#p%IYzKb6? zd*1m9g@_pv*Jk>E$F=ote|!jM;Aix0`Os^`IA92>CCN^-3go7PR9u%3oGUk?buyWr z&3WTwr)c(nM7S3PbA?3OlG2YJJG_3wF>b3%FKsNMDH{47VR0g>-DR(yaqJndcf2%F$hgxlfb#%MJ$HI(vJs9w)CCD`n>xGRUBBk=yaaVr*?p_o z;*4Kg*i4CXRQ6?NT`lcziNtmCmT55MdAFO8!s|TIXxVCi64+$h3NFEhFSMKvC}Q=z z{QkN~O?&Ixllsa8CJY-*j~7InTCvUV_Ca1nFM0kSuFf*9s&)O^0@6r_NF$ws(hVX? zcQ-5$kS^)&?r!Ps?(XjHScELP-|0SQpS}O@7xfG351uuj`yS&OW9D6$bV1Jh!r<~} zdPRAxrzrNd9iP2nS&gqXjjg!=gFmg@CJ}{%U30&Z5Tkj(Wf^X{Jjd-<=)}Dd{aHV- z_0?`ysizPFuDQeM650M`U#SADnNOW%KofMjfQMI!M!S%*z-6SQ+_22wlfb|4|NsBb zURKc8)={*~Px8P7`l+e`HFrHU>EkN&e16DGc4gTqpf)@A(6WqYDEMs+##DJ6@F#t8 zs*+6OmI6Kvn|ls~Y^Jd(5g68SO{_#&rzTkwK9u?`Rx)gR6Upm<~w=9JUqTuw^W;>=ag`!Ko!phlxn zbq=vSHzD0C*8ll)|Nr;tU)Dt+x+nR^f}UT{AK}Zx)vEUk%x1W%EV|*ilpRM#9|G@4 zSg7Cc8T%@2O}-CU9VBFTZ2$sR)e19lhZMD*0McC%I(tW=hlseV-D34HCsj++Ld#*< zSp>;jX>yZbDu})e9=k#CBk!8X5&;#^3GWwzHXACpQ@iXAt3ZGJy`&QHnYIQAzXvrM ziE^FhBWy2t)MMLIlL%t2Eo{G>FJTT$YWamWc9UDZV@>B|wbz7&7g9#_9Xt3fn^Snm z*sWrhyg!!fl&+6}a97un|EBkjjJiv}SEcS0SN8%GxVX71GRNx$uALNWoQei&& zWUApHUcx|)c`d@SU9U`)L$aseBJOt_Z*|wEzqTs;RA(nHp^@)=f{w3P$XYS>F)tff zg8t*Yp&au>U8S0^&HME((lTS^(&fZyRLhJ^0f;rCBpBE`^@x?Z#18^Fs|SBy--t!lOzx=*K>j8Qkv~v zrSyvY54?*MoWyEaU!fIvIq*8>o@B`Jj~^;8nUC205+|Vq%a$nWVU7Nu4e8GyJciz2 zvm1P@C=!6ie=EpWa}xE@c#Lzmip{Dg5CigfG0qcV6(R84;2fawL+!uP5mMqSt%1GC zLBDL2;mq$T0jT)o+tkvLaop?rG3xC4(h{y&uj$2HHxp<&rmCun)QjxWB~|j9(*35a z1~$l!{2e0qlqi?@c3W_tY>vA8kfrq+UFM~^97@JU%bhe<`yK4;nw%KtOLdqf5}0g* zrz;Km5Mz__Ol0l^)ffWnw&=acMEr}$8^qI{PMwlII;I~hI94SbfkAh{aYw=qintmB zBL84=g4P%f%L`;@L?+Rt@F_dLlZ;Gmf34CoMr4>ou^|_Oe3)#hl)kdzB=y?sRn-4y zFcOvOU|7hi=BroSAptTmKO7oJ(!HmZsLY4RMuW9rJt_o!a zjrlL|@nfK59LuJ7Z!f|uT}AjGe~UDh^l`c&CZ7JdI+}&tjeBVK9b%jQp$UP&IoHV1 zao~~T43YQc$+jNQwq+Nd^}Xfic{Uv}!78#@&6rw}MF(MmYF{XR%4yk?dYi~9zhF{u zBkAUKUD;_MA^&4#^;h5C-PiUq&3fB8_re+FNF$V0R-5EWpBj}n_}SM*a_M}jrIL@w z21D^b+NV##xn+er+8XbrLsuu#~>(s=fx(KER1hty2;o5BJ}+*SS2NKWxcBJFDohT|E>^k-0S zmncZb!Tm}RK9}9553W3Ht9n1WuRoD9r1H)e3J9HyjN0gF%ihbMcKrku8~0v8ZV+ov%a=f9g|PZZoRrUd`e3YV>Iv!~b+~;K>xp z4P}2s2FMb-jbL-g`6BM!@9i&l8-h8X_yb3baf-hU*Mc<@^T+Ck{EE$OTH2JD*k%U0 zFNzKOZjtcWeksxoKU~{?KUV!eyZ}O?X@1jjb&ESz31d zhb$xsL>WqUy3+W5zD&zjd-WXwL7Fg%g|VKXmv!$Spl2ZJy+}m=XUqXgXj#p!quVf! zwLmuTjmOJPVMpjB(1m744LEX+#4vUCD(&d^9_`O(V|MN($t{+OAw3Dt2|96pA-G&B zzkZr5hd6hK$zM`aLP+zt;F%w&1`f4^`$M@4p2laTJBqfq>jfI|W2-J0pIOb-~Mg_~vXe&O? zYQKmKGUQK<_~~ZwpXk$HPd;pNsD?Zf^E2#*5WZrh!57z?^ke=h8jhJER<-YwjVuwV zrtw(&8auPCIFP&kfFW)r!?|##gd=e}mYDPZmi7Gg7hT48%oeMp@u<=;TLSQCQD=jO zxp}EA8q!UX&TSW7YAzA$rqOkW7Yt<0UeZpyiHyo+ZSUL`Rp7e4P5w)qil-LQt-fhc7q|3;y)PC#ybM$?cRVO*V z*5|fEtV(_2zvUPpFb3_Fr>rEb{XI&>VKt%Nfj6?*)Os-+H~!F}YJK^Lo~TGA9#7x%X*!rXS!z=`Yr@nN<|C$89O!k_mfnFCPp$=ff7nFlq~ z7Vf&y))LH*(4K1OHrAXT7`e*aJ6Sk(#Fg$Dbt;7cqcg=iS4T&XaPp3UC4aa7=oAWk zi+Kc$Qd3h?o#%a;j%Es=5C6z zF;{pTK#F#}nkxNX!8l@mN7D{WoZ(6`TVThb_&~;a-E0rev-NR#T(HLf^fR*MYLCD| zdKj={LD#8VRl1$R`_B#s6?#brnBafU)n8*eENatTWmbFK?Ml>+%8Lmd#r7K|WgHK~ z1KpNpgKZBgY?63#yBedVs%aVit`YfjHAX^1g*NJ~NsRaf-o4+PeG{KhA^lh_@bJ;; z{xBcbmJrT|wluRrz1|{irP*;DU;6QJU%*jR?kvT!jTVr7M!&&QF?_&x#(bN%UG%ov z50doPxV!bIgp)YQUAjNvGvFuB<6XSvVBSgPx=3A~^?|?U+FkKO-rohVgDSIq2ek^T zsF4&79i!3Y6XIhW(_YR^hv8=A0D?h=;%ypz47n5zrUnuJTDiiC?_Vgbd&g1d#S3IU+xPIty=Ky z&RLB!ro%(xhCLOmPq$^_@nc2NO12xq@uw|KfwupG{#eCcT_`>8PzyxG9EpyWP_sDP z0JGX~o>YpwykXcoHu3z;rGvg>*>S|QF(d^|y;Ph1u{8PoZO4llRbKpg-Da z)we%|qf_$+-I%tGbPu|v2*tyW>rNWf*=4rDO@H*zwuozPJcMErXVrLSoh)2W+cXyi z)t5IU{9Q>S#y0%lZX^2>BySW8JRzuH*>}WT&Z^->Aqz3o;mwFuStEb^5QUAb6ST(b zQac?UrNS3Tn}13XZws)zD^R2>)K`#@@Y0BZ!-s;l`*#5yh*h<56FG0OXoe_P$5;xW zX{ZW^p(HQ)4EiL^`#;^xDqAkud}HJuFYLlT$5D!$D`vgZcWX^4#~vDup_UnNIcv)q z8W}XDY!-Jr7NAqem$420P9v8k3HtZ>A3%X>2yS(5)(S5yo=@vf-f8s-vpI22ab7-1 z+p7Ad2*B@5`Jv^Jy&vgz7i)b$r#(pcn!Sz8A8q?ok^gz5*-?9%6zB%ND*ooNCZVd+ zb~zgP(fBJpy7BfiD@vmn@VfAgm(t4;cw4=13v_XdGD}TWv<2Hb?=eOLh z*c*(;iScq?X`+wMRQ?1Otyx@LD@LKh2wQWg2L|<;0e09QR+=juxVTK32YcDQwZ1O! z^F;UIRU3Y;A3pg|y7GFOU1v*21c0$FrjnZtXAp^XVTMgp;OD||aC4Y=Njl!ylV8Jx zhk&OwzicP_`LT=W{pmgx8)J@*iYU?Aj|bmJdeJYc=(zRLe#rXl`c(T8ui|kX96A%w z6HO_RMxfAB;Y`Tk?(M>&0!XaGMKh)OHWyp4>uYO!ZR%p7ClYwfhpy4omz(w@e1usg z&ADi(JDWlgutQyvUNbb9p?*s$vTZhJd^EQVNz-aCfdw~2#$qWmgKYG>J#xwyFlK`(9Qj9s_o|{;hBHJ&o9RxoR?3T8o?aVC3 zYu|`?1W15HgHT9{loLXVcNfLrh7FJ(o;S7133`bBM~i>W{EE;4#>b`li~?8QNx zn#Q{AGM9OfWhG$Ia9vsTL7EJz2Xz_Bk+aL8THV6!63go{tTB>t~)=STiEXDjx>X6GgEaG$O%U+Stgzue(}G-?3f%)6h=r|M4}{oan?zaP+2uxvU1!hk=| zTlNuI7W;YM<2nEFWc|66ve9K%#p6na=;QB)O*D^#OPB_xtjC_#%Y&Q2*;cE&L;>q=H!k;agwx}#4n{j;8kb4$9X@Ttt28Hqes zmHosDXhF8Cwy*Dz{JSWDc^oxe!!_>rBQo>Qc1ng7T5tWDs}`_n!lV&YkI`b)7u#6g zoNCF-X>St0y`}pOiB;e4vp<;78)N-2V(eN`ygys@+q=oHw;PV7jofQ@`{@B~1&_b9 zl#!{gTkojGq{?p5#!a1~0EAc>xgx9FWyupjl`7*FgR~z>d4L3q| zWy{aAoZj>bTwo8LYX(hjQA(R={qg7Otj9tvCnNfz2=>JGR% zA?N)8sUeFV_X00+?vQPg!9FpL!Rqlg(&0mQ z&T_sKwolQay>l_PHsOVzjU7q`%|eO^0)`%!kns5fb-?ck{@d*LXTF)pc>Q7Tb~Av) zp<2@?`!p+n_-J+k|JsigX--wPOfU&rf`x`(mm-Qr(AtOV-xkx~{0 zXe&Q8C6sC6)||nNcL5%^@IWB=Der3?zYr7(CH5YTUl*QuH2_w#Tcp+LF!gZmleqr& zdIYyW7l)L3wB=Ha(U%F)yq}bzG07S!D=iIMhNT&3KM%7U0M@(}Hh*Wm9W0cAenqQ4 znuJChB(9uORHH~az4N}RF${cKJFjg!k5g8iSv9u=hdfU5bRY(idAXF4=0as}Kzs6h zz)((?_21IIzYut_HC983i0$;W^=|sj0(I0`=>s)aAuF2`_5xvk*^2FzeLJoK!~FM& zTb8e7FPUUE*?7h-)7MLGy$hmVmALvd*M4p{;w)y8*6UlHuv%r@SA=rABL7HTqZY9a3uuOuXYP$m~byIoFN>qiuvk|BF>^8$r|oHadh-l@LINNMzVNl{c|Z5%7; zM}xBZuKAy$lt z$VF?a?E0aoLu52encsaeF_E}bSA?Q`oxAgXdW#ZaYc)HbIRx|47(cQ@vDRgU3K1Xq zvk@|k%kB%lCM0mX9d3V=Fn)sTEh!JIX3uu3V0x{gYNo$(J)QAv7eS?8Hj$v?zDT>3 zDckkaO4U;zRs1~ziN|B5>xr3;?WwBXA$&qzsqDm-CI z)U8(^J4qhBz!{dk0aXQOF6$5J3fS;*E1gZ&Ocj|HGz*!5KE0F-Xcx2_O+NC3ywu{wiTQbIWZAB+?y+{rju-8Kk;|fBHHpB8OiuU5f1a zH=k7P8&)3+OftYrvq`MpDW|EEvKmV@nLD297mI@yOT^XKo5hKfRT$}w6o+JMnwuoK2 zP!C)j-v=o{YjvgnyKS#N*gFwQ3;F!zl{v32yO z#{MijAbf}rq8xgn?ulu-TxSj`wR9V%-HHr<14c1ousZYoJ z^UfzuBM&Cl@F2f@K->;xL<0$TdPX7>Hqb2e5qUSv_{ zp~hI==6C>NiT$jw5FAIPY*CU8ArkA`nGR6~T>20qt1wTTG7*{!tJIry51n*Z$hUn5 zoO!ann#UZ0`}Zoi^VDOA`p9N;CDs;l<^;jxUNyJ1+rnOf&)r4%=6z2rLj6bP+RCXg zJ3`ioxtt{*teJ&8Ucr+8e3-8C3K~^HmcIS@Y96Z$q>8fK54{1KOLJ;46JUmI+mZc- z-^{9y%L|Yccr*nPRq*Ct<0LxZA~WYfe~cKTCH|>!xf|RIt=T3V6chlzXVMdL2;eSR zMsq;7sa5p{fO5Xk&ET@F3!Q`?pwVJ2{oV}&%cP%W*Xn!{d^`_7Dm`Le7$0(VUnR;z zb-bDCjf44vFK$eJtqV`GdO{E<&Uh3{ildF!>UW7{5c zVup2Dk#Y$d?W`lO!t$EUocGXhhsg_YEV#zxvZee9wL?;;ah9D4S)x*zf-rA}!#LBRT z-i0{wJVlyC^wUaFdCRQv|AWs+y&lP56$^)|-6Khc+ID$DBZaKJmgIun^|$1LpO1O# z;fqPdAjpLPqQuT%ZoQ0d`Q3#qeGcUpOq-sG?wgH_gr`c`^+dO~)lC?X_Zg*_N5SMf zPoI2NkJDa~@yd!l0YVu}pkYe5 z!szN}eP83IJ^np>e6p@mqI-sxph7D^vheQg4U~k0vn~rPSSi)rh1>p7v zgd848jG^)E@92Jso3++vd5>pr{!ASO53uC`zFSA9T}x5XQtKnJTC+6&Rbf7;R63Fm zBt9=fi}w&)Aoc!A^!aeyRhgZ)>D$pv(WS@pxJNvAzN{I~qnLl=A5IHU9GVb#zn{h~ z7Zt2nw|r}Rc;@3$od4y+rUgI_O0fw8k)64$#-_QvjZI(N&9~8MRVWR(p^63_lw`Bb z#lRZ7`8;RC4@X0FSy}lE0XFrDop(?5r$Ye&$vZ4c@y}aJLac7Cekk&kRM@G9M0{!S zRsUnY{_3m>#SjiUgr^a>*9XCk+b@t*!Vze$O0{j z9IJ`@$AE}cYlDnH?%(@QodBb?t+Gqv-Y{AUySWW+v}}nmmm!p`s=k*WDRgWm;5Jx= z#HqD9*FK(}J(nqTsU`PTls%NL-!tY1-iNK>_G8=K50-^N5FaT*a9*M5_kABRD5>L(+vXXN3;CmfF6J>qH?;UwKyT`n@yoJX zy36Y%%5V)!xLV7pDaGyL8t?tSr2_>u-9HJm-H+dsgCpNPRTZnZZ~Pxf@__vJQ2GPp z{uJKkQZi&kNz_OuHle`&w1n<%#lN%4M6NcJP(Hp6f@xnU33Mp9XKDzJn59XLj90MqGU*V*LZ@Tf;-IeJ~odEL!Y2CyA`Dx@R<&ausKLMVBx6 zI-0CAKqO|T*t|Vq@2%2_2m1*DpK*pXv6bI1^8y}9rv*IT0M|JDrFIE8#?JBTF^%0_ ztzDH(IgrUUz9S30`qXK>&RX!irog%AP+mXrJp5+&5uHO+b)9b#7cpz@y}c+EOk0bm zi`ED-(pHjLW zk!5&oQJ4*xXvDo+L{-vEH;*4SUHn;IDZ=ey;-r>ys-G`a7CBxCnw^r|)FMOLEWll zEuObX_N!b{240NJuinV&JxNG!d7dB%?Z>fU&x8R%NBwVEW5;nbTYL$Wbt+Mc#cNhI z)72MsQOv&47-Mvx1Z#(qy!RAfctJNvC9qJE13XHW(IU*b1YKwl@d_FNv&y&h=OixM zJcgOWRquJ+CLey`!$9|BzmM2aR&L0<7A-EQ5Bemj^eYz#vf;~`HL`EJTbWkaMaV)Q z@FiL5DObj}?mI4EEJCdWLXi^e|-XfnpD!??lFVm{VY z0)ciMg7hHYI3X!)jB#> zH+V#rrFQoXlt>5qhu0`jBBa+CneA_~yA*0B$!EM5YO^UW(@1`pk?oOk^UC{Pk#duA zy2jbG?aHAI;8J;bO+Z768okX$GQAT7>c4xa|VQEui9p@)Vkp zV92tuvC(lS1_h)Q-(P=tyTcM(3)UUgr1O+P7Eloq$OtzUy? zImi!0cE;s##Qn^L3h*ut@MNfkK~EM1P+5cL-zpf7gUHwh%?GL9`fy-%I(6`Gtr&KQ zC@aS!MKy8p=mtJ7DOX!iKIHe3>b^Gmcp`4W`u(S3A?N?!QucbS;KpJ8kaZ!0#V z1uR-nW@S7$)^wM<28sZ7q)Cn?GB*EGSXt4oCn`68JT<=B`F$r($|MJG$%iInGxgus z992hqVJW9w4VIQ(1VY}iX`n_@hp9sTux$hKXITw7h&zjO%Tl zz-Wx{7TVvFO!v=kf)XNvB$dBfj`9c%_^xXXGg(r^%r-_(V%1$mq$u=zSTbmA9Rr7MzzozciNE40uHSCn(35w|zN zTj0wWJfbD4#Ok)dNM79@U6!PWUaH-AZSwDbpMm_A|2FY?S@6``VG&Q42mUDt z?XW_TJXQa0ad{gs#%Z_pFD-Ap1?OfHG0U1c7fD-cm$(TZKUC|(l8mXzxZ!_W=49fd zq~Fz*8R7lu6Gp(%bRvjri-Pq7OL&okck5zOjKrSntJ!|=mDXHaKRfiKTW`4e516?& zw+B?n&HB@eB5JGPnmbskR&#Z$M8)xBg{)YhE;j9xN!5p#XXJAkdpK=oHbgi;{w(N)m6~va5d|e)BIE;i zcLIarB*M}H?bbj{yUzww3HOwExd}&bDVBo(YWsh6nMIvwz!xv03yMF#SFcE)U)DvT`5qB>UJ5~+{WH} z*==0V5g@bPiFn19YMz;W=?#Ti@L^Eu9ykt-Eu}kJqIbiMV_c`!Sh}Ouqtxux1;KLW zfEc=7GS9uRobJ|#3;jixefoJzc>YUJT>!DOD&*oqskK3R?dP^kmHVo?SIy#+v$|%mR_%V@6(ruHynPIK^x;~bRw5^7)k&Q^tobE_sB@ngd zV>N+bixKD16egf&Nim?kcX2qAN4(>yvVCxfOUSS@q+Q+-?(K~s_%hbv#rjn#+R3Rq zm4y43iOmq>6dsVW37n7lsfq*aZ|0E{Dcj)ZUL;&D;CS{J6 zI!&2>@!uxOcx%d}=C=fP-+VTt_g?rb!W zDv(`FoMqHD3Kfro|1?k812Wa8ce{pMSncNz?i4ZL%F}K)&Fl7crJZ|emsWc1fFIEL@R5$c5ba@wBi-ZK z37{AFactZ_hvNrwZcXJ%j19%|n=q5Q8;>UM4pE6w_)_;U^$=77UZ7Z=({O!{OoZK~ z(ue(mhb@7Z3xVdAq%8E64J|x5af^B2M?8QLt8+J`vO@jz`>f?6d>aP+-N_99y$>Bb z#2bw8iyCRfINhl)#XN%%0qXsS6l-IfbD7B~0zT(!dDf4si>1U>cN! zbzH8)5APtzrO>umlO>x6;f>-g%Ef#Q(BL5EW;*hL8x#x&CTGVK_86=oi2 zJbBx4Du=bwUvxQwOr~1MpJ=Zi?<@xjCUZbjzi96(Vz;rYvn;0LIsV-Ie-8lh7zK*a zkW4xzJWIxyQh2)EfgrlZ%tliCR8>_dp+)xh(nb-I*2A1EA2$fLgA!}zSa zGcW|at7Z54woccBp&zLl(S$G(9gRsX9rVks;OV-sVxT(T44YaiFdYUW zQcX&WW9!c+>)e!V!75)(5ezwDNS6qhERPF8-pSY5w2aQuGtiU*v@-b078 z6^U#_!(kd5daI(->@b^ljQ7dux;F$bl?_}NL%q@qLym=ZCLR~$INh`46DK%&n#SnH zMor@DFsz|a7-kwN-DqFbW%O{q8kxz&+!PIxjSxwpm4eX z>f2PkL`#j--9_M&?l50r&o1$(XycV`?vHur6L}oNTFju$A||Za>)MdHFz$5j@}a4r ziLbJC$kxuPahbjQraO)M8i%S73(`q@+rovx! zAaAD1HC2ij$Ejl7pvNLbBEJH!N1|Iw#K!$LtJ=@{)KvomLBR}LC?&_jc7D&6nuI0|$o+K!lzla4$*fG~%Iu2YRg>kn}CJPsa6eo<4oj8(=@!hWA)+ zb3clJj^cl6f+j~7rLi|1$RviDg^IekU1_up-w-Wr`gyLO#A%(ai=~ya0D4H>7cEK! zDhfDKW8R+z9P?l==G362v2rp29f3zh!;QT5M~eMUkp{6(3o4?L+L<+mJZEhWW%LmS zxB*|8b@J*{-RcNmhjxT!yAAfzh=^fJDi1F_T5rekGDO#!Df7@z>q`-jeD^jm-EPug zuF(8d71uI66@?b+elVS19v#R>p~Q?^z#S8fNm*9=61AcToqxHxdA#`Xl&be@njMi^bWRT)ZXFE#oA^%d-J`JLd^)kgQGDs2cz6iYG2*ep zuPvsLaT*!Xh`0}!#sG@lj)GKt7#P(WTawZ9@bOQ&77csAAEJF*5+p4?g<}E?miYwo zF|L?VI;Y(6z+P!`PK;Y1_eTv9TyDq1Bc?43l@6r8_Lsk(VngVh?rrL**eZkfZgEw1 zVvVV?Av0EkLdkQ5ZmE|CsifWaltU;=+Iu(ilOtp{&a-SByXw7CSr!_x4VrmZOIiiv zt+{M^S@Yts89|8k5XZ_1-qjz5dd<>QSB#|YE|RDq=Tv8}o~ z6KAf1q67kWgEFZ|7?2=P8{oz^xM7D6jnTJf36L>We(=-OtTqaxC*IuwcofZ)yRasg z&y4*9zZgy)0N(rbhZtF#taP+Ml#Ob7JC`zF-1}kDV<9d{0p@Hx=pR;ez73jfu8mma zjU@cf0auCMhzJUG))JBz`)s5~9fY&g&@^>HL)cXjK~4*0^2UKefx_5f^vWexJsTMk z!H)zd{<6M={)C|4P{C_|$RS9=1)6I?1YXUcg5>k>00Fz;Z=7Bx(|KH5P9upd;i-l? zQ*Z+YOAX&A$pc_7I(!{4k45SRcL-*}43@G%kFwlFIOpPU6Ehr{u z1qHN{WWRq$_GEgwQ$B~4dXR~S6r1$?CAne*M6}u=8jm5f!r4gr!CKEyT*k7vN5goO znoE#!nS1Cnj-P68bp6L@0!BRYfqBf<4V3US>A-32#L5Tw`k4uVc8*H z!4gILUBBX@rkVQ|;7m3G?~RS~&5OQVHENloR|3b)QVN}>O?)99m5F0AHIqo4KWV9| z`W$b`n4n*q%Shi|$TcgXlBO+}vdXqRWVqahgwIW**5+#2gmRWfbEron?FP13|7Z8_ zKo6vPP5L%ZCW8s!+Z^ad-XC$ot3jDuZ%W$oUS2>1D3VNw-Dp?qRVXAw@go z4xvy6^JmWMzRMImTG|2Uk(Xm*0r35bTKMzE6?lI5;jH~Ee0T{-()TOjHu}Kjw9DpI zw~NQcH#b?oY+0%TtbVpDpN`}5(}0=n79_6%tcNp!=WT(V#{G2Lr+tQy-XkClKwjQ< ze?&c?sPY}=5yn`Ms1pu{svqIkZ-K{dfrbmT7P%^Cs76Ew6mHL-lpFMLaTy+wSt3Eo6zkKYW$eiKDt;R7VB2jlO|43Yk5T zqMhcOwufBd)&`lQUcH;sG&;of6DEJ-@l*$hHG=TKV6ijCo6nzYE{wOjxU2Ycx3BxZRTg6p=ywDWRP z{1V66+mN>O254fg&SE#&{YQcDB%3Hf&}3{UyWof&bSW0!DJWukA5?c}&FZQf%_~5! zb#E^b>0qud;l0<6!X{2{IdtTMj5-Gxd6qPd0OXpTtFpBlBMaS8^{8}I@RT9gqKefHt}2Kp13 zLXa5+87@rJD%vIJ<&FFd_azL6nut0fSE1iRNYB8DY&LHf&)}lqJn^A;Pud39S2A3} zqr-UO0$jgn5`}OvBQpxvJ%DXzl?g2r{ZQ6O%b~0Qp%dR_)^W|LKdxKgM?N5+)xYcw z1FXJg8lOEi7iosm9=@2X@I;gk7A(zcDj^LTf-PJY^rtJD4~69_#`U@|FWp>&cm6-& zODe&j<{4ypjH~?opP=c~{EZWrwkcdV!c6qMwaa3IC&>p=>Q+y}y_NvND+W70J#3J( zkh`SKy7Nvs$2z~pe~;%5bZ1Xsa0)lXdlGNe#c=R8DCUQ;QgE$)sk*2*~5^Yr?w-49p4dQbN9qix;Kzg{5SgADl86CNODb zvqMwox;0-H(N!pvG9CX&|7T<9p@P02JH`&Al(v7XO%Sc5$H~v3mWL)2m1UZiysDOA zkEH>wR{Fl1^?EhSiAg|_?Ld0e+G*=Yt!9(*`-K{RtO6z;```qzzWgDY(auGcZ?k15 zmufA_8Eg3P`d$LtRbAkv$vcfc3JHkQ%nCRJ4?-@x2NF`)l^)wEn$cWF+flGI7QQet6h7qIM zYWZ~^&DLMQ*43S`vlr!C*4etP%hj>t#cCoaF2_^NdFqn~jT%?u3f zghn|0;ho**lH#@k1u{grEMY@uw++|*L}8)3KeC5R;74rV^xz5yCtcqvD?rw^aB>eY zH0XkwS><(%Z1v#+@=@}7N`ux1&+Ky+|4 zWmPxhauJBCZ~qKSU6VK;P#T0}ZlyIuTEvmb+<-sG<>j zv1a_-3R)J|ICFgX!G-X)cxvPUlYaImpBKzx>s%Q*p5nllJYZyAJ^u)ZR0S)^$Xc1Y zpFV$SMxjKXhGxW_v=ocLZCr_e_@uJa)(ShOjRV2#`b1wGpx!Mli##`Zq{2TTMe$o| z!nxNbvxdT$hT=zrHs9*ksU^Z95XgboE zUoHVZzfIkFk*j%}mHHZsDH$3a-al1i8a^M%a}}`Hf%MR$A`@r(bl|*K+&{ifehtM< ze;Ar$z$cqIqkGx@-(^?O3PI3Qkht+#>M7iw3OD}}Bz*lLEAs-cB!ZE8h@F964u1)7 zi`BORiH^BDU4Urh(O!LjR8MVO$p(^BLRuOlu$4$(iD`?h^CmslPr0`1a`1{Pxboes z*d_;?dn%k{?RD>AV~!}q2xmssp+Kj(Cd5!lMFVhnlfA2%3<=-R^nQlN8iwH?U%5yp zP>z{&oNSyF3D6aeDz+M-K$Kis)`Y&1+YP=Imv0dI5SOS?otji0MkIBkD%pXayH&(4IiWYBKqu1v+!rTwD1 zp^xJN6n``r6t`YyJiw_6>sK*%J_GsZ(_}%XHdBc?C>cnKJRE2C!H(rETu6M7=gFec zQhBN?c&;o8z@#}T4cpzH((K-`evI}^JpRRz!sB-k75nzF=@eFmgng_KI#x~rDA$Y+ zBbaLrKrJz7jJ%$eV}XG~vBP78nC?XooPAMw-5z(K6Fo_Oa^=qn8mc)cFPWYA_d-i0 zOsZ9?*G${VQDK}dskl6AA`%^Ui7aJ-sH5(-orhgGWV2ogu9Cj^QnsR0Rwp`Zs)Ma9 zBI{~Y7ZSt2iUkUdj-LkNqKdY%*%c_1(N`>O8qIU^OKd`{Q|iU~AA6vM7gb}Kz;Fsj z1?~*>$@FjiWb&m%9P|Zs^}_u0vkHAsX}Q}E3c~zS>KDGG<756V`?sdqkc~r&k=z^Lea&W>!R&Lwsni`2h9@N9aRo0eX4T59{PWT7J z-L;6A;rq~VYu4seFWQ;91nBxJ$St0?#Zu8Wmj17Dw6$lbj1nXGs2q}BgCcdJ%zt*a z!e9oP@h*tWjqbFM+sYI62iJ0H{~C~;DQgT@+`Kjv~f z`O@jn8;NeCoz}@WwUP8n9?3h{0b|5K;C>5z(18X`I2uCMPD(^}|2;!Y*SQ~khhc|f zJoNdsXgXb_+i+Vy9S*1h@7VZgoPXo(27e$omQ6H!R;=%U0sk`OO$6!F{d_wUP`+n7 zG_*t~h0wmVP%TqcRi#Pbc(SxRhKHc;z3tUB#cpN9|1g~(S>m>$fEK8^ZVa1L=Jvh&v(#p|eHhS;GopyS5l4T#%JMMfy42CTG z0{ao7!(TGvv|GAeXVFk3zp44f9vRAUK=-o=T|HgwaX-vwb^DuH3_sXmckwzxD8YVX zF>>>*4woalzc;^hyzy#D@$(BX+=YN3*UJ}aQVi|37$*~1Ig(S8{6MQ@EQ`TKZnL%( z0qX)P^K__%UQwZ5Qx+OE$FKV)hwro1EUn{>$TWD9bEVtZFLT_hRVTZmGwZ#z>G~)8 z5g6Z7@^E_xzxj)OB$u7fT}yFP;PDPhdAvDi>~!hawzMSPPt=g!Kerm_j{Nhi`os?% z+PBlW3J%?Wyf~E@G0T0aoqLGq7fMY-OT@wI_|Uaai*bKDS+JovJXKdd(UpC68Hzw1Me3COW*yymle%~T)? zX2#WtxnYCfTMVf`MSB+CloeN)1>O4%r>JZ*0g5w7&*;swYrw5A0Vmccf@OsL(DTDni$pWcBjySx<1EIW5`l_?%yo`j=zG8%1fi zcAuvX6Co7^e`@q9LhmvU zbT3w~t~pQr4rZS<2d~Jw?*;i>CRnxE86n|FYc};-UH0s^`&RwuLLN!Q5f`;FH9;Kz zDj7JC3c%EUra$%aLN1t+}(flglN|12 zqtpHaXoN{@HL6u){PM0oNEshXx*QIr9wNk`$0cdsEp%e#C~sruBndo z=as%6U!Lis7jCue6!U~)>O@(O{0Ed`4YDFxHKt{4s*7so#Itm$`i7uD_aE`8bFEor zT&n2b%H{m*9ZolE!9j2G3pSc(YipZNk|*Vu2y>UDIVb{$BYb$({VKn8*mK@e+h6i7 z;QQ$ICZWnahYLOR0*Y>_{>Q2h2T&J&G>C_8RrWdi?RKty2RKE@ZYj(L9a>F}o9Db1 zBpEoE_z33=v9j1VRJ#YOj@@S)i~{ZKbNEXO5_ogS@}#pT^-Z7MbbG5lWGM-2{e|d2 z@Q^gH7oB$oQi|S-#+#Qd#52Xx)XivPT|-Nre>Jx{od24S?NOfVZoc?mPA3f10duD0 zybJZC7Z1zi8a=FN)2qSK2JgDuiRh+)O#XcFJzzV2EhPQ=_b<~R1%~6Wu`xxuoE$20 z_d+K_$~Vfo9!F~u3D+XQ*vrxdqRsvq!^2{-4?*}~j!7F!_{d^8S-H%z#)b;DGB*lF zQ~~MVCnv&r1}qP|TkuvN<;8q@w8l+RR(h6Q%_V%&O*V#$6R%nzjeJiu$_rDLD+adx{Ni8YM%)Qqs zma#GB%Xdt;K0;@Px4FYRHl^d?PQ56NNim<6G&1S-mftir^nZ4jf_aCH&DXx<6ic|lm8P}H_mU+SPsc}kt!!$t&eaK_ z7De!B9L&G4anQh}w`P-S?vD={*0cWUjh~&CBWF_4;rge-#-WXxRfm#~Kb{tK!+8~~+ zv3iH{Vk_{O3H<9vpV$OzN(YI+T(S4{m)c`n0b!T9PrS^IC1#d)@lENE-|G3{n>RXs zr<91}s_(^XXhztc z$am7^$OIwj$kC57Gu=KNZZqDYc-TpWYn~mloag09jNx?V-3h6SvbJ--$mbFq7;}== zbi8RJdF#5nh^;!Q=xftUo0{H*2{(|w0Y{>9XzdXfz5|y4R$>=wwYzjtVZyYLL1->m zK1ME;956h{wSy$uRF_sJjVmB%3w9$b_rLSNub43%@^!!nx%X!Eu$cM1{5Os?M)AGx z$R~SC(*-tuY77@$S4|AsPkH3;l}$yFJkA#MS?7=03-rVGbL3*b5LA@gEcLPKTz8;@ zcOhHzN4}d-B6wb`(E22gt=9WAvzTDH)MYGK_75qiADFg8&xv=pg1_nY9kh)gn-ej| z?aql?gCDMCc$_=566G&avf4dL*3U^bnbj&lDS)w}iwA!P$a8MD2lR=8gX)3`=jL!) zOoctqkz{~^Thpa z2(c{`p|+Abnb%4;2PBlt#buw*xYdK3Md^M~Hqb3Ye*JZV;R@6z$)xg>Y z@2G4`@r~{DQx?h%W5sdH3yjrl z14Iil?4U1mmd#z0fFIQ++80s|s-RHZIeaT&duWN(vcFHZUzIqYBzoY+XqFq}oPc$~ ztIK{2fEIF{?n7m79?)?Ho3Ve`U*RYRoYrnxwHW0AL%I^quiw;Kd6Za_#G_|ZNev>< z(GP!G?RCLkxj@SdeWD>Z?Y!_!(Q7ZG8!P~X2Y9qfeJ-i!sl|%fZhLiEg@tBPTX}Vv ztmf%s*=(Bd^B!o4rE^eZwRLrUpM%yLO~Wg+YUN!MDx7x7peev=UzB_k#4!0?8i{;a znb&gV8B8Me)H@$wZX5WT99P-oa;I^gZ31^i{=5YYNH%8X$vv6ftVSLvELtAsv~*S=(Wl}_-J#Qw zbI-$G_n+Si1354vz&sO>9^|yPW(5N-hKV^B5p{r_$WYYYsChfO)oX|r@aabs$CGiZ znLpy%vk_Rs{#uY?RJc-mjv%X*ip@^I4G};sleIIh)@x;ukdT_ozbP5D2VeHfv}(90 zxJoA+ye+RfQPhs`vxzA~u>^vgz9sXYE>vdhf0B1;Wz=Qs5a{dCu`Jg)VlupqM{lxK z^8-r`kI8b0IH2Gr&=;^*TfDUVVzrsWv91nr5H$%xFNTll`0RA`QFBsF{Q$^cG0#LF z)S3rGI;T={LJ9M2j<*-92Q}YrJwx|dDLs!m@5WW5En5BH^X&dkfCi9)Z~_ye@av?n z^txI*#1TGKm(xrB9+7Mk7aab$EOXhKX3eTosm)hPNiRF4R3IudFJOcHcpj#rUDqWq z+hDM?Dv2)8Mlp2yqy{$A!#|o~Qe2@3HK>+uay-F<{6SI!>@NWE4CVMvc*hS&BaAdO zP9Ak2@Hj4jl3eLjU?w=tqXA#4JxKcz`<15uZnKaAwWMC(nAPC8FEZ%|3D&}jbqyC& zB2@C347(=$HU2sE$^yAOG_`yJ?#G3ri(X1s7AE@X@zaXvYNV0+bUehJB#u03I$O*~ziQNM zK8pK)V!Z%Tr)E;6s)dSB>gv&Q#A?}ioxv3Pw8+c%nbPXES`{XiG1AV!?A|RV6(G#{ zI4nx`?CC0!_EtyrU&gmx(?`$C_FIwa4eZ+6R{$M1pNy;Ceu=%^9iZFHrJGLS+&Hs{ zBgyMOS*k5?)r9{pK=tK$aI2R|zpdpi!YIY@(A>-ahaau_<{%!O*MV`3jqBh>r_bJ2 zZ?HE?$Vc>_Oe03i0LfSCs(1zZf)pX(`@5#=!-exbO|UiWMSIrGx@SaJqJ^bpyXpKY zYQ?0Hu1XB%Njnb)n8_A)(8JR&*4z(fOA;?hN_+Pg5+}B`j7%hoPS<7ROF-Lk->>iQ z$1qR9%c@y%IMVk2eMkXh$^P0^vgadf5ryE|$bKzbqqA&h^B&VmB~HYCXQxm4{@x%z zO2&mFAqUN5##5a3wj^7j!tq8W`8wpc8DAEkr*fZ)VcAM!>V!V;=161dh}iy>=uD9< zS98V1!;g>D7q6bLyIX-!ya;!>ry6pkF1Gn5h1oQGS674dff?k_u)ESRA1&^VPL6R; z<iK zdir05F&zp5ZfqMd-S9(lYI2zu5|2*gKCdHXs~?7WNExHl&4-jcKXl4+KfR${BbfmO z9&g1f$9L)@Upukto|TF+d8I}|S&oa4^9;_|wkZtl?ZR*55~kDr>kSvZ)b%CL4bWK? zl^Y=YK@?-E9|YX_kR`>`V?ALb`u8J@)Avn*!RZX(?*OyPZ_S?0=1Fm3x!c8`d%=yw zip-^$$^8Q}6P5pG06yl*+=Y8wiEfi!Jg~ZKx&KI||G0k@J@H44>|BOki} z;_>VQWZliLLE`S@GRfFZBgjjao&bnm2Ak2p4~||HtfZtseU^6O*zAjo6Y#n5NYq4x z8zYxOq0a-0Uj5Wlg1m~>o5wDp*Q`30(|%@Vv!4&*1p1xAMwxaAgQklugQj-N8z*L~ z4G+BSL~KK84TIenmP_^FE`6 zy|iZ3rLrCgrwg2wdVrwQPK!C*&5hNgyTmlH5sFgo{aHy!&A&<7f9q{~vfzw{y^-hl zvg(5$=sC2pJPCJ-QdjCG2$IP#V5#M*$EFOOYoY{PTP1I4Bio$)Lm5`Jt47Lf2r+RK zE5%*&KDjBau4L;}=gC$GvUGjkwaOkhwCwNBc7Eo2#?_|Nkh-S5SnexoK2F;Ij|akRBy0@x-DVf()QLl@aP|DBA<3_q_#k+0&8dx*+Rl@MUUmh>`g0PeARME{E-WHkpl}QX~ z&4mCX6U6k6!b*Z!8nmmctM&e#^|N%c&`2W2!fRE$&U~9ukuotGr-q!^Q^3?Lm$snRpaabA9>+GdQw6P_)rXe!&n)rFdj~r zf8QIQRw;&wsIR$qFf7M$dHY>OyQ@eqYSPNUt1<2~#Y$mAiu1R`y)@b*R_PPCQX6Bq zemY34ToVD=7g?3$-=E~&)4`{;gJ$z(>Wb!(+tpP@FRvDZ%rD!_1bK@|w45aB*0A;n zm~%(K!@{;RC5LyhocQuyj7lMWm%){sc65Q`Z|cEURCBHYsEzEt3izL`aDX4r?p+iN zw}*1LO?GLdwm4MX@$Bkpn3xT_b}w~+{5BO=-Sc^Vl0m&LMT2*+$aod@ghwlxm{ z;c$eD#*`ijE8&$}%o%Pn$seu143|Ki*;u0SQQEe_s5UCMlUq?AZtRw@Ae( zxHK6x!cmel1A{5}_;jzF++vET!qhYkd`X!yT-2PUu^K}Ej2)kRSsX$nrR(-*oU?q*WAA;nib+{vb(YE1d@jBf7rhXR+6 zMO*S#CaKA|go!zIBTlTiY7`ii(M~_eYd$Wc>7;~`PU*pIr3WJ)x4EA{u2hNM?(ObM zJ1QXd@tp#Djaf6bWygscV{y4-Ql&gWtgaW6K$}=B`*ng` zD(b(>KF~-bK*GyvS$ISwifE@x=?{+?1@ot-%G&Hs9oZ}w+%sZ3O!KD>mKUnYd~<@_ zW>v2=X?KrK4eUfW-!H+$t%SB{_Q(@z*3|2!9XKdAPhCKiIF!;IRe#2!eooHifMm<; zG(BO*ganMT5&`cU8E0qb9e}PQikHVtQEW=zZ1eRjjE@)_Jzx`dF|1TwPI?5}xfO5juG}mMw=6l0z7VyUmvrKjd4s@#nt&2yKHyuOFs;cpf)p zSam9fKRsw5baix&hlXFb7&?7CrM^!9FjT!rEGz4n@XZqOKMy$^Tz{zue7`vjfvEPL zg2;M{gMVm8Q=PcSMY+DA&M3A5UpI@(U(XV=qkhR^Nqw~72+@*p`@Vk8)>(PnqIA!K45DGZ>M1QN4vTz3!7lJS2bdRds8%P1==3qxWA zHP+N9y*zgRSw*V=bfQVaiPR@=b{r;97UWP(6!|{4)K^&jea;VDSzD%m6*w`78_MJU zz=xn_ZS_xx8-7ynm|v8Dr8FAAgGWlcZdc6D7>|Z6c_>rBHpXr7iDW!WXs2!EnMK6| z$n~r9IJ4oYaqJ%TgijkD_5Q&1;E^ex#i>vAA?>)rw6wl+jbm2CBIED1b&E-AYkj<^ z&Pp}yluw0HGkGXFqyu^+^P|jV|1Kvh2bcCrv2{#4OUw6@d9J;dgyiZfy7vBcvY*Q@_p4 zd7-uhvvX)xq~&$hn6q}HqfHPI0b#A3@_76!9GtwJ?cLex!A9%JD%B(C?J*!2-g|X; zDLf5;fPxP4i1;e?WA=Z~B_1|#F7dGqyNj+=qLS%mzr4Ta#cL=Y>-5Z4Wv|j{RWZbg zJt>)EJRflW0ef*Gr*dA&pCEQgA!V3Sb7+kqvH#;+XdSRW)pdBLZo4GPllM;4av~e} zU*l4C-=?uRCo~yXB-92MSx#mrlrpcTrDdfTe*6g0MEw6-jlb?FS?H?d%{V{ms!?Li zl#vax@ttBbK~;&^{W8h!$HlVctU^8ve2Ec z5-dAp34VFv0sOivfS?D1m}A5}Tn<7<|gi z!YH}_QeOa%Jhv4jy#9M4j8(hhcocz>>6^Mf6;)%xhCYT_%YHLKLH}NjpiDy1J#C`c zP&Yh`x~x)mhZ?yqs`|)xK(?zd6iWvNi`ko9EcEog-9C=>e=_X{6#^macO`*Pu#$Qj zg>Usbz16>vA;XQ;)v>y_w-Q(@8&{%&WwK>Y)t=u%*^sg*Q$D~zxq+(*1-#vW_gxee zO07}1tRQS8TF1KdP87%F2CxI}nn(Ff$ciCBH46a8^}17XW+5tZDvT(#3JYu0ehWUo z!RCLGw@86M(O4kad{6Ow$NLK@aCz-oGQLNTrvkICVc^Q!o$3vCd0FEDHpujDPdAEq zTx|-&yL^$yaA`WdEl=ij4HF)?)h#k(7zUcKKIyn5{Qg9D#$GZvUFgeN)=*Y9v-iOL z@$`$Tzo_1;=2`NqsH}z6gd&6evV$R^KCjaj$?!NK9h8g9lYQSlFbMcJV)@q(g_s^| zO2kFms?keUb^Wj*v?d$M^q1UZGeD;BQ5)dEDP*XS6;sx-BT1W~{=OM_nYZ7{@1f&L zq4AqKRCGf+x+*||)@H!)`B)RJ`Hj>U?RpEI?GoVNprv|pVZTxKRNUmN)fRBx4l$(R zX9ew%YBVvoC|YaVZt2=|SZR=XRpH&CAkr>(8ZfB&BpT=&NLq8*~BCgy7VDNEaS{1QC1Js)~*YU<`))WmMNL zUPc=4|NAM22{Vv^h!?6SxxLL+Q%4sI$HLv==QbEZRIzrJGGp{(V;1Q6cqq(prkaP_Bo33Lidr zLTRNJYc#3*!+G7A+ikT@vJJs4qQJ08pmR(AMCx@G{=+kw%iqm@OHv_yYzNSRwJ|_n zrrZTfirHR9INo`+KOC)HzZbOvM=0c>mYlX)l$$Gza=J-9sKzl2r-GTT$AUXfP|Tbh z$ds)&Wb4+Jhwa?udKLP+U!&M@^CQ#2evL7?Lwvrq{o1I8iHVWAWs;cnJlj98#S_^S z(1?+%?gmbm&a}IB6qbeBWhSKOiGPlwms2yoKi_B7ZZL3lA}URAp=A5qf%H~Fx2YAB z8+`E%RS3!IS$5q^DoenpNzM^KIy9z0|3wen)?s>WZo``C4$F5?gkksHMv&}3#T+E&0$7g)gOSn{3 zR4EmNR?Ey8z&zS9XS)B5sBj<|kpsQdH7zUvk14CVX#6Awu{pXXTOYq$MWoLy(AbxH zRjMZ|l(Ggy09&77#)tQ>k)B-FuaTpm4_ILmWq^xln2mp z9&acdU6<2);rE1c!%3m8VUQHt!rpn@a(O%^MLr~SoWEo{+f+Ng4pD`@;MiYQ zMZ9k68lOmnV@BB|4=6F z5P?a%3kg}tB(VzCr7jt6OB7h$@m8AL-4D_uDI`pHjcJb>PS3 zr_4&KC473v=n|rv8`BaUjg-b}9_5pYbp0|Uywt^em=f7Q>4va?L3 z>0`U>goQZ2 zIyEJraSGkSwE{M)KBhD+zn(;b*ON$4!qvz5OaEfM-IF}YP6F>A7Z4+ApuD<{B5pic zPI@}kZZ{HTnXSV}V^oIAlW(J)^0v!7QR63mz0!h9^2s7>SpmD{L(wq`ewGb^iW77(o2p-~9IGq?3m&uFbM~>gh}`|&gh%qC@Hog>^RKDL)H%L& zimSC&-*H{4N=j%-)>5|=!kMCmA0S;40-NLmAse9zNoD1E!%uVtm9*oZ!fY`6k|P6Z z`guWix99685lg@tBZ7x(+!uK_D_E6^hXq)ljqwbw_K6D=LSFHK_b0kSj}CDCWROUO zUXQ?__Sg0RD{%MRFEn@URrO|?A}LuF{Q=mQA7pRdPY47&;s#b)85kI}3@m%Uk9jkh z!Dcb$q#DgNQ055NkNLXgFn3-z^3PKdChSV8qytvfxL`~TO+RpP6)DnVERCn5WM@oA zg|LIF$Zr+*^-gkH1bzaOjAD(S$!LV25oC!Xsol{m$ zlH=<*0(d2$-fL9qPy&9gsZvDXeq<_KE{DtpnZ~OMV^EWdFbO5)fI?Wa68P7TaA|9Q%$-zUY1r+moZf>6g(S}YJ8?3E$Bl2@z*CqH^RU` z7utnphy_Ymbzst5f{|uIOGi(irB9dj(hE(o23+33+U$kqO79&2>-@4g##1>s7b<3w z(P7g_cY?xw0NI)W%w(PWi3X3~LqqeI%@0F*a7s=MuY!*-u>f1R1MFF!i_QbJ+57u@ z){8DMtMyDF-^5PXYFV;dGw|Ntf$hdxr3#=2h`_)mgM$-t6$BEUPMuk#>Ro|kSVQ+g zwvQPgHx@ZdPfy3QOhmb#>|C$sv1CE(4ai8Q*Bm)tZ_j${11?gAdW&)N3(w}bXVce1 zE=*4T^MLx7p&kZlfv3&`HV87`8(?yO0Y-rQGrdKTN03;|?g$o_ysRK2K=n4^{N^&r+X>}8ORk609}C-Eaw-L?gyv5owx}>-Z!sJ!_cDe zu`Fh_+gP37E3&lWhbBQeED1N$>i*cd=DF!7n!ODyjJJ!xdi=5GKQ(PNs~X2<(u@0Z zpY!J)+FHDwB$ppOvAg@_rdkeQfX+!+Is@q#ngQ==E*98iLC(Q02wF+S@%N_RhmvSj z3E&5}zN}PXmPC=#ldb_mVYBW2$O)HcAa}%xg8T-Vi)6lp*?n(g6wGF~#G)CV^KxAr z!ykfENw3vhQ8A`nT5Zs|f|j-W>2^F`LDBa709c|+0U|!z_#3&MgnRB0SE3~NT5InO zQU?TNwQ7R7`;m=-u$~yRYt640zOg+|XO8|SbLCy#zX)x;sF<@~*M5Ei!f^|@u|Ln7 zf85V*=4wDo8*Fd;DHaJ>Aldhn=F=Ua2~r>2TVm)#T_Cj&ra~B0iy}_6=r7H3 zE)nM%r}NrxL2rIy?xFzzrhC7#J^HLzti7<+tF6A`TR2(-+@a1f)ftI|PZ?Kl-O0r9 zp)yI>YZbyX3w)a-d`e-1W0YWD?PJSFg+`xaJ%Tc@D^Qig#d?F@BJQf@JS6e`QF8Wf z0gna|a{qZvrC9pKzs0;HILR!}&lW&lCUYArblOq3G-wp!ozPaNztZ>7Vl%*8M`z_M zbH7AVtQYeV4e~n6a{~>tqXDDu7vJW64E}EauK`Yyu4ST0^0+|)R8TYl^=Yu-pNGYX zzEp3YFEb9=>skl%nuhKegX7p;Ki^6ndfV?Nn)hNn8sDOE=W$kc#&W+?u29`*zv!aR zc|Nt=Tei$`7ynB8-Vd$uVm$JdWsd|B!~WH0zmjDCrp$C0APH9oM?-$lUWRHPsrZ&k z8tD7Z!;QUbZ#FGAc1zE5%1vYd{aBc*4AK+t4gAco;Do#m4s$VidAfJNr{N@FTT(oW znNwO-pk^cta0`J!;AO1s{N&~n*kt_5T?wzl8A;tgZvNSD-`xZ*Fd!i&Rt9i@NY0e0 z@Ohizvq;+0m}YzZ8rC$#7f~VvK(rXOov!;O(^wuzly-$aa`yWPzW~!y;8%13GN`_F zjNgQH=SRgk9yx1{BsoKjk0hHZY1%c zvqr}6a+rFr9NE)&-F7>I<)JhqL}8wlJU0VQO|>J0DpZ4!rFkN{4WG8L9X11; za|3$%EwDpr%}DGm+Cg4xgTrZ$eTd9!O(R8}@kS#r+pS^GkFWh^vCy-%<>E*^_Ab*d z*(0$hjP%%r--VB29=xI!W}@dcU>NSA5M;Ht^ss*M@jx&QemOb_U82l!igRex(RT;m zfw-0_O8NL_5#TO(n{OlqCO9}Hk5H9%iJ?pZ*sOdA;4LpOX4WG7Z))_FwHqLbOT%Tx z2&Wh=Tr z38$BZ{a`FgM1LtgEhBwE3=OPU`4MNu^zJqllC$&iwf9CYE1lSl;zN3pLxN!92s5kW zgyQJ6bWPSH?7xPRZk6{yBgbG!OYdX&-p!>sgiQ(|_1pugPo9>5)i{iN#Jqv`|JP z?SEZB3?ASS#k{gQNkI8*wSf|W%}#fX-ly?;Y@1O>|HoAa{{+{h6AW1y$VR$;O0!l? zY^OkR3zJ;zNkXDu!>-6*z`f3pxH1mTw`k(mJF!CNa5~leDdydE{cNiQ`5TW|F6&nMcFEM3v&I zRdJ8V8=cCay?x1-Cz?kT4>N+xd%q-TgE;rrtuP1*gARX=d}(AxgNm2sc`x8{+hEJ$0TM35kVlRa3eZ>ungJ?b|W{WKZ!2}4N%>Y ztGPEq)gjLl6+QyPEf>CSle4|P=Zpg=IL1pBQEAaS(Ug0b)r0IiU^%_bHL}e+2BtAb zox}#0B1E6=0PnZa5t4{xwlsrlE3=Eh56|=Ixj=&GxO^nDpq}8LR|L2%{$de9sNyu@ zgg7paQg89?dxaS=a~j_Ic36tXz*lh?$ur5#CB!Z9r^YWP`t`hr7BmQe(5mBaaT%-O zpHu)95e32rPP}1E%G!#YAz*#Z_BnT+C-n+mQdavdHeQ4Y ztG+@HRZ{!a_x~x#|9M{n--Qd)?@_bOY*Uo0c91g{mztlpK*%Kgdhfivjc12^`RNVe z2R9}Tw{XEMIk&1=>pgeh`$}<;(A2anH7%iD^!^>To0c)LBohTM%{OK0hZKck>Jda~ zR9+TR^kamfw{UMG;FIv(0wnR=9%hE&e;mrO&%AsKM{SRs;N?|N9?wlUoh}Ghr4-Jc z@%WI{%S$7u70asZE*dh2?WR`XeYjX{7<@YT&}7+-5BWLr%_5qb))ES*j4hMZKC2xALfUPJNX=<&wPnJU;WHs0CkYAA3CBeDt9SsN zbWGf~RzFrQ6C}pWrvs!UFz9@Z9G|siQpD_a0a6jHozY>Yo5>t!AEys}7UEW^V9-W< zLkx4u!X3dYro`$M5GWRxw&qBBs6@_cWCcJE2M%e0p{BN^lC@YcXWp6CPZ#2SqDhX( zNh`!`>YCqsX?=!2@gFk|q;DbmDF?%t!AI>({nUHjlOg=6!fM{Vt|gudJ6^_*1fP&5 z%IG^Tm9F1mVz$_lK4OQmOiD-^Erh0z+seL93}qYsN3aUeDP*82L5fJtd2>nc%xHon zio0l;<;$l=JZ16ofOpaTp%i%!Dj2JZ{mS*T@opCWg|$+D<|d=fxqX zWL^fj=kR$}bpVEJiXuUK8Qr-U=vWqjWUC*V%3d-HLL^f3o1w6Uup}#3M2d{i6BO$P ziOzt1{PF8-8j4;LHw_=qwrNQP*rFdG@R*a{lhWdeG7{1;>Cuy^>pL^%*Kgu)^)#YV z0u>s>0I5}NVtf3yj6*G`7y1rxCV1_q#EGDZDM+DGZD0>@2B|0DKw8LzAnm#Ej!!R; z37;dkHaPtru2)Bd{7-5KD5&p5R(g2CqY@u!MKZhujSx6-Fn7_sdaGs$Mn&)zQsvOs z(%`cBlvEx@gGX4mhIg4;IN9K$-#E@?8WGbhF||yApZ?nNlHoNkk)`kTx9ro0h~lVI1__Ug zSmp=~n9$%C5lHh(9>A&?s!)wc&4FGp-{jdX>ZT~Z$HZF7&a1n|jzcfuI2tP?=S~Rd z5WkT*a3L98YiokocdMC6J9U2-R!@9rCZQ}^To33Y5I)(|GzPhZK=G&V8 zbEpJp-bG2&D~(}koq1fv>!MGK31#%Rv-BBkfKB+^_n=&{xePMK9K{#F=w-fKD=4Bz zGG0-}pU~{bTxi{^T*z({675Sv>hvEsCsC^FvsJFl@m6;d`&x0tROqivH}Rb}>L{NC zhDO8A`zsvVZ`(1-y z&1T2QpNko?WR7IEGXTy6flBHAF+naaPu~6QAQiN!DPaMUR@n!?F=3MGk88w#_8nio z@09=x^o<8+o86np6x-Q4IiCff31mN1WWn26@=TH*EHQ1SVV^++F2zkM8~D&J8rH<} zry|2R`|aRw!aaEP@25V0sv|u4W7V*Cv*?hq=>kjx>-WxeZPWhe%(1_LY+-NI2x6^v z%#S|Ip(uc%7@ay5KiUvflp5pefvJEK%Y_H!vPJ1R?;e#gE6L=-{jyU9sJx}kBPUZg zp<_(RThsOf=0kS!L89XrX*hXaZ)FT&#axP?yavzq&3XF;7Cqjn9jZWPfvfDyca?E= zwX8}4F%mWCjvanJzSX@kME7UuR7)dKlJbGJk%ROA1+tVBq>?QHiM$YGrv3=v=+QwM zpom`l4y-}AeHr$fPL10&Kt58_RATZt?M>0w#0}hcjxD?J&HpHG5U0wQnTw?Mv4o{n zGl;Z*6~K3yS!_Hwr1ao-TMvE0Z>3F!Or$mJ9BS9so9uPDGaRQ+oSwWM;humnBq9wT z+Hk-A`b2^5khgi2bHcB5vaqnudw_@iYkK{EKb)umg9nBKChL!7$4jT6XxmB;*|L_g z^K6n%K%_nf=(nt$>aI_59&G0#ujXBfuD@r!SvCw4#vl`xBH@WYR%Muq{P04_@ByEk zhIn4p51MNAYgY*b;BRB#SX|cKmOxDpSauP4Z9x=cia`Vw*_C+Iy^K`b3TD-oXpt%a z%(HSTBIC?ck-Poi{wq-V2{#21tCJ*x2Jmo+u*AMoSp_8%{I*uH0SH}cx-+1u%tITo zv0rcVCf`F_Lz7}7O%K%`#48v95)Z$+s(>COGeVt3-n=o>)tlw-^+*`@d#-&U@W$&o z+Qc`sTGJoTM}gSLlvjr8eB*-vj#j{Sl52_&Pw#Uwf7aR}Df{Q1r(L4`-@k6r1}PtD z7#YtJ5f|77>BIfZjN#a+A@jPyT$c9stN-&LL2PhIfO>NLk#6sIt4%67tHhNg)%U>| zv-pSoYuTg*&dR+XPn;8UoDF;ASf}smC z;yux-dVkuW^CrZdGf+{`vCK7)#L{8CP2B^KTV2e69Nq9N%D3}sO@OeuDlr#eGXUaD zdss+YO^qThrlhbBKBf^EauhF+{MiRAPIiM)1wlWB^?Ssn*a+R?3&xTYvD@Kj zt)=bLC-#O6MV$o90?#m&=38m}oE)7GO3uJutNwC~5ThMIbFoxunvkE6 zRd^;rCB^l>Ow1X29i+NOb-N#De9$h}s7!G5JJChqI=?e~xlG-=KghXjr|YlIYIpzk zO;A+k(_4m3|A*O}kzA2rvK1+J$KicEU{@Bv(F(!!_5=SPK>yXRwVZ&ay57>ZYLNf= zJwlnr$}e$Fm_ddy_mM**UoK3?9a-jGg!GU+mRT6)LF3uUt>#GisO;{~T3K2~+hqiK zUb&jRU}*Tc(h%MM;AI zVCsle8UY)Hi5S$nrm6t5o8pI3TQIOR1x)xdGeCkgH8~$2tZ{*GHB~=n1DLiC1EQ-H zG1I|sLWu4-VD_B!;&bBpCzmi6u`MSuo#{j`yiS2EQWgnYuNzY%H1IoTHX{i7QgzSFu;p@!Lw1*+01D zHFvl*wTbhFm13rKH99Fpjp4AsWS7lDwWDO*3+Y}f80bby&bqwsZz-7;Pb-t=+egg} zm6HhsR4cO>xaRVi<`PV7!Mt+7WNU{veAs$d`*PmlZK1j;hFN1X?(pVc7Fbcj_ju&A z-Cgd=PD-#5n@&)nu>BObkuSH1<^?Jyn{fqo@1g4K0G?10_YD|_hJ+ZeOfU|&AwEU} z&J%8Yx0~A?+9pshP2O$l0meMH>4#Uimc<`ojfCPvMZ0}A=7b5o%`=Yv zJ3+sPAepyOo)4fB#MG+jUTcH8hFNkh4q`zuG29KJ$u5dDri|8+qlW za^M?q%GKp10lZWw4od?d?azgicM$+g`L}PK(*U;+z4`)<5@L*2W^lGv)jbw&Qkbil z->*@_mzljvvt0bUo7V_i2mSN*r4gS=YNVGRf+x(}o||4fpL1c%@97IDClA2T)NnBV z@2#wlW{S?2DZW^izVb(PcFU|>zY$IhZqX)zU2$R8*T%s$-*J@_`Wzh^!Hs=B)YY<} ztFfcu%0$dk(sh+zLO@GHiAj9a&s#{Y|2I=qmrl- zs-$ww6eW8VMaSStT%J(*NN+Y9D9fYet6!zp>2vvgYFWJa-K0u%)ZHQv5-FD4{hOno zdE^A>H9U}H3@RKjHslN&L&G>UN?X&tsKbj(A{k2>euOr2oq}@hN++@hwDv_PL`?+s zpj1#A4PQ+)BO{|bu<|Bm8jdV z?pc*ORZTI^dGN6)DM$L(!XwZRzpK-Dm8-8w8qJTW*SQSTt@=xyU`u`m!Y2$}xI6$h z$emfc^WW&w1UIm(EJLLNOp?}A&RPpdZf`HLNvM<8=DI$A`7Bq&wfm*1Xv-=Yuvpkj z2|{QsGqdN8|1u@JEjCn-JHd(PN_a_q@4?Bj-;`cv7qKiX8}PMEiefd;>62s-@(fb4 zFgrBPH0kKvOrPrK{Etn487LvS8L>b_k@B7c)0K~@;Z1<=Q&lSn{|PAi>@bie7qy_l zTTJ>nfJfoE!8b#L2K7@xHMbmytQZ6NfxD(3|2*IA0oF<9Jf_EUr7>`y_aEb=7E~7R zuMYT%jsV*8MEp%$%XRrL1~}_a+r-pRYG1n_*Dv&l9L}ZI?s%knKfl555{p0|Ri7Wu zeIFqU^Bt^Q$Wyymp}jK#2#F);b6kn#dw&+h3c7enUFt!gjgWlRLSfi(UN-{4KEeb& z0gSD4FgHo){kkWyF%(iZbN5r7YF`j-%ckq3zGm@*ag*#;w@l(81KIyLfWcprS#l zN4jNQry>WJNx3OnUt`(+*Ch3|BxG3n-A-ilIy<>EHF_C*hXxgfc8`eEhB+JymT&eQ zmH+1^9}@8fAd-oZrf`5_`!sL(oIL7!lw{=1$0?x^5wNmtOdgbGzUIc+$jk*$Qc}i@WpUc4^IuPiHQOT6${N_YaOQt4lpj(C@&qacF+#{! z15clhHM{9HUv8VTSV*;2{Tu^ObNX9d5A?Ed;Y6mmA`qb$)3gxO4s-6uEX^Ko&rl{c z4ZwT1g87??e$dMBz0vExY^yu>D=bK3YI7-bJpI7Zrtqlcwsx=Up>`KS<(;G;47h0g zROU+E(9N{PrO&$-`iAFO->ZU?|8IoZj}B?Csx!QUF|#`rdE(Oe^wonP#4<6e@w7;8 z{^3#&;~o4;=9gr8-*Q>&&#WvKYFhbjm0z}h2jw5BgB1h zK`|oNy9nXF!O}r%Pk>n2N2;%YBIY(X2B`PR{*TT6iNt`NrXpIaE_Q%8A8AMG3tOQHA{>WX3hF$6tf-8u1l<9Gksu4 zM%Y?b`!n=SEJ)j^*fmON%$ksCACP9nB@R%m*uzfN({stJ;Y&- zmjdEv>6fFNm*M!-U0iejY0lW1n{_F`Y(908|0>!Sn14ryTIdj7paVQehnzkNq3U_qZdfxfB)JUENJxBVE(`B;TRNQyDrOXX?4)+XKyZ^L!sSTuGd6dq1H~F zYyy zrjiCC=e`BbEc}~CYZ(O{F4q^U!cXJILdLMn@9BGh#ARGbPo*Wq1&6Q=yhJ2piOw!{ zXBHcPk-OB`y#`h&ff?H9cqWf(7!vMw(nq4&-FCYMzv39Jt_0nC!P+S6Ody0*TCb@J*mW zt;vM$^Z-4HX*|2QEBq5{X+CMo%LJ3s5pgA^5Z8*gk8qT{Hkz1KyS)^HlnBN{7MndA zUatfeF}O9jVEOw}^ZD)b`RjNaEWHzLO|SZ=ilf6 zfLpiI(n08sz>|@c%veZB#$^t^dDLiBVFY{^WtNd!alE8S}2KqV8kj&ijq6A^eqTBgmH8M z*HaAC_*}fOK~W2uOEGNJ&U{2+|?l zCEZ91h=4TGE#2MHrF54x-{QXSz2|uD`JeY2gW-7gc8tB@dDfb9t~r14eZ%V^Ir8wo zMfrI(+ppw}`1YKzPr0Z#8JF%=rWdIGoz6@M^`$@Fz%`4IR9L=!o6k37=CF5o&eC6A zN)|OE+1c6Y{IriF-YDUl;xk*EdFQ7F-av*w>|xv%)@-%#mtz8`^U9x_8YPCi;4jiD zUge!_y%)e%dZj}Bg;`}u$++v?jyT{OdgeW56a+O51g=`G`4_sIpWibR;+>X_U zMJ%E6+^M)#vl@OD!l2s2m#Yu0^f-`QSqG}FPet#mPOx;YaI5`~uG3?qsj8>fD4q1m zU!i<^pI8d7i@s!oBm87d`Q09L>@(>hpdmv4s@m$WQwb(K-wW=TlD*X*`5{)uv(d&H zUvp$}tQq3kQz*-ej&m!5Uv%PGD1K%bGukLHY0Xt~^>oeG9@oxT!AzXpAny$+rcy>) zit&&A!7}Mp)8NIm$~F~=Tv+;-_QC%^;guikUz9T~=l(O#{NDlx)TnH8UA^ORW5%nQ z#u}e_DD*TmDNKiT5_bxW!>hO*awHP==n~a%bd@R2-(!}o)R5)Kr40}zQ~cWa(wFBY z9h)%!vWFTF>i+uo{qGLT5C>aP!4RBb{v)pczf)B*S=d$0uu4UHpzGuEHZ_HzE``uR zPNc5r6~*Dm(T>vRIw~XTuTf1(ZelO{+KrewI3lvYboL%XN!u?aso-bvFgG{`$Azoh zw*EK4;(x#F1{CADdS<%_|Bk2s8R#P7LKP`C)I>QbcUKqZsC{vnar>&|M4GQeQNcjL zVN~mg?AVk-$Q4KrRFo6y{oQC^-nAIt%0`cR#>J0ttg;b3wIcqn4}HKOHK0EX6pb^~ zR8;}hGch|mTV*JnhsnewCk1T#m_^{=6CX*;PW@W4+|-<6YYKG>RDHkSn=B$Z*rHiwW(()a1Tny#2h8ptS7(QaZDy8iQ5*F1H9fQ1RUseQp1;Ulr;#aG|Mmca z`s-c(*I(?r`~cE-DIzfG1)!#UI+jGE?x^0W!PFnG3_f{O{t)BQ1dWN5Z>-igun+W+ z)BQ=U+`%Mze0==aw6v#ynDs4e<~Oo8_#U!th*YQzwSPHgHlS$NIja=hthQT}OZN`2 zZ&+k&pU5nR8<13dIF3V_{T5z16vxz zGt&MV;ZD??xOgwEJ1e8Rn8?!WaGds|Glck8C`xs!zNL}d!3(m`N2B5xO?g~*?!)2p`+jVa34w;kx;6`^{P=#8)kr zD{pxnkFy6pvTMB=zEekbI!Ji9IeB@newpmOrkrbh`+2u#iTUpC4ru7J^ixI&(tMVP z`Y`kntJJ(7?mxa}4;QwKn1@GG6Xh#{$M?C_i3_*>Kf=&Vj*mi>=o#~ytX|08KVs>X zKTC9f4@=l>5?uf6R%OIE`VrE9|7ep!Atz0D@4c__6L#I6kaj)N8}82vMESAY3Zn$L zXVpsu1q`j9v$H$+b={8i?9X>K>aO?Qsp#u=Ue8Sx;JIy2(7Uc&diMa1)4>i&4Pwrj9-`itD{7W+_DOz5P%bfk^<=|sFPBQ&~g7(ACH^kb#> z!dnY`YM8vv)n`oxx4f-JXWOsK-6k38T#o#5zt?Beo1B=41YM4OHmyG0n_ddetd6+w z`|Y+_!$A9b?PUuEw1^A!j&vVe{VaEM&e`SDWit8csHwX$#f>OLY+9MyJgCxI-dxYz z{RTnm%PVZ=Wajg!B(ligKkQ%6VDjM^Kr6eh54>Fq7N1q0Xb=y0A1Iyi&GRSi{SgWh z5>lPH3WWA(^W&UkXMb4NYouu!rM~^8X1#=`x>P((ZptlSntA<7<5HbTJ9n7_lm?H;C(eV{=RK|G1O?wgCk1 z42t_CeRo$HaUZk+Sq6nZf~2{soN`7ip{Zo`+ZZ*eR$MYfBjZ->M+`gjhkIK zmiMx6l)Xyn^OAE@lXbcaUjCK=?I}{MSIQzM$D*2HrTiD6@y^APFWB93zx`SNiY$Z} z505e~aQ1`Ly*cTJ*B>6Xyz=yzSKXS0o}SQF+V>aVPMS!;?D(`om%&X!Ts*imBjfEi z6ChGk`PM&;*HsCqi?K*Xk(4()NZfvW{DjIHjzBiOO^wYGb7yyyjEPBL{wR-e&#MrH&8K)U(99!YxIkLQF#u6h{eKYo-<8P*I#JffZuCxAwUMg6>|{qA?x{3(<3(Qlpz zKgTpgMcW@Z+ih*LbEVZyg7(=x*-Hz0>U55dj$_}%5VrEq#3~%zdVz`_l>#YVvu7qJ zeOGEqN^Who zVl{@qS^6cz_79rvL`;J3@@y)#r!Nn&z3Z7vtyaIM{I((gCzM(HJc1h_^l@%Vbt`md zBYXB$gqSoqajwQHZq%qNnKvPUY}1mISmoXIkaM$*)@xWS;|(439NAa$7xE)pVQG(Z&euf9Mr z={(NKU4NsYk&H_4T)jp?MTBh;F$p4rPQtA}Hdmrip;>J?Yuqt@d~C1f4S_n^{E*7n z9uyV*99x0>&^M$)xPIa0X0KfJny-k02DYos^V+gXtk{azahqzP-Z3$9Wd(Y)%K1PL zu*(=hYE#8J@i^_lNIn~t)c~D046TOEBe{`@CW!QsyUqKj8kJHnrj^mETUpwzl>=jbP9Y9vd5bj%1W&^1BV=t@IB$hIT>lp2z5z zf9wul3re4>Bww$gW_DdIh4h;9$(6m!dEdH9`wy6L0qnni|ucsOer-6ZiGumlWUD&f5S7#PKZMgLQ3Am}e@jCoAkbb84IhBlf?>*WMT;yoixuSZlg09yQ+~pB^vrUJL z_=R&7CHos&z9yK7Slc3oQe7B2DNU+}4OXqcbse7>@ zWVvPR?=NQjBX2aNz$rYl+9)%(JR&mEY3m$tVRLd5n#^W_A%@;~v3%@i5}wt8%~%x; z4NVF`bjCnBH89e7lARFf@LX}{-TBt|barS&RI?J7eR8h0PFB9zN}ISAe{(5nw1m^< zSB&a4u|b(yJg&DHQU{^JgF_^mrS>DsjlXx7AC$A568eKl^PNl>{D5A^?z7tU)b$@LVeJr}Vau-19BZ(QZ_^FAd(_pX`#dtm)0&+G0Yj-oHiG zW<+D|Qpz^ct#^sR5FdREWx8GRv0PSig2D$E7 z$>saD^uO6YKCmTmAcF0{I#Z^K$co8z^g1svO-{bn)UuC}8}Scz&CcuLCu`~K?3NaH z39wu!*D%a7%8m<73ekzBdQLTgnAS>8u7(EZM@%v~IjNMLudtMQ6j>ZmT3Sk#{|vbd zaz;uRMp5jEUsy$TeMb7$+~j;~PJ#E`F5M=A9Tk07G7pZVrKB7Wu1H>} zmj>1b;^GpsPFT3OEVh|mJohLXRrY}xR^*8169jQvTgjL?h77AfpGyMoMV~4onRZ(p z?<)%%8d~Qn976IZ9JFF{LA@2;cX1f}idd&<$gNU?VZ0gp&>W2J8|R~}3e#&u`T+}0 zS28$bV^@WE*HIgH3f=ZC@1RyNjR?5B8gs8dGKjrL9e>wy2ECWBOiSHpRI5FfV4JO} zsO_O0Ni1M^+iUvgnDvGVLb}gHSpkz>eHBYYFH!8`!PkIkV6YhbahKM}!Jq1-o^oqr z+xyc0Er9=2Pe?7Rk_$ss1ipc0eu3zL&d;qw9L-wpamhAQ<6NquqS_O(YDl^JAt9kB z-4A-^vyph{xPI|RBxik9RR!P8sTz>p(cg#;@)(};H=d=YvIB0AdaS`>+Z`%Bp(UhdbAUhMUTrSRg2lI!9=*)2y( zx*$gqHRGcTNnE>oi!OB!2$XKQooV1MQ$Yedu0`i`!$+!j$1$?lEZv1JGc1F8 zZGI&l&X#vEcIdxFkma;T<+XeBb>qe#+HDGY+!EvCsi2^shPceKa(aYoyzjku3MC*n z=V>24n0Pr?4=_&GrvkUUWK^e%+b1)y4)*pXRbhnI=>CuaIy&O_s6H2Hgli&BLg5JA zy&y-`3jFI#==xGx4vW7lyg>|;D^k44(R;1drsV}xZjFI$WsPQE!gk)fXcD^OQl z^IPv!ssD<4USXTJKY7}q?#%=xg88@)s40ZiIJY0Q(GzCLPa|T7#hBw7GR`iyGgoLi zuT8w0$Ay*4{%-Q;G9Da|gqxjWNj5A<=IRl8b~#MSKV>S3!p!!

LCw)jZn5lU*q{ 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�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 literal 0 HcmV?d00001 diff --git a/docs/getting-started/quickstart.md b/docs/getting-started/quickstart.md index 57b007707a3..b30bdb585c7 100644 --- a/docs/getting-started/quickstart.md +++ b/docs/getting-started/quickstart.md @@ -555,6 +555,7 @@ show up in the upcoming concepts + architecture + tutorial pages as well. ## Next steps +* Join the [email newsletter](https://feast.dev/) to get new updates on Feast / feature stores. * Read the [Concepts](concepts/) page to understand the Feast data model. * Read the [Architecture](architecture-and-components/) page. * Check out our [Tutorials](../tutorials/tutorials-overview/) section for more examples on how to use Feast. diff --git a/docs/how-to-guides/running-feast-in-production.md b/docs/how-to-guides/running-feast-in-production.md index ef903b68c4b..9d1984d7366 100644 --- a/docs/how-to-guides/running-feast-in-production.md +++ b/docs/how-to-guides/running-feast-in-production.md @@ -34,6 +34,8 @@ The first step to setting up a deployment of Feast is to create a Git repository Out of the box, Feast serializes all of its state into a file-based registry. When running Feast in production, we recommend using the more scalable SQL-based registry that is backed by a database. Details are available [here](./scaling-feast.md#scaling-feast-registry). +> **Note:** A SQL-based registry primarily works with a Python feature server. The Java feature server does not understand this registry type yet. + ### 1.3 Setting up CI/CD to automatically update the registry We recommend typically setting up CI/CD to automatically run `feast plan` and `feast apply` when pull requests are opened / merged. @@ -78,7 +80,7 @@ batch_engine: key: aws-secret-access-key ``` -### 2.2 Scheduled materialization +### 2.2 Scheduled materialization with Airflow > See also [data ingestion](../getting-started/concepts/data-ingestion.md#batch-data-ingestion) for code snippets @@ -91,34 +93,34 @@ However, the amount of work can quickly outgrow the resources of a single machin If you are using Airflow as a scheduler, Feast can be invoked through a [PythonOperator](https://airflow.apache.org/docs/apache-airflow/stable/howto/operator/python.html) after the [Python SDK](https://pypi.org/project/feast/) has been installed into a virtual environment and your feature repo has been synced: ```python -import datetime -from airflow.operators.python_operator import PythonOperator +from airflow.decorators import task from feast import RepoConfig, FeatureStore from feast.infra.online_stores.dynamodb import DynamoDBOnlineStoreConfig from feast.repo_config import RegistryConfig # Define Python callable -def materialize(): +@task() +def materialize(data_interval_start=None, data_interval_end=None): repo_config = RepoConfig( registry=RegistryConfig(path="s3://[YOUR BUCKET]/registry.pb"), project="feast_demo_aws", provider="aws", offline_store="file", - online_store=DynamoDBOnlineStoreConfig(region="us-west-2") + online_store=DynamoDBOnlineStoreConfig(region="us-west-2"), + entity_key_serialization_version=2 ) store = FeatureStore(config=repo_config) # Option 1: materialize just one feature view # store.materialize_incremental(datetime.datetime.now(), feature_views=["my_fv_name"]) # Option 2: materialize all feature views incrementally - store.materialize_incremental(datetime.datetime.now()) - -# Use Airflow PythonOperator -materialize_python = PythonOperator( - task_id='materialize_python', - python_callable=materialize, -) + # store.materialize_incremental(datetime.datetime.now()) + # Option 3: Let Airflow manage materialization state + # Add 1 hr overlap to account for late data + store.materialize(data_interval_start.subtract(hours=1), data_interval_end) ``` +You can see more in an example at [Feast Workshop - Module 1](https://github.com/feast-dev/feast-workshop/blob/main/module_1/README.md#step-7-scaling-up-and-scheduling-materialization). + {% hint style="success" %} Important note: Airflow worker must have read and write permissions to the registry file on GCS / S3 since it pulls configuration and updates materialization history. {% endhint %} @@ -128,6 +130,8 @@ See more details at [data ingestion](../getting-started/concepts/data-ingestion. This supports pushing feature values into Feast to both online or offline stores. +### 2.4 Scheduled batch transformations with Airflow + dbt +Feast does not orchestrate batch transformation DAGs. For this, you can rely on tools like Airflow + dbt. See [Feast Workshop - Module 3](https://github.com/feast-dev/feast-workshop/blob/main/module_3/) for an example and some tips. ## 3. How to use Feast for model training @@ -238,7 +242,7 @@ helm install feast-release feast-charts/feast-feature-server \ --set feature_store_yaml_base64=$(base64 feature_store.yaml) ``` -This will deploy a single service. The service must have read access to the registry file on cloud storage. It will keep a copy of the registry in their memory and periodically refresh it, so expect some delays in update propagation in exchange for better performance. +This will deploy a single service. The service must have read access to the registry file on cloud storage and to the online store (e.g. via [podAnnotations](https://kubernetes-on-aws.readthedocs.io/en/latest/user-guide/iam-roles.html)). It will keep a copy of the registry in their memory and periodically refresh it, so expect some delays in update propagation in exchange for better performance. ## 5. Using environment variables in your yaml configuration @@ -272,7 +276,7 @@ In summary, the overall architecture in production may look like: * Feast SDK is being triggered by CI (eg, Github Actions). It applies the latest changes from the feature repo to the Feast database-backed registry * Data ingestion - * **Batch data**: Airflow manages materialization jobs to ingest batch data from DWH to the online store periodically. When working with large datasets to materialize, we recommend using a batch materialization engine + * **Batch data**: Airflow manages batch transformation jobs + materialization jobs to ingest batch data from DWH to the online store periodically. When working with large datasets to materialize, we recommend using a batch materialization engine * If your offline and online workloads are in Snowflake, the Snowflake materialization engine is likely the best option. * If your offline and online workloads are not using Snowflake, but using Kubernetes is an option, the Bytewax materialization engine is likely the best option. * If none of these engines suite your needs, you may continue using the in-process engine, or write a custom engine (e.g with Spark or Ray). diff --git a/docs/reference/batch-materialization/README.md b/docs/reference/batch-materialization/README.md index 50640bce49c..8511fd81d0b 100644 --- a/docs/reference/batch-materialization/README.md +++ b/docs/reference/batch-materialization/README.md @@ -5,3 +5,7 @@ Please see [Batch Materialization Engine](../../getting-started/architecture-and {% page-ref page="snowflake.md" %} {% page-ref page="bytewax.md" %} + +{% page-ref page="lambda.md" %} + +{% page-ref page="spark.md" %} diff --git a/docs/reference/batch-materialization/lambda.md b/docs/reference/batch-materialization/lambda.md new file mode 100644 index 00000000000..126d07c4103 --- /dev/null +++ b/docs/reference/batch-materialization/lambda.md @@ -0,0 +1,24 @@ +# AWS Lambda (alpha) + +## Description + +The AWS Lambda batch materialization engine is considered alpha status. It relies on the offline store to output feature values to S3 via `to_remote_storage`, and then loads them into the online store. + +See [LambdaMaterializationEngineConfig](https://rtd.feast.dev/en/master/index.html?highlight=LambdaMaterializationEngine#feast.infra.materialization.aws_lambda.lambda_engine.LambdaMaterializationEngineConfig) for configuration options. + +See also [Dockerfile](https://github.com/feast-dev/feast/blob/master/sdk/python/feast/infra/materialization/aws_lambda/Dockerfile) for a Dockerfile that can be used below with `materialization_image`. + +## Example + +{% code title="feature_store.yaml" %} +```yaml +... +offline_store: + type: snowflake.offline +... +batch_engine: + type: lambda + lambda_role: [your iam role] + materialization_image: [image uri of above Docker image] +``` +{% endcode %} diff --git a/docs/reference/batch-materialization/spark.md b/docs/reference/batch-materialization/spark.md new file mode 100644 index 00000000000..ce58c0ad0fd --- /dev/null +++ b/docs/reference/batch-materialization/spark.md @@ -0,0 +1,21 @@ +# Spark (alpha) + +## Description + +The Spark batch materialization engine is considered alpha status. It relies on the offline store to output feature values to S3 via `to_remote_storage`, and then loads them into the online store. + +See [SparkMaterializationEngine](https://rtd.feast.dev/en/master/index.html?highlight=SparkMaterializationEngine#feast.infra.materialization.spark.spark_materialization_engine.SparkMaterializationEngineConfig) for configuration options. + +## Example + +{% code title="feature_store.yaml" %} +```yaml +... +offline_store: + type: snowflake.offline +... +batch_engine: + type: spark.engine + partitions: [optional num partitions to use to write to online store] +``` +{% endcode %} diff --git a/infra/templates/README.md.jinja2 b/infra/templates/README.md.jinja2 index e59a364d819..e5213ae9f17 100644 --- a/infra/templates/README.md.jinja2 +++ b/infra/templates/README.md.jinja2 @@ -25,10 +25,10 @@ Feast allows ML platform teams to: * **Avoid data leakage** by generating point-in-time correct feature sets so data scientists can focus on feature engineering rather than debugging error-prone dataset joining logic. This ensure that future feature values do not leak to models during training. * **Decouple ML from data infrastructure** by providing a single data access layer that abstracts feature storage from feature retrieval, ensuring models remain portable as you move from training models to serving models, from batch models to realtime models, and from one data infra system to another. -Please see our [documentation](https://docs.feast.dev/) for more information about the project. +Please see our [documentation](https://docs.feast.dev/) for more information about the project, or sign up for an [email newsletter](https://feast.dev/). ## 📐 Architecture -![](docs/assets/feast-marchitecture.png) +![](docs/assets/feast_marchitecture.png) The above architecture is the minimal Feast deployment. Want to run the full Feast on Snowflake/GCP/AWS? Click [here](https://docs.feast.dev/how-to-guides/feast-snowflake-gcp-aws). diff --git a/sdk/python/docs/index.rst b/sdk/python/docs/index.rst index ca96782db8a..4cedffb1fc0 100644 --- a/sdk/python/docs/index.rst +++ b/sdk/python/docs/index.rst @@ -448,3 +448,15 @@ Snowflake Engine .. autoclass:: feast.infra.materialization.aws_lambda.lambda_engine.LambdaMaterializationJob :members: + +(Alpha) Spark Engine +--------------------------- + +.. autoclass:: feast.infra.materialization.contrib.spark.spark_materialization_engine.SparkMaterializationEngine + :members: + +.. autoclass:: feast.infra.materialization.contrib.spark.spark_materialization_engine.SparkMaterializationEngineConfig + :members: + +.. autoclass:: feast.infra.materialization.contrib.spark.spark_materialization_engine.SparkMaterializationJob + :members: \ No newline at end of file diff --git a/sdk/python/docs/source/feast.infra.online_stores.rst b/sdk/python/docs/source/feast.infra.online_stores.rst index 65758c409c0..59ac1868f58 100644 --- a/sdk/python/docs/source/feast.infra.online_stores.rst +++ b/sdk/python/docs/source/feast.infra.online_stores.rst @@ -12,6 +12,14 @@ Subpackages Submodules ---------- +feast.infra.online\_stores.bigtable module +------------------------------------------ + +.. automodule:: feast.infra.online_stores.bigtable + :members: + :undoc-members: + :show-inheritance: + feast.infra.online\_stores.datastore module ------------------------------------------- diff --git a/sdk/python/docs/source/index.rst b/sdk/python/docs/source/index.rst index ca96782db8a..4cedffb1fc0 100644 --- a/sdk/python/docs/source/index.rst +++ b/sdk/python/docs/source/index.rst @@ -448,3 +448,15 @@ Snowflake Engine .. autoclass:: feast.infra.materialization.aws_lambda.lambda_engine.LambdaMaterializationJob :members: + +(Alpha) Spark Engine +--------------------------- + +.. autoclass:: feast.infra.materialization.contrib.spark.spark_materialization_engine.SparkMaterializationEngine + :members: + +.. autoclass:: feast.infra.materialization.contrib.spark.spark_materialization_engine.SparkMaterializationEngineConfig + :members: + +.. autoclass:: feast.infra.materialization.contrib.spark.spark_materialization_engine.SparkMaterializationJob + :members: \ No newline at end of file diff --git a/ui/feature_repo/features.py b/ui/feature_repo/features.py index 293f438c67d..e02bb3de5d0 100644 --- a/ui/feature_repo/features.py +++ b/ui/feature_repo/features.py @@ -10,7 +10,10 @@ zipcode = Entity( name="zipcode", description="A zipcode", - tags={"owner": "danny@tecton.ai", "team": "hack week",}, + tags={ + "owner": "danny@tecton.ai", + "team": "hack week", + }, ) zipcode_source = FileSource( @@ -85,7 +88,10 @@ dob_ssn = Entity( name="dob_ssn", description="Date of birth and last four digits of social security number", - tags={"owner": "tony@tecton.ai", "team": "hack week",}, + tags={ + "owner": "tony@tecton.ai", + "team": "hack week", + }, ) credit_history_source = FileSource( @@ -123,14 +129,19 @@ # Define a request data source which encodes features / information only # available at request time (e.g. part of the user initiated HTTP request) input_request = RequestSource( - name="transaction", schema=[Field(name="transaction_amt", dtype=Int64),], + name="transaction", + schema=[ + Field(name="transaction_amt", dtype=Int64), + ], ) # Define an on demand feature view which can generate new features based on # existing feature views and RequestSource features @on_demand_feature_view( sources=[credit_history, input_request], - schema=[Field(name="transaction_gt_last_credit_card_due", dtype=Bool),], + schema=[ + Field(name="transaction_gt_last_credit_card_due", dtype=Bool), + ], ) def transaction_gt_last_credit_card_due(inputs: pd.DataFrame) -> pd.DataFrame: df = pd.DataFrame() @@ -173,14 +184,18 @@ def transaction_gt_last_credit_card_due(inputs: pd.DataFrame) -> pd.DataFrame: zipcode_model = FeatureService( name="zipcode_model", - features=[zipcode_features,], + features=[ + zipcode_features, + ], tags={"owner": "amanda@tecton.ai", "stage": "dev"}, description="Location model", ) zipcode_model_v2 = FeatureService( name="zipcode_model_v2", - features=[zipcode_money_features,], + features=[ + zipcode_money_features, + ], tags={"owner": "amanda@tecton.ai", "stage": "dev"}, description="Location model", ) From 1d288d351051db8ce9c658b9fcc66a779254dab6 Mon Sep 17 00:00:00 2001 From: Danny Chiao Date: Wed, 19 Oct 2022 15:35:02 -0400 Subject: [PATCH 08/30] docs: Fix broken hero image (#3305) Signed-off-by: Danny Chiao --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index f387406c3fd..a305c4aecde 100644 --- a/docs/README.md +++ b/docs/README.md @@ -14,7 +14,7 @@ Feast allows ML platform teams to: **Note:** Feast today primarily addresses _timestamped structured data_. {% endhint %} -![](assets/feast-marchitecture.png) +![](assets/feast_marchitecture.png) ## Who is Feast for? From 0ad0ace893edbd0680ee100726ad38bec1436974 Mon Sep 17 00:00:00 2001 From: Danny Chiao Date: Wed, 26 Oct 2022 12:59:49 -0700 Subject: [PATCH 09/30] fix: Ensure that Snowflake accounts for number columns that overspecify precision (#3306) * fix: Ensure that Snowflake properly accounts for INT32/INT64 columns with default precision 38 type Signed-off-by: Danny Chiao * fix: Snowflake infer snowflake OBJECT return type for number inference Signed-off-by: miles.adkins Signed-off-by: Danny Chiao Signed-off-by: miles.adkins Co-authored-by: miles.adkins --- .../feast/infra/offline_stores/snowflake_source.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/sdk/python/feast/infra/offline_stores/snowflake_source.py b/sdk/python/feast/infra/offline_stores/snowflake_source.py index 40e50b3cab9..cc5208a6761 100644 --- a/sdk/python/feast/infra/offline_stores/snowflake_source.py +++ b/sdk/python/feast/infra/offline_stores/snowflake_source.py @@ -263,6 +263,16 @@ def get_table_column_names_and_types( result.dtypes[column].name ] else: + if len(result) > 0: + max_value = result.iloc[0][0] + if max_value is not None and len(str(max_value)) <= 9: + row["snowflake_type"] = "NUMBER32" + continue + elif ( + max_value is not None and len(str(max_value)) <= 18 + ): + row["snowflake_type"] = "NUMBER64" + continue raise NotImplementedError( "NaNs or Numbers larger than INT64 are not supported" ) From 1590d6be14b9a9cea6fbde60f2373cb3cd68acb9 Mon Sep 17 00:00:00 2001 From: sfc-gh-madkins <82121043+sfc-gh-madkins@users.noreply.github.com> Date: Fri, 28 Oct 2022 12:04:39 -0500 Subject: [PATCH 10/30] =?UTF-8?q?fix:=20Changing=20Snowflake=20template=20?= =?UTF-8?q?code=20to=20avoid=20query=20not=20implemented=20=E2=80=A6=20(#3?= =?UTF-8?q?319)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix: Changing Snowflake template code to avoid query not implemented error Signed-off-by: miles.adkins Signed-off-by: miles.adkins --- sdk/python/feast/templates/snowflake/test_workflow.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/sdk/python/feast/templates/snowflake/test_workflow.py b/sdk/python/feast/templates/snowflake/test_workflow.py index 904d1e1f3e5..b121f229802 100644 --- a/sdk/python/feast/templates/snowflake/test_workflow.py +++ b/sdk/python/feast/templates/snowflake/test_workflow.py @@ -3,6 +3,7 @@ from datetime import datetime, timedelta import pandas as pd +import yaml from pytz import utc from feast import FeatureStore @@ -76,6 +77,10 @@ def fetch_historical_features_entity_sql(store: FeatureStore, for_batch_scoring) datetime.now().replace(microsecond=0, second=0, minute=0).astimezone(tz=utc) ) start_date = (end_date - timedelta(days=60)).astimezone(tz=utc) + + project_name = yaml.safe_load(open("feature_repo/feature_store.yaml"))["project"] + table_name = f"{project_name}_feast_driver_hourly_stats" + # For batch scoring, we want the latest timestamps if for_batch_scoring: print( @@ -86,7 +91,7 @@ def fetch_historical_features_entity_sql(store: FeatureStore, for_batch_scoring) SELECT "driver_id", CURRENT_TIMESTAMP() as "event_timestamp" - FROM {store.list_data_sources()[-1].get_table_query_string()} + FROM {store.get_data_source(table_name).get_table_query_string()} WHERE "event_timestamp" BETWEEN '{start_date}' AND '{end_date}' GROUP BY "driver_id" """ @@ -97,7 +102,7 @@ def fetch_historical_features_entity_sql(store: FeatureStore, for_batch_scoring) SELECT "driver_id", "event_timestamp" - FROM {store.list_data_sources()[-1].get_table_query_string()} + FROM {store.get_data_source(table_name).get_table_query_string()} WHERE "event_timestamp" BETWEEN '{start_date}' AND '{end_date}' """ From 80712a7cbbc761f2c9874690c6e539660303c9b5 Mon Sep 17 00:00:00 2001 From: petersutter5 <94383285+petersutter5@users.noreply.github.com> Date: Fri, 28 Oct 2022 19:58:37 -0400 Subject: [PATCH 11/30] docs: Install instructions fix directory issue (#3290) What this PR does / why we need it: When you run 'feast init my_feature_repo', it makes a 'my_feature_repo' directory. However the 'feature_store.yaml' file is within another directory called 'feature_repo'. So the feast apply command gives an error if you are simply in the 'my_feature_store' directory. Which issue(s) this PR fixes: This fixes a minor issue in the README with the install instructions Fixes # Signed-off-by: Danny Chiao Signed-off-by: Danny Chiao --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1b48f19f8f6..e1107d34570 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ pip install feast ### 2. Create a feature repository ```commandline feast init my_feature_repo -cd my_feature_repo +cd my_feature_repo/feature_repo ``` ### 3. Register your feature definitions and set up your feature store @@ -227,4 +227,4 @@ Thanks goes to these incredible people: - \ No newline at end of file + From 595698105637aaeb952fddc2957c83e501964d2a Mon Sep 17 00:00:00 2001 From: Youngkyu OH Date: Mon, 7 Nov 2022 06:42:22 +0900 Subject: [PATCH 12/30] fix: Updated AWS Athena template (#3322) * Update the template on how to use AWS Athena Signed-off-by: Youngkyu OH * Remove unnecessary imports Signed-off-by: Youngkyu OH * lint & format Signed-off-by: Youngkyu OH Signed-off-by: Youngkyu OH --- .../athena/feature_repo/feature_store.yaml | 7 ++-- .../athena/feature_repo/test_workflow.py | 35 ++++++++++++------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/sdk/python/feast/templates/athena/feature_repo/feature_store.yaml b/sdk/python/feast/templates/athena/feature_repo/feature_store.yaml index 13e7898e861..bd12e906d1f 100644 --- a/sdk/python/feast/templates/athena/feature_repo/feature_store.yaml +++ b/sdk/python/feast/templates/athena/feature_repo/feature_store.yaml @@ -6,8 +6,9 @@ online_store: path: online_store.db offline_store: type: athena - region: ap-northeast-2 - database: sampledb + region: {AWS region} + database: {The database in the data catalog to be used by Athena} data_source: AwsDataCatalog - s3_staging_location: s3://sagemaker-yelo-test + s3_staging_location: s3://{S3 bucket to be used by Feast} + workgroup: {Workgroup for Athena} entity_key_serialization_version: 2 \ No newline at end of file diff --git a/sdk/python/feast/templates/athena/feature_repo/test_workflow.py b/sdk/python/feast/templates/athena/feature_repo/test_workflow.py index 7d7daff8650..bf69a4bff05 100644 --- a/sdk/python/feast/templates/athena/feature_repo/test_workflow.py +++ b/sdk/python/feast/templates/athena/feature_repo/test_workflow.py @@ -3,16 +3,28 @@ import pandas as pd -from feast import Entity, Feature, FeatureStore, FeatureView, ValueType +from feast import Entity, FeatureStore, FeatureView, Field from feast.infra.offline_stores.contrib.athena_offline_store.athena_source import ( AthenaSource, ) +from feast.types import Float64, Int64 def test_end_to_end(): try: - fs = FeatureStore(".") + + # Before running this test method + # 1. Upload the driver_stats.parquet file to your S3 bucket. + # (https://github.com/feast-dev/feast-custom-offline-store-demo/tree/main/feature_repo/data) + # 2. Using AWS Glue Crawler, create a table in the data catalog. The generated table can be queried through Athena. + # 3. Specify the S3 bucket name, data source(AwsDataCatalog), database name, Athena's workgroup, etc. in feature_store.yaml + + fs = FeatureStore("./feature_repo") + + # Partition pruning has a significant impact on Athena's query performance and cost. + # If offline feature dataset is large, it is highly recommended to create partitions using date columns such as ('created','event_timestamp') + # The date_partition_column must be in form of YYYY-MM-DD(string) as in the beginning of the date column. driver_hourly_stats = AthenaSource( timestamp_field="event_timestamp", @@ -21,31 +33,29 @@ def test_end_to_end(): database="sampledb", data_source="AwsDataCatalog", created_timestamp_column="created", - # date_partition_column="std_date" + # date_partition_column="std_date" #YYYY-MM-DD ) driver = Entity( name="driver_id", - value_type=ValueType.INT64, description="driver id", ) driver_hourly_stats_view = FeatureView( name="driver_hourly_stats", - entities=["driver_id"], - ttl=timedelta(days=365), - features=[ - Feature(name="conv_rate", dtype=ValueType.FLOAT), - Feature(name="acc_rate", dtype=ValueType.FLOAT), - Feature(name="avg_daily_trips", dtype=ValueType.INT64), + entities=[driver], + ttl=timedelta(days=500), + schema=[ + Field(name="conv_rate", dtype=Float64), + Field(name="acc_rate", dtype=Float64), + Field(name="avg_daily_trips", dtype=Int64), ], online=True, - batch_source=driver_hourly_stats, + source=driver_hourly_stats, ) # apply repository fs.apply([driver_hourly_stats, driver, driver_hourly_stats_view]) - print(fs.list_data_sources()) print(fs.list_feature_views()) @@ -54,7 +64,6 @@ def test_end_to_end(): ) # Read features from offline store - feature_vector = ( fs.get_historical_features( features=["driver_hourly_stats:conv_rate"], entity_df=entity_df From 3bb902029d01b90d7ace1c40dac21d2991cb2390 Mon Sep 17 00:00:00 2001 From: Danny Chiao Date: Tue, 8 Nov 2022 11:06:58 -0500 Subject: [PATCH 13/30] ci: Add extra validation in release process dry runs (#3321) * ci: Add extra validation in release process dry runs Signed-off-by: Danny Chiao * remove file bump Signed-off-by: Danny Chiao Signed-off-by: Danny Chiao --- .github/workflows/release.yml | 45 +++++++++++++- Makefile | 1 - infra/charts/feast-python-server/.helmignore | 23 ------- infra/charts/feast-python-server/Chart.yaml | 12 ---- infra/charts/feast-python-server/README.md | 50 --------------- .../feast-python-server/README.md.gotmpl | 29 --------- .../templates/_helpers.tpl | 52 ---------------- .../templates/deployment.yaml | 61 ------------------- .../templates/service.yaml | 15 ----- infra/charts/feast-python-server/values.yaml | 59 ------------------ infra/scripts/helm/push-helm-charts.sh | 2 - infra/scripts/release/files_to_bump.txt | 2 - 12 files changed, 44 insertions(+), 307 deletions(-) delete mode 100644 infra/charts/feast-python-server/.helmignore delete mode 100644 infra/charts/feast-python-server/Chart.yaml delete mode 100644 infra/charts/feast-python-server/README.md delete mode 100644 infra/charts/feast-python-server/README.md.gotmpl delete mode 100644 infra/charts/feast-python-server/templates/_helpers.tpl delete mode 100644 infra/charts/feast-python-server/templates/deployment.yaml delete mode 100644 infra/charts/feast-python-server/templates/service.yaml delete mode 100644 infra/charts/feast-python-server/values.yaml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0c9ac1e752c..554fd282d1c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -42,10 +42,53 @@ jobs: echo "Current version is ${CURRENT_VERSION}" echo "Next version is ${NEXT_VERSION}" - publish-web-ui-npm: + validate_version_bumps: if: github.repository == 'feast-dev/feast' needs: get_dry_release_versions runs-on: ubuntu-latest + env: + # This publish is working using an NPM automation token to bypass 2FA + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + HELM_VERSION: v3.8.0 + CURRENT_VERSION: ${{ needs.get_dry_release_versions.outputs.current_version }} + NEXT_VERSION: ${{ needs.get_dry_release_versions.outputs.next_version }} + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: '17.x' + registry-url: 'https://registry.npmjs.org' + - name: Bump file versions + run: python ./infra/scripts/release/bump_file_versions.py ${CURRENT_VERSION} ${NEXT_VERSION} + - name: Install yarn dependencies + working-directory: ./ui + run: yarn install + - name: Build yarn rollup + working-directory: ./ui + run: yarn build:lib + - name: Bundle UI in SDK + run: make build-ui + - name: Remove previous Helm + run: sudo rm -rf $(which helm) + - name: Set up Homebrew + uses: Homebrew/actions/setup-homebrew@master + - name: Setup Helm-docs + run: | + brew install norwoodj/tap/helm-docs + - name: Generate helm chart READMEs + run: make build-helm-docs + - name: Install Helm + run: ./infra/scripts/helm/install-helm.sh + - name: Validate Helm chart prior to publishing + run: ./infra/scripts/helm/validate-helm-chart-publish.sh + - name: Validate all version consistency + run: ./infra/scripts/helm/validate-helm-chart-versions.sh $NEXT_VERSION + + + publish-web-ui-npm: + if: github.repository == 'feast-dev/feast' + needs: validate_version_bumps + runs-on: ubuntu-latest env: # This publish is working using an NPM automation token to bypass 2FA NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/Makefile b/Makefile index 718df6af4ab..8d9a1a8d3b3 100644 --- a/Makefile +++ b/Makefile @@ -461,7 +461,6 @@ build-templates: build-helm-docs: cd ${ROOT_DIR}/infra/charts/feast; helm-docs cd ${ROOT_DIR}/infra/charts/feast-feature-server; helm-docs - cd ${ROOT_DIR}/infra/charts/feast-python-server; helm-docs # Web UI diff --git a/infra/charts/feast-python-server/.helmignore b/infra/charts/feast-python-server/.helmignore deleted file mode 100644 index 0e8a0eb36f4..00000000000 --- a/infra/charts/feast-python-server/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/infra/charts/feast-python-server/Chart.yaml b/infra/charts/feast-python-server/Chart.yaml deleted file mode 100644 index 0c7690deb27..00000000000 --- a/infra/charts/feast-python-server/Chart.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: v2 -name: feast-python-server -description: Feast Feature Server in Python -type: application -version: 0.26.0 -keywords: - - machine learning - - big data - - mlops -home: https://feast.dev/ -sources: - - https://github.com/feast-dev/feast diff --git a/infra/charts/feast-python-server/README.md b/infra/charts/feast-python-server/README.md deleted file mode 100644 index ab2de1d3a83..00000000000 --- a/infra/charts/feast-python-server/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feast Python Feature Server Helm Charts (deprecated) - -> Note: this helm chart is deprecated in favor of [feast-feature-server](../feast-feature-server/README.md) - -Current chart version is `0.26.0` - -## Installation -Docker repository and tag are required. Helm install example: -``` -helm install feast-python-server . --set image.repository=REPO --set image.tag=TAG -``` - -Deployment assumes that `feature_store.yaml` exists on docker image. Example docker image: -``` -FROM python:3.8 - -RUN apt update && \ - apt install -y jq - -RUN pip install pip --upgrade - -RUN pip install feast - -COPY feature_store.yaml /feature_store.yaml -``` - -## Values - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| affinity | object | `{}` | | -| fullnameOverride | string | `""` | | -| image.pullPolicy | string | `"IfNotPresent"` | | -| image.repository | string | `""` | [required] The repository for the Docker image | -| image.tag | string | `""` | [required] The Docker image tag | -| imagePullSecrets | list | `[]` | | -| livenessProbe.initialDelaySeconds | int | `30` | | -| livenessProbe.periodSeconds | int | `30` | | -| nameOverride | string | `""` | | -| nodeSelector | object | `{}` | | -| podAnnotations | object | `{}` | | -| podSecurityContext | object | `{}` | | -| readinessProbe.initialDelaySeconds | int | `20` | | -| readinessProbe.periodSeconds | int | `10` | | -| replicaCount | int | `1` | | -| resources | object | `{}` | | -| securityContext | object | `{}` | | -| service.port | int | `80` | | -| service.type | string | `"ClusterIP"` | | -| tolerations | list | `[]` | | \ No newline at end of file diff --git a/infra/charts/feast-python-server/README.md.gotmpl b/infra/charts/feast-python-server/README.md.gotmpl deleted file mode 100644 index cb264c0066a..00000000000 --- a/infra/charts/feast-python-server/README.md.gotmpl +++ /dev/null @@ -1,29 +0,0 @@ -# Feast Python Feature Server Helm Charts (deprecated) - -> Note: this helm chart is deprecated in favor of [feast-feature-server](../feast-feature-server/README.md) - -Current chart version is `{{ template "chart.version" . }}` - -## Installation -Docker repository and tag are required. Helm install example: -``` -helm install feast-python-server . --set image.repository=REPO --set image.tag=TAG -``` - -Deployment assumes that `feature_store.yaml` exists on docker image. Example docker image: -``` -FROM python:3.8 - -RUN apt update && \ - apt install -y jq - -RUN pip install pip --upgrade - -RUN pip install feast - -COPY feature_store.yaml /feature_store.yaml -``` - -{{ template "chart.requirementsSection" . }} - -{{ template "chart.valuesSection" . }} \ No newline at end of file diff --git a/infra/charts/feast-python-server/templates/_helpers.tpl b/infra/charts/feast-python-server/templates/_helpers.tpl deleted file mode 100644 index b64e10536d1..00000000000 --- a/infra/charts/feast-python-server/templates/_helpers.tpl +++ /dev/null @@ -1,52 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "feast-python-server.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "feast-python-server.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "feast-python-server.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "feast-python-server.labels" -}} -helm.sh/chart: {{ include "feast-python-server.chart" . }} -{{ include "feast-python-server.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "feast-python-server.selectorLabels" -}} -app.kubernetes.io/name: {{ include "feast-python-server.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} diff --git a/infra/charts/feast-python-server/templates/deployment.yaml b/infra/charts/feast-python-server/templates/deployment.yaml deleted file mode 100644 index 56439be658c..00000000000 --- a/infra/charts/feast-python-server/templates/deployment.yaml +++ /dev/null @@ -1,61 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "feast-python-server.fullname" . }} - labels: - {{- include "feast-python-server.labels" . | nindent 4 }} -spec: - replicas: {{ .Values.replicaCount }} - selector: - matchLabels: - {{- include "feast-python-server.selectorLabels" . | nindent 6 }} - template: - metadata: - {{- with .Values.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "feast-python-server.selectorLabels" . | nindent 8 }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - securityContext: - {{- toYaml .Values.podSecurityContext | nindent 8 }} - containers: - - name: {{ .Chart.Name }} - securityContext: - {{- toYaml .Values.securityContext | nindent 12 }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - command: ["feast", "serve", "-h", "0.0.0.0"] - ports: - - name: http - containerPort: 6566 - protocol: TCP - livenessProbe: - tcpSocket: - port: http - initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.livenessProbe.periodSeconds }} - readinessProbe: - tcpSocket: - port: http - initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.readinessProbe.periodSeconds }} - resources: - {{- toYaml .Values.resources | nindent 12 }} - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} diff --git a/infra/charts/feast-python-server/templates/service.yaml b/infra/charts/feast-python-server/templates/service.yaml deleted file mode 100644 index 86bf38a9a45..00000000000 --- a/infra/charts/feast-python-server/templates/service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ include "feast-python-server.name" . }} - labels: - {{- include "feast-python-server.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: http - protocol: TCP - name: http - selector: - {{- include "feast-python-server.selectorLabels" . | nindent 4 }} diff --git a/infra/charts/feast-python-server/values.yaml b/infra/charts/feast-python-server/values.yaml deleted file mode 100644 index 6d0ab9c0ae4..00000000000 --- a/infra/charts/feast-python-server/values.yaml +++ /dev/null @@ -1,59 +0,0 @@ -# Default values for feast. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -replicaCount: 1 - -image: - # image.repository -- [required] The repository for the Docker image - repository: "" - pullPolicy: IfNotPresent - # image.tag -- [required] The Docker image tag - tag: "" - -imagePullSecrets: [] -nameOverride: "" -fullnameOverride: "" - -podAnnotations: {} - -podSecurityContext: {} - # fsGroup: 2000 - -securityContext: {} - # capabilities: - # drop: - # - ALL - # readOnlyRootFilesystem: true - # runAsNonRoot: true - # runAsUser: 1000 - -service: - type: ClusterIP - port: 80 - -resources: {} - # We usually recommend not to specify default resources and to leave this as a conscious - # choice for the user. This also increases chances charts run on environments with little - # resources, such as Minikube. If you do want to specify resources, uncomment the following - # lines, adjust them as necessary, and remove the curly braces after 'resources:'. - # limits: - # cpu: 100m - # memory: 128Mi - # requests: - # cpu: 100m - # memory: 128Mi - -nodeSelector: {} - -tolerations: [] - -affinity: {} - -livenessProbe: - initialDelaySeconds: 30 - periodSeconds: 30 - -readinessProbe: - initialDelaySeconds: 20 - periodSeconds: 10 diff --git a/infra/scripts/helm/push-helm-charts.sh b/infra/scripts/helm/push-helm-charts.sh index 1c32ee985b8..338751c28b8 100755 --- a/infra/scripts/helm/push-helm-charts.sh +++ b/infra/scripts/helm/push-helm-charts.sh @@ -16,10 +16,8 @@ helm repo add feast-helm-chart-repo $bucket cd infra/charts helm package feast -helm package feast-python-server helm package feast-feature-server helm gcs push --public feast-${1}.tgz feast-helm-chart-repo --force -helm gcs push --public feast-python-server-${1}.tgz feast-helm-chart-repo --force helm gcs push --public feast-feature-server-${1}.tgz feast-helm-chart-repo --force rm -f ./*.tgz \ No newline at end of file diff --git a/infra/scripts/release/files_to_bump.txt b/infra/scripts/release/files_to_bump.txt index d7588185ded..61a70ac6b3c 100644 --- a/infra/scripts/release/files_to_bump.txt +++ b/infra/scripts/release/files_to_bump.txt @@ -7,8 +7,6 @@ infra/charts/feast/charts/feature-server/Chart.yaml 4 5 infra/charts/feast/charts/feature-server/README.md 3 20 infra/charts/feast/charts/feature-server/values.yaml 8 infra/charts/feast/README.md 11 68 69 -infra/charts/feast-python-server/Chart.yaml 5 -infra/charts/feast-python-server/README.md 5 infra/charts/feast-feature-server/Chart.yaml 5 infra/charts/feast-feature-server/README.md 3 infra/charts/feast-feature-server/values.yaml 12 From 5c9b6fe687188bb1a316e2368d79042b6a8841da Mon Sep 17 00:00:00 2001 From: Danny Chiao Date: Tue, 8 Nov 2022 11:07:29 -0500 Subject: [PATCH 14/30] docs: Fix docs on push API in feature server (#3320) Signed-off-by: Danny Chiao Signed-off-by: Danny Chiao --- .../feature-servers/python-feature-server.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/reference/feature-servers/python-feature-server.md b/docs/reference/feature-servers/python-feature-server.md index d18bdc4f42e..c189f97ae03 100644 --- a/docs/reference/feature-servers/python-feature-server.md +++ b/docs/reference/feature-servers/python-feature-server.md @@ -157,20 +157,22 @@ curl -X POST \ The Python feature server also exposes an endpoint for [push sources](../../data-sources/push.md). This endpoint allows you to push data to the online and/or offline store. -The request definition for pushmode is a string parameter `to` where the options are: \["online", "offline", "online\_and\_offline"]. Note that timestamps need to be strings. +The request definition for `PushMode` is a string parameter `to` where the options are: \[`"online"`, `"offline"`, `"online_and_offline"`]. + +**Note:** timestamps need to be strings, and might need to be timezone aware (matching the schema of the offline store) ``` curl -X POST "http://localhost:6566/push" -d '{ - "push_source_name": "driver_hourly_stats_push_source", + "push_source_name": "driver_stats_push_source", "df": { "driver_id": [1001], - "event_timestamp": ["2022-05-13 10:59:42"], + "event_timestamp": ["2022-05-13 10:59:42+00:00"], "created": ["2022-05-13 10:59:42"], "conv_rate": [1.0], "acc_rate": [1.0], "avg_daily_trips": [1000] }, - "to": "online_and_offline", + "to": "online_and_offline" }' | jq ``` @@ -179,7 +181,6 @@ or equivalently from Python: ```python import json import requests -import pandas as pd from datetime import datetime event_dict = { From ef0ed083d7f31a48b9548c5774eba54a4d647bce Mon Sep 17 00:00:00 2001 From: Felix Wang Date: Sat, 19 Nov 2022 13:33:09 -0800 Subject: [PATCH 15/30] ci: Remove code coverage upload (#3351) Remove code coverage upload Signed-off-by: Felix Wang Signed-off-by: Felix Wang --- .github/workflows/master_only.yml | 9 --------- .github/workflows/nightly-ci.yml | 11 +---------- .github/workflows/pr_integration_tests.yml | 11 +---------- .github/workflows/unit_tests.yml | 10 ---------- 4 files changed, 2 insertions(+), 39 deletions(-) diff --git a/.github/workflows/master_only.yml b/.github/workflows/master_only.yml index 51e3830fe6d..13cb341c616 100644 --- a/.github/workflows/master_only.yml +++ b/.github/workflows/master_only.yml @@ -158,15 +158,6 @@ jobs: SNOWFLAKE_CI_ROLE: ${{ secrets.SNOWFLAKE_CI_ROLE }} SNOWFLAKE_CI_WAREHOUSE: ${{ secrets.SNOWFLAKE_CI_WAREHOUSE }} run: pytest -n 8 --cov=./ --cov-report=xml --color=yes sdk/python/tests --integration --durations=5 --timeout=1200 --timeout_method=thread - - name: Upload coverage to Codecov - uses: codecov/codecov-action@v1 - with: - token: ${{ secrets.CODECOV_TOKEN }} - files: ./coverage.xml - flags: integrationtests - env_vars: OS,PYTHON - fail_ci_if_error: true - verbose: true - name: Benchmark python env: FEAST_SERVER_DOCKER_IMAGE_TAG: ${{ needs.build-lambda-docker-image.outputs.DOCKER_IMAGE_TAG }} diff --git a/.github/workflows/nightly-ci.yml b/.github/workflows/nightly-ci.yml index e1370b10b12..8eeb2f0e804 100644 --- a/.github/workflows/nightly-ci.yml +++ b/.github/workflows/nightly-ci.yml @@ -208,13 +208,4 @@ jobs: SNOWFLAKE_CI_PASSWORD: ${{ secrets.SNOWFLAKE_CI_PASSWORD }} SNOWFLAKE_CI_ROLE: ${{ secrets.SNOWFLAKE_CI_ROLE }} SNOWFLAKE_CI_WAREHOUSE: ${{ secrets.SNOWFLAKE_CI_WAREHOUSE }} - run: pytest -n 8 --cov=./ --cov-report=xml --color=yes sdk/python/tests --integration --durations=5 --timeout=1200 --timeout_method=thread - - name: Upload coverage to Codecov - uses: codecov/codecov-action@v1 - with: - token: ${{ secrets.CODECOV_TOKEN }} - files: ./coverage.xml - flags: integrationtests - env_vars: OS,PYTHON - fail_ci_if_error: true - verbose: true \ No newline at end of file + run: pytest -n 8 --cov=./ --cov-report=xml --color=yes sdk/python/tests --integration --durations=5 --timeout=1200 --timeout_method=thread \ No newline at end of file diff --git a/.github/workflows/pr_integration_tests.yml b/.github/workflows/pr_integration_tests.yml index ab8a79760f2..7c92c293a60 100644 --- a/.github/workflows/pr_integration_tests.yml +++ b/.github/workflows/pr_integration_tests.yml @@ -182,13 +182,4 @@ jobs: SNOWFLAKE_CI_PASSWORD: ${{ secrets.SNOWFLAKE_CI_PASSWORD }} SNOWFLAKE_CI_ROLE: ${{ secrets.SNOWFLAKE_CI_ROLE }} SNOWFLAKE_CI_WAREHOUSE: ${{ secrets.SNOWFLAKE_CI_WAREHOUSE }} - run: pytest -n 8 --cov=./ --cov-report=xml --color=yes sdk/python/tests --integration --durations=5 --timeout=1200 --timeout_method=thread - - name: Upload coverage to Codecov - uses: codecov/codecov-action@v1 - with: - token: ${{ secrets.CODECOV_TOKEN }} - files: ./coverage.xml - flags: integrationtests - env_vars: OS,PYTHON - fail_ci_if_error: true - verbose: true \ No newline at end of file + run: pytest -n 8 --cov=./ --cov-report=xml --color=yes sdk/python/tests --integration --durations=5 --timeout=1200 --timeout_method=thread \ No newline at end of file diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml index ebc09f0080e..ea8bef2e2fa 100644 --- a/.github/workflows/unit_tests.yml +++ b/.github/workflows/unit_tests.yml @@ -70,16 +70,6 @@ jobs: run: make install-python-ci-dependencies - name: Test Python run: pytest -n 8 --cov=./ --cov-report=xml --color=yes sdk/python/tests - - name: Upload coverage to Codecov - uses: codecov/codecov-action@v1 - if: github.repository == 'feast-dev/feast' - with: - token: ${{ secrets.CODECOV_TOKEN }} - files: ./coverage.xml - flags: unittests - env_vars: OS,PYTHON - fail_ci_if_error: true - verbose: true unit-test-go: runs-on: ubuntu-latest From 76ae9ca541a4811f64059a1c33d81a41785f9277 Mon Sep 17 00:00:00 2001 From: k10 <40850370+ketangangal@users.noreply.github.com> Date: Mon, 21 Nov 2022 07:56:39 +0530 Subject: [PATCH 16/30] docs: Correction in spelling mistake in file_source.py line number 59 (#3354) Correction in spelling mistake in file_source.py line number 59 Signed-off-by: ketanGangal Signed-off-by: ketanGangal --- sdk/python/feast/infra/offline_stores/file_source.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/python/feast/infra/offline_stores/file_source.py b/sdk/python/feast/infra/offline_stores/file_source.py index 81a83c22457..e9f3735dee6 100644 --- a/sdk/python/feast/infra/offline_stores/file_source.py +++ b/sdk/python/feast/infra/offline_stores/file_source.py @@ -56,7 +56,7 @@ def __init__( tags (optional): A dictionary of key-value pairs to store arbitrary metadata. owner (optional): The owner of the file source, typically the email of the primary maintainer. - timestamp_field (optional): Event timestamp foe;d used for point in time + timestamp_field (optional): Event timestamp field used for point in time joins of feature values. Examples: From 2cb5f0d05a1070cc6b50e9c86c2108b3439ee65a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 20 Nov 2022 22:03:36 -0800 Subject: [PATCH 17/30] chore: Bump loader-utils from 1.4.0 to 1.4.2 in /ui (#3344) Bumps [loader-utils](https://github.com/webpack/loader-utils) from 1.4.0 to 1.4.2. - [Release notes](https://github.com/webpack/loader-utils/releases) - [Changelog](https://github.com/webpack/loader-utils/blob/v1.4.2/CHANGELOG.md) - [Commits](https://github.com/webpack/loader-utils/compare/v1.4.0...v1.4.2) --- updated-dependencies: - dependency-name: loader-utils dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui/yarn.lock | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/ui/yarn.lock b/ui/yarn.lock index 948eb78796e..16e34b029df 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -7224,9 +7224,9 @@ loader-runner@^4.2.0: integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== loader-utils@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + version "1.4.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" @@ -7551,11 +7551,16 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.1.1, minimist@^1.2.5: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +minimist@^1.2.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + mkdirp@^0.5.5, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" From ea94aa2f8d9ad9ee259d168c6aac0b69299f4b49 Mon Sep 17 00:00:00 2001 From: Deepyaman Datta Date: Mon, 21 Nov 2022 01:05:32 -0500 Subject: [PATCH 18/30] docs: Fix repeated field in `DataSource` docstring (#3350) Signed-off-by: Deepyaman Datta Signed-off-by: Deepyaman Datta --- sdk/python/feast/data_source.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/sdk/python/feast/data_source.py b/sdk/python/feast/data_source.py index 54a68ed0480..05df7a90976 100644 --- a/sdk/python/feast/data_source.py +++ b/sdk/python/feast/data_source.py @@ -182,8 +182,6 @@ class DataSource(ABC): tags (optional): A dictionary of key-value pairs to store arbitrary metadata. owner (optional): The owner of the data source, typically the email of the primary maintainer. - timestamp_field (optional): Event timestamp field used for point in time - joins of feature values. date_partition_column (optional): Timestamp column used for partitioning. Not supported by all offline stores. """ From 891231af38cd9a0fbcc45e59db1769a7d30ab4d9 Mon Sep 17 00:00:00 2001 From: Amith Adiraju Date: Sun, 20 Nov 2022 22:47:33 -0800 Subject: [PATCH 19/30] chore: Provide related exceptions for empty data frame from entity sql execution in spark sql query execution. (#3323) 1. Modified spark.py, to raise error from current file regarding empty data from entity sql execution, than from separate module. 2. Removed spark_utils.py 3. Removed un-necessary files from git repo and changed gitignore accordingly. Formatted spark.py with make for better linting Signed-off-by: amithadiraju1694 Signed-off-by: amithadiraju1694 --- .gitignore | 2 +- .../offline_stores/contrib/spark_offline_store/spark.py | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 6a86eb2682b..e4e82bfce46 100644 --- a/.gitignore +++ b/.gitignore @@ -223,4 +223,4 @@ ui/.vercel **/yarn-error.log* # Go subprocess binaries (built during feast pip package building) -sdk/python/feast/binaries/ +sdk/python/feast/binaries/ \ No newline at end of file diff --git a/sdk/python/feast/infra/offline_stores/contrib/spark_offline_store/spark.py b/sdk/python/feast/infra/offline_stores/contrib/spark_offline_store/spark.py index 01f89f80bb7..665a65fec53 100644 --- a/sdk/python/feast/infra/offline_stores/contrib/spark_offline_store/spark.py +++ b/sdk/python/feast/infra/offline_stores/contrib/spark_offline_store/spark.py @@ -18,7 +18,7 @@ from feast import FeatureView, OnDemandFeatureView from feast.data_source import DataSource -from feast.errors import InvalidEntityType +from feast.errors import EntitySQLEmptyResults, InvalidEntityType from feast.feature_view import DUMMY_ENTITY_ID, DUMMY_ENTITY_VAL from feast.infra.offline_stores import offline_utils from feast.infra.offline_stores.contrib.spark_offline_store.spark_source import ( @@ -449,7 +449,13 @@ def _get_entity_df_event_timestamp_range( # If the entity_df is a string (SQL query), determine range # from table df = spark_session.sql(entity_df).select(entity_df_event_timestamp_col) + + # Checks if executing entity sql resulted in any data + if df.rdd.isEmpty(): + raise EntitySQLEmptyResults(entity_df) + # TODO(kzhang132): need utc conversion here. + entity_df_event_timestamp_range = ( df.agg({entity_df_event_timestamp_col: "min"}).collect()[0][0], df.agg({entity_df_event_timestamp_col: "max"}).collect()[0][0], From 4d6932ca53c4c88b9b7ea207b2e2cbcf8d62682d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 20 Nov 2022 22:48:30 -0800 Subject: [PATCH 20/30] chore: Bump loader-utils from 2.0.2 to 2.0.4 in /sdk/python/feast/ui (#3346) Bumps [loader-utils](https://github.com/webpack/loader-utils) from 2.0.2 to 2.0.4. - [Release notes](https://github.com/webpack/loader-utils/releases) - [Changelog](https://github.com/webpack/loader-utils/blob/v2.0.4/CHANGELOG.md) - [Commits](https://github.com/webpack/loader-utils/compare/v2.0.2...v2.0.4) --- updated-dependencies: - dependency-name: loader-utils dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- sdk/python/feast/ui/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/python/feast/ui/yarn.lock b/sdk/python/feast/ui/yarn.lock index 66abae62440..d6181e46eac 100644 --- a/sdk/python/feast/ui/yarn.lock +++ b/sdk/python/feast/ui/yarn.lock @@ -6888,9 +6888,9 @@ loader-runner@^4.2.0: integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== loader-utils@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" - integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" From 2f189572493cb498243bf7d6ec12d768f4b90ee7 Mon Sep 17 00:00:00 2001 From: Amith Adiraju Date: Wed, 23 Nov 2022 11:53:45 -0800 Subject: [PATCH 21/30] feat: Get Snowflake Query Output As Pyspark Dataframe (#2504) (#3358) 1. Added feature to offline_store-> snowflake.py to return results of snowflake query as pyspark data frame.This helps spark-based users to distribute data, which often doesn't fit in driver nodes through pandas output. 2. Also added relevant error class, to notify user on missing spark session , particular to this usecase. Signed-off-by: amithadiraju1694 Signed-off-by: amithadiraju1694 --- sdk/python/feast/errors.py | 8 ++++ .../feast/infra/offline_stores/snowflake.py | 46 ++++++++++++++++++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/sdk/python/feast/errors.py b/sdk/python/feast/errors.py index 15ba86781df..042a3622a98 100644 --- a/sdk/python/feast/errors.py +++ b/sdk/python/feast/errors.py @@ -56,6 +56,14 @@ def __init__(self, name, project=None): super().__init__(f"Feature view {name} does not exist") +class InvalidSparkSessionException(Exception): + def __init__(self, spark_arg): + super().__init__( + f" Need Spark Session to convert results to spark data frame\ + recieved {type(spark_arg)} instead. " + ) + + class OnDemandFeatureViewNotFoundException(FeastObjectNotFoundException): def __init__(self, name, project=None): if project: diff --git a/sdk/python/feast/infra/offline_stores/snowflake.py b/sdk/python/feast/infra/offline_stores/snowflake.py index 2d621de50ff..330c2ffae54 100644 --- a/sdk/python/feast/infra/offline_stores/snowflake.py +++ b/sdk/python/feast/infra/offline_stores/snowflake.py @@ -1,7 +1,9 @@ import contextlib import os import uuid +import warnings from datetime import datetime +from functools import reduce from pathlib import Path from typing import ( Any, @@ -21,11 +23,16 @@ import pyarrow from pydantic import Field, StrictStr from pydantic.typing import Literal +from pyspark.sql import DataFrame, SparkSession from pytz import utc from feast import OnDemandFeatureView from feast.data_source import DataSource -from feast.errors import EntitySQLEmptyResults, InvalidEntityType +from feast.errors import ( + EntitySQLEmptyResults, + InvalidEntityType, + InvalidSparkSessionException, +) from feast.feature_logging import LoggingConfig, LoggingSource from feast.feature_view import DUMMY_ENTITY_ID, DUMMY_ENTITY_VAL, FeatureView from feast.infra.offline_stores import offline_utils @@ -57,6 +64,8 @@ raise FeastExtrasDependencyImportError("snowflake", str(e)) +warnings.filterwarnings("ignore", category=DeprecationWarning) + class SnowflakeOfflineStoreConfig(FeastConfigBaseModel): """Offline store config for Snowflake""" @@ -447,6 +456,41 @@ def to_sql(self) -> str: with self._query_generator() as query: return query + def to_spark_df(self, spark_session: SparkSession) -> DataFrame: + """ + Method to convert snowflake query results to pyspark data frame. + + Args: + spark_session: spark Session variable of current environment. + + Returns: + spark_df: A pyspark dataframe. + """ + + if isinstance(spark_session, SparkSession): + with self._query_generator() as query: + + arrow_batches = execute_snowflake_statement( + self.snowflake_conn, query + ).fetch_arrow_batches() + + if arrow_batches: + spark_df = reduce( + DataFrame.unionAll, + [ + spark_session.createDataFrame(batch.to_pandas()) + for batch in arrow_batches + ], + ) + + return spark_df + + else: + raise EntitySQLEmptyResults(query) + + else: + raise InvalidSparkSessionException(spark_session) + def persist(self, storage: SavedDatasetStorage, allow_overwrite: bool = False): assert isinstance(storage, SavedDatasetSnowflakeStorage) self.to_snowflake(table_name=storage.snowflake_options.table) From 2733368add83bc009b0d1680d995222d5eff75b0 Mon Sep 17 00:00:00 2001 From: Oliver Holworthy Date: Mon, 28 Nov 2022 17:30:40 +0000 Subject: [PATCH 22/30] chore: Remove upper bound on dask dependency (#3343) Remove upper bound on dask dependency Signed-off-by: Oliver Holworthy Signed-off-by: Oliver Holworthy --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index fbd3cf5368f..2764faa6973 100644 --- a/setup.py +++ b/setup.py @@ -74,7 +74,7 @@ "typeguard", "fastapi>=0.68.0,<1", "uvicorn[standard]>=0.14.0,<1", - "dask>=2021.*,<2022.02.0", + "dask>=2021.*", "bowler", # Needed for automatic repo upgrades ] From 00fa21f9ebef496a6801974cfd3a0a0b4861a11e Mon Sep 17 00:00:00 2001 From: Stefano Lottini Date: Tue, 29 Nov 2022 15:29:07 +0100 Subject: [PATCH 23/30] feat: Cassandra online store, concurrent fetching for multiple entities (#3356) concurrent fetching for multiple entities minimal handling of exceptions in concurrent query execution read_concurrency parameter in Cassandra online store config yaml Signed-off-by: Stefano Lottini Signed-off-by: Stefano Lottini Co-authored-by: Stefano Lottini --- docs/reference/online-stores/cassandra.md | 3 +- .../contrib/cassandra_online_store/README.md | 10 +++ .../cassandra_online_store.py | 77 +++++++++++++------ .../feast/templates/cassandra/bootstrap.py | 27 +++++-- .../cassandra/feature_repo/feature_store.yaml | 1 + 5 files changed, 88 insertions(+), 30 deletions(-) diff --git a/docs/reference/online-stores/cassandra.md b/docs/reference/online-stores/cassandra.md index e012ad250ae..663a7f6eaca 100644 --- a/docs/reference/online-stores/cassandra.md +++ b/docs/reference/online-stores/cassandra.md @@ -32,6 +32,7 @@ online_store: load_balancing: # optional local_dc: 'datacenter1' # optional load_balancing_policy: 'TokenAwarePolicy(DCAwareRoundRobinPolicy)' # optional + read_concurrency: 100 # optional ``` {% endcode %} @@ -52,7 +53,7 @@ online_store: load_balancing: # optional local_dc: 'eu-central-1' # optional load_balancing_policy: 'TokenAwarePolicy(DCAwareRoundRobinPolicy)' # optional - + read_concurrency: 100 # optional ``` {% endcode %} diff --git a/sdk/python/feast/infra/online_stores/contrib/cassandra_online_store/README.md b/sdk/python/feast/infra/online_stores/contrib/cassandra_online_store/README.md index 3dea1917aa1..a8d7a0ec027 100644 --- a/sdk/python/feast/infra/online_stores/contrib/cassandra_online_store/README.md +++ b/sdk/python/feast/infra/online_stores/contrib/cassandra_online_store/README.md @@ -58,6 +58,7 @@ online_store: load_balancing: # optional local_dc: 'datacenter1' # optional load_balancing_policy: 'TokenAwarePolicy(DCAwareRoundRobinPolicy)' # optional + read_concurrency: 100 # optional ``` #### Astra DB setup: @@ -84,6 +85,7 @@ online_store: load_balancing: # optional local_dc: 'eu-central-1' # optional load_balancing_policy: 'TokenAwarePolicy(DCAwareRoundRobinPolicy)' # optional + read_concurrency: 100 # optional ``` #### Protocol version and load-balancing settings @@ -111,6 +113,14 @@ The former parameter is a region name for Astra DB instances (as can be verified See the source code of the online store integration for the allowed values of the latter parameter. +#### Read concurrency value + +You can optionally specify the value of `read_concurrency`, which will be +passed to the Cassandra driver function handling +[concurrent reading of multiple entities](https://docs.datastax.com/en/developer/python-driver/3.25/api/cassandra/concurrent/#module-cassandra.concurrent). +Consult the reference for guidance on this parameter (which in most cases can be left to its default value of 100). +This is relevant only for retrieval of several entities at once. + ### More info For a more detailed walkthrough, please see the diff --git a/sdk/python/feast/infra/online_stores/contrib/cassandra_online_store/cassandra_online_store.py b/sdk/python/feast/infra/online_stores/contrib/cassandra_online_store/cassandra_online_store.py index 71d3167c46f..e13fd4cfba4 100644 --- a/sdk/python/feast/infra/online_stores/contrib/cassandra_online_store/cassandra_online_store.py +++ b/sdk/python/feast/infra/online_stores/contrib/cassandra_online_store/cassandra_online_store.py @@ -30,6 +30,7 @@ ResultSet, Session, ) +from cassandra.concurrent import execute_concurrent_with_args from cassandra.policies import DCAwareRoundRobinPolicy, TokenAwarePolicy from cassandra.query import PreparedStatement from pydantic import StrictFloat, StrictInt, StrictStr @@ -166,6 +167,14 @@ class CassandraLoadBalancingPolicy(FeastConfigBaseModel): wrapped into an execution profile if present. """ + read_concurrency: Optional[StrictInt] = 100 + """ + Value of the `concurrency` parameter internally passed to Cassandra driver's + `execute_concurrent_with_args ` call. + See https://docs.datastax.com/en/developer/python-driver/3.25/api/cassandra/concurrent/#module-cassandra.concurrent . + Default: 100. + """ + class CassandraOnlineStore(OnlineStore): """ @@ -358,32 +367,36 @@ def online_read( result: List[Tuple[Optional[datetime], Optional[Dict[str, ValueProto]]]] = [] - for entity_key in entity_keys: - entity_key_bin = serialize_entity_key( + entity_key_bins = [ + serialize_entity_key( entity_key, entity_key_serialization_version=config.entity_key_serialization_version, ).hex() + for entity_key in entity_keys + ] + + with tracing_span(name="remote_call"): + feature_rows_sequence = self._read_rows_by_entity_keys( + config, + project, + table, + entity_key_bins, + columns=["feature_name", "value", "event_ts"], + ) - with tracing_span(name="remote_call"): - feature_rows = self._read_rows_by_entity_key( - config, - project, - table, - entity_key_bin, - columns=["feature_name", "value", "event_ts"], - ) - + for entity_key_bin, feature_rows in zip(entity_key_bins, feature_rows_sequence): res = {} res_ts = None - for feature_row in feature_rows: - if ( - requested_features is None - or feature_row.feature_name in requested_features - ): - val = ValueProto() - val.ParseFromString(feature_row.value) - res[feature_row.feature_name] = val - res_ts = feature_row.event_ts + if feature_rows: + for feature_row in feature_rows: + if ( + requested_features is None + or feature_row.feature_name in requested_features + ): + val = ValueProto() + val.ParseFromString(feature_row.value) + res[feature_row.feature_name] = val + res_ts = feature_row.event_ts if not res: result.append((None, None)) else: @@ -479,12 +492,12 @@ def _write_rows( params, ) - def _read_rows_by_entity_key( + def _read_rows_by_entity_keys( self, config: RepoConfig, project: str, table: FeatureView, - entity_key_bin: str, + entity_key_bins: List[str], columns: Optional[List[str]] = None, ) -> ResultSet: """ @@ -500,7 +513,25 @@ def _read_rows_by_entity_key( fqtable=fqtable, columns=projection_columns, ) - return session.execute(select_cql, [entity_key_bin]) + retrieval_results = execute_concurrent_with_args( + session, + select_cql, + ((entity_key_bin,) for entity_key_bin in entity_key_bins), + concurrency=config.online_store.read_concurrency, + ) + # execute_concurrent_with_args return a sequence + # of (success, result_or_exception) pairs: + returned_sequence = [] + for success, result_or_exception in retrieval_results: + if success: + returned_sequence.append(result_or_exception) + else: + # an exception + logger.error( + f"Cassandra online store exception during concurrent fetching: {str(result_or_exception)}" + ) + returned_sequence.append(None) + return returned_sequence def _drop_table( self, diff --git a/sdk/python/feast/templates/cassandra/bootstrap.py b/sdk/python/feast/templates/cassandra/bootstrap.py index 464eba271fe..f66ae99eff7 100644 --- a/sdk/python/feast/templates/cassandra/bootstrap.py +++ b/sdk/python/feast/templates/cassandra/bootstrap.py @@ -70,7 +70,7 @@ def collect_cassandra_store_settings(): sys.exit(1) needs_port = click.confirm("Need to specify port?", default=False) if needs_port: - c_port = click.prompt("Port to use", default=9042, type=int) + c_port = click.prompt(" Port to use", default=9042, type=int) else: c_port = None use_auth = click.confirm( @@ -78,8 +78,8 @@ def collect_cassandra_store_settings(): default=False, ) if use_auth: - c_username = click.prompt("Database username") - c_password = click.prompt("Database password", hide_input=True) + c_username = click.prompt(" Database username") + c_password = click.prompt(" Database password", hide_input=True) else: c_username = None c_password = None @@ -95,7 +95,7 @@ def collect_cassandra_store_settings(): ) if specify_protocol_version: c_protocol_version = click.prompt( - "Protocol version", + " Protocol version", default={"A": 4, "C": 5}.get(db_type, 5), type=int, ) @@ -105,11 +105,11 @@ def collect_cassandra_store_settings(): specify_lb = click.confirm("Specify load-balancing?", default=False) if specify_lb: c_local_dc = click.prompt( - "Local datacenter (for load-balancing)", + " Local datacenter (for load-balancing)", default="datacenter1" if db_type == "C" else None, ) c_load_balancing_policy = click.prompt( - "Load-balancing policy", + " Load-balancing policy", type=click.Choice( [ "TokenAwarePolicy(DCAwareRoundRobinPolicy)", @@ -122,6 +122,12 @@ def collect_cassandra_store_settings(): c_local_dc = None c_load_balancing_policy = None + needs_concurrency = click.confirm("Specify read concurrency level?", default=False) + if needs_concurrency: + c_concurrency = click.prompt(" Concurrency level?", default=100, type=int) + else: + c_concurrency = None + return { "c_secure_bundle_path": c_secure_bundle_path, "c_hosts": c_hosts, @@ -132,6 +138,7 @@ def collect_cassandra_store_settings(): "c_protocol_version": c_protocol_version, "c_local_dc": c_local_dc, "c_load_balancing_policy": c_load_balancing_policy, + "c_concurrency": c_concurrency, } @@ -149,6 +156,7 @@ def apply_cassandra_store_settings(config_file, settings): 'c_protocol_version' 'c_local_dc' 'c_load_balancing_policy' + 'c_concurrency' """ write_setting_or_remove( config_file, @@ -216,6 +224,13 @@ def apply_cassandra_store_settings(config_file, settings): remove_lines_from_file(config_file, "load_balancing:") remove_lines_from_file(config_file, "local_dc:") remove_lines_from_file(config_file, "load_balancing_policy:") + # + write_setting_or_remove( + config_file, + settings["c_concurrency"], + "read_concurrency", + "100", + ) def bootstrap(): diff --git a/sdk/python/feast/templates/cassandra/feature_repo/feature_store.yaml b/sdk/python/feast/templates/cassandra/feature_repo/feature_store.yaml index 076a0d7c6b4..b43790eda23 100644 --- a/sdk/python/feast/templates/cassandra/feature_repo/feature_store.yaml +++ b/sdk/python/feast/templates/cassandra/feature_repo/feature_store.yaml @@ -16,4 +16,5 @@ online_store: load_balancing: local_dc: c_local_dc load_balancing_policy: c_load_balancing_policy + read_concurrency: 100 entity_key_serialization_version: 2 From 0c20a4e6ac95d7c28299a95d91024be4370ef7ed Mon Sep 17 00:00:00 2001 From: Danny Chiao Date: Thu, 1 Dec 2022 15:57:04 -0500 Subject: [PATCH 24/30] fix: Enable Spark materialization on Yarn (#3370) * fix: Fix Spark materialization engine to work on Yarn Signed-off-by: Danny Chiao * fix Signed-off-by: Danny Chiao * fix Signed-off-by: Danny Chiao * add docs Signed-off-by: Danny Chiao Signed-off-by: Danny Chiao --- docs/reference/batch-materialization/spark.md | 34 +++++++++++++++++++ .../spark/spark_materialization_engine.py | 12 +++---- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/docs/reference/batch-materialization/spark.md b/docs/reference/batch-materialization/spark.md index ce58c0ad0fd..27a1388c48e 100644 --- a/docs/reference/batch-materialization/spark.md +++ b/docs/reference/batch-materialization/spark.md @@ -19,3 +19,37 @@ batch_engine: partitions: [optional num partitions to use to write to online store] ``` {% endcode %} + +## Example in Python + +{% code title="feature_store.py" %} +```python +from feast import FeatureStore, RepoConfig +from feast.repo_config import RegistryConfig +from feast.infra.online_stores.dynamodb import DynamoDBOnlineStoreConfig +from feast.infra.offline_stores.contrib.spark_offline_store.spark import SparkOfflineStoreConfig + +repo_config = RepoConfig( + registry="s3://[YOUR_BUCKET]/feast-registry.db", + project="feast_repo", + provider="aws", + offline_store=SparkOfflineStoreConfig( + spark_conf={ + "spark.ui.enabled": "false", + "spark.eventLog.enabled": "false", + "spark.sql.catalogImplementation": "hive", + "spark.sql.parser.quotedRegexColumnNames": "true", + "spark.sql.session.timeZone": "UTC" + } + ), + batch_engine={ + "type": "spark.engine", + "partitions": 10 + }, + online_store=DynamoDBOnlineStoreConfig(region="us-west-1"), + entity_key_serialization_version=2 +) + +store = FeatureStore(config=repo_config) +``` +{% endcode %} \ No newline at end of file diff --git a/sdk/python/feast/infra/materialization/contrib/spark/spark_materialization_engine.py b/sdk/python/feast/infra/materialization/contrib/spark/spark_materialization_engine.py index 66eb97bca78..00f2c950a28 100644 --- a/sdk/python/feast/infra/materialization/contrib/spark/spark_materialization_engine.py +++ b/sdk/python/feast/infra/materialization/contrib/spark/spark_materialization_engine.py @@ -1,4 +1,3 @@ -import tempfile from dataclasses import dataclass from datetime import datetime from typing import Callable, List, Literal, Optional, Sequence, Union @@ -196,7 +195,7 @@ class _SparkSerializedArtifacts: """Class to assist with serializing unpicklable artifacts to the spark workers""" feature_view_proto: str - repo_config_file: str + repo_config_byte: str @classmethod def serialize(cls, feature_view, repo_config): @@ -205,12 +204,10 @@ def serialize(cls, feature_view, repo_config): feature_view_proto = feature_view.to_proto().SerializeToString() # serialize repo_config to disk. Will be used to instantiate the online store - repo_config_file = tempfile.NamedTemporaryFile(delete=False).name - with open(repo_config_file, "wb") as f: - dill.dump(repo_config, f) + repo_config_byte = dill.dumps(repo_config) return _SparkSerializedArtifacts( - feature_view_proto=feature_view_proto, repo_config_file=repo_config_file + feature_view_proto=feature_view_proto, repo_config_byte=repo_config_byte ) def unserialize(self): @@ -220,8 +217,7 @@ def unserialize(self): feature_view = FeatureView.from_proto(proto) # load - with open(self.repo_config_file, "rb") as f: - repo_config = dill.load(f) + repo_config = dill.loads(self.repo_config_byte) provider = PassthroughProvider(repo_config) online_store = provider.online_store From eaf354cde27c8f3a46ac256a71ad5ec06dfd70b3 Mon Sep 17 00:00:00 2001 From: Stefano Lottini Date: Fri, 2 Dec 2022 02:22:09 +0100 Subject: [PATCH 25/30] feat: Cassandra online store, concurrency in bulk write operations (#3367) Concurrency in materialize and any bulk write operation write_concurrency parameter in configuration and bootstrap guided procedure Signed-off-by: Stefano Lottini Signed-off-by: Stefano Lottini Co-authored-by: Stefano Lottini --- docs/reference/online-stores/cassandra.md | 2 + .../contrib/cassandra_online_store/README.md | 14 +-- .../cassandra_online_store.py | 89 ++++++++++--------- .../feast/templates/cassandra/bootstrap.py | 32 +++++-- .../cassandra/feature_repo/feature_store.yaml | 3 +- 5 files changed, 84 insertions(+), 56 deletions(-) diff --git a/docs/reference/online-stores/cassandra.md b/docs/reference/online-stores/cassandra.md index 663a7f6eaca..30514305b6a 100644 --- a/docs/reference/online-stores/cassandra.md +++ b/docs/reference/online-stores/cassandra.md @@ -33,6 +33,7 @@ online_store: local_dc: 'datacenter1' # optional load_balancing_policy: 'TokenAwarePolicy(DCAwareRoundRobinPolicy)' # optional read_concurrency: 100 # optional + write_concurrency: 100 # optional ``` {% endcode %} @@ -54,6 +55,7 @@ online_store: local_dc: 'eu-central-1' # optional load_balancing_policy: 'TokenAwarePolicy(DCAwareRoundRobinPolicy)' # optional read_concurrency: 100 # optional + write_concurrency: 100 # optional ``` {% endcode %} diff --git a/sdk/python/feast/infra/online_stores/contrib/cassandra_online_store/README.md b/sdk/python/feast/infra/online_stores/contrib/cassandra_online_store/README.md index a8d7a0ec027..7d9393f30ec 100644 --- a/sdk/python/feast/infra/online_stores/contrib/cassandra_online_store/README.md +++ b/sdk/python/feast/infra/online_stores/contrib/cassandra_online_store/README.md @@ -59,6 +59,7 @@ online_store: local_dc: 'datacenter1' # optional load_balancing_policy: 'TokenAwarePolicy(DCAwareRoundRobinPolicy)' # optional read_concurrency: 100 # optional + write_concurrency: 100 # optional ``` #### Astra DB setup: @@ -86,6 +87,7 @@ online_store: local_dc: 'eu-central-1' # optional load_balancing_policy: 'TokenAwarePolicy(DCAwareRoundRobinPolicy)' # optional read_concurrency: 100 # optional + write_concurrency: 100 # optional ``` #### Protocol version and load-balancing settings @@ -113,13 +115,13 @@ The former parameter is a region name for Astra DB instances (as can be verified See the source code of the online store integration for the allowed values of the latter parameter. -#### Read concurrency value +#### Read/write concurrency value -You can optionally specify the value of `read_concurrency`, which will be -passed to the Cassandra driver function handling -[concurrent reading of multiple entities](https://docs.datastax.com/en/developer/python-driver/3.25/api/cassandra/concurrent/#module-cassandra.concurrent). -Consult the reference for guidance on this parameter (which in most cases can be left to its default value of 100). -This is relevant only for retrieval of several entities at once. +You can optionally specify the value of `read_concurrency` and `write_concurrency`, +which will be passed to the Cassandra driver function handling +[concurrent reading/writing of multiple entities](https://docs.datastax.com/en/developer/python-driver/3.25/api/cassandra/concurrent/#module-cassandra.concurrent). +Consult the reference for guidance on this parameter (which in most cases can be left to its default value of). +This is relevant only for retrieval of several entities at once and during bulk writes, such as in the materialization step. ### More info diff --git a/sdk/python/feast/infra/online_stores/contrib/cassandra_online_store/cassandra_online_store.py b/sdk/python/feast/infra/online_stores/contrib/cassandra_online_store/cassandra_online_store.py index e13fd4cfba4..34a8cab036d 100644 --- a/sdk/python/feast/infra/online_stores/contrib/cassandra_online_store/cassandra_online_store.py +++ b/sdk/python/feast/infra/online_stores/contrib/cassandra_online_store/cassandra_online_store.py @@ -170,7 +170,15 @@ class CassandraLoadBalancingPolicy(FeastConfigBaseModel): read_concurrency: Optional[StrictInt] = 100 """ Value of the `concurrency` parameter internally passed to Cassandra driver's - `execute_concurrent_with_args ` call. + `execute_concurrent_with_args` call when reading rows from tables. + See https://docs.datastax.com/en/developer/python-driver/3.25/api/cassandra/concurrent/#module-cassandra.concurrent . + Default: 100. + """ + + write_concurrency: Optional[StrictInt] = 100 + """ + Value of the `concurrency` parameter internally passed to Cassandra driver's + `execute_concurrent_with_args` call when writing rows to tables. See https://docs.datastax.com/en/developer/python-driver/3.25/api/cassandra/concurrent/#module-cassandra.concurrent . Default: 100. """ @@ -327,21 +335,37 @@ def online_write_batch( display progress. """ project = config.project - for entity_key, values, timestamp, created_ts in data: - entity_key_bin = serialize_entity_key( - entity_key, - entity_key_serialization_version=config.entity_key_serialization_version, - ).hex() - with tracing_span(name="remote_call"): - self._write_rows( - config, - project, - table, - entity_key_bin, - values.items(), - timestamp, - created_ts, - ) + + def unroll_insertion_tuples() -> Iterable[Tuple[str, bytes, str, datetime]]: + """ + We craft an iterable over all rows to be inserted (entities->features), + but this way we can call `progress` after each entity is done. + """ + for entity_key, values, timestamp, created_ts in data: + entity_key_bin = serialize_entity_key( + entity_key, + entity_key_serialization_version=config.entity_key_serialization_version, + ).hex() + for feature_name, val in values.items(): + params: Tuple[str, bytes, str, datetime] = ( + feature_name, + val.SerializeToString(), + entity_key_bin, + timestamp, + ) + yield params + # this happens N-1 times, will be corrected outside: + if progress: + progress(1) + + with tracing_span(name="remote_call"): + self._write_rows_concurrently( + config, + project, + table, + unroll_insertion_tuples(), + ) + # correction for the last missing call to `progress`: if progress: progress(1) @@ -458,39 +482,24 @@ def _fq_table_name(keyspace: str, project: str, table: FeatureView) -> str: """ return f'"{keyspace}"."{project}_{table.name}"' - def _write_rows( + def _write_rows_concurrently( self, config: RepoConfig, project: str, table: FeatureView, - entity_key_bin: str, - features_vals: Iterable[Tuple[str, ValueProto]], - timestamp: datetime, - created_ts: Optional[datetime], + rows: Iterable[Tuple[str, bytes, str, datetime]], ): - """ - Handle the CQL (low-level) insertion of feature values to a table. - - Note: `created_ts` can be None: in that case we avoid explicitly - inserting it to prevent unnecessary tombstone creation on Cassandra. - Note: `created_ts` is being deprecated (July 2022) and the following - reflects this fact. - """ session: Session = self._get_session(config) keyspace: str = self._keyspace fqtable = CassandraOnlineStore._fq_table_name(keyspace, project, table) insert_cql = self._get_cql_statement(config, "insert4", fqtable=fqtable) - for feature_name, val in features_vals: - params: Sequence[object] = ( - feature_name, - val.SerializeToString(), - entity_key_bin, - timestamp, - ) - session.execute( - insert_cql, - params, - ) + # + execute_concurrent_with_args( + session, + insert_cql, + rows, + concurrency=config.online_store.write_concurrency, + ) def _read_rows_by_entity_keys( self, diff --git a/sdk/python/feast/templates/cassandra/bootstrap.py b/sdk/python/feast/templates/cassandra/bootstrap.py index f66ae99eff7..fa70917914f 100644 --- a/sdk/python/feast/templates/cassandra/bootstrap.py +++ b/sdk/python/feast/templates/cassandra/bootstrap.py @@ -122,11 +122,17 @@ def collect_cassandra_store_settings(): c_local_dc = None c_load_balancing_policy = None - needs_concurrency = click.confirm("Specify read concurrency level?", default=False) - if needs_concurrency: - c_concurrency = click.prompt(" Concurrency level?", default=100, type=int) + specify_concurrency = click.confirm("Specify concurrency levels?", default=False) + if specify_concurrency: + c_r_concurrency = click.prompt( + " Read-concurrency level?", default=100, type=int + ) + c_w_concurrency = click.prompt( + " Write-concurrency level?", default=100, type=int + ) else: - c_concurrency = None + c_r_concurrency = None + c_w_concurrency = None return { "c_secure_bundle_path": c_secure_bundle_path, @@ -138,7 +144,8 @@ def collect_cassandra_store_settings(): "c_protocol_version": c_protocol_version, "c_local_dc": c_local_dc, "c_load_balancing_policy": c_load_balancing_policy, - "c_concurrency": c_concurrency, + "c_r_concurrency": c_r_concurrency, + "c_w_concurrency": c_w_concurrency, } @@ -156,7 +163,8 @@ def apply_cassandra_store_settings(config_file, settings): 'c_protocol_version' 'c_local_dc' 'c_load_balancing_policy' - 'c_concurrency' + 'c_r_concurrency' + 'c_w_concurrency' """ write_setting_or_remove( config_file, @@ -224,12 +232,18 @@ def apply_cassandra_store_settings(config_file, settings): remove_lines_from_file(config_file, "load_balancing:") remove_lines_from_file(config_file, "local_dc:") remove_lines_from_file(config_file, "load_balancing_policy:") - # + write_setting_or_remove( config_file, - settings["c_concurrency"], + settings["c_r_concurrency"], "read_concurrency", - "100", + "c_r_concurrency", + ) + write_setting_or_remove( + config_file, + settings["c_w_concurrency"], + "write_concurrency", + "c_w_concurrency", ) diff --git a/sdk/python/feast/templates/cassandra/feature_repo/feature_store.yaml b/sdk/python/feast/templates/cassandra/feature_repo/feature_store.yaml index b43790eda23..ce50275554b 100644 --- a/sdk/python/feast/templates/cassandra/feature_repo/feature_store.yaml +++ b/sdk/python/feast/templates/cassandra/feature_repo/feature_store.yaml @@ -16,5 +16,6 @@ online_store: load_balancing: local_dc: c_local_dc load_balancing_policy: c_load_balancing_policy - read_concurrency: 100 + read_concurrency: c_r_concurrency + write_concurrency: c_w_concurrency entity_key_serialization_version: 2 From 4ebe00fefa337cbe96ad3c712f44b9c9d7a46ef2 Mon Sep 17 00:00:00 2001 From: Dan Herrera Date: Thu, 1 Dec 2022 17:25:08 -0800 Subject: [PATCH 26/30] fix: Update bytewax materialization (#3368) * Updates Bytewax materialization engine. - Since no data is exchanged between workers, remove k8s service definition. - Update bytewax dataflow to only use one worker. Signed-off-by: Dan Herrera * Update Bytewax to latest version. Signed-off-by: Dan Herrera * Format imports. Signed-off-by: Dan Herrera Signed-off-by: Dan Herrera --- .../bytewax_materialization_dataflow.py | 28 +++------ .../bytewax/bytewax_materialization_engine.py | 61 ++----------------- setup.py | 2 +- 3 files changed, 16 insertions(+), 75 deletions(-) diff --git a/sdk/python/feast/infra/materialization/contrib/bytewax/bytewax_materialization_dataflow.py b/sdk/python/feast/infra/materialization/contrib/bytewax/bytewax_materialization_dataflow.py index 1fad2c909fa..bf5229303ab 100644 --- a/sdk/python/feast/infra/materialization/contrib/bytewax/bytewax_materialization_dataflow.py +++ b/sdk/python/feast/infra/materialization/contrib/bytewax/bytewax_materialization_dataflow.py @@ -3,9 +3,10 @@ import pyarrow as pa import pyarrow.parquet as pq import s3fs -from bytewax import Dataflow, cluster_main # type: ignore -from bytewax.inputs import AdvanceTo, Emit, ManualInputConfig, distribute -from bytewax.parse import proc_env +from bytewax.dataflow import Dataflow # type: ignore +from bytewax.execution import cluster_main +from bytewax.inputs import ManualInputConfig, distribute +from bytewax.outputs import ManualOutputConfig from tqdm import tqdm from feast import FeatureStore, FeatureView, RepoConfig @@ -37,20 +38,15 @@ def process_path(self, path): return batches - def input_builder(self, worker_index, worker_count, resume_epoch): + def input_builder(self, worker_index, worker_count, _state): worker_paths = distribute(self.paths, worker_index, worker_count) - epoch = 0 for path in worker_paths: - yield AdvanceTo(epoch) - yield Emit(path) - epoch += 1 + yield None, path return def output_builder(self, worker_index, worker_count): - def output_fn(epoch_batch): - _, batch = epoch_batch - + def output_fn(batch): table = pa.Table.from_batches([batch]) if self.feature_view.batch_source.field_mapping is not None: @@ -79,11 +75,7 @@ def output_fn(epoch_batch): def _run_dataflow(self): flow = Dataflow() + flow.input("inp", ManualInputConfig(self.input_builder)) flow.flat_map(self.process_path) - flow.capture() - cluster_main( - flow, - ManualInputConfig(self.input_builder), - self.output_builder, - **proc_env(), - ) + flow.capture(ManualOutputConfig(self.output_builder)) + cluster_main(flow, [], 0) diff --git a/sdk/python/feast/infra/materialization/contrib/bytewax/bytewax_materialization_engine.py b/sdk/python/feast/infra/materialization/contrib/bytewax/bytewax_materialization_engine.py index 0477722eb16..9a456376bf4 100644 --- a/sdk/python/feast/infra/materialization/contrib/bytewax/bytewax_materialization_engine.py +++ b/sdk/python/feast/infra/materialization/contrib/bytewax/bytewax_materialization_engine.py @@ -23,7 +23,7 @@ from feast.infra.registry.base_registry import BaseRegistry from feast.repo_config import FeastConfigBaseModel from feast.stream_feature_view import StreamFeatureView -from feast.utils import _get_column_names +from feast.utils import _get_column_names, get_default_yaml_file_path from .bytewax_materialization_job import BytewaxMaterializationJob @@ -157,9 +157,6 @@ def _create_kubernetes_job(self, job_id, paths, feature_view): # Create a k8s configmap with information needed by bytewax self._create_configuration_map(job_id, paths, feature_view, self.namespace) - # Create the k8s service definition, used for bytewax communication - self._create_service_definition(job_id, self.namespace) - # Create the k8s job definition self._create_job_definition( job_id, @@ -175,14 +172,10 @@ def _create_kubernetes_job(self, job_id, paths, feature_view): def _create_configuration_map(self, job_id, paths, feature_view, namespace): """Create a Kubernetes configmap for this job""" - feature_store_configuration = yaml.dump( - yaml.safe_load( - self.repo_config.json( - exclude={"repo_path"}, - exclude_unset=True, - ) - ) - ) + repo_path = self.repo_config.repo_path + assert repo_path + feature_store_path = get_default_yaml_file_path(repo_path) + feature_store_configuration = feature_store_path.read_text() materialization_config = yaml.dump( {"paths": paths, "feature_view": feature_view.name} @@ -204,41 +197,6 @@ def _create_configuration_map(self, job_id, paths, feature_view, namespace): body=configmap_manifest, ) - def _create_service_definition(self, job_id, namespace): - """Creates a kubernetes service definition. - - This service definition is created to allow bytewax workers - to communicate with each other. - """ - service_definition = { - "apiVersion": "v1", - "kind": "Service", - "metadata": { - "name": f"dataflow-{job_id}", - "namespace": namespace, - }, - "spec": { - "clusterIP": "None", - "clusterIPs": ["None"], - "internalTrafficPolicy": "Cluster", - "ipFamilies": ["IPv4"], - "ipFamilyPolicy": "SingleStack", - "ports": [ - { - "name": "worker", - "port": 9999, - "protocol": "TCP", - "targetPort": 9999, - } - ], - "selector": {"job-name": f"dataflow-{job_id}"}, - "sessionAffinity": "None", - "type": "ClusterIP", - }, - } - - utils.create_from_dict(self.k8s_client, service_definition) - def _create_job_definition(self, job_id, namespace, pods, env): """Create a kubernetes job definition.""" job_env = [ @@ -269,10 +227,6 @@ def _create_job_definition(self, job_id, namespace, pods, env): "name": "BYTEWAX_KEEP_CONTAINER_ALIVE", "value": "false", }, - { - "name": "BYTEWAX_HOSTFILE_PATH", - "value": "/etc/bytewax/hostfile.txt", - }, { "name": "BYTEWAX_STATEFULSET_NAME", "value": f"dataflow-{job_id}", @@ -299,11 +253,6 @@ def _create_job_definition(self, job_id, namespace, pods, env): "subdomain": f"dataflow-{job_id}", "initContainers": [ { - "command": [ - "sh", - "-c", - f'set -ex\n# Generate hostfile.txt.\necho "dataflow-{job_id}-0.dataflow-{job_id}.{namespace}.svc.cluster.local:9999" > /etc/bytewax/hostfile.txt\nreplicas=$(($BYTEWAX_REPLICAS-1))\nx=1\nwhile [ $x -le $replicas ]\ndo\n echo "dataflow-{job_id}-$x.dataflow-{job_id}.{namespace}.svc.cluster.local:9999" >> /etc/bytewax/hostfile.txt\n x=$(( $x + 1 ))\ndone', - ], "env": [ { "name": "BYTEWAX_REPLICAS", diff --git a/setup.py b/setup.py index 2764faa6973..27f4ff7ed3c 100644 --- a/setup.py +++ b/setup.py @@ -93,7 +93,7 @@ AWS_REQUIRED = ["boto3>=1.17.0,<=1.20.23", "docker>=5.0.2", "s3fs>=0.4.0,<=2022.01.0"] -BYTEWAX_REQUIRED = ["bytewax==0.10.0", "docker>=5.0.2", "kubernetes<=20.13.0"] +BYTEWAX_REQUIRED = ["bytewax==0.13.1", "docker>=5.0.2", "kubernetes<=20.13.0"] SNOWFLAKE_REQUIRED = [ "snowflake-connector-python[pandas]>=2.7.3,<3", From a0c6fde93bc8088d2bb34d1dd366a44b5d2657ee Mon Sep 17 00:00:00 2001 From: Danny Chiao Date: Thu, 1 Dec 2022 21:07:04 -0500 Subject: [PATCH 27/30] fix: Fix memory leak from usage.py not properly cleaning up call stack (#3371) * fix: Fix memory leak from usage.py not properly cleaning up call stack context Signed-off-by: Danny Chiao * fix Signed-off-by: Danny Chiao Signed-off-by: Danny Chiao --- sdk/python/feast/usage.py | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/sdk/python/feast/usage.py b/sdk/python/feast/usage.py index 0965e709998..18bb497182c 100644 --- a/sdk/python/feast/usage.py +++ b/sdk/python/feast/usage.py @@ -78,7 +78,7 @@ class FnCall: class Sampler: - def should_record(self, event) -> bool: + def should_record(self) -> bool: raise NotImplementedError @property @@ -87,7 +87,7 @@ def priority(self): class AlwaysSampler(Sampler): - def should_record(self, event) -> bool: + def should_record(self) -> bool: return True @@ -100,7 +100,7 @@ def __init__(self, ratio): self.total_counter = 0 self.sampled_counter = 0 - def should_record(self, event) -> bool: + def should_record(self) -> bool: self.total_counter += 1 if self.total_counter == self.MAX_COUNTER: self.total_counter = 1 @@ -176,10 +176,12 @@ def _set_installation_id(): def _export(event: typing.Dict[str, typing.Any]): - _executor.submit(requests.post, USAGE_ENDPOINT, json=event, timeout=30) + _executor.submit(requests.post, USAGE_ENDPOINT, json=event, timeout=2) def _produce_event(ctx: UsageContext): + if ctx.sampler and not ctx.sampler.should_record(): + return # Cannot check for unittest because typeguard pulls in unittest is_test = flags_helper.is_test() or bool({"pytest"} & sys.modules.keys()) event = { @@ -204,10 +206,6 @@ def _produce_event(ctx: UsageContext): **_constant_attributes, } event.update(ctx.attributes) - - if ctx.sampler and not ctx.sampler.should_record(event): - return - _export(event) @@ -262,6 +260,13 @@ def deeply_nested(...): """ sampler = attrs.pop("sampler", AlwaysSampler()) + def clear_context(ctx): + _context.set(UsageContext()) # reset context to default values + # TODO: Figure out why without this, new contexts.get aren't reset + ctx.call_stack = [] + ctx.completed_calls = [] + ctx.attributes = {} + def decorator(func): if not _is_enabled: return func @@ -295,17 +300,22 @@ def wrapper(*args, **kwargs): raise exc finally: - last_call = ctx.call_stack.pop(-1) - last_call.end = datetime.utcnow() - ctx.completed_calls.append(last_call) ctx.sampler = ( sampler if sampler.priority > ctx.sampler.priority else ctx.sampler ) + last_call = ctx.call_stack.pop(-1) + last_call.end = datetime.utcnow() + ctx.completed_calls.append(last_call) - if not ctx.call_stack: - # we reached the root of the stack - _context.set(UsageContext()) # reset context to default values + if not ctx.call_stack or ( + len(ctx.call_stack) == 1 + and "feast.feature_store.FeatureStore.serve" + in str(ctx.call_stack[0].fn_name) + ): + # When running `feast serve`, the serve method never exits so it gets + # stuck otherwise _produce_event(ctx) + clear_context(ctx) return wrapper From 8112db5b5a18123da567c310fe385ae907edb56d Mon Sep 17 00:00:00 2001 From: Kevin Zhang Date: Mon, 5 Dec 2022 10:57:24 -0800 Subject: [PATCH 28/30] fix: Update the version counts (#3378) * Fix Signed-off-by: Kevin Zhang * Fix Signed-off-by: Kevin Zhang Signed-off-by: Kevin Zhang --- README.md | 2 +- infra/scripts/helm/validate-helm-chart-versions.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e1107d34570..1152aa060e4 100644 --- a/README.md +++ b/README.md @@ -227,4 +227,4 @@ Thanks goes to these incredible people: - + \ No newline at end of file diff --git a/infra/scripts/helm/validate-helm-chart-versions.sh b/infra/scripts/helm/validate-helm-chart-versions.sh index cd8317222bd..8a088a006d8 100755 --- a/infra/scripts/helm/validate-helm-chart-versions.sh +++ b/infra/scripts/helm/validate-helm-chart-versions.sh @@ -3,7 +3,7 @@ set -e # Amount of file locations that need to be bumped in unison when versions increment -UNIQUE_VERSIONS_COUNT=22 # Change in release 0.24.0 +UNIQUE_VERSIONS_COUNT=20 # Change in release 0.27.0 if [ $# -ne 1 ]; then echo "Please provide a single semver version (without a \"v\" prefix) to test the repository against, e.g 0.99.0" From 548bed988687dc94147f494d4dbb4147fa5bea8e Mon Sep 17 00:00:00 2001 From: Kevin Zhang Date: Mon, 5 Dec 2022 12:34:41 -0800 Subject: [PATCH 29/30] fix: Fix workflow to contain env vars (#3379) * Fix Signed-off-by: Kevin Zhang * Fix Signed-off-by: Kevin Zhang * Fix Signed-off-by: Kevin Zhang Signed-off-by: Kevin Zhang --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 554fd282d1c..db62766a1c7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -87,7 +87,7 @@ jobs: publish-web-ui-npm: if: github.repository == 'feast-dev/feast' - needs: validate_version_bumps + needs: [validate_version_bumps, get_dry_release_versions] runs-on: ubuntu-latest env: # This publish is working using an NPM automation token to bypass 2FA From 1d3c111c4adb28b7063f45e92af0ad3aef296ee3 Mon Sep 17 00:00:00 2001 From: feast-ci-bot Date: Mon, 5 Dec 2022 21:50:15 +0000 Subject: [PATCH 30/30] chore(release): release 0.27.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # [0.27.0](https://github.com/feast-dev/feast/compare/v0.26.0...v0.27.0) (2022-12-05) ### Bug Fixes * Changing Snowflake template code to avoid query not implemented … ([#3319](https://github.com/feast-dev/feast/issues/3319)) ([1590d6b](https://github.com/feast-dev/feast/commit/1590d6be14b9a9cea6fbde60f2373cb3cd68acb9)) * Dask zero division error if parquet dataset has only one partition ([#3236](https://github.com/feast-dev/feast/issues/3236)) ([69e4a7d](https://github.com/feast-dev/feast/commit/69e4a7d10d912cd89f1e0c2a024d07cf2f44211e)) * Enable Spark materialization on Yarn ([#3370](https://github.com/feast-dev/feast/issues/3370)) ([0c20a4e](https://github.com/feast-dev/feast/commit/0c20a4e6ac95d7c28299a95d91024be4370ef7ed)) * Ensure that Snowflake accounts for number columns that overspecify precision ([#3306](https://github.com/feast-dev/feast/issues/3306)) ([0ad0ace](https://github.com/feast-dev/feast/commit/0ad0ace893edbd0680ee100726ad38bec1436974)) * Fix memory leak from usage.py not properly cleaning up call stack ([#3371](https://github.com/feast-dev/feast/issues/3371)) ([a0c6fde](https://github.com/feast-dev/feast/commit/a0c6fde93bc8088d2bb34d1dd366a44b5d2657ee)) * Fix workflow to contain env vars ([#3379](https://github.com/feast-dev/feast/issues/3379)) ([548bed9](https://github.com/feast-dev/feast/commit/548bed988687dc94147f494d4dbb4147fa5bea8e)) * Update bytewax materialization ([#3368](https://github.com/feast-dev/feast/issues/3368)) ([4ebe00f](https://github.com/feast-dev/feast/commit/4ebe00fefa337cbe96ad3c712f44b9c9d7a46ef2)) * Update the version counts ([#3378](https://github.com/feast-dev/feast/issues/3378)) ([8112db5](https://github.com/feast-dev/feast/commit/8112db5b5a18123da567c310fe385ae907edb56d)) * Updated AWS Athena template ([#3322](https://github.com/feast-dev/feast/issues/3322)) ([5956981](https://github.com/feast-dev/feast/commit/595698105637aaeb952fddc2957c83e501964d2a)) * Wrong UI data source type display ([#3276](https://github.com/feast-dev/feast/issues/3276)) ([8f28062](https://github.com/feast-dev/feast/commit/8f280620bceb3a6e42ffffd0571eeb353b0feff2)) ### Features * Cassandra online store, concurrency in bulk write operations ([#3367](https://github.com/feast-dev/feast/issues/3367)) ([eaf354c](https://github.com/feast-dev/feast/commit/eaf354cde27c8f3a46ac256a71ad5ec06dfd70b3)) * Cassandra online store, concurrent fetching for multiple entities ([#3356](https://github.com/feast-dev/feast/issues/3356)) ([00fa21f](https://github.com/feast-dev/feast/commit/00fa21f9ebef496a6801974cfd3a0a0b4861a11e)) * Get Snowflake Query Output As Pyspark Dataframe ([#2504](https://github.com/feast-dev/feast/issues/2504)) ([#3358](https://github.com/feast-dev/feast/issues/3358)) ([2f18957](https://github.com/feast-dev/feast/commit/2f189572493cb498243bf7d6ec12d768f4b90ee7)) --- CHANGELOG.md | 23 +++++++++++++++++++ infra/charts/feast-feature-server/Chart.yaml | 2 +- infra/charts/feast-feature-server/README.md | 4 ++-- infra/charts/feast-feature-server/values.yaml | 2 +- infra/charts/feast/Chart.yaml | 2 +- infra/charts/feast/README.md | 6 ++--- .../feast/charts/feature-server/Chart.yaml | 4 ++-- .../feast/charts/feature-server/README.md | 4 ++-- .../feast/charts/feature-server/values.yaml | 2 +- .../charts/transformation-service/Chart.yaml | 4 ++-- .../charts/transformation-service/README.md | 4 ++-- .../charts/transformation-service/values.yaml | 2 +- infra/charts/feast/requirements.yaml | 4 ++-- java/pom.xml | 2 +- sdk/python/feast/ui/package.json | 2 +- sdk/python/feast/ui/yarn.lock | 8 +++---- ui/package.json | 2 +- 17 files changed, 50 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 65aa693691e..0b2f585587a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,28 @@ # Changelog +# [0.27.0](https://github.com/feast-dev/feast/compare/v0.26.0...v0.27.0) (2022-12-05) + + +### Bug Fixes + +* Changing Snowflake template code to avoid query not implemented … ([#3319](https://github.com/feast-dev/feast/issues/3319)) ([1590d6b](https://github.com/feast-dev/feast/commit/1590d6be14b9a9cea6fbde60f2373cb3cd68acb9)) +* Dask zero division error if parquet dataset has only one partition ([#3236](https://github.com/feast-dev/feast/issues/3236)) ([69e4a7d](https://github.com/feast-dev/feast/commit/69e4a7d10d912cd89f1e0c2a024d07cf2f44211e)) +* Enable Spark materialization on Yarn ([#3370](https://github.com/feast-dev/feast/issues/3370)) ([0c20a4e](https://github.com/feast-dev/feast/commit/0c20a4e6ac95d7c28299a95d91024be4370ef7ed)) +* Ensure that Snowflake accounts for number columns that overspecify precision ([#3306](https://github.com/feast-dev/feast/issues/3306)) ([0ad0ace](https://github.com/feast-dev/feast/commit/0ad0ace893edbd0680ee100726ad38bec1436974)) +* Fix memory leak from usage.py not properly cleaning up call stack ([#3371](https://github.com/feast-dev/feast/issues/3371)) ([a0c6fde](https://github.com/feast-dev/feast/commit/a0c6fde93bc8088d2bb34d1dd366a44b5d2657ee)) +* Fix workflow to contain env vars ([#3379](https://github.com/feast-dev/feast/issues/3379)) ([548bed9](https://github.com/feast-dev/feast/commit/548bed988687dc94147f494d4dbb4147fa5bea8e)) +* Update bytewax materialization ([#3368](https://github.com/feast-dev/feast/issues/3368)) ([4ebe00f](https://github.com/feast-dev/feast/commit/4ebe00fefa337cbe96ad3c712f44b9c9d7a46ef2)) +* Update the version counts ([#3378](https://github.com/feast-dev/feast/issues/3378)) ([8112db5](https://github.com/feast-dev/feast/commit/8112db5b5a18123da567c310fe385ae907edb56d)) +* Updated AWS Athena template ([#3322](https://github.com/feast-dev/feast/issues/3322)) ([5956981](https://github.com/feast-dev/feast/commit/595698105637aaeb952fddc2957c83e501964d2a)) +* Wrong UI data source type display ([#3276](https://github.com/feast-dev/feast/issues/3276)) ([8f28062](https://github.com/feast-dev/feast/commit/8f280620bceb3a6e42ffffd0571eeb353b0feff2)) + + +### Features + +* Cassandra online store, concurrency in bulk write operations ([#3367](https://github.com/feast-dev/feast/issues/3367)) ([eaf354c](https://github.com/feast-dev/feast/commit/eaf354cde27c8f3a46ac256a71ad5ec06dfd70b3)) +* Cassandra online store, concurrent fetching for multiple entities ([#3356](https://github.com/feast-dev/feast/issues/3356)) ([00fa21f](https://github.com/feast-dev/feast/commit/00fa21f9ebef496a6801974cfd3a0a0b4861a11e)) +* Get Snowflake Query Output As Pyspark Dataframe ([#2504](https://github.com/feast-dev/feast/issues/2504)) ([#3358](https://github.com/feast-dev/feast/issues/3358)) ([2f18957](https://github.com/feast-dev/feast/commit/2f189572493cb498243bf7d6ec12d768f4b90ee7)) + # [0.26.0](https://github.com/feast-dev/feast/compare/v0.25.0...v0.26.0) (2022-10-06) diff --git a/infra/charts/feast-feature-server/Chart.yaml b/infra/charts/feast-feature-server/Chart.yaml index 252dceb9f6f..55041c2b8dd 100644 --- a/infra/charts/feast-feature-server/Chart.yaml +++ b/infra/charts/feast-feature-server/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: feast-feature-server description: Feast Feature Server in Go or Python type: application -version: 0.26.0 +version: 0.27.0 keywords: - machine learning - big data diff --git a/infra/charts/feast-feature-server/README.md b/infra/charts/feast-feature-server/README.md index 0ae45328598..f023021f963 100644 --- a/infra/charts/feast-feature-server/README.md +++ b/infra/charts/feast-feature-server/README.md @@ -1,6 +1,6 @@ # Feast Python / Go Feature Server Helm Charts -Current chart version is `0.26.0` +Current chart version is `0.27.0` ## Installation @@ -30,7 +30,7 @@ See [here](https://github.com/feast-dev/feast/tree/master/examples/python-helm-d | fullnameOverride | string | `""` | | | image.pullPolicy | string | `"IfNotPresent"` | | | image.repository | string | `"feastdev/feature-server"` | Docker image for Feature Server repository | -| image.tag | string | `"0.26.0"` | The Docker image tag (can be overwritten if custom feature server deps are needed for on demand transforms) | +| image.tag | string | `"0.27.0"` | The Docker image tag (can be overwritten if custom feature server deps are needed for on demand transforms) | | imagePullSecrets | list | `[]` | | | livenessProbe.initialDelaySeconds | int | `30` | | | livenessProbe.periodSeconds | int | `30` | | diff --git a/infra/charts/feast-feature-server/values.yaml b/infra/charts/feast-feature-server/values.yaml index d897346efe4..c66c45e36dc 100644 --- a/infra/charts/feast-feature-server/values.yaml +++ b/infra/charts/feast-feature-server/values.yaml @@ -9,7 +9,7 @@ image: repository: feastdev/feature-server pullPolicy: IfNotPresent # image.tag -- The Docker image tag (can be overwritten if custom feature server deps are needed for on demand transforms) - tag: 0.26.0 + tag: 0.27.0 imagePullSecrets: [] nameOverride: "" diff --git a/infra/charts/feast/Chart.yaml b/infra/charts/feast/Chart.yaml index f0d6774a3cb..2586871119d 100644 --- a/infra/charts/feast/Chart.yaml +++ b/infra/charts/feast/Chart.yaml @@ -1,7 +1,7 @@ apiVersion: v1 description: Feature store for machine learning name: feast -version: 0.26.0 +version: 0.27.0 keywords: - machine learning - big data diff --git a/infra/charts/feast/README.md b/infra/charts/feast/README.md index b0dde94610b..9519729f541 100644 --- a/infra/charts/feast/README.md +++ b/infra/charts/feast/README.md @@ -8,7 +8,7 @@ This repo contains Helm charts for Feast Java components that are being installe ## Chart: Feast -Feature store for machine learning Current chart version is `0.26.0` +Feature store for machine learning Current chart version is `0.27.0` ## Installation @@ -65,8 +65,8 @@ See [here](https://github.com/feast-dev/feast/tree/master/examples/java-demo) fo | Repository | Name | Version | |------------|------|---------| | https://charts.helm.sh/stable | redis | 10.5.6 | -| https://feast-helm-charts.storage.googleapis.com | feature-server(feature-server) | 0.26.0 | -| https://feast-helm-charts.storage.googleapis.com | transformation-service(transformation-service) | 0.26.0 | +| https://feast-helm-charts.storage.googleapis.com | feature-server(feature-server) | 0.27.0 | +| https://feast-helm-charts.storage.googleapis.com | transformation-service(transformation-service) | 0.27.0 | ## Values diff --git a/infra/charts/feast/charts/feature-server/Chart.yaml b/infra/charts/feast/charts/feature-server/Chart.yaml index 6e577e1fb83..4874dca14ba 100644 --- a/infra/charts/feast/charts/feature-server/Chart.yaml +++ b/infra/charts/feast/charts/feature-server/Chart.yaml @@ -1,8 +1,8 @@ apiVersion: v1 description: "Feast Feature Server: Online feature serving service for Feast" name: feature-server -version: 0.26.0 -appVersion: v0.26.0 +version: 0.27.0 +appVersion: v0.27.0 keywords: - machine learning - big data diff --git a/infra/charts/feast/charts/feature-server/README.md b/infra/charts/feast/charts/feature-server/README.md index f13a6488c39..92dd950a22a 100644 --- a/infra/charts/feast/charts/feature-server/README.md +++ b/infra/charts/feast/charts/feature-server/README.md @@ -1,6 +1,6 @@ # feature-server -![Version: 0.26.0](https://img.shields.io/badge/Version-0.26.0-informational?style=flat-square) ![AppVersion: v0.26.0](https://img.shields.io/badge/AppVersion-v0.26.0-informational?style=flat-square) +![Version: 0.27.0](https://img.shields.io/badge/Version-0.27.0-informational?style=flat-square) ![AppVersion: v0.27.0](https://img.shields.io/badge/AppVersion-v0.27.0-informational?style=flat-square) Feast Feature Server: Online feature serving service for Feast @@ -17,7 +17,7 @@ Feast Feature Server: Online feature serving service for Feast | envOverrides | object | `{}` | Extra environment variables to set | | image.pullPolicy | string | `"IfNotPresent"` | Image pull policy | | image.repository | string | `"feastdev/feature-server-java"` | Docker image for Feature Server repository | -| image.tag | string | `"0.26.0"` | Image tag | +| image.tag | string | `"0.27.0"` | Image tag | | ingress.grpc.annotations | object | `{}` | Extra annotations for the ingress | | ingress.grpc.auth.enabled | bool | `false` | Flag to enable auth | | ingress.grpc.class | string | `"nginx"` | Which ingress controller to use | diff --git a/infra/charts/feast/charts/feature-server/values.yaml b/infra/charts/feast/charts/feature-server/values.yaml index 66795aeba71..529ca53d09a 100644 --- a/infra/charts/feast/charts/feature-server/values.yaml +++ b/infra/charts/feast/charts/feature-server/values.yaml @@ -5,7 +5,7 @@ image: # image.repository -- Docker image for Feature Server repository repository: feastdev/feature-server-java # image.tag -- Image tag - tag: 0.26.0 + tag: 0.27.0 # image.pullPolicy -- Image pull policy pullPolicy: IfNotPresent diff --git a/infra/charts/feast/charts/transformation-service/Chart.yaml b/infra/charts/feast/charts/transformation-service/Chart.yaml index 20321e687a3..cf12aa7a79a 100644 --- a/infra/charts/feast/charts/transformation-service/Chart.yaml +++ b/infra/charts/feast/charts/transformation-service/Chart.yaml @@ -1,8 +1,8 @@ apiVersion: v1 description: "Transformation service: to compute on-demand features" name: transformation-service -version: 0.26.0 -appVersion: v0.26.0 +version: 0.27.0 +appVersion: v0.27.0 keywords: - machine learning - big data diff --git a/infra/charts/feast/charts/transformation-service/README.md b/infra/charts/feast/charts/transformation-service/README.md index 8b44c218df9..b137e9b544b 100644 --- a/infra/charts/feast/charts/transformation-service/README.md +++ b/infra/charts/feast/charts/transformation-service/README.md @@ -1,6 +1,6 @@ # transformation-service -![Version: 0.26.0](https://img.shields.io/badge/Version-0.26.0-informational?style=flat-square) ![AppVersion: v0.26.0](https://img.shields.io/badge/AppVersion-v0.26.0-informational?style=flat-square) +![Version: 0.27.0](https://img.shields.io/badge/Version-0.27.0-informational?style=flat-square) ![AppVersion: v0.27.0](https://img.shields.io/badge/AppVersion-v0.27.0-informational?style=flat-square) Transformation service: to compute on-demand features @@ -13,7 +13,7 @@ Transformation service: to compute on-demand features | envOverrides | object | `{}` | Extra environment variables to set | | image.pullPolicy | string | `"IfNotPresent"` | Image pull policy | | image.repository | string | `"feastdev/feature-transformation-server"` | Docker image for Transformation Server repository | -| image.tag | string | `"0.26.0"` | Image tag | +| image.tag | string | `"0.27.0"` | Image tag | | nodeSelector | object | `{}` | Node labels for pod assignment | | podLabels | object | `{}` | Labels to be added to Feast Serving pods | | replicaCount | int | `1` | Number of pods that will be created | diff --git a/infra/charts/feast/charts/transformation-service/values.yaml b/infra/charts/feast/charts/transformation-service/values.yaml index ecaa16e614f..eb5876a18b3 100644 --- a/infra/charts/feast/charts/transformation-service/values.yaml +++ b/infra/charts/feast/charts/transformation-service/values.yaml @@ -5,7 +5,7 @@ image: # image.repository -- Docker image for Transformation Server repository repository: feastdev/feature-transformation-server # image.tag -- Image tag - tag: 0.26.0 + tag: 0.27.0 # image.pullPolicy -- Image pull policy pullPolicy: IfNotPresent diff --git a/infra/charts/feast/requirements.yaml b/infra/charts/feast/requirements.yaml index f9f23092f5d..94d34d0f335 100644 --- a/infra/charts/feast/requirements.yaml +++ b/infra/charts/feast/requirements.yaml @@ -1,12 +1,12 @@ dependencies: - name: feature-server alias: feature-server - version: 0.26.0 + version: 0.27.0 condition: feature-server.enabled repository: https://feast-helm-charts.storage.googleapis.com - name: transformation-service alias: transformation-service - version: 0.26.0 + version: 0.27.0 condition: transformation-service.enabled repository: https://feast-helm-charts.storage.googleapis.com - name: redis diff --git a/java/pom.xml b/java/pom.xml index 3b9910a7cfa..5f1c8f5df90 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -35,7 +35,7 @@ - 0.26.0 + 0.27.0 https://github.com/feast-dev/feast UTF-8 diff --git a/sdk/python/feast/ui/package.json b/sdk/python/feast/ui/package.json index 442cb2466e2..259d48ea50a 100644 --- a/sdk/python/feast/ui/package.json +++ b/sdk/python/feast/ui/package.json @@ -6,7 +6,7 @@ "@elastic/datemath": "^5.0.3", "@elastic/eui": "^55.0.1", "@emotion/react": "^11.9.0", - "@feast-dev/feast-ui": "0.26.0", + "@feast-dev/feast-ui": "0.27.0", "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^13.2.0", "@testing-library/user-event": "^13.5.0", diff --git a/sdk/python/feast/ui/yarn.lock b/sdk/python/feast/ui/yarn.lock index d6181e46eac..c168c310f69 100644 --- a/sdk/python/feast/ui/yarn.lock +++ b/sdk/python/feast/ui/yarn.lock @@ -1300,10 +1300,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@feast-dev/feast-ui@0.26.0": - version "0.26.0" - resolved "https://registry.yarnpkg.com/@feast-dev/feast-ui/-/feast-ui-0.26.0.tgz#502e61652024a2db9bc5b9b5fcfe3f3dce04161b" - integrity sha512-7TBL9zetO/7Kx+FECIaDYG+fCr7P4R6esWyZW08xJTEFEvds5VXdXvUTWCibA/sKH24dlNXwpiLpyujwqwpQgA== +"@feast-dev/feast-ui@0.27.0": + version "0.27.0" + resolved "https://registry.yarnpkg.com/@feast-dev/feast-ui/-/feast-ui-0.27.0.tgz#3a0c2ae54e0a0cfb94a6d9883d91d3dd5e649b2c" + integrity sha512-1meDDMt0SNR6u45zH9wVgakrejrywSlOPJnq5JLLkErOVLmJsFe1EN6oeGdJXKQKuk5rQGgwWX0y7Ox4o2T45g== dependencies: "@elastic/datemath" "^5.0.3" "@elastic/eui" "^55.0.1" diff --git a/ui/package.json b/ui/package.json index 6cb2fef5c3f..948c1655ba9 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "@feast-dev/feast-ui", - "version": "0.26.0", + "version": "0.27.0", "private": false, "files": [ "dist"