/**
  * Writes the DataStream to a socket as a byte array. The format of the output is specified by a
  * {@link SerializationSchema}.
  *
  * @param hostName host of the socket
  * @param port port of the socket
  * @param schema schema for serialization
  * @return the closed DataStream
  */
 @PublicEvolving
 public DataStreamSink<T> writeToSocket(String hostName, int port, SerializationSchema<T> schema) {
   DataStreamSink<T> returnStream = addSink(new SocketClientSink<>(hostName, port, schema, 0));
   returnStream.setParallelism(
       1); // It would not work if multiple instances would connect to the same port
   return returnStream;
 }
  /**
   * Adds the given sink to this DataStream. Only streams with sinks added will be executed once the
   * {@link StreamExecutionEnvironment#execute()} method is called.
   *
   * @param sinkFunction The object containing the sink's invoke function.
   * @return The closed DataStream.
   */
  public DataStreamSink<T> addSink(SinkFunction<T> sinkFunction) {

    // read the output type of the input Transform to coax out errors about MissingTypeInfo
    transformation.getOutputType();

    // configure the type if needed
    if (sinkFunction instanceof InputTypeConfigurable) {
      ((InputTypeConfigurable) sinkFunction).setInputType(getType(), getExecutionConfig());
    }

    StreamSink<T> sinkOperator = new StreamSink<>(clean(sinkFunction));

    DataStreamSink<T> sink = new DataStreamSink<>(this, sinkOperator);

    getExecutionEnvironment().addOperator(sink.getTransformation());
    return sink;
  }