DataStream 转换操作
转换就是从一个或多个Datastream生成新的Datastream的过程。所有Datastream的转换操作可以分为单Single-Datastream、Multi-Datastream、物理分区三类类型。
1、Single-Datastream 操作
Single-Datastream主要有Map、FlatMap、Filter、KeyBy、Reduce、Aggregations等算子。
2、Muti-Datastream 操作
Muti-Datastream 主要有Union、Connect、CoMap、CoFlatMap、Split、Select、Iterate等算子。
3、物理分区操作
物理分区操作的作用是根据指定分区策略将数据重新分配到不同节点的Task上执行。常见的分区策略有随机分区、平衡分区、按比例分区、自定义分区。
Flink 内部常见的数据重分区的策略:
(1)随机分区(random partition)
通过随机分区将数据分配到下游的算子的每个分区中,分区相对均衡,但比较容易失去原有数据的分区结构。
var shuffleStream = dataStream.shuffle
(2) 平衡分区(roundrobin partition)
通过循环的方法对数据集中重分区,能够尽可能保证每个分区的数据平衡,当数据倾斜时可以使用这个分区策略来优化。
val shuffleStream = dataStream.rebalance()
(3)按比例分区(rescale partition)
也是通过循环的方式将数据重平衡,但与平衡分区策略不同的是,平衡分区是全局性通过网络介质将数据传输到其他的节点完成数据的重新平衡,而按比例分区只是对上下游算子数据进行重平衡。
val shuffleStream = dataStream.rescale()
(4)广播操作(broadcast)
通过广播操作可以将小数据集分发到算子的每个分区中。
val shuffleStream = dataStream.broadcast()
(5) 自定义分区(custom partition)
用户实现自定义分区器,然后调用DataStream API 上 partitionCustom() 方法将创建的分区器应用到数据集上。
//自定义分区器
object customPartitioner extends Partitions[String] {
.......
}
//通过数据集字段名称指定分区字段
dataStream.partitionCustom(customPartitioner ,"field_name")
//通过数据集字段索引指定分区字段
dataStream.partitionCustom(customPartitioner ,0)
DataSinks 数据输出
在Flink中DataStream数据输出到外部系统的过程叫DataSink操作。在Flink内部定义的第三方外部系统连接器中,支持数据输出的有Kafka、Cassandra、Kinesis、Elasticsearch、Hadoop FileSystem、RabbitMQ、NIFI等。
1、基本数据输出
基本输出包含了文件输出、客户端输出、Socket网络端口输出等。
dataStream.writeAsCSV(filePath,WriteMode.OVERWRITE)
dataStream.writeAsText(filePath)
dataStream.writeToSocket(host,port,new SimpleStringScheme())
2、第三方数据输出
val kafkaProducer = new FlinkKafkaProducer011[String](url,topic,new SimplezStringScheme)
dataStream.addSink(kafkaProducer)
博主的微信公众号,不定期发布技术文章,喜欢的可以关注一下哈