/*
* 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.ignite.internal.processors.hadoop;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.UUID;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.configuration.HadoopConfiguration;
import org.apache.ignite.hadoop.HadoopMapReducePlan;
import org.apache.ignite.hadoop.HadoopMapReducePlanner;
import org.apache.ignite.internal.GridKernalContext;
import org.apache.ignite.internal.processors.hadoop.jobtracker.HadoopJobMetadata;
import org.apache.ignite.internal.processors.hadoop.jobtracker.HadoopJobTracker;
import org.apache.ignite.internal.processors.hadoop.shuffle.HadoopShuffle;
import org.apache.ignite.internal.processors.hadoop.taskexecutor.HadoopTaskExecutorAdapter;
import org.apache.ignite.internal.util.typedef.internal.CU;
/**
* Hadoop accelerator context.
*/
public class HadoopContext {
/** Kernal context. */
private GridKernalContext ctx;
/** Hadoop configuration. */
private HadoopConfiguration cfg;
/** Job tracker. */
private HadoopJobTracker jobTracker;
/** External task executor. */
private HadoopTaskExecutorAdapter taskExecutor;
/** */
private HadoopShuffle shuffle;
/** Managers list. */
private List<HadoopComponent> components = new ArrayList<>();
/**
* @param ctx Kernal context.
*/
public HadoopContext(
GridKernalContext ctx,
HadoopConfiguration cfg,
HadoopJobTracker jobTracker,
HadoopTaskExecutorAdapter taskExecutor,
HadoopShuffle shuffle
) {
this.ctx = ctx;
this.cfg = cfg;
this.jobTracker = add(jobTracker);
this.taskExecutor = add(taskExecutor);
this.shuffle = add(shuffle);
}
/**
* Gets list of managers.
*
* @return List of managers.
*/
public List<HadoopComponent> components() {
return components;
}
/**
* Gets kernal context.
*
* @return Grid kernal context instance.
*/
public GridKernalContext kernalContext() {
return ctx;
}
/**
* Gets Hadoop configuration.
*
* @return Hadoop configuration.
*/
public HadoopConfiguration configuration() {
return cfg;
}
/**
* Gets local node ID. Shortcut for {@code kernalContext().localNodeId()}.
*
* @return Local node ID.
*/
public UUID localNodeId() {
return ctx.localNodeId();
}
/**
* Gets local node order.
*
* @return Local node order.
*/
public long localNodeOrder() {
assert ctx.discovery() != null;
return ctx.discovery().localNode().order();
}
/**
* @return Hadoop-enabled nodes.
*/
public Collection<ClusterNode> nodes() {
return ctx.discovery().cacheNodes(CU.SYS_CACHE_HADOOP_MR, ctx.discovery().topologyVersionEx());
}
/**
* @return {@code True} if
*/
public boolean jobUpdateLeader() {
long minOrder = Long.MAX_VALUE;
ClusterNode minOrderNode = null;
for (ClusterNode node : nodes()) {
if (node.order() < minOrder) {
minOrder = node.order();
minOrderNode = node;
}
}
assert minOrderNode != null;
return localNodeId().equals(minOrderNode.id());
}
/**
* @param meta Job metadata.
* @return {@code true} If local node is participating in job execution.
*/
public boolean isParticipating(HadoopJobMetadata meta) {
UUID locNodeId = localNodeId();
if (locNodeId.equals(meta.submitNodeId()))
return true;
HadoopMapReducePlan plan = meta.mapReducePlan();
return plan.mapperNodeIds().contains(locNodeId) || plan.reducerNodeIds().contains(locNodeId) || jobUpdateLeader();
}
/**
* @return Jon tracker instance.
*/
public HadoopJobTracker jobTracker() {
return jobTracker;
}
/**
* @return Task executor.
*/
public HadoopTaskExecutorAdapter taskExecutor() {
return taskExecutor;
}
/**
* @return Shuffle.
*/
public HadoopShuffle shuffle() {
return shuffle;
}
/**
* @return Map-reduce planner.
*/
public HadoopMapReducePlanner planner() {
return cfg.getMapReducePlanner();
}
/**
* Adds component.
*
* @param c Component to add.
* @return Added manager.
*/
private <C extends HadoopComponent> C add(C c) {
components.add(c);
return c;
}
}