很久没更新博客了,这半年多来,公司的事情也比较多,没多少时间学习,又赶上疫情,都是在家办公,慢慢感觉自己要颓废下去了,赶紧抽个周末让自己学点东西。
每个分布式计算模型都是从Word count 开始的,学习Flink肯定也不例外,下面这个程序收集socket 端口的输入,统计5s内出现的单词书,并输出到控制台。
object ApplicationDemo {
def main(args: Array[String]): Unit = {
//获取执行环境
val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
// val data: DataStream[String] = FlinkConnectKafka.getKafkaSource(env, "flink-kafka-topic")
//指定数据源
val data = env.socketTextStream("localhost", 9999)
val result: DataStream[(String, Int)] = data.flatMap {
_.toLowerCase.split(" ") filter {
_.nonEmpty
}
}
.map(x => (x, 1))
.keyBy(0)
.timeWindow(Time.seconds(5))
.sum(1)
result.print()
env.execute("Flink Test")
}
}
一段最简单的Flink 代码。
数据的流向通过 Data Source ==> Transformation ==> Data Sink
一、内部数据源
二、外部数据源
实现SourceFunction的自定义数据源,通过addSource()注册使用。
一、内部数据接收
二、外部数据接收
实现SinkFunction 的自定义数据接收,通过addSink()注册使用。
预定义的source和sink
Flink 还有些一些额外的连接器通过 Apache Bahir 发布, 包括:
注:Apache Bahir 提供对分布式分析平台(如 Apache Spark 和 Apache Flink )的扩展,通过多种流连接器和 SQL 数据源扩展其覆盖范围。
通过下面代码创建一个kafka消费者
val properties = new Properties()
properties.setProperty("bootstrap.servers", "localhost:9092")
// 仅 Kafka 0.8 需要
//properties.setProperty("zookeeper.connect", "localhost:2181")
properties.setProperty("group.id", "test")
//kafka1.0.0版本之后使用FlinkKafkaConsumer
stream = env
.addSource(new FlinkKafkaConsumer[String]("topic", new SimpleStringSchema(), properties))
.print()
kafka 是我工作中用到的最常见的上下游组件,在这也就只列举一个创建kafka consumer的例子了。
Transformation 操作是DataStream生成新的DataStream的过程,在转化过程中,每个操作类型被定义成不同的Operator;DataStream的操作可以分为Single-DataStream、Multi-DataStream、物理分区三类。
dataStream.shuffle()
(2)、Round-robin partitioning
通过循环的方式对数据集中的部分进行重分区,解决数据倾斜
dataStream.rebalance()
(3)、Rescaling partitioning
将元素循环地分区到下游操作的子集;在上游并发度和下游并发度成倍数关系,Rescaling 的效果优于Round-robin
dataStream.rescale()
(4)、Broadcasting
将元素广播到每个分区。
dataStream.broadcast()
(5)、Custom partitioning(自定义分区)
用户定义的分区程序为每个元素选择目标任务。继承Partitioner类,实现partition方法即可
dataStream.partitionCustom(partitioner, 0)
今天介绍了DataStream 的整个编程模型,从source 到transformation 到sink整个完整的链路;今天就到这吧。还是那句话,作为一个菜鸟,如果各位大佬在看博客的过程中发现什么问题,欢迎随时批评指正。