private synchronized void flushMetricMessageQueueToMaster() { if (!metricMessageQueue.isEmpty()) { // Build batched metric messages int size = metricMessageQueue.size(); final ControlMessage.MetricMsg.Builder metricMsgBuilder = ControlMessage.MetricMsg.newBuilder(); LOG.debug("MetricManagerWorker Size: {}", size); for (int i = 0; i < size; i++) { final ControlMessage.Metric metric = metricMessageQueue.poll(); LOG.debug("MetricManagerWorker addMetric: {}, {}, {}", size, i, metric); metricMsgBuilder.addMetric(i, metric); } persistentConnectionToMasterMap.getMessageSender(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID).send( ControlMessage.Message.newBuilder() .setId(RuntimeIdManager.generateMessageId()) .setListenerId(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID) .setType(ControlMessage.MessageType.MetricMessageReceived) .setMetricMsg(metricMsgBuilder.build()) .build()); } }
private synchronized void flushMetricMessageQueueToMaster() { if (!metricMessageQueue.isEmpty()) { // Build batched metric messages int size = metricMessageQueue.size(); final ControlMessage.MetricMsg.Builder metricMsgBuilder = ControlMessage.MetricMsg.newBuilder(); LOG.debug("MetricManagerWorker Size: {}", size); for (int i = 0; i < size; i++) { final ControlMessage.Metric metric = metricMessageQueue.poll(); LOG.debug("MetricManagerWorker addMetric: {}, {}, {}", size, i, metric); metricMsgBuilder.addMetric(i, metric); } persistentConnectionToMasterMap.getMessageSender(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID).send( ControlMessage.Message.newBuilder() .setId(RuntimeIdManager.generateMessageId()) .setListenerId(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID) .setType(ControlMessage.MessageType.MetricMessageReceived) .setMetricMsg(metricMsgBuilder.build()) .build()); } }
/** * Marks the Task as running, and sends scheduling message to the executor. * @param task the task to run */ public void onTaskScheduled(final Task task) { (task.getPropertyValue(ResourceSlotProperty.class).orElse(true) ? runningComplyingTasks : runningNonComplyingTasks).put(task.getTaskId(), task); runningTaskToAttempt.put(task, task.getAttemptIdx()); failedTasks.remove(task); serializationExecutorService.execute(() -> { final byte[] serialized = SerializationUtils.serialize(task); sendControlMessage( ControlMessage.Message.newBuilder() .setId(RuntimeIdManager.generateMessageId()) .setListenerId(MessageEnvironment.EXECUTOR_MESSAGE_LISTENER_ID) .setType(ControlMessage.MessageType.ScheduleTask) .setScheduleTaskMsg( ControlMessage.ScheduleTaskMsg.newBuilder() .setTask(ByteString.copyFrom(serialized)) .build()) .build()); }); }
@Override public void onMessageWithContext(final ControlMessage.Message message, final MessageContext messageContext) { switch (message.getType()) { case RequestBroadcastVariable: final Serializable broadcastId = SerializationUtils.deserialize(message.getRequestbroadcastVariableMsg().getBroadcastId().toByteArray()); final Object broadcastVariable = BroadcastManagerMaster.getBroadcastVariable(broadcastId); if (broadcastVariable == null) { throw new IllegalStateException(broadcastId.toString()); } messageContext.reply( ControlMessage.Message.newBuilder() .setId(RuntimeIdManager.generateMessageId()) .setListenerId(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID) .setType(ControlMessage.MessageType.InMasterBroadcastVariable) .setBroadcastVariableMsg(ControlMessage.InMasterBroadcastVariableMessage.newBuilder() .setRequestId(message.getId()) // TODO #206: Efficient Broadcast Variable Serialization .setVariable(ByteString.copyFrom(SerializationUtils.serialize((Serializable) broadcastVariable))) .build()) .build()); break; default: throw new IllegalMessageException( new Exception("This message should not be requested to Master :" + message.getType())); } } }
/** * Registers a request for the block location. * If the location is already known, reply the location instantly. * * @param requestId the ID of the block location request. * @param messageContext the message context to reply. */ void registerRequest(final long requestId, final MessageContext messageContext) { final ControlMessage.BlockLocationInfoMsg.Builder infoMsgBuilder = ControlMessage.BlockLocationInfoMsg.newBuilder() .setRequestId(requestId) .setBlockId(blockIdOrWildcard); locationFuture.whenComplete((location, throwable) -> { if (throwable == null) { infoMsgBuilder.setOwnerExecutorId(location); } else { infoMsgBuilder.setState( convertBlockState(((AbsentBlockException) throwable).getState())); } messageContext.reply( ControlMessage.Message.newBuilder() .setId(RuntimeIdManager.generateMessageId()) .setListenerId(MessageEnvironment.EXECUTOR_MESSAGE_LISTENER_ID) .setType(ControlMessage.MessageType.BlockLocationInfo) .setBlockLocationInfoMsg(infoMsgBuilder.build()) .build()); }); }
@Override public void onMessageWithContext(final ControlMessage.Message message, final MessageContext messageContext) { switch (message.getType()) { case RequestBroadcastVariable: final Serializable broadcastId = SerializationUtils.deserialize(message.getRequestbroadcastVariableMsg().getBroadcastId().toByteArray()); final Object broadcastVariable = BroadcastManagerMaster.getBroadcastVariable(broadcastId); if (broadcastVariable == null) { throw new IllegalStateException(broadcastId.toString()); } messageContext.reply( ControlMessage.Message.newBuilder() .setId(RuntimeIdManager.generateMessageId()) .setListenerId(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID) .setType(ControlMessage.MessageType.InMasterBroadcastVariable) .setBroadcastVariableMsg(ControlMessage.InMasterBroadcastVariableMessage.newBuilder() .setRequestId(message.getId()) // TODO #206: Efficient Broadcast Variable Serialization .setVariable(ByteString.copyFrom(SerializationUtils.serialize((Serializable) broadcastVariable))) .build()) .build()); break; default: throw new IllegalMessageException( new Exception("This message should not be requested to Master :" + message.getType())); } } }
/** * Notifies the change in task state to master. * @param newState of the task. * @param vertexPutOnHold the vertex put on hold. * @param cause only provided as non-empty upon recoverable failures. */ private void notifyTaskStateToMaster(final TaskState.State newState, final Optional<String> vertexPutOnHold, final Optional<TaskState.RecoverableTaskFailureCause> cause) { final ControlMessage.TaskStateChangedMsg.Builder msgBuilder = ControlMessage.TaskStateChangedMsg.newBuilder() .setExecutorId(executorId) .setTaskId(taskId) .setAttemptIdx(attemptIdx) .setState(convertState(newState)); if (vertexPutOnHold.isPresent()) { msgBuilder.setVertexPutOnHoldId(vertexPutOnHold.get()); } if (cause.isPresent()) { msgBuilder.setFailureCause(convertFailureCause(cause.get())); } // Send taskStateChangedMsg to master! persistentConnectionToMasterMap.getMessageSender(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID).send( ControlMessage.Message.newBuilder() .setId(RuntimeIdManager.generateMessageId()) .setListenerId(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID) .setType(ControlMessage.MessageType.TaskStateChanged) .setTaskStateChangedMsg(msgBuilder.build()) .build()); }
/** * Marks the Task as running, and sends scheduling message to the executor. * @param task the task to run */ public void onTaskScheduled(final Task task) { (task.getPropertyValue(ResourceSlotProperty.class).orElse(true) ? runningComplyingTasks : runningNonComplyingTasks).put(task.getTaskId(), task); runningTaskToAttempt.put(task, task.getAttemptIdx()); failedTasks.remove(task); serializationExecutorService.execute(() -> { final byte[] serialized = SerializationUtils.serialize(task); sendControlMessage( ControlMessage.Message.newBuilder() .setId(RuntimeIdManager.generateMessageId()) .setListenerId(MessageEnvironment.EXECUTOR_MESSAGE_LISTENER_ID) .setType(ControlMessage.MessageType.ScheduleTask) .setScheduleTaskMsg( ControlMessage.ScheduleTaskMsg.newBuilder() .setTask(ByteString.copyFrom(serialized)) .build()) .build()); }); }
@Override public void emit(final O output) { final Map<Object, Long> aggregatedDynOptData = (Map<Object, Long>) output; final List<ControlMessage.PartitionSizeEntry> partitionSizeEntries = new ArrayList<>(); aggregatedDynOptData.forEach((key, size) -> partitionSizeEntries.add( ControlMessage.PartitionSizeEntry.newBuilder() // TODO #325: Add (de)serialization for non-string key types in data metric collection .setKey(key == null ? NULL_KEY : String.valueOf(key)) .setSize(size) .build()) ); connectionToMasterMap.getMessageSender(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID) .send(ControlMessage.Message.newBuilder() .setId(RuntimeIdManager.generateMessageId()) .setListenerId(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID) .setType(ControlMessage.MessageType.DataSizeMetric) .setDataSizeMetricMsg(ControlMessage.DataSizeMetricMsg.newBuilder() .addAllPartitionSize(partitionSizeEntries) ) .build()); // set the id of this vertex to mark the corresponding stage as put on hold taskExecutor.setIRVertexPutOnHold(irVertex); }
@Override public void emit(final O output) { final Map<Object, Long> aggregatedDynOptData = (Map<Object, Long>) output; final List<ControlMessage.PartitionSizeEntry> partitionSizeEntries = new ArrayList<>(); aggregatedDynOptData.forEach((key, size) -> partitionSizeEntries.add( ControlMessage.PartitionSizeEntry.newBuilder() .setKey(key == null ? NULL_KEY : String.valueOf(key)) .setSize(size) .build()) ); connectionToMasterMap.getMessageSender(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID) .send(ControlMessage.Message.newBuilder() .setId(RuntimeIdManager.generateMessageId()) .setListenerId(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID) .setType(ControlMessage.MessageType.DataSizeMetric) .setDataSizeMetricMsg(ControlMessage.DataSizeMetricMsg.newBuilder() .addAllPartitionSize(partitionSizeEntries) ) .build()); // set the id of this vertex to mark the corresponding stage as put on hold taskExecutor.setIRVertexPutOnHold(irVertex); }
public Object load(final Serializable id) throws Exception { // Get from master final CompletableFuture<ControlMessage.Message> responseFromMasterFuture = toMaster .getMessageSender(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID).request( ControlMessage.Message.newBuilder() .setId(RuntimeIdManager.generateMessageId()) .setListenerId(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID) .setType(ControlMessage.MessageType.RequestBroadcastVariable) .setRequestbroadcastVariableMsg( ControlMessage.RequestBroadcastVariableMessage.newBuilder() .setExecutorId(executorId) .setBroadcastId(ByteString.copyFrom(SerializationUtils.serialize(id))) .build()) .build()); return SerializationUtils.deserialize( responseFromMasterFuture.get().getBroadcastVariableMsg().getVariable().toByteArray()); } });
public Object load(final Serializable id) throws Exception { // Get from master final CompletableFuture<ControlMessage.Message> responseFromMasterFuture = toMaster .getMessageSender(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID).request( ControlMessage.Message.newBuilder() .setId(RuntimeIdManager.generateMessageId()) .setListenerId(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID) .setType(ControlMessage.MessageType.RequestBroadcastVariable) .setRequestbroadcastVariableMsg( ControlMessage.RequestBroadcastVariableMessage.newBuilder() .setExecutorId(executorId) .setBroadcastId(ByteString.copyFrom(SerializationUtils.serialize(id))) .build()) .build()); return SerializationUtils.deserialize( responseFromMasterFuture.get().getBroadcastVariableMsg().getVariable().toByteArray()); } });
private void closeTransform(final VertexHarness vertexHarness) { final IRVertex irVertex = vertexHarness.getIRVertex(); final Transform transform; if (irVertex instanceof OperatorVertex) { transform = ((OperatorVertex) irVertex).getTransform(); transform.close(); } vertexHarness.getContext().getSerializedData().ifPresent(data -> persistentConnectionToMasterMap.getMessageSender(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID).send( ControlMessage.Message.newBuilder() .setId(RuntimeIdManager.generateMessageId()) .setListenerId(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID) .setType(ControlMessage.MessageType.ExecutorDataCollected) .setDataCollected(ControlMessage.DataCollectMessage.newBuilder().setData(data).build()) .build())); }
private void closeTransform(final VertexHarness vertexHarness) { final IRVertex irVertex = vertexHarness.getIRVertex(); final Transform transform; if (irVertex instanceof OperatorVertex) { transform = ((OperatorVertex) irVertex).getTransform(); transform.close(); } vertexHarness.getContext().getSerializedData().ifPresent(data -> persistentConnectionToMasterMap.getMessageSender(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID).send( ControlMessage.Message.newBuilder() .setId(RuntimeIdManager.generateMessageId()) .setListenerId(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID) .setType(ControlMessage.MessageType.ExecutorDataCollected) .setDataCollected(ControlMessage.DataCollectMessage.newBuilder().setData(data).build()) .build())); }
public void notifyMaster(final String runtimeEdgeId, final long srcTaskIndex) { // Notify the master that we're using this pipe. toMaster.getMessageSender(MessageEnvironment.PIPE_MANAGER_MASTER_MESSAGE_LISTENER_ID).send( ControlMessage.Message.newBuilder() .setId(RuntimeIdManager.generateMessageId()) .setListenerId(MessageEnvironment.PIPE_MANAGER_MASTER_MESSAGE_LISTENER_ID) .setType(ControlMessage.MessageType.PipeInit) .setPipeInitMsg(ControlMessage.PipeInitMessage.newBuilder() .setRuntimeEdgeId(runtimeEdgeId) .setSrcTaskIndex(srcTaskIndex) .setExecutorId(executorId) .build()) .build()); }
public void notifyMaster(final String runtimeEdgeId, final long srcTaskIndex) { // Notify the master that we're using this pipe. toMaster.getMessageSender(MessageEnvironment.PIPE_MANAGER_MASTER_MESSAGE_LISTENER_ID).send( ControlMessage.Message.newBuilder() .setId(RuntimeIdManager.generateMessageId()) .setListenerId(MessageEnvironment.PIPE_MANAGER_MASTER_MESSAGE_LISTENER_ID) .setType(ControlMessage.MessageType.PipeInit) .setPipeInitMsg(ControlMessage.PipeInitMessage.newBuilder() .setRuntimeEdgeId(runtimeEdgeId) .setSrcTaskIndex(srcTaskIndex) .setExecutorId(executorId) .build()) .build()); }
public synchronized void sendMetricFlushRequest() { executorRegistry.viewExecutors(executors -> executors.forEach(executor -> { final ControlMessage.Message message = ControlMessage.Message.newBuilder() .setId(RuntimeIdManager.generateMessageId()) .setListenerId(MessageEnvironment.EXECUTOR_MESSAGE_LISTENER_ID) .setType(ControlMessage.MessageType.RequestMetricFlush) .build(); executor.sendControlMessage(message); })); }
@Override public void flush() { flushMetricMessageQueueToMaster(); persistentConnectionToMasterMap.getMessageSender(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID).send( ControlMessage.Message.newBuilder() .setId(RuntimeIdManager.generateMessageId()) .setListenerId(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID) .setType(ControlMessage.MessageType.MetricFlushed) .build()); }
@Override public void flush() { flushMetricMessageQueueToMaster(); persistentConnectionToMasterMap.getMessageSender(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID).send( ControlMessage.Message.newBuilder() .setId(RuntimeIdManager.generateMessageId()) .setListenerId(MessageEnvironment.RUNTIME_MASTER_MESSAGE_LISTENER_ID) .setType(ControlMessage.MessageType.MetricFlushed) .build()); }
public synchronized void sendMetricFlushRequest() { executorRegistry.viewExecutors(executors -> executors.forEach(executor -> { final ControlMessage.Message message = ControlMessage.Message.newBuilder() .setId(RuntimeIdManager.generateMessageId()) .setListenerId(MessageEnvironment.EXECUTOR_MESSAGE_LISTENER_ID) .setType(ControlMessage.MessageType.RequestMetricFlush) .build(); executor.sendControlMessage(message); })); }