intellij运行flink的wordcount实验-Java版本

注意哈,intellij运行wordcount这个并不属于flink集群中的任何一种模式,

这个属于java应用方式提交,不需要启动任何flink集群.

########################项目结构####################################################

├──pom.xml

├── src
│   ├── main
│   │   ├── java
│   │   │   └── WordCount.java
│   │   └── resources

└──pom.xml

#############################实验步骤###############################################

①建立上述结构的工程,在intellij中导入,每次改动pom.xml时,intellij都会自动下载依赖,但是第一次下载依赖耗时较长,需要耐心等待。

②nc -lk 9999

然后输入

hello hello world world world(一定要按下回车键,然后Flink才会开始统计词频)

③Alt+Shift+F10选择WordCount运行

注意②③顺序不能反,否则一定概率报错。(发生的概率大小不确定)

结果:

intellij运行flink的wordcount实验-Java版本_第1张图片

 

##############################附录##############################################

WordCount.java(IP改成自己的,默认的是"Desktop")

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.utils.ParameterTool;
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;


public class WordCount {

    public static void main(String[] args) throws Exception {
        //定义socket的端口号
        int port;
        try{
            ParameterTool parameterTool = ParameterTool.fromArgs(args);
            port = parameterTool.getInt("port");
        }catch (Exception e){
            System.err.println("没有指定port参数,使用默认值9000");
            port = 9999;
        }

        //获取运行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        //连接socket获取输入的数据
        DataStreamSource text = env.socketTextStream("Desktop", port, "\n");

        //计算数据
        DataStream windowCount = text.flatMap(new FlatMapFunction() {
            public void flatMap(String value, Collector out) throws Exception {
                String[] splits = value.split("\\s");
                for (String word:splits) {
                    out.collect(new WordWithCount(word,1L));
                }
            }
        })//打平操作,把每行的单词转为类型的数据
                .keyBy("word")//针对相同的word数据进行分组
                .timeWindow(Time.seconds(2),Time.seconds(1))//指定计算数据的窗口大小和滑动窗口大小
                .sum("count");

        //把数据打印到控制台
        windowCount.print()
                .setParallelism(1);//使用一个并行度
        //注意:因为flink是懒加载的,所以必须调用execute方法,上面的代码才会执行
        env.execute("streaming word count");

    }

    /**
     * 主要为了存储单词以及单词出现的次数
     */
    public static class WordWithCount{
        public String word;
        public long count;
        public WordWithCount(){}
        public WordWithCount(String word, long count) {
            this.word = word;
            this.count = count;
        }

        @Override
        public String toString() {
            return "WordWithCount{" +
                    "word='" + word + '\'' +
                    ", count=" + count +
                    '}';
        }
    }


}

pom.xml



    4.0.0

    com.xiao
    bbb
    1.0-SNAPSHOT

    
        
            org.apache.flink
            flink-java
            1.10.0
        
        
            org.apache.flink
            flink-streaming-java_2.12
            1.10.1

        
        
            org.apache.flink
            flink-clients_2.10
            1.2.0
        

    

 

你可能感兴趣的:(Flink)