一、flink处理的主要过程

上一节wordcount的示例可以看到,flink的处理过程分为下面3个步骤:

1.1 、添加数据源addSource,这里的数据源可以是文件,网络数据流,MQ,Mysql...

1.2、数据转换(或者称为数据处理),比如wordcount里的处理过程,就是把一行文本,按空格拆分成单词,并按单词计数

1.3、将处理好的结果,输出(或下沉)到目标系统,这里的目标系统,可以是控制台、MQ、Redis、Mysql、ElasticSearch...

可能有同学有疑问,上节wordcount里,最后的结果只是调用了1个print方法,好象并没有addSink的过程?

org.apache.flink.streaming.api.datastream.DataStream#print() 可以看下这个方法的源码:

	/**
* Writes a DataStream to the standard output stream (stdout).
*
* <p>For each element of the DataStream the result of {@link Object#toString()} is written.
*
* <p>NOTE: This will print to stdout on the machine where the code is executed, i.e. the Flink
* worker.
*
* @return The closed DataStream.
*/
@PublicEvolving
public DataStreamSink<T> print() {
PrintSinkFunction<T> printFunction = new PrintSinkFunction<>();
return addSink(printFunction).name("Print to Std. Out");
}

其实最后1行,就已经调用了addSink

二、kafka基本操作

下面将把之前WordCount的流式处理版本,其中的Source与Sink改成常用的Kafka:

注:不熟悉kafka的同学,可以参考下面的步骤学习kafka的常用命令行(kafka老手可跳过)

kafka官网下载最新的版本,并解压到本机。

2.1 启动zookeeper
.\zookeeper-server-start.bat ..\..\config\zookeeper.properties
2.2 启动kafka
.\kafka-server-start.bat ..\..\config\server.properties
2.3 查看topic list
.\kafka-topics.bat --list --zookeeper localhost:2181
2.4 启动procduer
.\kafka-console-producer.bat --broker-list localhost:9092 --topic test1
2.5 启动consumer
.\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test1
 
添加Source

1 <dependency>
2 <groupId>org.apache.flink</groupId>
3 <artifactId>flink-connector-kafka-0.11_2.12</artifactId>
4 <version>1.11.2</version>
5 </dependency>

代码:

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("zookeeper.connect", "localhost:2181");
props.put("group.id", "test-read-group");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("auto.offset.reset", "latest"); DataStreamSource<String> text = env.addSource(new FlinkKafkaConsumer011<>(
"test1",
new SimpleStringSchema(),
props));

添加Transform

DataStream<Tuple2<String, Integer>> counts = text.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
@Override
public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
//将每行按word拆分
String[] tokens = value.toLowerCase().split("\\b+"); //收集(类似:map-reduce思路)
for (String token : tokens) {
if (token.trim().length() > 0) {
out.collect(new Tuple2<>(token.trim(), 1));
}
}
}
})
//按Tuple2里的第0项,即:word分组
.keyBy(value -> value.f0)
//然后对Tuple2里的第1项求合
.sum(1);

添加Sink

counts.addSink(new FlinkKafkaProducer010<>("localhost:9092", "test2",
(SerializationSchema<Tuple2<String, Integer>>) element -> ("(" + element.f0 + "," + element.f1 + ")").getBytes()));

如上图,程序运行起来后,在kafka的proceduer终端,随便输入一些word,相当于发送消息给flink,然后idea的console控制台,输出的统计结果。

如果此时,再开一个kafka的consumer,可以看到统计结果,也同步发送到了test2这个topic,即实现了kafka的sink.

附:

完整pom文件

  1 <?xml version="1.0" encoding="UTF-8"?>
