Files

13 KiB

DATAWAVE Docker Compose

It is recommended to read through these instructions in their entirety before attempting to build or deploy Datawave. However, if you just want to get started and use this document as a reference, here's the short version (although we recommend checking out the prereqs at a minimum):

System Environment

The following versions are known to work.
RHEL 9.6+
Docker 28.5.1+

RHEL 8 does not seem to work. It interferes with the Docker daemon during the image build.

TLDR

# build docker images for datawave and all of the microservices
mvn -T1C -Pcompose -Dservices -Dmicroservice-docker -Ddocker-release -Ddeploy -Dtar -Ddist -DskipTests -Djkube.container-image.tags.1=latest clean install

# bootstrap the services, and bring them up using docker compose
cd docker
./bootstrap.sh
docker compose up -d --wait --wait-timeout 600

# run some queries to ensure everything is working
cd scripts
./testAll.sh

Components

DataWave Stack Accumulo

datawave-stack-accumulo supplies the Hadoop and Accumulo runtime. Docker Compose starts its individual services and the ingest service loads the same sample datasets used by the DataWave quickstart tests.

Consul

Consul v1.15.4 is a prepacked docker image used for discovery between the various services.

RabbitMQ

RabbitMQ v3.12.4 is a prepacked docker image used for messaging between the various services.

Configuration

Datawave Config Service is Datawave's customized Spring Cloud config service.

Sample configuration files can be found in the config folder.

You will need to build the docker image for this service on your local machine following the instructions in the config service README.

Cache

Datawave Hazelcast Service is Datawave's customized Hazelcast In-Memory Data Grid.

You will need to build the docker image for this service on your local machine following the instructions in the hazelcast cache service README.

Authorization

Datawave Authorization Service provides basic authorization for the Datawave microservices.

You will need to build the docker image for this service on your local machine following the instructions in the authorization service README.

Audit

Datawave Audit Service provides query audit capabilities for Datawave.

You will need to build the docker image for this service on your local machine following the instructions in the audit service README.

Metrics

Datawave Query Metric Service provides metrics caching, storage, and retrieval capabilities for Datawave.

You will need to build the docker image for this service on your local machine following the instructions in the query metrics service README.

Zookeeper

ZooKeeper is provided by the datawave-stack-accumulo image and used for distributed synchronization.

Kafka

Kafka is a prepacked docker image used for messaging between the various services.

Query

Datawave Query Service v1.0-SNAPSHOT is a user-facing interface for Datawave query.

This microservice is in development, and can be found in this repo.

You will need to build the docker image for this service on your local machine following the instructions in the config service README.

Executor Pool 1

Datawave Executor Service v1.0-SNAPSHOT is the back-end worker for Datawave queries.

This microservice is in development, and can be found in this repo.

You will need to build the docker image for this service on your local machine following the instructions in the config service README.

Executor Pool 2

Enabled via the 'pool2', or 'full' profile.

Datawave Executor Service v1.0-SNAPSHOT is the back-end worker for Datawave queries.

This microservice is in development, and can be found in this repo.

You will need to build the docker image for this service on your local machine following the instructions in the config service README.

Query Storage

Enabled via the 'storage', or 'full' profile.

Datawave Query Storage Service v1.0-SNAPSHOT is a utility service used to inspect the storage cache.

This microservice is in development, and can be found in this repo.

You will need to build the docker image for this service on your local machine following the instructions in the config service README.

Optional Components

Kafdrop

Enabled via the 'management', or 'full' profile.

Kafdrop is a prepacked docker image used for kafka cluster management.

Hazelcast Management Center

Enabled via the 'management', or 'full' profile.

Hazelcast Management Center v4.2021.06 is a prepacked docker image used for hazelcast cluster management.

Dictionary

Enabled via the 'dictionary', or 'full' profile.

Datawave Dictionary Service provides access to the data dictionary and edge dictionary for Datawave.

You will need to build the docker image for this service on your local machine following the instructions in the dictionary service README.

File Provider

Enabled via the 'file-provider', or 'full' profile.

This microservice is in development, and can be found in this repo.

Datawave File Provider Service provides file management and access to Datawave and it's services.

You will need to build the docker image for this service on your local machine following the instructions in the file provider service README.

Usage

Please read through these instructions in their entirety before attempting to build or deploy Datawave.

Prereqs

/etc/hosts

In order for the following bootstrap step to work properly, you should ensure that your /etc/hosts file looks similar to the following:

<your ip address>    <your fqdn> <your hostname>
127.0.0.1            localhost

Docker

These services have been successfully deployed using the following versions of docker and docker compose.

$> docker --version
Docker version 24.0.6, build ed223bc
$> docker compose version
Docker Compose version v2.21.0

DataWave Stack Setup

The default Compose profile starts Hadoop, ZooKeeper, and Accumulo from the published datawave-stack-accumulo image. It also starts the DataWave ingest and webservice images and loads the sample Wikipedia, annotation, JSON, and CSV data used by the existing test suites.

Build the DataWave images using the following command. The infrastructure image is pulled and does not need to be rebuilt in this repository:

mvn -T1C -Pcompose -Dservices -Dmicroservice-docker -Ddocker-release -Ddeploy -Dtar -Ddist -DskipTests -Djkube.container-image.tags.1=latest clean install

