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.tez.dag.history.events; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.EnumSet; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.tez.common.ProtoConverters; import org.apache.tez.dag.history.HistoryEvent; import org.apache.tez.dag.history.HistoryEventType; import org.apache.tez.dag.records.TezTaskAttemptID; import org.apache.tez.dag.records.TezVertexID; import org.apache.tez.dag.recovery.records.RecoveryProtos; import org.apache.tez.dag.recovery.records.RecoveryProtos.TezDataMovementEventProto; import org.apache.tez.dag.recovery.records.RecoveryProtos.VertexDataMovementEventsGeneratedProto; import org.apache.tez.runtime.api.Event; import org.apache.tez.runtime.api.events.CompositeDataMovementEvent; import org.apache.tez.runtime.api.events.DataMovementEvent; import org.apache.tez.runtime.api.events.InputDataInformationEvent; import org.apache.tez.runtime.api.events.InputInitializerEvent; import org.apache.tez.runtime.api.impl.EventMetaData; import org.apache.tez.runtime.api.impl.EventType; import org.apache.tez.runtime.api.impl.TezEvent; import com.google.common.collect.Lists; // TODO PreCommit - rename this to VertexRecoverableEventGeneratedEvent public class VertexRecoverableEventsGeneratedEvent implements HistoryEvent { private static final Logger LOG = LoggerFactory.getLogger(VertexRecoverableEventsGeneratedEvent.class); private List<TezEvent> events; private TezVertexID vertexID; public VertexRecoverableEventsGeneratedEvent(TezVertexID vertexID, List<TezEvent> events) { this.vertexID = vertexID; this.events = Lists.newArrayListWithCapacity(events.size()); for (TezEvent event : events) { if (EnumSet .of(EventType.DATA_MOVEMENT_EVENT, EventType.COMPOSITE_DATA_MOVEMENT_EVENT, EventType.ROOT_INPUT_DATA_INFORMATION_EVENT, EventType.ROOT_INPUT_INITIALIZER_EVENT) .contains(event.getEventType())) { this.events.add(event); } } if (events.isEmpty()) { throw new RuntimeException("Invalid creation of VertexDataMovementEventsGeneratedEvent" + ", no data movement/information events provided"); } } public VertexRecoverableEventsGeneratedEvent() { } @Override public HistoryEventType getEventType() { return HistoryEventType.VERTEX_DATA_MOVEMENT_EVENTS_GENERATED; } @Override public boolean isRecoveryEvent() { return true; } @Override public boolean isHistoryEvent() { return false; } static RecoveryProtos.EventMetaDataProto convertEventMetaDataToProto(EventMetaData eventMetaData) { RecoveryProtos.EventMetaDataProto.Builder builder = RecoveryProtos.EventMetaDataProto.newBuilder() .setProducerConsumerType(eventMetaData.getEventGenerator().ordinal()) .setEdgeVertexName(eventMetaData.getEdgeVertexName()) .setTaskVertexName(eventMetaData.getTaskVertexName()); if (eventMetaData.getTaskAttemptID() != null) { builder.setTaskAttemptId(eventMetaData.getTaskAttemptID().toString()); } return builder.build(); } static EventMetaData convertEventMetaDataFromProto(RecoveryProtos.EventMetaDataProto proto) { TezTaskAttemptID attemptID = null; if (proto.hasTaskAttemptId()) { attemptID = TezTaskAttemptID.fromString(proto.getTaskAttemptId()); } return new EventMetaData(EventMetaData.EventProducerConsumerType.values()[proto.getProducerConsumerType()], proto.getTaskVertexName(), proto.getEdgeVertexName(), attemptID); } public VertexDataMovementEventsGeneratedProto toProto() { List<TezDataMovementEventProto> tezEventProtos = null; if (events != null) { tezEventProtos = Lists.newArrayListWithCapacity(events.size()); for (TezEvent event : events) { TezDataMovementEventProto.Builder evtBuilder = TezDataMovementEventProto.newBuilder(); if (event.getEventType().equals(EventType.COMPOSITE_DATA_MOVEMENT_EVENT)) { evtBuilder .setCompositeDataMovementEvent(ProtoConverters.convertCompositeDataMovementEventToProto( (CompositeDataMovementEvent) event.getEvent())); } else if (event.getEventType().equals(EventType.DATA_MOVEMENT_EVENT)) { evtBuilder.setDataMovementEvent( ProtoConverters.convertDataMovementEventToProto((DataMovementEvent) event.getEvent())); } else if (event.getEventType().equals(EventType.ROOT_INPUT_DATA_INFORMATION_EVENT)) { evtBuilder.setRootInputDataInformationEvent( ProtoConverters.convertRootInputDataInformationEventToProto( (InputDataInformationEvent) event.getEvent())); } else if (event.getEventType().equals(EventType.ROOT_INPUT_INITIALIZER_EVENT)) { evtBuilder.setInputInitializerEvent(ProtoConverters .convertRootInputInitializerEventToProto((InputInitializerEvent) event.getEvent())); } if (event.getSourceInfo() != null) { evtBuilder.setSourceInfo(convertEventMetaDataToProto(event.getSourceInfo())); } if (event.getDestinationInfo() != null) { evtBuilder.setDestinationInfo(convertEventMetaDataToProto(event.getDestinationInfo())); } evtBuilder.setEventTime(event.getEventReceivedTime()); tezEventProtos.add(evtBuilder.build()); } } return VertexDataMovementEventsGeneratedProto.newBuilder().setVertexId(vertexID.toString()) .addAllTezDataMovementEvent(tezEventProtos).build(); } public void fromProto(VertexDataMovementEventsGeneratedProto proto) { this.vertexID = TezVertexID.fromString(proto.getVertexId()); int eventCount = proto.getTezDataMovementEventCount(); if (eventCount > 0) { this.events = Lists.newArrayListWithCapacity(eventCount); } for (TezDataMovementEventProto eventProto : proto.getTezDataMovementEventList()) { Event evt = null; if (eventProto.hasCompositeDataMovementEvent()) { evt = ProtoConverters .convertCompositeDataMovementEventFromProto(eventProto.getCompositeDataMovementEvent()); } else if (eventProto.hasDataMovementEvent()) { evt = ProtoConverters.convertDataMovementEventFromProto(eventProto.getDataMovementEvent()); } else if (eventProto.hasRootInputDataInformationEvent()) { evt = ProtoConverters.convertRootInputDataInformationEventFromProto( eventProto.getRootInputDataInformationEvent()); } else if (eventProto.hasInputInitializerEvent()) { evt = ProtoConverters .convertRootInputInitializerEventFromProto(eventProto.getInputInitializerEvent()); } EventMetaData sourceInfo = null; EventMetaData destinationInfo = null; if (eventProto.hasSourceInfo()) { sourceInfo = convertEventMetaDataFromProto(eventProto.getSourceInfo()); } if (eventProto.hasDestinationInfo()) { destinationInfo = convertEventMetaDataFromProto(eventProto.getDestinationInfo()); } TezEvent tezEvent = new TezEvent(evt, sourceInfo, eventProto.getEventTime()); tezEvent.setDestinationInfo(destinationInfo); this.events.add(tezEvent); } } @Override public void toProtoStream(OutputStream outputStream) throws IOException { toProto().writeDelimitedTo(outputStream); } @Override public void fromProtoStream(InputStream inputStream) throws IOException { VertexDataMovementEventsGeneratedProto proto = VertexDataMovementEventsGeneratedProto .parseDelimitedFrom(inputStream); if (proto == null) { throw new IOException("No data found in stream"); } fromProto(proto); } @Override public String toString() { return "vertexId=" + vertexID.toString() + ", eventCount=" + (events != null ? events.size() : "null"); } public TezVertexID getVertexID() { return this.vertexID; } public List<TezEvent> getTezEvents() { return this.events; } }