Flink - Sink
在说sink前,我们提一句flink数据传输重分区,也是DataStream内所拥有方法。
- shuffle:设置DataStream的分区,以便输出元素随机地均匀地移至下一个操作。
- keyby:创建一个新的KeyedStream,使用提供的key进行分区
- global:设置DataStream的分区,以便输出值全部转到下一个处理运算符的第一个实例。用这个请小心设置,因为这可能会导致严重的性能瓶颈在应用程序中.
- rebalance:设置DataStream的分区,以便输出元素以轮询方式平均分配给下一个操作的实例
Sink
Flink没有类似spark中foreach方法,让用户进行迭代操作。虽有对外的输出操作都要利用sink完成。最后通过类似方式完成整个任务最终输出操作:
stream.addSink(new MySink(xxx))
官方提供了一部分框架的sink,也可自定义实现sink
1.10版本提供的sink
- Apache Kafka(source/sink)
- Apache Cassandra(sink)
- Amazom Kinesis Streams (source/sink)
- Elasticsearch(sink)
- Hadoop FileSystem(sink)
- RabbitMQ(source/sink)
- Apache NiFi(source/sink)
- Twitter Streaming API(source)
三方框架(Apache Bahir)提供的sink
- Apache ActiveMQ(source/sink)
- Apache Flume(sink)
- Redis(sink)
- Akka(sink)
- Netty(source)
案例中变量值
<flink.version>1.12.0</flink.version>
<scala.binary.version>2.11</scala.binary.version>
Kafka
flink - kafka 依赖坐标导入
<!-- https://mvnrepository.com/artifact/org.apache.flink/flink-connector-kafka -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka_2.12</artifactId>
<version>1.12.0</version>
</dependency>
案例代码 -> 基于Flink 1.12.0版本
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<String> filedata = env.readTextFile("data/temps.txt");
DataStream<String> mapDataStream = filedata.map(new MapFunction<String, String>() {
@Override
public String map(String value) throws Exception {
String[] split = value.split(",");
return new TempInfo(split[0],new Long(split[1]),new Double(split[2])).toString();
}
});
mapDataStream.addSink(new FlinkKafkaProducer<String>("localhost:9092"