2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4 <modelVersion>4.0.0</modelVersion>
5
6 <groupId>com.cnblogs.yjmyzz</groupId>
7 <artifactId>flink-demo</artifactId>
8 <version>0.0.1-SNAPSHOT</version>
9
10 <properties>
11 <java.version>1.8</java.version>
12 <flink.version>1.11.2</flink.version>
13 </properties>
14
15 <dependencies>
16
17 <!-- flink -->
18 <dependency>
19 <groupId>org.apache.flink</groupId>
20 <artifactId>flink-core</artifactId>
21 <version>${flink.version}</version>
22 </dependency>
23
24 <dependency>
25 <groupId>org.apache.flink</groupId>
26 <artifactId>flink-java</artifactId>
27 <version>${flink.version}</version>
28 </dependency>
29
30 <dependency>
31 <groupId>org.apache.flink</groupId>
32 <artifactId>flink-scala_2.12</artifactId>
33 <version>${flink.version}</version>
34 </dependency>
35
36 <dependency>
37 <groupId>org.apache.flink</groupId>
38 <artifactId>flink-clients_2.12</artifactId>
39 <version>${flink.version}</version>
40 </dependency>
41
42 <!--kafka-->
43 <dependency>
44 <groupId>org.apache.flink</groupId>
45 <artifactId>flink-connector-kafka-0.11_2.12</artifactId>
46 <version>1.11.2</version>
47 </dependency>
48
49 <dependency>
50 <groupId>org.apache.flink</groupId>
51 <artifactId>flink-test-utils-junit</artifactId>
52 <version>${flink.version}</version>
53 </dependency>
54 </dependencies>
55
56 <repositories>
57 <repository>
58 <id>central</id>
59 <layout>default</layout>
60 <url>https://repo1.maven.org/maven2</url>
61 </repository>
62 <repository>
63 <id>bintray-streamnative-maven</id>
64 <name>bintray</name>
65 <url>https://dl.bintray.com/streamnative/maven</url>
66 </repository>
67 </repositories>
68
69 <build>
70 <plugins>
71 <plugin>
72 <artifactId>maven-compiler-plugin</artifactId>
73 <version>3.1</version>
74 <configuration>
75 <source>1.8</source>
76 <target>1.8</target>
77 </configuration>
78 </plugin>
79
80 <!-- Scala Compiler -->
81 <plugin>
82 <groupId>net.alchim31.maven</groupId>
83 <artifactId>scala-maven-plugin</artifactId>
84 <version>4.4.0</version>
85 <executions>
86 <execution>
87 <id>scala-compile-first</id>
88 <phase>process-resources</phase>
89 <goals>
90 <goal>compile</goal>
91 </goals>
92 </execution>
93 </executions>
94 <configuration>
95 <jvmArgs>
96 <jvmArg>-Xms128m</jvmArg>
97 <jvmArg>-Xmx512m</jvmArg>
98 </jvmArgs>
99 </configuration>
100 </plugin>
101
102 </plugins>
103 </build>
104
105 </project>

完整java文件

package com.cnblogs.yjmyzz.flink.demo;

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.serialization.SerializationSchema;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer011;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer010;
import org.apache.flink.util.Collector; import java.util.Properties; /**
* @author 菩提树下的杨过(http://yjmyzz.cnblogs.com/)
*/
public class KafkaStreamWordCount { public static void main(String[] args) throws Exception { // 1 设置环境
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 2. 定义数据
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("zookeeper.connect", "localhost:2181");
props.put("group.id", "test-read-group");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("auto.offset.reset", "latest"); DataStreamSource<String> text = env.addSource(new FlinkKafkaConsumer011<>(
"test1",
new SimpleStringSchema(),
props)); // 3. 处理逻辑
DataStream<Tuple2<String, Integer>> counts = text.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
@Override
public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
//将每行按word拆分
String[] tokens = value.toLowerCase().split("\\b+"); //收集(类似:map-reduce思路)
for (String token : tokens) {
if (token.trim().length() > 0) {
out.collect(new Tuple2<>(token.trim(), 1));
}
}
}
})
//按Tuple2里的第0项,即:word分组
.keyBy(value -> value.f0)
//然后对Tuple2里的第1项求合
.sum(1); // 4. 打印结果
counts.addSink(new FlinkKafkaProducer010<>("localhost:9092", "test2",
(SerializationSchema<Tuple2<String, Integer>>) element -> ("(" + element.f0 + "," + element.f1 + ")").getBytes()));
counts.print(); // execute program
env.execute("Kafka Streaming WordCount"); }
}

