Java tutorial
/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.druid.cli; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Predicates; import com.google.common.collect.ImmutableList; import com.google.inject.Binder; import com.google.inject.Inject; import com.google.inject.Key; import com.google.inject.Module; import com.google.inject.Provides; import com.google.inject.name.Names; import io.airlift.airline.Command; import org.apache.curator.framework.CuratorFramework; import org.apache.druid.audit.AuditManager; import org.apache.druid.client.CoordinatorServerView; import org.apache.druid.client.HttpServerInventoryViewResource; import org.apache.druid.client.coordinator.Coordinator; import org.apache.druid.client.indexing.HttpIndexingServiceClient; import org.apache.druid.client.indexing.IndexingServiceClient; import org.apache.druid.discovery.DruidNodeDiscoveryProvider; import org.apache.druid.guice.ConditionalMultibind; import org.apache.druid.guice.ConfigProvider; import org.apache.druid.guice.Jerseys; import org.apache.druid.guice.JsonConfigProvider; import org.apache.druid.guice.LazySingleton; import org.apache.druid.guice.LifecycleModule; import org.apache.druid.guice.ManageLifecycle; import org.apache.druid.guice.annotations.CoordinatorIndexingServiceHelper; import org.apache.druid.guice.annotations.EscalatedGlobal; import org.apache.druid.guice.http.JettyHttpClientModule; import org.apache.druid.java.util.common.concurrent.ScheduledExecutorFactory; import org.apache.druid.java.util.common.logger.Logger; import org.apache.druid.java.util.http.client.HttpClient; import org.apache.druid.metadata.MetadataRuleManager; import org.apache.druid.metadata.MetadataRuleManagerConfig; import org.apache.druid.metadata.MetadataRuleManagerProvider; import org.apache.druid.metadata.MetadataSegmentManager; import org.apache.druid.metadata.MetadataSegmentManagerConfig; import org.apache.druid.metadata.MetadataSegmentManagerProvider; import org.apache.druid.metadata.MetadataStorage; import org.apache.druid.metadata.MetadataStorageProvider; import org.apache.druid.server.audit.AuditManagerProvider; import org.apache.druid.server.coordinator.BalancerStrategyFactory; import org.apache.druid.server.coordinator.DruidCoordinator; import org.apache.druid.server.coordinator.DruidCoordinatorCleanupPendingSegments; import org.apache.druid.server.coordinator.DruidCoordinatorConfig; import org.apache.druid.server.coordinator.LoadQueueTaskMaster; import org.apache.druid.server.coordinator.helper.DruidCoordinatorHelper; import org.apache.druid.server.coordinator.helper.DruidCoordinatorSegmentKiller; import org.apache.druid.server.coordinator.helper.DruidCoordinatorSegmentMerger; import org.apache.druid.server.http.ClusterResource; import org.apache.druid.server.http.CoordinatorCompactionConfigsResource; import org.apache.druid.server.http.CoordinatorDynamicConfigsResource; import org.apache.druid.server.http.CoordinatorRedirectInfo; import org.apache.druid.server.http.CoordinatorResource; import org.apache.druid.server.http.DatasourcesResource; import org.apache.druid.server.http.IntervalsResource; import org.apache.druid.server.http.LookupCoordinatorResource; import org.apache.druid.server.http.MetadataResource; import org.apache.druid.server.http.RedirectFilter; import org.apache.druid.server.http.RedirectInfo; import org.apache.druid.server.http.RulesResource; import org.apache.druid.server.http.ServersResource; import org.apache.druid.server.http.TiersResource; import org.apache.druid.server.initialization.ZkPathsConfig; import org.apache.druid.server.initialization.jetty.JettyServerInitializer; import org.apache.druid.server.lookup.cache.LookupCoordinatorManager; import org.apache.druid.server.lookup.cache.LookupCoordinatorManagerConfig; import org.apache.druid.server.router.TieredBrokerConfig; import org.eclipse.jetty.server.Server; import java.util.ArrayList; import java.util.List; import java.util.Properties; import java.util.concurrent.Executors; /** */ @Command(name = "coordinator", description = "Runs the Coordinator, see http://druid.io/docs/latest/Coordinator.html for a description.") public class CliCoordinator extends ServerRunnable { private static final Logger log = new Logger(CliCoordinator.class); private Properties properties; private boolean beOverlord; public CliCoordinator() { super(log); } @Inject public void configure(Properties properties) { this.properties = properties; beOverlord = isOverlord(properties); if (beOverlord) { log.info("Coordinator is configured to act as Overlord as well."); } } @Override protected List<? extends Module> getModules() { List<Module> modules = new ArrayList<>(); modules.add(JettyHttpClientModule.global()); modules.add(new Module() { @Override public void configure(Binder binder) { binder.bindConstant().annotatedWith(Names.named("serviceName")) .to(TieredBrokerConfig.DEFAULT_COORDINATOR_SERVICE_NAME); binder.bindConstant().annotatedWith(Names.named("servicePort")).to(8081); binder.bindConstant().annotatedWith(Names.named("tlsServicePort")).to(8281); ConfigProvider.bind(binder, DruidCoordinatorConfig.class); binder.bind(MetadataStorage.class).toProvider(MetadataStorageProvider.class); JsonConfigProvider.bind(binder, "druid.manager.segments", MetadataSegmentManagerConfig.class); JsonConfigProvider.bind(binder, "druid.manager.rules", MetadataRuleManagerConfig.class); JsonConfigProvider.bind(binder, "druid.manager.lookups", LookupCoordinatorManagerConfig.class); JsonConfigProvider.bind(binder, "druid.coordinator.balancer", BalancerStrategyFactory.class); binder.bind(RedirectFilter.class).in(LazySingleton.class); if (beOverlord) { binder.bind(RedirectInfo.class).to(CoordinatorOverlordRedirectInfo.class) .in(LazySingleton.class); } else { binder.bind(RedirectInfo.class).to(CoordinatorRedirectInfo.class).in(LazySingleton.class); } binder.bind(MetadataSegmentManager.class).toProvider(MetadataSegmentManagerProvider.class) .in(ManageLifecycle.class); binder.bind(MetadataRuleManager.class).toProvider(MetadataRuleManagerProvider.class) .in(ManageLifecycle.class); binder.bind(AuditManager.class).toProvider(AuditManagerProvider.class).in(ManageLifecycle.class); binder.bind(IndexingServiceClient.class).to(HttpIndexingServiceClient.class) .in(LazySingleton.class); binder.bind(CoordinatorServerView.class).in(LazySingleton.class); binder.bind(LookupCoordinatorManager.class).in(LazySingleton.class); binder.bind(DruidCoordinator.class); LifecycleModule.register(binder, MetadataStorage.class); LifecycleModule.register(binder, DruidCoordinator.class); binder.bind(JettyServerInitializer.class).to(CoordinatorJettyServerInitializer.class); Jerseys.addResource(binder, CoordinatorResource.class); Jerseys.addResource(binder, CoordinatorDynamicConfigsResource.class); Jerseys.addResource(binder, CoordinatorCompactionConfigsResource.class); Jerseys.addResource(binder, TiersResource.class); Jerseys.addResource(binder, RulesResource.class); Jerseys.addResource(binder, ServersResource.class); Jerseys.addResource(binder, DatasourcesResource.class); Jerseys.addResource(binder, MetadataResource.class); Jerseys.addResource(binder, IntervalsResource.class); Jerseys.addResource(binder, LookupCoordinatorResource.class); Jerseys.addResource(binder, ClusterResource.class); Jerseys.addResource(binder, HttpServerInventoryViewResource.class); LifecycleModule.register(binder, Server.class); LifecycleModule.register(binder, DatasourcesResource.class); ConditionalMultibind .create(properties, binder, DruidCoordinatorHelper.class, CoordinatorIndexingServiceHelper.class) .addConditionBinding("druid.coordinator.merge.on", Predicates.equalTo("true"), DruidCoordinatorSegmentMerger.class) .addConditionBinding("druid.coordinator.kill.on", Predicates.equalTo("true"), DruidCoordinatorSegmentKiller.class) .addConditionBinding("druid.coordinator.kill.pendingSegments.on", Predicates.equalTo("true"), DruidCoordinatorCleanupPendingSegments.class); binder.bind(DiscoverySideEffectsProvider.Child.class).annotatedWith(Coordinator.class) .toProvider(new DiscoverySideEffectsProvider( DruidNodeDiscoveryProvider.NODE_TYPE_COORDINATOR, ImmutableList.of())) .in(LazySingleton.class); LifecycleModule.registerKey(binder, Key.get(DiscoverySideEffectsProvider.Child.class, Coordinator.class)); } @Provides @LazySingleton public LoadQueueTaskMaster getLoadQueueTaskMaster(CuratorFramework curator, ObjectMapper jsonMapper, ScheduledExecutorFactory factory, DruidCoordinatorConfig config, @EscalatedGlobal HttpClient httpClient, ZkPathsConfig zkPaths) { return new LoadQueueTaskMaster(curator, jsonMapper, factory.create(1, "Master-PeonExec--%d"), Executors.newSingleThreadExecutor(), config, httpClient, zkPaths); } }); if (beOverlord) { modules.addAll(new CliOverlord().getModules(false)); } return modules; } public static boolean isOverlord(Properties properties) { return Boolean.parseBoolean(properties.getProperty("druid.coordinator.asOverlord.enabled")); } }