使用套接字在Flink中发送DataStream;序列化问题

时间:2017-08-22 10:01:58

标签: serialization apache-flink flink-streaming flink-cep

我想将数据流从VM发送到主机,我使用方法writeToSocket(),如下所示:

joinedStreamEventDataStream.writeToSocket("192.168.1.10", 6998) ;

此处joinedStreamEventDataStream的类型为DataStream<Integer,Integer>

有人可以告诉我如何将序列化器传递给上述方法。

先谢谢

2 个答案:

答案 0 :(得分:3)

这取决于你想如何从套接字读取数据。如果您希望它是数据的字符串表示形式,那么您可以通过以下方式完成:

joinedStreamEventDataStream.map(new MapFunction<Type, String>() {
    @Override
    public String map(Type value) throws Exception {
        return value.toString();
    }
}).writeToSocket(hostname, port, new SimpleStringSchema());

如果你想保留Flink的序列化格式,那么你可以写:

joinedStreamEventDataStream.writeToSocket(
    hostname, 
    port, 
    new TypeInformationSerializationSchema<>(
        joinedStreamEventDataStream.getType(), 
        env.getConfig()));

如果您想以自己的序列化格式输出它,那么您必须按照Alex的指示实现自己的SerializationSchema

答案 1 :(得分:1)

writeToSocket()方法有3个参数:套接字主机和端口,以及用于序列化数据的SerializationSchema接口的实现。所以你的实现可能是这样的:

joinedStreamEventDataStream.writeToSocket(
    "192.168.1.10",  // host name
    6998,  // port
    new SerializationSchema<Integer>() {

        @Override
        public byte[] serialize(Integer element) {
            return ByteBuffer.allocate(4).putInt(element).array();
        }
    }
);

如果joinedStreamEventDataStream具有DataStream<Integer>类型,则属实。