Ray runtime implementation for Java - the core distributed runtime component of Ray framework for scaling AI and Python applications
—
Resource management and co-location control for distributed workloads with bundle-based scheduling and sophisticated placement strategies.
Create and manage placement groups for controlling resource allocation and task co-location.
public class PlacementGroups {
/**
* Create a new placement group.
* @param options Configuration for the placement group
* @return PlacementGroup instance
*/
public static PlacementGroup createPlacementGroup(PlacementGroupCreationOptions options);
/**
* Get placement group by ID.
* @param id Placement group ID
* @return PlacementGroup instance or null if not found
*/
public static PlacementGroup getPlacementGroup(PlacementGroupId id);
/**
* Get placement group by name.
* @param name Placement group name
* @return PlacementGroup instance or null if not found
*/
public static PlacementGroup getPlacementGroup(String name);
/**
* Get placement group by name and namespace.
* @param name Placement group name
* @param namespace Namespace to search in
* @return PlacementGroup instance or null if not found
*/
public static PlacementGroup getPlacementGroup(String name, String namespace);
/**
* Get all placement groups in the cluster.
* @return List of all placement groups
*/
public static List<PlacementGroup> getAllPlacementGroups();
/**
* Remove a placement group.
* @param id Placement group ID to remove
*/
public static void removePlacementGroup(PlacementGroupId id);
}Usage Examples:
import io.ray.api.Ray;
import io.ray.api.PlacementGroups;
import io.ray.api.placementgroup.PlacementGroup;
import io.ray.api.placementgroup.PlacementStrategy;
import io.ray.api.options.PlacementGroupCreationOptions;
public class PlacementGroupExample {
public static void main(String[] args) {
Ray.init();
// Define resource bundles
List<Map<String, Double>> bundles = Arrays.asList(
Map.of("CPU", 2.0, "GPU", 1.0), // Bundle 1: 2 CPUs, 1 GPU
Map.of("CPU", 2.0), // Bundle 2: 2 CPUs
Map.of("CPU", 1.0) // Bundle 3: 1 CPU
);
// Create placement group options
PlacementGroupCreationOptions options = PlacementGroupCreationOptions.builder()
.setName("ml-training-group")
.setBundles(bundles)
.setStrategy(PlacementStrategy.STRICT_PACK)
.build();
// Create placement group
PlacementGroup pg = PlacementGroups.createPlacementGroup(options);
// Wait for placement group to be ready
boolean ready = pg.wait(30); // Wait up to 30 seconds
if (ready) {
System.out.println("Placement group ready: " + pg.getId());
} else {
System.out.println("Placement group creation timed out");
}
// Use placement group for tasks and actors...
// Clean up
PlacementGroups.removePlacementGroup(pg.getId());
Ray.shutdown();
}
}Core placement group operations and information access.
public interface PlacementGroup {
/**
* Get the placement group ID.
* @return PlacementGroupId
*/
PlacementGroupId getId();
/**
* Get the placement group name.
* @return Name of the placement group
*/
String getName();
/**
* Get the resource bundles.
* @return List of resource bundle maps
*/
List<Map<String, Double>> getBundles();
/**
* Get the placement strategy.
* @return PlacementStrategy used by this group
*/
PlacementStrategy getStrategy();
/**
* Get the current state.
* @return Current PlacementGroupState
*/
PlacementGroupState getState();
/**
* Wait for the placement group to be ready.
* @param timeoutSeconds Maximum time to wait in seconds
* @return true if ready within timeout, false otherwise
*/
boolean wait(int timeoutSeconds);
}Usage Examples:
public class PlacementGroupInfo {
public static void main(String[] args) {
Ray.init();
// Create placement group
PlacementGroup pg = createExamplePlacementGroup();
// Get placement group information
System.out.println("ID: " + pg.getId());
System.out.println("Name: " + pg.getName());
System.out.println("Strategy: " + pg.getStrategy());
System.out.println("State: " + pg.getState());
// Inspect resource bundles
List<Map<String, Double>> bundles = pg.getBundles();
for (int i = 0; i < bundles.size(); i++) {
System.out.println("Bundle " + i + ": " + bundles.get(i));
}
// Wait for ready state
if (pg.wait(30)) {
System.out.println("Placement group is ready for use");
}
Ray.shutdown();
}
private static PlacementGroup createExamplePlacementGroup() {
List<Map<String, Double>> bundles = Arrays.asList(
Map.of("CPU", 4.0),
Map.of("CPU", 2.0, "GPU", 1.0)
);
PlacementGroupCreationOptions options = PlacementGroupCreationOptions.builder()
.setName("example-group")
.setBundles(bundles)
.setStrategy(PlacementStrategy.PACK)
.build();
return PlacementGroups.createPlacementGroup(options);
}
}Control how resources are allocated across the cluster.
public enum PlacementStrategy {
/**
* Pack bundles on as few nodes as possible.
*/
PACK,
/**
* Spread bundles across as many nodes as possible.
*/
SPREAD,
/**
* Pack bundles on as few nodes as possible (strict).
* Fails if cannot pack all bundles.
*/
STRICT_PACK,
/**
* Spread bundles across different nodes (strict).
* Fails if cannot spread across enough nodes.
*/
STRICT_SPREAD
}Usage Examples:
public class PlacementStrategies {
public static void main(String[] args) {
Ray.init();
// PACK strategy - minimize node usage
PlacementGroup packGroup = createPlacementGroup("pack-group", PlacementStrategy.PACK);
// SPREAD strategy - maximize distribution
PlacementGroup spreadGroup = createPlacementGroup("spread-group", PlacementStrategy.SPREAD);
// STRICT_PACK - fail if cannot pack on few nodes
PlacementGroup strictPackGroup = createPlacementGroup("strict-pack", PlacementStrategy.STRICT_PACK);
// STRICT_SPREAD - fail if cannot spread across many nodes
PlacementGroup strictSpreadGroup = createPlacementGroup("strict-spread", PlacementStrategy.STRICT_SPREAD);
Ray.shutdown();
}
private static PlacementGroup createPlacementGroup(String name, PlacementStrategy strategy) {
List<Map<String, Double>> bundles = Arrays.asList(
Map.of("CPU", 2.0),
Map.of("CPU", 2.0),
Map.of("CPU", 2.0)
);
PlacementGroupCreationOptions options = PlacementGroupCreationOptions.builder()
.setName(name)
.setBundles(bundles)
.setStrategy(strategy)
.build();
return PlacementGroups.createPlacementGroup(options);
}
}Monitor placement group lifecycle states.
public enum PlacementGroupState {
/**
* Placement group is being created.
*/
PENDING,
/**
* Placement group has been successfully created and is ready.
*/
CREATED,
/**
* Placement group has been removed.
*/
REMOVED
}Usage Example:
public class PlacementGroupStateMonitoring {
public static void main(String[] args) {
Ray.init();
PlacementGroup pg = createExamplePlacementGroup();
// Monitor state changes
while (pg.getState() == PlacementGroupState.PENDING) {
System.out.println("Placement group is still pending...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
switch (pg.getState()) {
case CREATED:
System.out.println("Placement group created successfully");
break;
case REMOVED:
System.out.println("Placement group was removed");
break;
case PENDING:
System.out.println("Placement group still pending");
break;
}
Ray.shutdown();
}
}Configure placement group creation with detailed options.
public class PlacementGroupCreationOptions {
/**
* Get builder for creating options.
* @return PlacementGroupCreationOptions.Builder
*/
public static Builder builder();
public static class Builder {
/**
* Set placement group name.
* @param name Name for the placement group
* @return Builder for method chaining
*/
public Builder setName(String name);
/**
* Set resource bundles.
* @param bundles List of resource bundle maps
* @return Builder for method chaining
*/
public Builder setBundles(List<Map<String, Double>> bundles);
/**
* Set placement strategy.
* @param strategy PlacementStrategy to use
* @return Builder for method chaining
*/
public Builder setStrategy(PlacementStrategy strategy);
/**
* Set placement group lifetime.
* @param lifetime Lifetime setting
* @return Builder for method chaining
*/
public Builder setLifetime(ActorLifetime lifetime);
/**
* Build the options.
* @return PlacementGroupCreationOptions instance
*/
public PlacementGroupCreationOptions build();
}
}Usage Example:
public class PlacementGroupConfiguration {
public static void main(String[] args) {
Ray.init();
// Complex placement group configuration
List<Map<String, Double>> bundles = Arrays.asList(
// GPU-intensive bundle
Map.of("CPU", 4.0, "GPU", 2.0, "memory", 8000.0),
// CPU-intensive bundle
Map.of("CPU", 8.0, "memory", 4000.0),
// Storage bundle
Map.of("CPU", 2.0, "storage", 1000.0)
);
PlacementGroupCreationOptions options = PlacementGroupCreationOptions.builder()
.setName("complex-ml-pipeline")
.setBundles(bundles)
.setStrategy(PlacementStrategy.STRICT_PACK)
.setLifetime(ActorLifetime.DETACHED)
.build();
PlacementGroup pg = PlacementGroups.createPlacementGroup(options);
if (pg.wait(60)) {
System.out.println("Complex placement group ready");
// Use different bundles for different types of work
// Bundle 0: GPU training tasks
// Bundle 1: CPU preprocessing tasks
// Bundle 2: Storage and I/O tasks
} else {
System.out.println("Failed to create placement group within timeout");
}
Ray.shutdown();
}
}public class TaskPlacement {
public static String gpuTask(String data) {
// GPU-intensive computation
return "GPU processed: " + data;
}
public static String cpuTask(String data) {
// CPU-intensive computation
return "CPU processed: " + data;
}
public static void main(String[] args) {
Ray.init();
// Create placement group
List<Map<String, Double>> bundles = Arrays.asList(
Map.of("CPU", 2.0, "GPU", 1.0), // Bundle 0: GPU bundle
Map.of("CPU", 4.0) // Bundle 1: CPU bundle
);
PlacementGroupCreationOptions options = PlacementGroupCreationOptions.builder()
.setName("task-placement-group")
.setBundles(bundles)
.setStrategy(PlacementStrategy.STRICT_PACK)
.build();
PlacementGroup pg = PlacementGroups.createPlacementGroup(options);
pg.wait(30);
// Schedule tasks to specific bundles
// Note: Actual bundle specification would be done through task options
// This shows the conceptual approach
// GPU tasks on bundle 0
ObjectRef<String> gpuResult1 = Ray.task(TaskPlacement::gpuTask, "data1").remote();
ObjectRef<String> gpuResult2 = Ray.task(TaskPlacement::gpuTask, "data2").remote();
// CPU tasks on bundle 1
ObjectRef<String> cpuResult1 = Ray.task(TaskPlacement::cpuTask, "data3").remote();
ObjectRef<String> cpuResult2 = Ray.task(TaskPlacement::cpuTask, "data4").remote();
// Get results
System.out.println(Ray.get(gpuResult1));
System.out.println(Ray.get(gpuResult2));
System.out.println(Ray.get(cpuResult1));
System.out.println(Ray.get(cpuResult2));
PlacementGroups.removePlacementGroup(pg.getId());
Ray.shutdown();
}
}public class GpuActor {
public String processWithGpu(String data) {
return "GPU actor processed: " + data;
}
}
public class CpuActor {
public String processWithCpu(String data) {
return "CPU actor processed: " + data;
}
}
public class ActorPlacement {
public static void main(String[] args) {
Ray.init();
// Create placement group for co-located actors
List<Map<String, Double>> bundles = Arrays.asList(
Map.of("CPU", 2.0, "GPU", 1.0), // GPU actor bundle
Map.of("CPU", 2.0) // CPU actor bundle
);
PlacementGroupCreationOptions options = PlacementGroupCreationOptions.builder()
.setName("actor-placement-group")
.setBundles(bundles)
.setStrategy(PlacementStrategy.PACK)
.build();
PlacementGroup pg = PlacementGroups.createPlacementGroup(options);
pg.wait(30);
// Create actors in specific bundles
// Note: Actual bundle assignment would be done through actor creation options
ActorHandle<GpuActor> gpuActor = Ray.actor(GpuActor::new).remote(); // Bundle 0
ActorHandle<CpuActor> cpuActor = Ray.actor(CpuActor::new).remote(); // Bundle 1
// Actors are co-located according to placement strategy
ObjectRef<String> gpuResult = gpuActor.task(GpuActor::processWithGpu, "gpu-data").remote();
ObjectRef<String> cpuResult = cpuActor.task(CpuActor::processWithCpu, "cpu-data").remote();
System.out.println(Ray.get(gpuResult));
System.out.println(Ray.get(cpuResult));
PlacementGroups.removePlacementGroup(pg.getId());
Ray.shutdown();
}
}// Plan resources based on workload requirements
List<Map<String, Double>> balancedBundles = Arrays.asList(
// Training bundle
Map.of("CPU", 4.0, "GPU", 2.0, "memory", 16000.0),
// Preprocessing bundle
Map.of("CPU", 8.0, "memory", 8000.0),
// Inference bundle
Map.of("CPU", 2.0, "GPU", 1.0, "memory", 4000.0)
);try {
PlacementGroup pg = PlacementGroups.createPlacementGroup(options);
if (!pg.wait(60)) {
throw new RuntimeException("Placement group creation timed out");
}
// Use placement group...
} catch (Exception e) {
System.err.println("Placement group error: " + e.getMessage());
} finally {
// Always clean up placement groups
if (pg != null) {
PlacementGroups.removePlacementGroup(pg.getId());
}
}public class PlacementGroupMonitoring {
public static void main(String[] args) {
Ray.init();
// List all placement groups
List<PlacementGroup> allGroups = PlacementGroups.getAllPlacementGroups();
System.out.println("Active placement groups: " + allGroups.size());
for (PlacementGroup pg : allGroups) {
System.out.println("Group: " + pg.getName() +
" State: " + pg.getState() +
" Strategy: " + pg.getStrategy());
}
Ray.shutdown();
}
}Install with Tessl CLI
npx tessl i tessl/maven-io-ray--ray-runtime