flink 1.11.2 学习笔记(2)-Source/Transform/Sink的更多相关文章

  1. 1-1 maven 学习笔记(1-6章)

    一.基础概念 1.Maven作为Apache组织中颇为成功的开源项目,主要服务于基于Java平台的项目构建,依赖管理和项目信息管理.从清理,编译,测试到生成报告,到打包部署,自动化构建过程. 还可以跨 ...

  2. Linux(10.5-10.11)学习笔记

    3.2程序编码 unix> gcc -01 -o p p1.c p2.c -o用于指定输出(out)文件名. -01,-02 告诉编译器使用第一级或第二级优化 3.2.1机器级代码 机器级编程两 ...

  3. (11)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Thrift高效通讯 (完结)

    一. 什么是 RPC Restful 采用 Http 进行通讯,优点是开放.标准.简单.兼容性升级容易: 缺点是性能略低.在 QPS 高或者对响应时间要求苛刻的服务上,可以用 RPC(Remote P ...

  4. 1-1.flutter学习笔记(一)git入门(msysgit图文安装)

    1.下载git-for-windows (1)常用的GitHub客户端msysgit,也就是git-for-windows. (2)登录官网 https://git-for-windows.githu ...

  5. c++11多线程学习笔记之一 thread基础使用

    没啥好讲的  c++11  thread类的基本使用 #include "stdafx.h" #include <iostream> #include <thre ...

  6. 机器学习11—Apriori学习笔记

    votesmart下载  https://pypi.python.org/pypi/py-votesmart test11.py #-*- coding:utf-8 import sys sys.pa ...

  7. 11.Laravel5学习笔记:扩展 Validator 类

    简单介绍 在 Laravel5 中,本身已经提供了丰富的验证规则供我们使用,可是天下应用奇葩多,做为程序猿你会发现永远都有新的验证规则诞生,光是组合已经解救不了你的项目了.这个时候就须要我们扩展 Va ...

  8. c++11多线程学习笔记之四 生产消费者

    #ifndef MY_QUEUE_H__ #define MY_QUEUE_H__ #include<list> #include<mutex> #include<thr ...

  9. c++11多线程学习笔记之三 condition_variable使用

    从windows角度来说,condition_variable类似event. 阻塞等待出发,不过condition_variable可以批量出发. 代码如下: // 1111111.cpp : 定义 ...

  10. c++11多线程学习笔记之二 mutex使用

    // 1111111.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include ...

随机推荐

  1. 信息资源管理综合题之“什么是公钥基础设施(PKI) 和 PKI的任务核心 和 补全PKI认证服务系统流程图”

    一.关于公钥基础设施(PKI),请回如下问题 1.PKI的核心任务是什么? 2.PKI的任务核心是什么? 3.基于PKI的认证服务系统至少由哪几部分组成?请将答案内容(1)~(5)填写在题中图下对应的 ...

  2. VS Code 插件 clangd的用法

    VS Code 插件 clangd的用法 目录 深入理解 VS Code 插件 clangd 的用法 1. clangd 的核心原理:语言服务器协议 (LSP) 与 Clang 分析 关键点: 2. ...

  3. .NET+AI | eShopSupport 知多少

    eShopSupport 项目深度解析 eShopSupport 项目的整体架构示意图.左侧为离线运行的工具(DataGenerator.DataIngestor.Evaluator)用于数据准备和评 ...

  4. 探索Rust:深入了解结构体和枚举的用途与高级功能

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  5. C++11 Lambda表达式(匿名函数)详解

    使用STL时,往往会大量用到函数对象,为此要编写很多函数对象类.而有的函数对象类只用定义一个对象,而且这个对象也只使用一次,那编写这样一个函数对象就很浪费了.而且有时这定义函数对象类的地方和使用函数对 ...

  6. [网鼎杯 2020 朱雀组]Nmap 1

    [网鼎杯 2020 朱雀组]Nmap 1 这个题目主要考察的是nmap的常用命令和escapeshell函数 Nmap 相关参数 -iL 读取文件内容,以文件内容作为搜索目标 -o 输出到文件 举例 ...

  7. TenantLineInnerInterceptor源码解读

    一.引言 TenantLineInnerInterceptor是MyBatis-Plus中的一个拦截器类,位于com.baomidou.mybatisplus.extension.plugins.in ...

  8. L1-1、Prompt 是什么?为什么它能“控制 AI”?

    *--Prompt 入门 L1-1 想象一下,你只需输入一句话,AI 就能自动为你写一篇文案.生成一份报告.甚至规划你的创业计划.这种"对话即编程"的背后魔法,就是 Prompt ...

  9. Spring注解之获取自定义注解信息

    目录 前言 由反射获取自定义注解 结束语 前言   在了解了自定义注解的入门知识后,以实践的形式,介绍一下通过反射技术获取自定义注解的常用API,例如如何获取自定义注解的成员变量值等等. 由反射获取自 ...

  10. 【中文】【吴恩达课后编程作业】Course 5 - 序列模型 - 第三周作业 - 机器翻译与触发词检测

    [中文][吴恩达课后编程作业]Course 5 - 序列模型 - 第三周作业 - 机器翻译与触发词检测 上一篇:[课程5 - 第三周测验]※※※※※ [回到目录]※※※※※下一篇:无 致谢: 感谢@e ...