flink实时流处理入门实战1-单词计数

1、flink-1.7.1
编辑start-cluster.bat
set "JAVA_HOME=C:\tools\JDK8"
set "path=%JAVA_HOME%\bin;%PATH%";
set "CLASSPATH=%JAVA_HOME%\lib";

2、创建flink项目
打开cmd黑屏
md project
cd project                           
mvn archetype:generate -DarchetypeGroupId=org.apache.flink -DarchetypeArtifactId=flink-quickstart-java      -DarchetypeVersion=1.7.0          

package cn.zsj;

import org.apache.flink.api.common.typeinfo.BasicTypeInfo;
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.api.java.io.TextInputFormat;
import org.apache.flink.core.fs.Path;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.source.FileProcessingMode;

public class FileStreamingJob {
    public static void main(String[] args) throws Exception {
        Path pa=new Path("C:\\tools\\flink-1.7.1\\project\\1.txt");
 
        TextInputFormat format = new TextInputFormat(pa);
 
        BasicTypeInfo typeInfo = BasicTypeInfo.STRING_TYPE_INFO;
 
        format.setCharsetName("UTF-8");
 
        StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
    /*
        方法内有三个属性,
        分别是WatchType.ONLY_NEW_FILES:处理整个文件,
        PROCESS_ONLY_APPENDED只处理相应的增加部分,
        REPROCESS_WITH_APPENDED :当文件内容增加了之后会重新处理整个文件。
        
        在新的flink版本里面,
        只有两种模式了:PROCESS_ONCE以及PROCESS_CONTINUOUSLY.分别对应处理一次以及增量处理。

    */
        DataStream<String> st=env.readFile(format,"C:\\tools\\flink-1.7.1\\project\\1.txt", 
        FileProcessingMode.PROCESS_CONTINUOUSLY, 
        1L,(TypeInformation)typeInfo);
 
        st.print();
 
        env.execute();
 
    }
 
}

3、构建项目
mvn clean package


4、打开http://localhost:8081
提交jar包到平台,并运行

5、编辑C:\\tools\\flink-1.7.1\\project\\1.txt,黑屏打印如下:
sssfs
safasdf
werwrwr
sfdsdf
a
sd
asd

-----------------分割线----------------------
代码升级,实现计数功能

package cn.zsj;

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.typeinfo.BasicTypeInfo;
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.api.java.io.TextInputFormat;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.core.fs.Path;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.source.FileProcessingMode;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.util.Collector;

public class FileStreamingJob {
    public static void main(String[] args) throws Exception {
        Path pa = new Path("C:\\tools\\flink-1.7.1\\project\\1.txt");

        TextInputFormat format = new TextInputFormat(pa);

        BasicTypeInfo typeInfo = BasicTypeInfo.STRING_TYPE_INFO;

        format.setCharsetName("UTF-8");

        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        /*
         * 方法内有三个属性, 分别是WatchType.ONLY_NEW_FILES:处理整个文件,
         * PROCESS_ONLY_APPENDED只处理相应的增加部分, REPROCESS_WITH_APPENDED
         * :当文件内容增加了之后会重新处理整个文件。 在新的flink版本里面,
         * 只有两种模式了:PROCESS_ONCE以及PROCESS_CONTINUOUSLY.分别对应处理一次以及增量处理。
         * “Filter”就类似于过滤。 “keyBy”就等效于SQL里的group by。
         * “aggregate”是一个聚合操作,如计数、求和、求平均等。 “reduce”就类似于MapReduce里的reduce。
         * “join”操作就有点类似于我们数据库里面的join。 “connect”实现把两个流连成一个流。
         * “repartition”是一个重新分区操作(还没研究)。 “project”操作就类似于SQL里面的snacks(还没研究)。
         */
        DataStream<String> st = env.readFile(format, "C:\\tools\\flink-1.7.1\\project\\1.txt",
                FileProcessingMode.PROCESS_CONTINUOUSLY, 1L, (TypeInformation) typeInfo).flatMap(new Splitter())
                .keyBy(0).sum(1);
        
        st.print();

        env.execute();

    }

}

class Splitter implements FlatMapFunction<String, Tuple2<String, Integer>> {
    private static final long serialVersionUID = 1L;

    @Override
    public void flatMap(String sentence, Collector<Tuple2<String, Integer>> out) throws Exception {
        for (String word : sentence.split(" ")) {
            System.out.println("wwww:" + word);
            out.collect(new Tuple2<String, Integer>(word, 1));
        }

    }
}


在1.txt输入一下内容:
1231 嗯嗯 人人 eee fff
asdfa asdfa


黑屏打印如下:
wwww:1231
wwww:嗯嗯
wwww:人人
wwww:eee
wwww:fff
wwww:asdfa
wwww:asdfa
(1231,4)
(嗯嗯,4)
(人人,4)
(eee,4)
(fff,3)
(asdfa,2)
(asdfa,3)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值