Running Feast Java Server with Redis & calling with python (with registry in GCP)
June 22, 2025 ยท View on GitHub
For this tutorial, we setup Feast with Redis, using the Feast CLI to register and materialize features, and then retrieving via a Feast Java server deployed in Kubernetes via a gRPC call.
:point_right: for tips on how to run and debug this locally without using Kubernetes, see java/serving/README.md
First, let's setup a Redis cluster
-
Start minikube (
minikube start) -
Use helm to install a default Redis cluster
helm repo add bitnami https://charts.bitnami.com/bitnami helm repo update helm install my-redis bitnami/redis
-
Port forward Redis so we can materialize features to it
kubectl port-forward --namespace default svc/my-redis-master 6379:6379 -
Get your Redis password using the command (pasted below for convenience). We'll need this to tell Feast how to communicate with the cluster.
export REDIS_PASSWORD=$(kubectl get secret --namespace default my-redis -o jsonpath="{.data.redis-password}" | base64 --decode) echo $REDIS_PASSWORD
Next, we setup a local Feast repo
- Install Feast with Redis dependencies
pip install "feast[redis]" - Make a bucket in GCS (or S3)
- The feature repo is already setup here, so you just need to swap in your GCS bucket and Redis credentials.
We need to modify the
feature_store.yaml, which has two fields for you to replace:registry: gs://[YOUR GCS BUCKET]/demo-repo/registry.db project: feast_java_demo provider: gcp online_store: type: redis # Note: this would normally be using instance URL's to access Redis connection_string: localhost:6379,password=[YOUR PASSWORD] offline_store: type: file entity_key_serialization_version: 3 - Run
feast applyto apply your local features to the remote registry- Note: you may need to authenticate to gcloud first with
gcloud auth login
- Note: you may need to authenticate to gcloud first with
- Materialize features to the online store:
CURRENT_TIME=$(date -u +"%Y-%m-%dT%H:%M:%S") feast materialize-incremental $CURRENT_TIME
Now let's setup the Feast Server
- Add the gcp-auth addon to mount GCP credentials:
minikube addons enable gcp-auth - Add Feast's Java feature server chart repo
helm repo add feast-charts https://feast-helm-charts.storage.googleapis.com helm repo update - Modify the application-override.yaml file to have your credentials + bucket location:
feature-server: application-override.yaml: enabled: true feast: activeStore: online stores: - name: online type: REDIS config: host: my-redis-master port: 6379 password: [YOUR PASSWORD] global: registry: path: gs://[YOUR BUCKET]/demo-repo/registry.db cache_ttl_seconds: 60 project: feast_java_demo - Install the Feast helm chart:
helm install feast-release feast-charts/feast --values application-override.yamlDev instructions: if you're changing the java logic or chart, you can do
eval $(minikube docker-env)make build-java-docker-dev- In the
application-override.yaml, uncomment the twoimage: tag: devblocks helm install feast-release ../../../infra/charts/feast --values application-override.yaml
- (Optional): check logs of the server to make sure it's working
kubectl logs svc/feast-release-feature-server - Port forward to expose the grpc endpoint:
kubectl port-forward svc/feast-release-feature-server 6566:6566 - Make a gRPC call:
-
Python example
python test.py -
gRPC cli:
grpc_cli call localhost:6566 GetOnlineFeatures ' features { val: "driver_hourly_stats:conv_rate" val: "driver_hourly_stats:acc_rate" } entities { key: "driver_id" value { val { int64_val: 1001 } val { int64_val: 1002 } } }'- Response:
connecting to localhost:6566 metadata { feature_names { val: "driver_hourly_stats:conv_rate" val: "driver_hourly_stats:acc_rate" } } results { values { float_val: 0.812357187 } values { float_val: 0.379484832 } statuses: PRESENT statuses: PRESENT event_timestamps { seconds: 1631725200 } event_timestamps { seconds: 1631725200 } } results { values { float_val: 0.840873241 } values { float_val: 0.151376978 } statuses: PRESENT statuses: PRESENT event_timestamps { seconds: 1631725200 } event_timestamps { seconds: 1631725200 } } Rpc succeeded with OK status
-