WordCount - 一个简单的flink项目 | 青训营笔记

141 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第2天

1. java实现Flink批处理脚本

首先,配置MAVEN项目pom.xml中的flink依赖

<dependency>
   <groupId>org.apache.flink</groupId>
   <artifactId>flink-java</artifactId>
   <version>${flink.version}</version>
   <scope>provided</scope>
</dependency>
<dependency>
   <groupId>org.apache.flink</groupId>
   <artifactId>flink-streaming-java_${scala.binary.version}</artifactId>
   <version>${flink.version}</version>
   <scope>provided</scope>
</dependency>

接下来是代码分解

  1. 创建执行环境
// 创建执行环境
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
  1. 加载源数据
// 加载或创建源数据
DataSet<String> text = env.fromElements("this a book", "i love china", "i am chinese");
// 从文件中读取数据
// String inputPath = "D:\project\FlinkTutorial\src\main\resources\hello.txt";
// DataSet<String> inputDataSet = env.readTextFile(inputPath);
  1. 对数据进行处理,按空格分词展开,转换成(word,1)二元组进行统计
// 对数据进行处理,按空格分词展开,转换成(word,1)二元组进行统计
DataSet<Tuple2<String, Integer>> ds = text.flatMap(new LineSplitter()).groupBy(0).sum(1);

static class LineSplitter implements FlatMapFunction<String, Tuple2<String,Integer>> {
    @Override
    public void flatMap(String line, Collector<Tuple2<String, Integer>> collector) throws Exception {
        for (String word:line.split(" ")) {
            collector.collect(new Tuple2<>(word,1));
        }
    }
}
  1. 输出数据到目的端
// 输出数据到目的端
ds.print();

执行结果如下:

image.png

2. java实现Flink流处理脚本

  1. 创建执行环境
// 创建执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
  1. 设置socket数据源
// 设置socket数据源
DataStreamSource<String> source = env.socketTextStream("127.0.0.1", 9999, "\n");
  1. 转化处理数据
// 转化处理数据
DataStream<WordWithCount> dataStream = source.flatMap(new FlatMapFunction<String, WordWithCount>() {
    @Override
    public void flatMap(String line, Collector<WordWithCount> collector) throws Exception {
        for (String word : line.split(" ")) {
            collector.collect(new WordWithCount(word, 1));
        }
    }
}).keyBy("word")//以key分组统计
        .timeWindow(Time.seconds(2),Time.seconds(2))//设置一个窗口函数,模拟数据流动
        .sum("count");//计算时间窗口内的词语个数
  1. 输出数据
// 输出数据到目的端
dataStream.print();
  1. 执行任务操作
// 执行任务操作
env.execute("Flink Streaming Word Count By Java");

windows配置端口监听:要想在windows系统下对端口进行监听,netcat是一个不错的选择。首先安装netcat,然后打开一个cmd控制台,输入net -l -p 9000。再打开一个新的cmd控制台,输入net localhost 9000。可以发现在其中一个窗口打字会同步到另一个窗口上。

执行:打开一个cmd控制台,输入net -l -p 9999,然后启动WordCount,输入 time is passed what is the time?,回车,输入下一句 time is nine time passed again,执行结果如下:

image.png


参考

www.cnblogs.com/ShadowFiend… blog.csdn.net/muriyue6/ar…