Flink入门(详细教程)
和其他所有的计算框架一样,flink也有一些基础的开发步骤以及基础,核心的API,从开发步骤的角度来讲,主要分为四大部分

导入flink相关依赖
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-scala_2.11</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala_2.11</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka_2.11</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.11</artifactId>
<version>1.7.2</version>
</dependency>
1、Environment
Flink Job在提交执行计算时,需要首先建立和Flink框架之间的联系,也就指的是当前的flink运行环境,只有获取了环境信息,才能将task调度到不同的taskManager执行。而这个环境对象的获取方式相对比较简单
// 批处理环境
val env = ExecutionEnvironment.getExecutionEnvironment
// 流式数据处理环境
val env = StreamExecutionEnvironment.getExecutionEnvironment
2、Source
Flink框架可以从不同的来源获取数据,将数据提交给框架进行处理, 我们将获取数据的来源称之为数据源.
2.1、从集合读取数据
一般情况下,可以将数据临时存储到内存中,形成特殊的数据结构后,作为数据源使用。这里的数据结构采用集合类型是比较普遍的
package cn.kgc.kb09
import org.apache.flink.streaming.api.scala._
/**
* 从集合读取数据
*/
object SourceTest {
def main(args: Array[String]): Unit = {
// 创建执行的环境
val env = StreamExecutionEnvironment.getExecutionEnvironment
// 设置所有执行环境的默认并行度
// env.setParallelism(1)
// 创建流
// 从集合中读取数据
val stream1 = env.fromCollection(
List(
"hello java",
"hello flink"
)
)
// 打印
stream1.print()
// 启动流
env.execute("demo")
}
}

2.2、从文件中读取数据
通常情况下,我们会从存储介质中获取数据,比较常见的就是将日志文件作为数据源
package cn.kgc.kb09
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
/**
* 从文件获取数据
*/
object SourceFile {
def main(args: Array[String]): Unit = {
// 创建执行的环境
val env = StreamExecutionEnvironment.getExecutionEnvironment
// 从指定路径获取数据
val fileDS = env.readTextFile("in/data.log")
// 打印
fileDS.print()
// 执行
env.execute("sensor")
}
}


2.3、从socket端口接收数据
需求:
从socket端口接收字符串格式为"sensor_1,1549044122,10"数据
接收到字符串后将字符串流转换成WaterSensor流 DataStream[WaterSensor]
package cn.kgc.kb09.Window
import cn.kgc.kb09.Tramsfrom.WaterSensor
import org.apache.flink.streaming.api.scala._
/**
* 从socket端口接收字符串格式为"sensor_1,1549044122,10"数据
* 接收到字符串后将字符串流转换成WaterSensor流 DataStream[WaterSensor]
*/
object TumblingWindowDemo {
def main(args: Array[String]): Unit = {
// 创建执行的环境
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1) // 设置并行度
// 从socket端口接收数据
val stream = env.socketTextStream("192.168.247.201",7777)
// 转换成样例类
val dataStream = stream.map(x => {
// 根据逗号切割 获取每个元素
val strings = x.split(",")
WaterSensor(strings(0).trim, strings(1).trim.toLong, strings(2).trim.toDouble)
})
// 打印
dataStream.print()
// 执行
env.execute("sensor")
}
}
运行代码,在虚拟机上输入nc -lk 7777 代表向7777号端口输入数据,来进行测试
2.4、kafka读取数据
Kafka作为消息传输队列,是一个分布式的,高吞吐量,易于扩展地基于主题发布/订阅的消息系统。在现今企业级开发中,Kafka 和 Flink成为构建一个实时的数据处理系统的首选
2.4.1 引入kafka连接器的依赖
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka_2.11</artifactId>
<version>1.7.2</version>
</dependency>
2.4.2 代码实现参考
package cn.kgc.kb09
import java.util.Properties
import org.apache.flink.streaming.api.scala._
import org.apache.flink.api.common.serialization.SimpleStringSchema
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer
import org.apache.kafka.clients.consumer.ConsumerConfig
/**
* 从kafka读取数据
*/
object SourceKafka {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
val prop = new Properties()
prop.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"192.168.247.201:9092")
prop.setProperty(ConsumerConfig.GROUP_ID_CONFIG,"flink-kafka-demo")
prop.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringDeserializer")
prop.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringDeserializer")
prop.setProperty(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,"latest")
// 另外一种表示方法
// prop.setProperty("bootstrap.servers","192.168.247.201:9092")
// prop.setProperty("group.id", "flink-kafka-demo")
// prop.setProperty("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
// prop.setProperty("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
// prop.setProperty("auto.offset.reset", "latest")
val kafkaDS = env.addSource(
new FlinkKafkaConsumer[String](
"sensor",
new SimpleStringSchema(),
prop
)
)
// 打印
kafkaDS.print()
// 执行
env.execute("kafkademo")
}
}
2.4.3 Kafka Shell 命令
创建Topic
kafka-topics.sh --create --zookeeper 192.168.247.201:2181 --topic sensor --partitions 1 --replication-factor 1

生产消息
kafka-console-producer.sh --topic sensor --broker-list 192.168.247.201:9092

启动Java代码,同时执行生产消息命令

2.5、自定义数据源
大多数情况下&

本文是Flink的详细入门教程,涵盖了Environment的介绍,数据源(如集合、文件、socket、kafka)的读取,以及自定义数据源的创建。在转换操作中,讲解了map、flatMap、filter、keyBy、shuffle、split、select、connect、union和各种Operator的使用。最后探讨了Sink的概念,并给出了从Kafka读取数据并存储到Kafka的案例。
最低0.47元/天 解锁文章
1278

被折叠的 条评论
为什么被折叠?



