Flink编程一例

取自 https://ci.apache.org/projects/flink/flink-docs-release-1.8/tutorials/datastream_api.html
含pom文件,未搬运过来。本文核心收获: Flink编程=图计算。

package wikiedits;
import org.apache.flink.api.common.functions.FoldFunction;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.streaming.connectors.wikiedits.WikipediaEditEvent;
import org.apache.flink.streaming.connectors.wikiedits.WikipediaEditsSource;

public class WikipediaAnalysis {

    public static void main(String[] args) throws Exception {
//第一步:创建一个StreamExecutionEnvironment (批处理任务则是创建一个ExecutionEnvironment). 
    	StreamExecutionEnvironment see = StreamExecutionEnvironment.getExecutionEnvironment();
//下一步:创建一个 Wikipedia IRC 日志数据源,从其读取数据:
    	DataStream<WikipediaEditEvent> edits = see.addSource(new WikipediaEditsSource());
//本例用于展示某个时间周期(5秒)内,每个用户增加的内容字节数,或者删除的内容字节数,
//首先,我们确定使用流里面的用户名作为key,用 KeySelector 来指定:
    	KeyedStream<WikipediaEditEvent, String> keyedEdits = edits
    		    .keyBy(new KeySelector<WikipediaEditEvent, String>() {
    		        @Override
    		        public String getKey(WikipediaEditEvent event) {
    		            return event.getUser();
    		        }
    		    });
//其次,我们指定事件窗口的时长为5秒(无重叠),
    		DataStream<Tuple2<String, Long>> result = keyedEdits
    		    .timeWindow(Time.seconds(5))
    		    .fold(new Tuple2<>("", 0L), new FoldFunction<WikipediaEditEvent, Tuple2<String, Long>>() {
    		        @Override
    		        public Tuple2<String, Long> fold(Tuple2<String, Long> acc, WikipediaEditEvent event) {
    		            acc.f0 = event.getUser();//Tuple的概念用过python的同学一定不会陌生。就是固定不能修改的数组。
    		            acc.f1 += event.getByteDiff();//在这5秒的窗口里,一个用户可能编辑多次(每次可能是增加了一定的字数、或删除了一定的字数),给它累加到一起。
    		            return acc;
    		        }
    		    });
//第三,我们让它往console打印出来:
    		result.print();
    		see.execute();//最后,我们启动Flink的job。
//补充知识: 数据源的创建、数据格式的转化、sink操作们,这些操作都仅仅是定义一个图,而execute() 才真正运行这个图。
//图(graph)是图论里的概念。tensorflow等deeplearning工具里也有这个概念。
//在flink中,图可以在集群上运行,也可以在本地单个flink实例上运行。
    }
}

打印示例:

1> (02:1980:8144:1591:0:0:0:1,-7)
1> (OxonAlex,279)
1> (Jimj wpg,-238)
3> (David Eppstein,-38)
3> (3.81.88.252,-2)
4> (A.lanzetta,-2)
4> (LoveFromBJM,191)
4> (ClueBot III,198)
4> (Mclarge90,-8)
4> (Abductive,22)
4> (A00:23C4:7312:8A00:4D8F:7AAD:921E:2707,5)
2> (Tombury89,0)
3> (Dainamo,-59)
3> (Eerie Holiday,0)
4> (ZxxZxxZ,295)

含义:每5秒输出一次,每次是这5秒里编辑Wikipedia的每个用户增减的字节数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值