examples/java-demo/README.md
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
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
pip install "feast[redis]"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
feast apply to apply your local features to the remote registry
gcloud auth loginCURRENT_TIME=$(date -u +"%Y-%m-%dT%H:%M:%S")
feast materialize-incremental $CURRENT_TIME
minikube addons enable gcp-auth
helm repo add feast-charts https://feast-helm-charts.storage.googleapis.com
helm repo update
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
helm install feast-release feast-charts/feast --values application-override.yaml
Dev 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: devblockshelm install feast-release ../../../infra/charts/feast --values application-override.yaml
kubectl logs svc/feast-release-feature-server
kubectl port-forward svc/feast-release-feature-server 6566:6566
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
}
}
}'
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