Flink-【1】初体验

言于头: (背景)在面对系统业务功能及数据流的繁杂多变但前端而比较规律情况下,许多企业公司开始采用自动编码工具以减少前端编码投入的资源,集中力量处理业务。偶然机会发现公司的业务团队采用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以及在企业项目中它是如何发挥作用的。谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值