com.datatorrent.stram.plan.physical.PTContainer.java Source code

Java tutorial

Introduction

Here is the source code for com.datatorrent.stram.plan.physical.PTContainer.java

Source

/**
 * 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 com.datatorrent.stram.plan.physical;

import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;

import com.esotericsoftware.kryo.KryoException;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

import com.datatorrent.stram.Journal.Recoverable;

/**
 *
 * Representation of a container for physical objects of DAG to be placed in
 * <p>
 * <br>
 * References the actual container assigned by the resource manager which
 * hosts the streaming operators in the execution layer.<br>
 * The container reference may change throughout the lifecycle of the
 * application due to failure/recovery or scheduler decisions in general. <br>
 *
 * @since 0.3.5
 */
public class PTContainer implements java.io.Serializable {
    private static final long serialVersionUID = 201312112033L;

    public final static Recoverable SET_CONTAINER_STATE = new SetContainerState();

    public enum State {
        NEW, ALLOCATED, ACTIVE, KILLED
    }

    /**
     * Resource priority is logged so that on restore, pending resource requests can be matched to the containers.
     */
    private static class SetContainerState implements Recoverable {
        private final PTContainer container;

        private SetContainerState() {
            container = null;
        }

        private SetContainerState(PTContainer container) {
            this.container = container;
        }

        @Override
        public void read(final Object object, final Input in) throws KryoException {
            PhysicalPlan plan = (PhysicalPlan) object;

            int containerId = in.readInt();

            for (PTContainer c : plan.getContainers()) {
                if (c.getId() == containerId) {
                    int stateOrd = in.readInt();
                    c.state = PTContainer.State.values()[stateOrd];
                    c.containerId = in.readString();
                    c.resourceRequestPriority = in.readInt();
                    c.requiredMemoryMB = in.readInt();
                    c.allocatedMemoryMB = in.readInt();
                    c.requiredVCores = in.readInt();
                    c.allocatedVCores = in.readInt();
                    String bufferServerHost = in.readString();
                    if (bufferServerHost != null) {
                        c.bufferServerAddress = InetSocketAddress.createUnresolved(bufferServerHost, in.readInt());
                    }
                    c.host = in.readString();
                    c.nodeHttpAddress = in.readString();
                    int tokenLength = in.readInt();
                    if (tokenLength != -1) {
                        c.bufferServerToken = in.readBytes(tokenLength);
                    } else {
                        c.bufferServerToken = null;
                    }
                    break;
                }
            }
        }

        @Override
        public void write(final Output out) throws KryoException {
            out.writeInt(container.getId());
            // state
            out.writeInt(container.getState().ordinal());
            // external id
            out.writeString(container.getExternalId());
            // resource priority
            out.writeInt(container.getResourceRequestPriority());
            // memory required
            out.writeInt(container.getRequiredMemoryMB());
            // memory allocated
            out.writeInt(container.getAllocatedMemoryMB());
            // vcores required
            out.writeInt(container.getRequiredVCores());
            // vcores allocated
            out.writeInt(container.getAllocatedVCores());
            // buffer server address
            InetSocketAddress addr = container.bufferServerAddress;
            if (addr != null) {
                out.writeString(addr.getHostName());
                out.writeInt(addr.getPort());
            } else {
                out.writeString(null);
            }
            // host
            out.writeString(container.host);
            out.writeString(container.nodeHttpAddress);
            out.writeInt((container.bufferServerToken == null) ? -1 : container.bufferServerToken.length);
            if (container.bufferServerToken != null) {
                out.write(container.bufferServerToken);
            }
        }
    }

    private volatile PTContainer.State state = State.NEW;
    private int requiredMemoryMB;
    private int allocatedMemoryMB;
    private int resourceRequestPriority;
    private int requiredVCores;
    private int allocatedVCores;

    private final PhysicalPlan plan;
    private final int seq;
    List<PTOperator> operators = new ArrayList<PTOperator>();

    // execution layer properties
    private String containerId; // assigned yarn container id
    public String host;
    public InetSocketAddress bufferServerAddress;
    public String nodeHttpAddress;
    int restartAttempts;
    private long startedTime = -1;
    private long finishedTime = -1;

    private byte[] bufferServerToken;

    PTContainer(PhysicalPlan plan) {
        this.plan = plan;
        this.seq = plan.containerSeq.incrementAndGet();
    }

    public Recoverable getSetContainerState() {
        return new SetContainerState(this);
    }

    public PhysicalPlan getPlan() {
        return plan;
    }

    public PTContainer.State getState() {
        return this.state;
    }

    public void setState(PTContainer.State state) {
        this.state = state;
    }

    public int getRequiredMemoryMB() {
        return requiredMemoryMB;
    }

    public void setRequiredMemoryMB(int requiredMemoryMB) {
        this.requiredMemoryMB = requiredMemoryMB;
    }

    public int getAllocatedMemoryMB() {
        return allocatedMemoryMB;
    }

    public int getRequiredVCores() {
        return requiredVCores;
    }

    public void setRequiredVCores(int requiredVCores) {
        this.requiredVCores = requiredVCores;
    }

    public int getAllocatedVCores() {
        return allocatedVCores;
    }

    public void setAllocatedVCores(int allocatedVCores) {
        this.allocatedVCores = allocatedVCores;
    }

    public void setAllocatedMemoryMB(int allocatedMemoryMB) {
        this.allocatedMemoryMB = allocatedMemoryMB;
    }

    public int getResourceRequestPriority() {
        return resourceRequestPriority;
    }

    public void setResourceRequestPriority(int resourceRequestPriority) {
        this.resourceRequestPriority = resourceRequestPriority;
    }

    public List<PTOperator> getOperators() {
        return operators;
    }

    public int getId() {
        return this.seq;
    }

    public String getExternalId() {
        return this.containerId;
    }

    public void setExternalId(String id) {
        this.containerId = id;
    }

    public long getStartedTime() {
        return startedTime;
    }

    public void setStartedTime(long startedTime) {
        this.startedTime = startedTime;
    }

    public long getFinishedTime() {
        return finishedTime;
    }

    public void setFinishedTime(long finishedTime) {
        this.finishedTime = finishedTime;
    }

    public byte[] getBufferServerToken() {
        return bufferServerToken;
    }

    public void setBufferServerToken(byte[] bufferServerToken) {
        this.bufferServerToken = bufferServerToken;
    }

    public String toIdStateString() {
        return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
                .append("id", "" + seq + "(" + this.containerId + ")").append("state", this.getState()).toString();
    }

    /**
     *
     * @return String
     */
    @Override
    public String toString() {
        return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
                .append("id", "" + seq + "(" + this.containerId + ")").append("state", this.getState())
                .append("operators", this.operators).toString();
    }
}