概念:
Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行状态计算。Flink设计为在所有常见的集群环境中运行,以内存速度和任何规模执行计算。
在这里,我们解释Flink架构的重要方面
Flink特点
1)mapredue
2)store
3)spark
适用于所有企业,不同企业有不同的业务场景,处理数据量,模型不一样
处理无界和有界数据
随处部署应用
Flink是分布式系统,需要计算资源才可执行程序,Flink可以与常用的集资源进行集成(hadoop,yarn,nesos)
可以单作为独立集运行
通过不同不是部署模实现
这些模式允许flink用管的方式进行交互
flink可以自动识别应用程序配置的所需资源
容错性:
如果发生故障,flink请求新的资源替换
提交或控制程序通过调用TEST调用进行,简化flink在许多环境下集成
以任何比例应用程序(小集群,无限集群)
a) Flink以任何规模运行有状态流应用程序,并行化
b) 利用无限的CPU和磁盘与网络IO
c)轻松的维护大的应用程序状态
d)用户可拓展性报告:
处理万亿个事件
维护过个TB的状态
上千个内核
利用内存中的性能
有状态Flink应用程序针对于对本地状态访问进行优化,任务状态保留在内存中
如果大小超过了可用内存,则保存在访问高效的磁盘数据结构中(SSD机械/固态)
结构:
安装部署
安装包:版本flink-1.7.1-bin-hadoop26-scala_2.12.tgz 按照自己的环境下载对应的安装包
单机模式:
1)直接运行start -cluster.sh 启动单个节点
StandaloneSessionClusterEntrypoint 和TaskManagerRunner在一个主机上
2)192.168.8.xxx:8081界面访问浏览器
集群模式:
修改flink-conf.yaml中的jobmanager.rpc.address: Master (切记:后的空格,否则会报集群起不来)
slave修改两个集群的属性
采用interllij IDEA构建maven工程
pom.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.alex.flink</groupId>
<artifactId>flinktest</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.11</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_2.11</artifactId>
<version>1.7.1</version>
</dependency>
</dependencies>
</project>
Flink-API编程
package com.alex.flink.test;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.ReduceFunction;
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.api.windowing.time.Time;
import org.apache.flink.util.Collector;
/**
* 实时的wordcount
* 往端口中发送数据,实时的计算数据
*/
public class WordCount {
public static void main(String[] args) throws Exception {
//定义端口
final int port = 6666;
//建立连接
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
//得到套接字对象(主机,端口,关键字)
DataStreamSource<String> text = env.socketTextStream("192.168.8.128",port,"\n");
//解析数据。统计数据-单词计数
DataStream<WordWithCount> wc = text.flatMap(new FlatMapFunction<String, WordWithCount>() {
public void flatMap(String s, Collector<WordWithCount> collector) throws Exception {
//按照空白符进行切割
for(String word:s.split("\\s")){
collector.collect(new WordWithCount(word,1L));
}
}
})
//按照key分组
.keyBy("word")
//设置窗口的时间长度,1s计算一次
.timeWindow(Time.seconds(5),Time.seconds(1))
//聚合
.reduce(new ReduceFunction<WordWithCount>() {
public WordWithCount reduce(WordWithCount a, WordWithCount b) throws Exception {
return new WordWithCount(a.word,a.count+b.count);
}
});
//打印并发度
wc.print().setParallelism(1);
//执行
env.execute("Hello Amy");
}
public static class WordWithCount{
public String word;
public long count;
public WordWithCount(){
}
public WordWithCount(String word, long count){
this.word = word;
this.count = count;
}
public String toString(){
return word +":" +count;
}
}
}
自动打包flinktest-1.0-SNAPSHOT.jar上传到主服务器上
发送数据
nc -lk -p 6666
运行 flink run -c com.alex.flink.test.WordCount /root/flinktest-1.0-SNAPSHOT.jar
查看结果: