言于头: (背景)在面对系统业务功能及数据流的繁杂多变但前端而比较规律情况下,许多企业公司开始采用自动编码工具以减少前端编码投入的资源,集中力量处理业务。偶然机会发现公司的业务团队采用flink处理数据(应该是table相关)效率极高,所以今天小弟也来玩玩尝尝鲜。
1 下载Flink
下载地址:https://www.apache.org/dyn/closer.lua/flink/flink-1.11.2/flink-1.11.2-bin-scala_2.11.tgz
此处选择版本为相对比较新的版本1.11.2 如图所示。
2 安装Flink
此处采用3台机器安装,安装模式为Standalone 模式。安装前请先检查所有机器是否为jdk1.8环境。
其次需要每台机器之间相互信任,服务器机器建立信任参考文章:
链接:服务器建立信任(免SSH)
2.1 将上述安装包在服务器某目录下解压
tar zxvf flink-1.11.2-bin-scala_2.11.tgz
2.2 进入相关目录修改配置
cd flink-1.11.2/conf
2.2.1 修改主配置文件 flink-conf.yaml
此配置项为jobmanager的ip
2.2.2 修改work配置文件 workers
此处选择三台机器作为workers
2.3 配置完成后将flink-1.11.2目录拷贝到其他机器上
2.4 启动flink
// 在jobmanager机器上执行该命令
./bin/start-cluster.sh
2.5 启动后的web页面(默认jobmananger:8081)
主页:
历史记录:
taskmanager页面:
jobmanager页面:
3 idea调试WorldCount程序并提交运行
3.1 idea项目结构搭建
项目为本地java结构,所需jar包在下载地址:[idea运行flink程序jar地址下载](https://download.csdn.net/download/bk120/13126174)
log4j2 日志配置文件:
主要代码部分(其实是copy的flink网站里面的样例、哈哈哈):
public class WorldCountDemo {
private static final Logger LOGGER = LogManager.getLogger(WorldCountDemo.class);
private static final String PREE="FLINK【单词统计】:";
public static void main(String[] args) throws Exception {
for (String arg : args) {
LOGGER.info(PREE+arg);
}
LOGGER.info(PREE+"Flink-WorldCountDemo-start.......");
final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
saveDataToFile(args[0], env);
env.execute(PREE);
LOGGER.info(PREE+"Flink-WorldCountDemo-end.......");
}
/***
* 将结果保存到文件
* @date 2020/11/19 11:34
* @param sinkFilePath
* @param env
* @return void
*/
private static void saveDataToFile(String sinkFilePath, ExecutionEnvironment env) {
DataSet<String> text = env.fromElements(
"Who's there?",
"I think I hear them. Stand, ho! Who's there?");
DataSet<Tuple2<String, Integer>> wordCounts = text
.flatMap(new LineSplitter())
.groupBy(0)
.sum(1)
.sortPartition(1, Order.DESCENDING);
// 保存到文件 本地文件系统名称格式 file:///home/rx/data 设置输出并行度可以合并结果
wordCounts.writeAsText(sinkFilePath, FileSystem.WriteMode.OVERWRITE).setParallelism(1);
}
public static class LineSplitter implements FlatMapFunction<String, Tuple2<String, Integer>> {
@Override
public void flatMap(String line, Collector<Tuple2<String, Integer>> out) {
for (String word : line.split(" ")) {
out.collect(new Tuple2<String, Integer>(word, 1));
}
}
}
}
3.2 flink-web界面提交运行任务
将程序打成jar包,在flink-web界面提交运行任务,注意相关输入框参数:本程序的输入为结果输出文件。
此页面会显示任务具体提交到哪个taskmanager处理:
在66机器上相关目录查看结果如下:
4 WorldCount统计TOPN
本次程序修改为统计一个文件中单词出现次数的topN,结果并且输出到另外一个文件中。输入参数为:源文件 topN 结果文件。
程序如下:
public class WorldCountDemo_TOPN {
private static final Logger LOGGER = LogManager.getLogger(WorldCountDemo_TOPN.class);
private static final String PREE="FLINK【单词统计WorldCountDemo_TOPN】:";
/***
* args[0] 为输入文件路径 args[1] 为top n args[2] 为结果路径
* @date 2020/11/19 15:10
* @param args
* @return void
*/
public static void main(String[] args) throws Exception {
LOGGER.info(PREE+"Flink-WorldCountDemo-start.......");
for (String arg : args) {
LOGGER.info(PREE+arg);
}
if (args.length!=3){
LOGGER.info(PREE+"输入参数不正确!");
return;
}
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
//设置全局并行度1
env.setParallelism(1);
DataSet<Tuple2<String, Integer>> resultData=getResultData(args[0],args[1],env);
saveDataToFile(env,args[2], resultData);
env.execute(PREE);
//resultData.print();
LOGGER.info(PREE+"Flink-WorldCountDemo-end.......");
}
private static DataSet<Tuple2<String, Integer>> getResultData(String srcFilePath,String topN, ExecutionEnvironment env) {
Integer topNI=Integer.valueOf(topN);
DataSet<String> text = env.readTextFile(srcFilePath);
DataSet<Tuple2<String, Integer>> wordCounts = text
.flatMap(new LineSplitter())
.groupBy(0)
.sum(1)
.sortPartition(1, Order.DESCENDING)
.first(topNI);
return wordCounts;
}
/***.
* 将结果保存到文件
* @date 2020/11/19 11:34
* @param sinkFilePath
* @param env
* @return void
*/
private static void saveDataToFile( ExecutionEnvironment env,String sinkFilePath, DataSet<Tuple2<String, Integer>> resultData) {
// 保存到文件 本地文件系统名称格式 file:///home/rx/data
resultData.writeAsText(sinkFilePath, FileSystem.WriteMode.OVERWRITE);
}
public static class LineSplitter implements FlatMapFunction<String, Tuple2<String, Integer>> {
@Override
public void flatMap(String line, Collector<Tuple2<String, Integer>> out) {
for (String word : line.split(" ")) {
out.collect(new Tuple2<String, Integer>(word, 1));
}
}
}
}
程序源文件src.txt内容:
打包运行Top20:
TOP20 结果查看:
尽于尾:此次flink的初体验就是一次简单的尝试,了解其搭建安装过程和idea配置运行程序样例等,后续如果有时间,小弟会继续探索学习其相关api以及在企业项目中它是如何发挥作用的。谢谢大家!