For this command, the build profile is set to compose. This profile contains the properties needed by the Compose deployment. The use of any other build profile with Docker Compose is unsupported.

You may update the property jkube.container-image.tags.1 to be something other than latest, but must use the VERSION environment variable with docker compose to specify the tag used for DataWave images. Otherwise, Docker Compose uses latest.

If you performed a build with the jkube.container-image.tags.1 property set to anything but latest, you can specify the the tag to use when running docker compose

VERSION=20260326.1 docker compose up

Datawave Microservices

If you haven't done so already, you can build the Datawave Microservice docker images using the following build command:

mvn -Pcompose -Dservices -Dmicroservice-docker -Ddist -DskipTests -DskipITs clean install -T1C

Note that the microservice-docker property is set. This property is a shortcut which activates the docker profile for just the microservices.

This command can be combined with the DataWave ingest and webservice image build as shown above.

Bootstrap

The audit, dictionary, query executor, and query metric services all need to connect to Zookeeper, Hadoop and/or Accumulo. In order to make that work, there are some environment variables which need to be configured.

Default Bootstrap

Bootstrap your deployment by running:

./bootstrap.sh

This will produce a .env file containing the following:

# Enables the reusable Hadoop/Accumulo stack and DataWave fixture loader
# Note: More than one profile may be set.
COMPOSE_PROFILES="datawave-stack"

# These environment variables are used to create extra hosts which
# allow containers to route to services running on the host when using hybrid mode.
DW_HOSTNAME="<Your hostname>"
DW_HOST_FQDN="<Your host FQDN>"
DW_HOST_IP="<Your host IP Address>"

DW_ZOOKEEPER_HOST="zookeeper"
DW_HADOOP_HOST="hdfs-nn"
DW_YARN_HOST="yarn-rm"
HADOOP_CONF_SOURCE="./stack"

Hybrid Bootstrap

Bootstrap your deployment by running:

./bootstrap.sh hybrid

This will produce a .env file containing the following:

# No infrastructure profile is selected because the backend is running on the host.
COMPOSE_PROFILES=""

# These environment variables are used to create extra hosts which
# allow containers to route to the host backend deployment.
DW_HOSTNAME="<Your hostname>"
DW_HOST_FQDN="<Your host FQDN>"
DW_HOST_IP="<Your host IP Address>"

# Backend service locations for hybrid mode.
DW_ZOOKEEPER_HOST="<Your hostname>"
DW_HADOOP_HOST="<Your hostname>"
DW_YARN_HOST="<Your hostname>"
HADOOP_CONF_SOURCE="<HADOOP_CONF_DIR from your host deployment>"

Hybrid mode requires either HADOOP_CONF_DIR or HADOOP_CONF_SOURCE to point to the host deployment's Hadoop configuration directory when bootstrap.sh hybrid runs. The directory is mounted at /etc/hadoop/conf inside the service containers.

Start services

Start the default services (with the Kafka as the backend):

docker compose up -d

Start the default services (with RabbitMQ as the backend):

BACKEND=rabbitmq docker compose up -d

Start the default services (with Hazelcast as the backend):

BACKEND=hazelcast docker compose up -d

Start the default services and the dictionary service:

docker compose --profile datawave-stack --profile dictionary up -d

Start the default services, the kafka services, and the dictionary service:

docker compose --profile datawave-stack --profile dictionary --profile kafka up -d

Start the default services, and the file provider service:

docker compose --profile datawave-stack --profile file-provider up -d

Start all services:

docker compose --profile datawave-stack --profile full up -d

To scale annotation API and writer pools independently, use the split profile in place of the combined annotation profile:

docker compose -f docker-compose.yml -f docker-compose-annotation-split.yml \
  --profile datawave-stack --profile annotation-split up -d \
  --scale annotation-api=3 --scale annotation-writer=1

Publish shared config/annotation.yml and the matching role overlays before starting. The API pool registers as annotation-api in Consul; writers register as annotation-writer. API host ports are dynamic; use a load balancer. Writers publish no host ports. All annotation roles use local caches.

See the service quick start and deployment reference for role requirements, storage, routes, tuning, and cutover.

Shard table splits

stack/shard-splits.txt holds the split points for datawave.shard, one full yyyyMMdd_num shard id per line. stack/initialize-datawave.sh applies them with addsplits before any data is written, so the sharded schema starts out spread over one tablet per shard row instead of sitting in a single tablet. It also writes the num_shards entry the query side reads out of datawave.metadata to expand a day from the global index into that day's shards.

The dates are those of the fixture data, and the shard numbers must cover 0 through table.shard.numShardsPerDay - 1 from properties/compose.properties. Changing that property means regenerating the file and rebuilding the ingest image, since the count is baked into the image's ingest configuration.

To check a running stack:

docker/scripts/verifySplits.sh

View logs

For everything:

docker compose logs -f

For a specific service:

docker compose logs -f audit

Stop services

Stop the configured services

docker compose down

Stop the configured services, and delete all volumes

docker compose down -v

Stop all services, including ones that are no longer enabled

docker compose down --remove-orphans

Restart a service and pull an updated image

docker compose stop audit
docker compose rm -f audit
docker compose up -d

Restart a service without pulling an updated image

docker compose restart <servicename>