From ecd8805ed5476969a63c7283025e5a721a3b16d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E7=A5=A5?= <1366971433@qq.com> Date: Thu, 31 Oct 2019 10:08:37 +0800 Subject: [PATCH] flink datasource --- .../main/java/com/heibaiying/BatchJob.java | 54 ---- .../java/com/heibaiying/StreamingJob.java | 52 +--- .../main/scala/com/heibaiying/BatchJob.scala | 66 ----- .../scala/com/heibaiying/StreamingJob.scala | 63 ---- .../scala/com/heibaiying/WordCountBatch.scala | 10 +- .../com/heibaiying/WordCountStreaming.scala | 18 +- code/Flink/flink-kafka-integration/pom.xml | 242 +++++++++++++++ .../java/com/heibaiying/CustomSinkJob.java | 23 ++ .../com/heibaiying/KafkaStreamingJob.java | 43 +++ .../java/com/heibaiying/bean/Employee.java | 42 +++ .../com/heibaiying/sink/FlinkToMySQL.java | 43 +++ .../src/main/resources/log4j.properties | 23 ++ code/Flink/flink-time-watermark/pom.xml | 232 +++++++++++++++ .../main/java/com/heibaiying/SampleJob.java | 27 ++ .../src/main/resources/log4j.properties | 23 ++ notes/Flink_Data_Sink.md | 119 ++++++++ notes/Flink_Data_Source.md | 280 ++++++++++++++++++ notes/Flink_Time_Watermark.md | 0 notes/Flink_Windows.md | 110 +++++++ notes/Flink开发环境搭建.md | 38 +-- notes/资料分享与工具推荐.md | 1 + pictures/flink-RichParallelSourceFunction.png | Bin 0 -> 9630 bytes pictures/flink-kafka-datasource-console.png | Bin 0 -> 22489 bytes pictures/flink-kafka-datasource-producer.png | Bin 0 -> 6427 bytes pictures/flink-kafka-producer-consumer.png | Bin 0 -> 15042 bytes pictures/flink-mysql-sink.png | Bin 0 -> 5378 bytes pictures/flink-non-windowed.png | Bin 0 -> 19818 bytes pictures/flink-session-windows.png | Bin 0 -> 36954 bytes pictures/flink-sliding-windows.png | Bin 0 -> 36620 bytes pictures/flink-tumbling-windows.png | Bin 0 -> 33763 bytes pictures/flink-window-word-count.png | Bin 0 -> 27183 bytes 31 files changed, 1245 insertions(+), 264 deletions(-) delete mode 100644 code/Flink/flink-basis-java/src/main/java/com/heibaiying/BatchJob.java delete mode 100644 code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/BatchJob.scala delete mode 100644 code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/StreamingJob.scala create mode 100644 code/Flink/flink-kafka-integration/pom.xml create mode 100644 code/Flink/flink-kafka-integration/src/main/java/com/heibaiying/CustomSinkJob.java create mode 100644 code/Flink/flink-kafka-integration/src/main/java/com/heibaiying/KafkaStreamingJob.java create mode 100644 code/Flink/flink-kafka-integration/src/main/java/com/heibaiying/bean/Employee.java create mode 100644 code/Flink/flink-kafka-integration/src/main/java/com/heibaiying/sink/FlinkToMySQL.java create mode 100644 code/Flink/flink-kafka-integration/src/main/resources/log4j.properties create mode 100644 code/Flink/flink-time-watermark/pom.xml create mode 100644 code/Flink/flink-time-watermark/src/main/java/com/heibaiying/SampleJob.java create mode 100644 code/Flink/flink-time-watermark/src/main/resources/log4j.properties create mode 100644 notes/Flink_Data_Sink.md create mode 100644 notes/Flink_Data_Source.md create mode 100644 notes/Flink_Time_Watermark.md create mode 100644 notes/Flink_Windows.md create mode 100644 pictures/flink-RichParallelSourceFunction.png create mode 100644 pictures/flink-kafka-datasource-console.png create mode 100644 pictures/flink-kafka-datasource-producer.png create mode 100644 pictures/flink-kafka-producer-consumer.png create mode 100644 pictures/flink-mysql-sink.png create mode 100644 pictures/flink-non-windowed.png create mode 100644 pictures/flink-session-windows.png create mode 100644 pictures/flink-sliding-windows.png create mode 100644 pictures/flink-tumbling-windows.png create mode 100644 pictures/flink-window-word-count.png diff --git a/code/Flink/flink-basis-java/src/main/java/com/heibaiying/BatchJob.java b/code/Flink/flink-basis-java/src/main/java/com/heibaiying/BatchJob.java deleted file mode 100644 index d95a4bb..0000000 --- a/code/Flink/flink-basis-java/src/main/java/com/heibaiying/BatchJob.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.heibaiying; - -import org.apache.flink.api.common.functions.FlatMapFunction; -import org.apache.flink.api.common.functions.MapFunction; -import org.apache.flink.api.common.functions.ReduceFunction; -import org.apache.flink.api.java.ExecutionEnvironment; -import org.apache.flink.api.java.operators.DataSource; -import org.apache.flink.api.java.operators.FlatMapOperator; -import org.apache.flink.api.java.tuple.Tuple2; -import org.apache.flink.streaming.api.datastream.DataStream; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.util.Collector; - -import java.util.Arrays; -import java.util.List; - -/** - * Skeleton for a Flink Batch Job. - * - *

For a tutorial how to write a Flink batch application, check the - * tutorials and examples on the Flink Website. - * - *

To package your application into a JAR file for execution, - * change the main class in the POM.xml file to this class (simply search for 'mainClass') - * and run 'mvn clean package' on the command line. - */ -public class BatchJob { - - public static void main(String[] args) throws Exception { - - // set up the batch execution environment - final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); - - env.execute("Flink Batch Java API Skeleton"); - } -} diff --git a/code/Flink/flink-basis-java/src/main/java/com/heibaiying/StreamingJob.java b/code/Flink/flink-basis-java/src/main/java/com/heibaiying/StreamingJob.java index 5d248f7..a4c688f 100644 --- a/code/Flink/flink-basis-java/src/main/java/com/heibaiying/StreamingJob.java +++ b/code/Flink/flink-basis-java/src/main/java/com/heibaiying/StreamingJob.java @@ -1,56 +1,18 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - package com.heibaiying; -import org.apache.flink.api.common.functions.*; import org.apache.flink.api.java.operators.DataSource; -import org.apache.flink.api.java.tuple.Tuple; -import org.apache.flink.api.java.tuple.Tuple2; -import org.apache.flink.api.java.tuple.Tuple3; -import org.apache.flink.streaming.api.collector.selector.OutputSelector; -import org.apache.flink.streaming.api.datastream.*; +import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.streaming.api.functions.co.CoMapFunction; -import org.apache.flink.util.Collector; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * Skeleton for a Flink Streaming Job. - * - *

For a tutorial how to write a Flink streaming application, check the - * tutorials and examples on the Flink Website. - * - *

To package your application into a JAR file for execution, run - * 'mvn clean package' on the command line. - * - *

If you change the name of the main class (with the public static void main(String[] args)) - * method, change the respective entry in the POM.xml file (simply search for 'mainClass'). - */ public class StreamingJob { - public static void main(String[] args) throws Exception { - // set up the streaming execution environment - final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); + private static final String ROOT_PATH = "D:\\BigData-Notes\\code\\Flink\\flink-basis-java\\src\\main\\resources\\"; + public static void main(String[] args) throws Exception { + + final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); + DataStreamSource streamSource = env.readTextFile(ROOT_PATH + "log4j.properties"); + streamSource.writeAsText(ROOT_PATH + "out").setParallelism(1); env.execute(); } diff --git a/code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/BatchJob.scala b/code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/BatchJob.scala deleted file mode 100644 index 6652d98..0000000 --- a/code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/BatchJob.scala +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.heibaiying - -import org.apache.flink.api.scala._ - -/** - * Skeleton for a Flink Batch Job. - * - * For a tutorial how to write a Flink batch application, check the - * tutorials and examples on the Flink Website. - * - * To package your application into a JAR file for execution, - * change the main class in the POM.xml file to this class (simply search for 'mainClass') - * and run 'mvn clean package' on the command line. - */ -object BatchJob { - - def main(args: Array[String]) { - // set up the batch execution environment - val env = ExecutionEnvironment.getExecutionEnvironment - - /* - * Here, you can start creating your execution plan for Flink. - * - * Start with getting some data from the environment, like - * env.readTextFile(textPath); - * - * then, transform the resulting DataSet[String] using operations - * like - * .filter() - * .flatMap() - * .join() - * .group() - * - * and many more. - * Have a look at the programming guide: - * - * http://flink.apache.org/docs/latest/apis/batch/index.html - * - * and the examples - * - * http://flink.apache.org/docs/latest/apis/batch/examples.html - * - */ - - // execute program - env.execute("Flink Batch Scala API Skeleton") - } -} diff --git a/code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/StreamingJob.scala b/code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/StreamingJob.scala deleted file mode 100644 index 2325a6c..0000000 --- a/code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/StreamingJob.scala +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.heibaiying - -import org.apache.flink.streaming.api.scala._ - -/** - * Skeleton for a Flink Streaming Job. - * - * For a tutorial how to write a Flink streaming application, check the - * tutorials and examples on the Flink Website. - * - * To package your application into a JAR file for execution, run - * 'mvn clean package' on the command line. - * - * If you change the name of the main class (with the public static void main(String[] args)) - * method, change the respective entry in the POM.xml file (simply search for 'mainClass'). - */ -object StreamingJob { - def main(args: Array[String]) { - // set up the streaming execution environment - val env = StreamExecutionEnvironment.getExecutionEnvironment - - /* - * Here, you can start creating your execution plan for Flink. - * - * Start with getting some data from the environment, like - * env.readTextFile(textPath); - * - * then, transform the resulting DataStream[String] using operations - * like - * .filter() - * .flatMap() - * .join() - * .group() - * - * and many more. - * Have a look at the programming guide: - * - * http://flink.apache.org/docs/latest/apis/streaming/index.html - * - */ - - // execute program - env.execute("Flink Streaming Scala API Skeleton") - } -} diff --git a/code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/WordCountBatch.scala b/code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/WordCountBatch.scala index ff52ae7..b7a51b3 100644 --- a/code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/WordCountBatch.scala +++ b/code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/WordCountBatch.scala @@ -6,8 +6,12 @@ object WordCountBatch { def main(args: Array[String]): Unit = { val benv = ExecutionEnvironment.getExecutionEnvironment - val text = benv.readTextFile("D:\\BigData-Notes\\code\\Flink\\flink-basis-scala\\src\\main\\resources\\wordcount.txt") - val counts = text.flatMap { _.toLowerCase.split(",") filter { _.nonEmpty } }.map { (_, 1) }.groupBy(0).sum(1) - counts.print() + val dataSet = benv.readTextFile("D:\\BigData-Notes\\code\\Flink\\flink-basis-scala\\src\\main\\resources\\wordcount.txt") + dataSet.flatMap { _.toLowerCase.split(",")} + .filter (_.nonEmpty) + .map { (_, 1) } + .groupBy(0) + .sum(1) + .print() } } diff --git a/code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/WordCountStreaming.scala b/code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/WordCountStreaming.scala index daad9ce..6a71e5d 100644 --- a/code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/WordCountStreaming.scala +++ b/code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/WordCountStreaming.scala @@ -10,16 +10,14 @@ object WordCountStreaming { val senv = StreamExecutionEnvironment.getExecutionEnvironment - val text: DataStream[String] = senv.socketTextStream("192.168.200.229", 9999, '\n') - val windowCounts = text.flatMap { w => w.split(",") }.map { w => WordWithCount(w, 1) }.keyBy("word") - .timeWindow(Time.seconds(5)).sum("count") - - windowCounts.print().setParallelism(1) - + val dataStream: DataStream[String] = senv.socketTextStream("192.168.0.229", 9999, '\n') + dataStream.flatMap { line => line.toLowerCase.split(",") } + .filter(_.nonEmpty) + .map { word => (word, 1) } + .keyBy(0) + .timeWindow(Time.seconds(3)) + .sum(1) + .print() senv.execute("Streaming WordCount") - } - - case class WordWithCount(word: String, count: Long) - } diff --git a/code/Flink/flink-kafka-integration/pom.xml b/code/Flink/flink-kafka-integration/pom.xml new file mode 100644 index 0000000..1b80867 --- /dev/null +++ b/code/Flink/flink-kafka-integration/pom.xml @@ -0,0 +1,242 @@ + + + 4.0.0 + + com.heibaiying + flink-kafka-integration + 1.0 + jar + + Flink Quickstart Job + http://www.myorganization.org + + + UTF-8 + 1.9.0 + 1.8 + 2.11 + ${java.version} + ${java.version} + + + + + apache.snapshots + Apache Development Snapshot Repository + https://repository.apache.org/content/repositories/snapshots/ + + false + + + true + + + + + + + + + org.apache.flink + flink-java + ${flink.version} + provided + + + org.apache.flink + flink-streaming-java_${scala.binary.version} + ${flink.version} + provided + + + + + + + + + + org.slf4j + slf4j-log4j12 + 1.7.7 + runtime + + + log4j + log4j + 1.2.17 + runtime + + + org.apache.flink + flink-connector-kafka_2.11 + 1.9.0 + + + mysql + mysql-connector-java + 8.0.16 + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + ${java.version} + ${java.version} + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.0.0 + + + + package + + shade + + + + + org.apache.flink:force-shading + com.google.code.findbugs:jsr305 + org.slf4j:* + log4j:* + + + + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + + + com.heibaiying.KafkaStreamingJob + + + + + + + + + + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + org.apache.maven.plugins + maven-shade-plugin + [3.0.0,) + + shade + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + [3.1,) + + testCompile + compile + + + + + + + + + + + + + + + + + + + + add-dependencies-for-IDEA + + + + idea.version + + + + + + org.apache.flink + flink-java + ${flink.version} + compile + + + org.apache.flink + flink-streaming-java_${scala.binary.version} + ${flink.version} + compile + + + + + + diff --git a/code/Flink/flink-kafka-integration/src/main/java/com/heibaiying/CustomSinkJob.java b/code/Flink/flink-kafka-integration/src/main/java/com/heibaiying/CustomSinkJob.java new file mode 100644 index 0000000..14861bc --- /dev/null +++ b/code/Flink/flink-kafka-integration/src/main/java/com/heibaiying/CustomSinkJob.java @@ -0,0 +1,23 @@ +package com.heibaiying; + +import com.heibaiying.bean.Employee; +import com.heibaiying.sink.FlinkToMySQL; +import org.apache.flink.streaming.api.datastream.DataStreamSource; +import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; + +import java.sql.Date; + +public class CustomSinkJob { + + public static void main(String[] args) throws Exception { + + final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); + Date date = new Date(System.currentTimeMillis()); + DataStreamSource streamSource = env.fromElements( + new Employee("hei", 10, date), + new Employee("bai", 20, date), + new Employee("ying", 30, date)); + streamSource.addSink(new FlinkToMySQL()); + env.execute(); + } +} diff --git a/code/Flink/flink-kafka-integration/src/main/java/com/heibaiying/KafkaStreamingJob.java b/code/Flink/flink-kafka-integration/src/main/java/com/heibaiying/KafkaStreamingJob.java new file mode 100644 index 0000000..d26da5f --- /dev/null +++ b/code/Flink/flink-kafka-integration/src/main/java/com/heibaiying/KafkaStreamingJob.java @@ -0,0 +1,43 @@ +package com.heibaiying; + +import org.apache.flink.api.common.functions.MapFunction; +import org.apache.flink.api.common.serialization.SimpleStringSchema; +import org.apache.flink.streaming.api.datastream.DataStream; +import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; +import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer; +import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer; +import org.apache.flink.streaming.connectors.kafka.KafkaSerializationSchema; +import org.apache.kafka.clients.producer.ProducerRecord; + +import javax.annotation.Nullable; +import java.util.Properties; + +public class KafkaStreamingJob { + + public static void main(String[] args) throws Exception { + + final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); + + // 1.指定Kafka的相关配置属性 + Properties properties = new Properties(); + properties.setProperty("bootstrap.servers", "192.168.200.229:9092"); + + // 2.接收Kafka上的数据 + DataStream stream = env + .addSource(new FlinkKafkaConsumer<>("flink-stream-in-topic", new SimpleStringSchema(), properties)); + + // 3.定义计算结果到 Kafka ProducerRecord 的转换 + KafkaSerializationSchema kafkaSerializationSchema = new KafkaSerializationSchema() { + @Override + public ProducerRecord serialize(String element, @Nullable Long timestamp) { + return new ProducerRecord<>("flink-stream-out-topic", element.getBytes()); + } + }; + // 4. 定义Flink Kafka生产者 + FlinkKafkaProducer kafkaProducer = new FlinkKafkaProducer<>("flink-stream-out-topic", + kafkaSerializationSchema, properties, FlinkKafkaProducer.Semantic.AT_LEAST_ONCE, 5); + // 5. 将接收到输入元素*2后写出到Kafka + stream.map((MapFunction) value -> value + value).addSink(kafkaProducer); + env.execute("Flink Streaming"); + } +} diff --git a/code/Flink/flink-kafka-integration/src/main/java/com/heibaiying/bean/Employee.java b/code/Flink/flink-kafka-integration/src/main/java/com/heibaiying/bean/Employee.java new file mode 100644 index 0000000..24c2179 --- /dev/null +++ b/code/Flink/flink-kafka-integration/src/main/java/com/heibaiying/bean/Employee.java @@ -0,0 +1,42 @@ +package com.heibaiying.bean; + +import java.sql.Date; + +public class Employee { + + private String name; + private int age; + private Date birthday; + + Employee(){} + + public Employee(String name, int age, Date birthday) { + this.name = name; + this.age = age; + this.birthday = birthday; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public Date getBirthday() { + return birthday; + } + + public void setBirthday(Date birthday) { + this.birthday = birthday; + } +} diff --git a/code/Flink/flink-kafka-integration/src/main/java/com/heibaiying/sink/FlinkToMySQL.java b/code/Flink/flink-kafka-integration/src/main/java/com/heibaiying/sink/FlinkToMySQL.java new file mode 100644 index 0000000..aa3e064 --- /dev/null +++ b/code/Flink/flink-kafka-integration/src/main/java/com/heibaiying/sink/FlinkToMySQL.java @@ -0,0 +1,43 @@ +package com.heibaiying.sink; + +import com.heibaiying.bean.Employee; +import org.apache.flink.configuration.Configuration; +import org.apache.flink.streaming.api.functions.sink.RichSinkFunction; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; + +public class FlinkToMySQL extends RichSinkFunction { + + private PreparedStatement stmt; + private Connection conn; + + @Override + public void open(Configuration parameters) throws Exception { + Class.forName("com.mysql.cj.jdbc.Driver"); + conn = DriverManager.getConnection("jdbc:mysql://192.168.200.229:3306/employees?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false", "root", "123456"); + String sql = "insert into emp(name, age, birthday) values(?, ?, ?)"; + stmt = conn.prepareStatement(sql); + } + + @Override + public void invoke(Employee value, Context context) throws Exception { + stmt.setString(1, value.getName()); + stmt.setInt(2, value.getAge()); + stmt.setDate(3, value.getBirthday()); + stmt.executeUpdate(); + } + + @Override + public void close() throws Exception { + super.close(); + if (stmt != null) { + stmt.close(); + } + if (conn != null) { + conn.close(); + } + } + +} diff --git a/code/Flink/flink-kafka-integration/src/main/resources/log4j.properties b/code/Flink/flink-kafka-integration/src/main/resources/log4j.properties new file mode 100644 index 0000000..da32ea0 --- /dev/null +++ b/code/Flink/flink-kafka-integration/src/main/resources/log4j.properties @@ -0,0 +1,23 @@ +################################################################################ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +################################################################################ + +log4j.rootLogger=INFO, console + +log4j.appender.console=org.apache.log4j.ConsoleAppender +log4j.appender.console.layout=org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p %-60c %x - %m%n diff --git a/code/Flink/flink-time-watermark/pom.xml b/code/Flink/flink-time-watermark/pom.xml new file mode 100644 index 0000000..2dd15f1 --- /dev/null +++ b/code/Flink/flink-time-watermark/pom.xml @@ -0,0 +1,232 @@ + + + 4.0.0 + + com.heibaiying + flink-time-watermark + 1.0 + jar + + Flink Quickstart Job + http://www.myorganization.org + + + UTF-8 + 1.9.0 + 1.8 + 2.11 + ${java.version} + ${java.version} + + + + + apache.snapshots + Apache Development Snapshot Repository + https://repository.apache.org/content/repositories/snapshots/ + + false + + + true + + + + + + + + + org.apache.flink + flink-java + ${flink.version} + provided + + + org.apache.flink + flink-streaming-java_${scala.binary.version} + ${flink.version} + provided + + + + + + + + + + org.slf4j + slf4j-log4j12 + 1.7.7 + runtime + + + log4j + log4j + 1.2.17 + runtime + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + ${java.version} + ${java.version} + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.0.0 + + + + package + + shade + + + + + org.apache.flink:force-shading + com.google.code.findbugs:jsr305 + org.slf4j:* + log4j:* + + + + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + + + com.heibaiying.SampleJob + + + + + + + + + + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + org.apache.maven.plugins + maven-shade-plugin + [3.0.0,) + + shade + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + [3.1,) + + testCompile + compile + + + + + + + + + + + + + + + + + + + + add-dependencies-for-IDEA + + + + idea.version + + + + + + org.apache.flink + flink-java + ${flink.version} + compile + + + org.apache.flink + flink-streaming-java_${scala.binary.version} + ${flink.version} + compile + + + + + + diff --git a/code/Flink/flink-time-watermark/src/main/java/com/heibaiying/SampleJob.java b/code/Flink/flink-time-watermark/src/main/java/com/heibaiying/SampleJob.java new file mode 100644 index 0000000..733b05d --- /dev/null +++ b/code/Flink/flink-time-watermark/src/main/java/com/heibaiying/SampleJob.java @@ -0,0 +1,27 @@ +package com.heibaiying; + +import org.apache.flink.api.common.functions.FlatMapFunction; +import org.apache.flink.api.java.tuple.Tuple2; +import org.apache.flink.streaming.api.datastream.DataStreamSource; +import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; +import org.apache.flink.streaming.api.windowing.time.Time; +import org.apache.flink.util.Collector; + +public class SampleJob { + + public static void main(String[] args) throws Exception { + + final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); + DataStreamSource streamSource = env.socketTextStream("192.168.200.229", 9999, "\n", 3); + streamSource.flatMap(new FlatMapFunction>() { + @Override + public void flatMap(String value, Collector> out) throws Exception { + String[] words = value.split("\t"); + for (String word : words) { + out.collect(new Tuple2<>(word, 1L)); + } + } + }).keyBy(0).timeWindow(Time.seconds(3)).sum(1).print(); + env.execute("Flink Streaming"); + } +} diff --git a/code/Flink/flink-time-watermark/src/main/resources/log4j.properties b/code/Flink/flink-time-watermark/src/main/resources/log4j.properties new file mode 100644 index 0000000..da32ea0 --- /dev/null +++ b/code/Flink/flink-time-watermark/src/main/resources/log4j.properties @@ -0,0 +1,23 @@ +################################################################################ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +################################################################################ + +log4j.rootLogger=INFO, console + +log4j.appender.console=org.apache.log4j.ConsoleAppender +log4j.appender.console.layout=org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p %-60c %x - %m%n diff --git a/notes/Flink_Data_Sink.md b/notes/Flink_Data_Sink.md new file mode 100644 index 0000000..939ce8a --- /dev/null +++ b/notes/Flink_Data_Sink.md @@ -0,0 +1,119 @@ +# Flink Sink + +## 一、Data Sinks + +在使用 Flink 进行数据处理时,数据经 Data Source 流入,然后通过系列 Transformations 的转化,最终可以通过 Sink 将计算结果进行输出,Flink Data Sinks 就是用于定义数据流最终的输出位置。Flink 提供了几个较为简单的 Sink API 用于日常的开发,具体如下: + +### 1.1 writeAsText + +`writeAsText` 用于将计算结果以文本的方式并行地写入到指定文件夹下,除了路径参数是必选外,该方法还可以通过指定第二个参数来定义输出模式,它有以下两个可选值: + ++ **WriteMode.NO_OVERWRITE**:当指定路径上不存在任何文件时,才执行写出操作; ++ **WriteMode.OVERWRITE**:不论指定路径上是否存在文件,都执行写出操作;如果原来已有文件,则进行覆盖。 + +使用示例如下: + +```java + streamSource.writeAsText("D:\\out", FileSystem.WriteMode.OVERWRITE); +``` + +以上写出是以并行的方式写出到多个文件,如果想要将输出结果全部写出到一个文件,需要设置其并行度为 1: + +```java +streamSource.writeAsText("D:\\out", FileSystem.WriteMode.OVERWRITE).setParallelism(1); +``` + +### 1.2 writeAsCsv + +`writeAsCsv` 用于将计算结果以 CSV 的文件格式写出到指定目录,除了路径参数是必选外,该方法还支持传入输出模式,行分隔符,和字段分隔符三个额外的参数,其方法定义如下: + +```java +writeAsCsv(String path, WriteMode writeMode, String rowDelimiter, String fieldDelimiter) +``` + +### 1.3 print \ printToErr + +`print \ printToErr` 是测试当中最常用的方式,用于将计算结果以标准输出流或错误输出流的方式打印到控制台上。 + +### 1.4 writeUsingOutputFormat + +采用自定义的输出格式将计算结果写出,上面介绍的 `writeAsText` 和 `writeAsCsv` 其底层调用的都是该方法,源码如下: + +```java +public DataStreamSink writeAsText(String path, WriteMode writeMode) { + TextOutputFormat tof = new TextOutputFormat<>(new Path(path)); + tof.setWriteMode(writeMode); + return writeUsingOutputFormat(tof); +} +``` + +### 1.5 writeToSocket + +`writeToSocket` 用于将计算结果以指定的格式写出到 Socket 中,使用示例如下: + +```shell +streamSource.writeToSocket("192.168.0.226", 9999, new SimpleStringSchema()); +``` + +## 二、Streaming Connectors + +除了上述 API 外,Flink 中还内置了系列的 Connectors 连接器,用于将计算结果输入到常用的存储系统或者消息中间件中,具体如下: + +- Apache Kafka (支持 source 和 sink) +- Apache Cassandra (sink) +- Amazon Kinesis Streams (source/sink) +- Elasticsearch (sink) +- Hadoop FileSystem (sink) +- RabbitMQ (source/sink) +- Apache NiFi (source/sink) +- Google PubSub (source/sink) + +除了内置的连接器外,你还可以通过 Apache Bahir 的连接器扩展 Flink。Apache Bahir 旨在为分布式数据分析系统 (如 Spark,Flink) 等提供功能上的扩展,当前其支持的与 Flink Sink 相关的连接器如下: + +- Apache ActiveMQ (source/sink) +- Apache Flume (sink) +- Redis (sink) +- Akka (sink) + +这里接着在 Data Sources 章节介绍的整合 Kafka Source 的基础上,将 Kafka Sink 也一并进行整合,具体步骤如下。 + +## 三、整合 Kafka Sink + +### 3.1 addSink + +### 3.2 创建输出主题 + +```shell +# 创建用于测试的输出主题 +bin/kafka-topics.sh --create \ + --bootstrap-server hadoop001:9092 \ + --replication-factor 1 \ + --partitions 1 \ + --topic flink-stream-out-topic + +# 查看所有主题 + bin/kafka-topics.sh --list --bootstrap-server hadoop001:9092 +``` + +### 3.3 启动消费者 + +```java +bin/kafka-console-consumer.sh --bootstrap-server hadoop001:9092 --topic flink-stream-out-topic +``` + +### 3.4 测试结果 + + + +## 四、自定义 Sink + +### 4.1 导入依赖 + +### 4.2 自定义 Sink + +### 4.3 测试结果 + + + + + diff --git a/notes/Flink_Data_Source.md b/notes/Flink_Data_Source.md new file mode 100644 index 0000000..7686cad --- /dev/null +++ b/notes/Flink_Data_Source.md @@ -0,0 +1,280 @@ +# Flink Data Source +

+ +## 一、内置 Data Source + +Flink Data Source 用于定义 Flink 程序的数据来源,Flink 官方内置提供了多种数据获取方法,用于帮助开发者简单快速地构建输入流,具体如下: + +### 1.1 基于文件构建 + +**1. readTextFile(path)**:按照 TextInputFormat 格式读取文本文件,并将其内容以字符串的形式返回。示例如下: + +```java +env.readTextFile(filePath).print(); +``` + +**2. readFile(fileInputFormat, path)** :按照指定格式读取文件。 + +**3. readFile(inputFormat, filePath, watchType, interval, typeInformation) **:按照指定格式周期性的读取文件。其中各个参数的含义如下: + ++ **inputFormat**:数据流的输入格式。 ++ **filePath**:文件路径,可以是本地文件系统上的路径,也可以是 HDFS 上的文件路径。 ++ **watchType**:读取方式,它有两个可选值,分别是 `FileProcessingMode.PROCESS_ONCE` 和 `FileProcessingMode.PROCESS_CONTINUOUSLY`:前者表示对指定路径上的数据只读取一次,然后退出;后者表示对路径进行定期扫描从而可以获取到新的数据。需要注意的是如果 watchType 被设置为 `PROCESS_CONTINUOUSLY`,那么当文件被修改时,其所有的内容 (包含原有的内容和新增的内容) 都将被重新处理,因此这会打破 Flink 的 *exactly-once* 语义。 ++ **interval**:定期扫描的时间间隔。 ++ **typeInformation**:输入流中元素的类型。 + +使用示例如下: + +```java +final String filePath = "D:\\log4j.properties"; +final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); +env.readFile(new TextInputFormat(new Path(filePath)), + filePath, + FileProcessingMode.PROCESS_ONCE, + 1, + BasicTypeInfo.STRING_TYPE_INFO).print(); +env.execute(); +``` + +### 1.2 基于集合构建 + +**1. fromCollection(Collection)**:基于集合构建,集合中的所有元素必须是同一类型。示例如下: + +```java +env.fromCollection(Arrays.asList(1,2,3,4,5)).print(); +``` + +**2. fromElements(T ...)**: 基于元素构建,所有元素必须是同一类型。示例如下: + +```java +env.fromElements(1,2,3,4,5).print(); +``` +**3. generateSequence(from, to)**:基于给定的序列区间进行构建。示例如下: + +```java +env.generateSequence(0,100); +``` + +**4. fromCollection(Iterator, Class)**:基于迭代器进行构建。第一个参数用于定义迭代器,第二个参数用于定义输出元素的类型。使用示例如下: + +```java +env.fromCollection(new CustomIterator(), BasicTypeInfo.INT_TYPE_INFO).print(); +``` + +其中 CustomIterator 为自定义的迭代器,这里以产生 1 到 100 区间内的数据为例,源码如下。需要注意的是自定义迭代器除了要实现 Iterator 接口外,还必须要实现序列化接口 Serializable ,否则会抛出序列化失败的异常: + +```java +import java.io.Serializable; +import java.util.Iterator; + +public class CustomIterator implements Iterator, Serializable { + private Integer i = 0; + + @Override + public boolean hasNext() { + return i < 100; + } + + @Override + public Integer next() { + i++; + return i; + } +} +``` + +**5. fromParallelCollection(SplittableIterator, Class)**:方法接收两个参数,第二个参数用于定义输出元素的类型,第一个参数 SplittableIterator 是迭代器的抽象基类,它用于将原始迭代器的值拆分到多个不相交的迭代器中。 + +### 1.3 基于 Socket 构建 + +Flink 提供了 socketTextStream 方法用于构建基于 Socket 的数据流,socketTextStream 方法有以下四个主要参数: + +- **hostname**:主机名; +- **port**:端口号,设置为 0 时,表示端口号自动分配; +- **delimiter**:用于分隔每条记录的分隔符; +- **maxRetry**:当 Socket 临时关闭时,程序的最大重试间隔,单位为秒。设置为 0 时表示不进行重试;设置为负值则表示一直重试。使用示例如下: + +```shell + env.socketTextStream("192.168.0.229", 9999, "\n", 3).print(); +``` + + + +## 二、自定义 Data Source + +### 2.1 SourceFunction + +除了内置的数据源外,用户还可以使用 `addSource` 方法来添加自定义的数据源。自定义的数据源必须要实现 SourceFunction 接口,这里以产生 [0 , 1000) 区间内的数据为例,代码如下: + +```java +final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); + +env.addSource(new SourceFunction() { + + private long count = 0L; + private volatile boolean isRunning = true; + + public void run(SourceContext ctx) { + while (isRunning && count < 1000) { + // 通过collect将输入发送出去 + ctx.collect(count); + count++; + } + } + + public void cancel() { + isRunning = false; + } + +}).print(); +env.execute(); +``` + +### 2.2 ParallelSourceFunction 和 RichParallelSourceFunction + +上面通过 SourceFunction 实现的数据源是不具有并行度的,即不支持在得到的 DataStream 上调用 `setParallelism(n)` 方法,此时会抛出如下的异常: + +```shell +Exception in thread "main" java.lang.IllegalArgumentException: Source: 1 is not a parallel source +``` + +如果你想要实现具有并行度的输入流,则需要实现 ParallelSourceFunction 或 RichParallelSourceFunction 接口,其与 SourceFunction 的关系如下图: + +
+ParallelSourceFunction 直接继承自 ParallelSourceFunction,具有并行度的功能。RichParallelSourceFunction 则继承自 AbstractRichFunction,同时实现了 ParallelSourceFunction 接口,所以其除了具有并行度的功能外,还提供了额外的与生命周期相关的方法,如 open() ,closen() 。 + +## 三、Streaming Connectors + +### 3.1 内置连接器 + +除了自定义数据源外, Flink 还内置了多种连接器,用于满足大多数的数据收集场景。当前内置连接器的支持情况如下: + +- Apache Kafka (支持 source 和 sink) +- Apache Cassandra (sink) +- Amazon Kinesis Streams (source/sink) +- Elasticsearch (sink) +- Hadoop FileSystem (sink) +- RabbitMQ (source/sink) +- Apache NiFi (source/sink) +- Twitter Streaming API (source) +- Google PubSub (source/sink) + +除了上述的连接器外,你还可以通过 Apache Bahir 的连接器扩展 Flink。Apache Bahir 旨在为分布式数据分析系统 (如 Spark,Flink) 等提供功能上的扩展,当前其支持的与 Flink 相关的连接器如下: + +- Apache ActiveMQ (source/sink) +- Apache Flume (sink) +- Redis (sink) +- Akka (sink) +- Netty (source) + +随着 Flink 的不断发展,可以预见到其会支持越来越多类型的连接器,关于连接器的后续发展情况,可以查看其官方文档:[Streaming Connectors]( https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/connectors/index.html) 。在所有 DataSource 连接器中,使用的广泛的就是 Kafka,所以这里我们以其为例,来介绍 Connectors 的整合步骤。 + +### 3.2 整合 Kakfa + +#### 1. 导入依赖 + +整合 Kafka 时,一定要注意所使用的 Kafka 的版本,不同版本间所需的 Maven 依赖和开发时所调用的类均不相同,具体如下: + +| Maven 依赖 | Flink 版本 | Consumer and Producer 类的名称 | Kafka 版本 | +| :------------------------------ | :--------- | :----------------------------------------------- | :--------- | +| flink-connector-kafka-0.8_2.11 | 1.0.0 + | FlinkKafkaConsumer08
FlinkKafkaProducer08 | 0.8.x | +| flink-connector-kafka-0.9_2.11 | 1.0.0 + | FlinkKafkaConsumer09
FlinkKafkaProducer09 | 0.9.x | +| flink-connector-kafka-0.10_2.11 | 1.2.0 + | FlinkKafkaConsumer010
FlinkKafkaProducer010 | 0.10.x | +| flink-connector-kafka-0.11_2.11 | 1.4.0 + | FlinkKafkaConsumer011
FlinkKafkaProducer011 | 0.11.x | +| flink-connector-kafka_2.11 | 1.7.0 + | FlinkKafkaConsumer
FlinkKafkaProducer | >= 1.0.0 | + +这里我使用的 Kafka 版本为 kafka_2.12-2.2.0,添加的依赖如下: + +```xml + + org.apache.flink + flink-connector-kafka_2.11 + 1.9.0 + +``` + +#### 2. 代码开发 + +这里以最简单的场景为例,接收 Kafka 上的数据并打印,代码如下: + +```java +final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); +Properties properties = new Properties(); +// 指定Kafka的连接位置 +properties.setProperty("bootstrap.servers", "hadoop001:9092"); +// 指定监听的主题,并定义Kafka字节消息到Flink对象之间的转换规则 +DataStream stream = env + .addSource(new FlinkKafkaConsumer<>("flink-stream-in-topic", new SimpleStringSchema(), properties)); +stream.print(); +env.execute("Flink Streaming"); +``` + +### 3.3 整合测试 + +#### 1. 启动 Kakfa + +Kafka 的运行依赖于 zookeeper,需要预先启动,可以启动 Kafka 内置的 zookeeper,也可以启动自己安装的: + +```shell +# zookeeper启动命令 +bin/zkServer.sh start + +# 内置zookeeper启动命令 +bin/zookeeper-server-start.sh config/zookeeper.properties +``` + +启动单节点 kafka 用于测试: + +```shell +# bin/kafka-server-start.sh config/server.properties +``` + +#### 2. 创建 Topic + +```shell +# 创建用于测试主题 +bin/kafka-topics.sh --create \ + --bootstrap-server hadoop001:9092 \ + --replication-factor 1 \ + --partitions 1 \ + --topic flink-stream-in-topic + +# 查看所有主题 + bin/kafka-topics.sh --list --bootstrap-server hadoop001:9092 +``` + +#### 3. 启动 Producer + +这里 启动一个 Kafka 生产者,用于发送测试数据: + +```shell +bin/kafka-console-producer.sh --broker-list hadoop001:9092 --topic flink-stream-in-topic +``` + +#### 4. 测试结果 + +在 Producer 上输入任意测试数据,之后观察程序控制台的输出: + +
+程序控制台的输出如下: + +
+可以看到已经成功接收并打印出相关的数据。 + + + +## 参考资料 + +1. data-sources:https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/datastream_api.html#data-sources +2. Streaming Connectors:https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/connectors/index.html +3. Apache Kafka Connector: https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/connectors/kafka.html \ No newline at end of file diff --git a/notes/Flink_Time_Watermark.md b/notes/Flink_Time_Watermark.md new file mode 100644 index 0000000..e69de29 diff --git a/notes/Flink_Windows.md b/notes/Flink_Windows.md new file mode 100644 index 0000000..40deba1 --- /dev/null +++ b/notes/Flink_Windows.md @@ -0,0 +1,110 @@ +# Flink Windows + +## 一、窗口概念 + +在大多数场景下,我们需要统计的数据流都是无界的,因此我们无法等待整个数据流终止后才进行统计。通常情况下,我们只需要对某个时间范围或者数量范围内的数据进行统计分析:如每隔五分钟统计一次过去一小时内所有商品的点击量;或者每发生1000次点击后,都去统计一下每个商品点击率的占比。在 Flink 中,我们使用窗口 (Window) 来实现这类功能。按照统计维度的不同,Flink 中的窗口可以分为 时间窗口 (Time Windows) 和 计数窗口 (Count Windows) 。 + +## 二、Time Windows + +Time Windows 用于以时间为维度来进行数据聚合,具体分为以下四类: + +### 2.1 Tumbling Windows + +滚动窗口 (Tumbling Windows) 是指彼此之间没有重叠的窗口。例如:每隔1小时统计过去1小时内的商品点击量,那么 1 天就只能分为 24 个窗口,每个窗口彼此之间是不存在重叠的,具体如下: + +![flink-tumbling-windows](D:\BigData-Notes\pictures\flink-tumbling-windows.png) + +这里我们以词频统计为例,给出一个具体的用例,代码如下: + +```java +final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); +// 接收socket上的数据输入 +DataStreamSource streamSource = env.socketTextStream("hadoop001", 9999, "\n", 3); +streamSource.flatMap(new FlatMapFunction>() { + @Override + public void flatMap(String value, Collector> out) throws Exception { + String[] words = value.split("\t"); + for (String word : words) { + out.collect(new Tuple2<>(word, 1L)); + } + } +}).keyBy(0).timeWindow(Time.seconds(3)).sum(1).print(); //每隔3秒统计一次每个单词出现的数量 +env.execute("Flink Streaming"); +``` + +测试结果如下: + +![flink-window-word-count](D:\BigData-Notes\pictures\flink-window-word-count.png) + +### 2.2 Sliding Windows + +滑动窗口用于滚动进行聚合分析,例如:每隔 6 分钟统计一次过去一小时内所有商品的点击量,那么统计窗口彼此之间就是存在重叠的,即 1天可以分为 240 个窗口。图示如下: + +![flink-sliding-windows](D:\BigData-Notes\pictures\flink-sliding-windows.png) + +可以看到 window 1 - 4 这四个窗口彼此之间都存在着时间相等的重叠部分。想要实现滑动窗口,只需要在使用 timeWindow 方法时额外传递第二个参数作为滚动时间即可,具体如下: + +```java +// 每隔3秒统计一次过去1分钟内的数据 +timeWindow(Time.minutes(1),Time.seconds(3)) +``` + +### 2.3 Session Windows + +当用户在进行持续浏览时,可能每时每刻都会有点击数据,例如在活动区间内,用户可能频繁的将某类商品加入和移除购物车,而你只想知道用户本次浏览最终的购物车情况,此时就可以在用户持有的会话结束后再进行统计。想要实现这类统计,可以通过 Session Windows 来进行实现。 + +![flink-session-windows](D:\BigData-Notes\pictures\flink-session-windows.png) + +具体的实现代码如下: + +```java +// 以处理时间为衡量标准,如果10秒内没有任何数据输入,就认为会话已经端口,此时触发统计 +window(ProcessingTimeSessionWindows.withGap(Time.seconds(10))) +// 以事件时间为衡量标准 +window(EventTimeSessionWindows.withGap(Time.seconds(10))) +``` + +### 2.4 Global Windows + +最后一个窗口是全局窗口, 全局窗口会将所有 key 相同的元素分配到同一个窗口中,其通常配合触发器 (trigger) 进行使用。如果没有相应触发器,则计算将不会被执行。 + +![flink-non-windowed](D:\BigData-Notes\pictures\flink-non-windowed.png) + +这里继续以上面词频统计的案例为例,示例代码如下: + +```java +// 当单词累计出现的次数每达到10次时,则触发计算,计算整个窗口内该单词出现的总数 +window(GlobalWindows.create()).trigger(CountTrigger.of(10)).sum(1).print(); +``` + +## 三、Count Windows + +Count Windows 用于以数量为维度来进行数据聚合,同样也分为滚动窗口和滑动窗口,实现方式也和时间窗口完全一致,只是调用的 API 不同,具体如下: + +```java +// 滚动计数窗口,每1000次点击则计算一次 +countWindow(1000) +// 滑动计数窗口,每10次点击发生后,则计算过去1000次点击的情况 +countWindow(1000,10) +``` + +实际上计数窗口内部就是调用的我们上一部分介绍的全局窗口来实现的,其源码如下: + +```java +public WindowedStream countWindow(long size) { + return window(GlobalWindows.create()).trigger(PurgingTrigger.of(CountTrigger.of(size))); +} + + +public WindowedStream countWindow(long size, long slide) { + return window(GlobalWindows.create()) + .evictor(CountEvictor.of(size)) + .trigger(CountTrigger.of(slide)); +} +``` + + + +## 参考资料 + +Flink Windows: https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/stream/operators/windows.html \ No newline at end of file diff --git a/notes/Flink开发环境搭建.md b/notes/Flink开发环境搭建.md index 81a2769..eddffc8 100644 --- a/notes/Flink开发环境搭建.md +++ b/notes/Flink开发环境搭建.md @@ -17,7 +17,6 @@ Flink 分别提供了基于 Java 语言和 Scala 语言的 API ,如果想要使用 Scala 语言来开发 Flink 程序,可以通过在 IDEA 中安装 Scala 插件来提供语法提示,代码高亮等功能。打开 IDEA , 依次点击 `File => settings => plugins` 打开插件安装页面,搜索 Scala 插件并进行安装,安装完成后,重启 IDEA 即可生效。
- ## 二、Flink 项目初始化 ### 2.1 使用官方脚本构建 @@ -68,11 +67,9 @@ mvn archetype:generate \ 如果你使用的是开发工具是 IDEA ,可以直接在项目创建页面选择 Maven Flink Archetype 进行项目初始化:
- 如果你的 IDEA 没有上述 Archetype, 可以通过点击右上角的 `ADD ARCHETYPE` ,来进行添加,依次填入所需信息,这些信息都可以从上述的 `archetype:generate ` 语句中获取。点击 `OK` 保存后,该 Archetype 就会一直存在于你的 IDEA 中,之后每次创建项目时,只需要直接选择该 Archetype 即可:
- 选中 Flink Archetype ,然后点击 `NEXT` 按钮,之后的所有步骤都和正常的 Maven 工程相同。 ## 三、项目结构 @@ -82,7 +79,6 @@ mvn archetype:generate \ 创建完成后的自动生成的项目结构如下:
- 其中 BatchJob 为批处理的样例代码,源码如下: ```scala @@ -146,7 +142,6 @@ object StreamingJob { 需要特别注意的以上依赖的 `scope` 标签全部被标识为 provided ,这意味着这些依赖都不会被打入最终的 JAR 包。因为 Flink 的安装包中已经提供了这些依赖,位于其 lib 目录下,名为 `flink-dist_*.jar` ,它包含了 Flink 的所有核心类和依赖:
- `scope` 标签被标识为 provided 会导致你在 IDEA 中启动项目时会抛出 ClassNotFoundException 异常。基于这个原因,在使用 IDEA 创建项目时还自动生成了以下 profile 配置: ```xml @@ -190,7 +185,6 @@ object StreamingJob { 在 id 为 `add-dependencies-for-IDEA` 的 profile 中,所有的核心依赖都被标识为 compile,此时你可以无需改动任何代码,只需要在 IDEA 的 Maven 面板中勾选该 profile,即可直接在 IDEA 中运行 Flink 项目:
- ## 四、词频统计案例 项目创建完成后,可以先书写一个简单的词频统计的案例来尝试运行 Flink 项目,以下以 Scala 语言为例,分别介绍流处理程序和批处理程序的编程示例: @@ -204,9 +198,13 @@ object WordCountBatch { def main(args: Array[String]): Unit = { val benv = ExecutionEnvironment.getExecutionEnvironment - val text = benv.readTextFile("D:\\wordcount.txt") - val counts = text.flatMap { _.toLowerCase.split(",") filter { _.nonEmpty } }.map { (_, 1) }.groupBy(0).sum(1) - counts.print() + val dataSet = benv.readTextFile("D:\\wordcount.txt") + dataSet.flatMap { _.toLowerCase.split(",")} + .filter (_.nonEmpty) + .map { (_, 1) } + .groupBy(0) + .sum(1) + .print() } } ``` @@ -223,7 +221,6 @@ d,d 本机不需要配置其他任何的 Flink 环境,直接运行 Main 方法即可,结果如下:
- ### 4.2 流处理示例 ```scala @@ -236,20 +233,17 @@ object WordCountStreaming { val senv = StreamExecutionEnvironment.getExecutionEnvironment - val text: DataStream[String] = senv.socketTextStream("192.168.0.229", 9999, '\n') - val windowCounts = text.flatMap { w => w.split(",") }.map { w => WordWithCount(w, 1) }.keyBy("word") - .timeWindow(Time.seconds(5)).sum("count") - - windowCounts.print().setParallelism(1) - + val dataStream: DataStream[String] = senv.socketTextStream("192.168.0.229", 9999, '\n') + dataStream.flatMap { line => line.toLowerCase.split(",") } + .filter(_.nonEmpty) + .map { word => (word, 1) } + .keyBy(0) + .timeWindow(Time.seconds(3)) + .sum(1) + .print() senv.execute("Streaming WordCount") - } - - case class WordWithCount(word: String, count: Long) - } - ``` 这里以监听指定端口号上的内容为例,使用以下命令来开启端口服务: @@ -271,7 +265,6 @@ https://flink.apache.org/downloads.html Flink 大多数版本都提供有 Scala 2.11 和 Scala 2.12 两个版本的安装包可供下载:
- 下载完成后进行解压即可,Scala Shell 位于安装目录的 bin 目录下,直接使用以下命令即可以本地模式启动: ```shell @@ -281,7 +274,6 @@ Flink 大多数版本都提供有 Scala 2.11 和 Scala 2.12 两个版本的安 命令行启动完成后,其已经提供了批处理 (benv 和 btenv)和流处理(senv 和 stenv)的运行环境,可以直接运行 Scala Flink 程序,示例如下:
- 最后说明一个常见的异常:这里我使用的 Flink 版本为 1.9.1,启动时会抛出如下异常。这里因为按照官方的说明,目前所有 Scala 2.12 版本的安装包暂时都不支持 Scala Shell,所以如果想要使用 Scala Shell,只能选择 Scala 2.11 版本的安装包。 ```shell diff --git a/notes/资料分享与工具推荐.md b/notes/资料分享与工具推荐.md index 0bf087a..b7e3b33 100644 --- a/notes/资料分享与工具推荐.md +++ b/notes/资料分享与工具推荐.md @@ -26,6 +26,7 @@ - 有态度的 HBase/Spark/BigData:http://hbasefly.com/ - 深入 Apache Spark 的设计和实现原理 : https://github.com/JerryLead/SparkInternals +- Jark's Blog - Flink 系列文章:http://wuchong.me/categories/Flink/ diff --git a/pictures/flink-RichParallelSourceFunction.png b/pictures/flink-RichParallelSourceFunction.png new file mode 100644 index 0000000000000000000000000000000000000000..64c0f9e977b811577d81786211a8782825c0e13f GIT binary patch literal 9630 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 B4#5Bb literal 0 HcmV?d00001 diff --git a/pictures/flink-kafka-datasource-console.png b/pictures/flink-kafka-datasource-console.png new file mode 100644 index 0000000000000000000000000000000000000000..91620dccf2e47bbac8491a9b65362982e4740789 GIT binary patch literal 22489 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 Bg!TXc literal 0 HcmV?d00001 diff --git a/pictures/flink-kafka-datasource-producer.png b/pictures/flink-kafka-datasource-producer.png new file mode 100644 index 0000000000000000000000000000000000000000..1d24c3816d5f6ff14809f9e84a074be30847964f GIT binary patch literal 6427 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 literal 0 HcmV?d00001 diff --git a/pictures/flink-kafka-producer-consumer.png b/pictures/flink-kafka-producer-consumer.png new file mode 100644 index 0000000000000000000000000000000000000000..98f17ce18e9b01813e8dc50971244fd3e15eadc5 GIT binary patch literal 15042 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 literal 0 HcmV?d00001 diff --git a/pictures/flink-non-windowed.png b/pictures/flink-non-windowed.png new file mode 100644 index 0000000000000000000000000000000000000000..6ce05bea4fb7914c706257a4f7981a032fc13513 GIT binary patch literal 19818 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 KM)AF8Z~qUuQc#@$ literal 0 HcmV?d00001 diff --git a/pictures/flink-session-windows.png b/pictures/flink-session-windows.png new file mode 100644 index 0000000000000000000000000000000000000000..08f432f313216ef1d9f24e1edc2a6771da7dfcff GIT binary patch literal 36954 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 literal 0 HcmV?d00001 diff --git a/pictures/flink-sliding-windows.png b/pictures/flink-sliding-windows.png new file mode 100644 index 0000000000000000000000000000000000000000..1c92a372401d588346811eef37afde2c8c643f49 GIT binary patch literal 36620 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 literal 0 HcmV?d00001 diff --git a/pictures/flink-tumbling-windows.png b/pictures/flink-tumbling-windows.png new file mode 100644 index 0000000000000000000000000000000000000000..94d6f72fbfd67c9186c4c10c39c6e1699e520dba GIT binary patch literal 33763 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%0DqV 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 literal 0 HcmV?d00001 diff --git a/pictures/flink-window-word-count.png b/pictures/flink-window-word-count.png new file mode 100644 index 0000000000000000000000000000000000000000..158f255aca0f7c33a19449f471b9f892ac93870f GIT binary patch literal 27183 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