一、Flink前奏-完成一个电商订单数据的java需求让你明白用途
- 需求
- 电商订单数据处理,根据下⾯的list1和list2 各10个订单
- 统计两个⼈的分别购买订单的平均价格
- 统计两个人的订单总价
- 电商订单数据处理,根据下⾯的list1和list2 各10个订单
具体实现
结构图
JdkStreamApp
点击查看完整内容
import net.xdclass.model.VideoOrder; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class JdkStreamApp { public static void main(String [] args){ //总价 35 List<VideoOrder> videoOrders1 = Arrays.asList( new VideoOrder("20190242812", "springboot教程", 3), new VideoOrder("20194350812", "微服务SpringCloud", 5), new VideoOrder("20190814232", "Redis教程", 9), new VideoOrder("20190523812", "⽹⻚开发教程", 9), new VideoOrder("201932324", "百万并发实战Netty", 9)); //总价 54 List<VideoOrder> videoOrders2 = Arrays.asList( new VideoOrder("2019024285312", "springboot教程", 3), new VideoOrder("2019081453232", "Redis教程", 9), new VideoOrder("20190522338312", "⽹⻚开发教程", 9), new VideoOrder("2019435230812", "Jmeter压⼒测试", 5), new VideoOrder("2019323542411", "Git+Jenkins持续集成", 7), new VideoOrder("2019323542424", "Idea全套教程", 21)); // 一定配置idea的 jdk8编译 //平均价格 double videoOrder1Avg1 = videoOrders1.stream().collect(Collectors.averagingInt(VideoOrder::getMoney)).doubleValue(); double videoOrder1Avg2 = videoOrders2.stream().collect(Collectors.averagingInt(VideoOrder::getMoney)).doubleValue(); System.out.println("videoOrder1Avg1="+videoOrder1Avg1); System.out.println("videoOrder1Avg2="+videoOrder1Avg2); //订单总价 int total1 = videoOrders1.stream().collect(Collectors.summingInt(VideoOrder::getMoney)).intValue(); int total2 = videoOrders2.stream().collect(Collectors.summingInt(VideoOrder::getMoney)).intValue(); System.out.println("total1="+total1); System.out.println("total2="+total2); } }
ProductOrder
点击查看完整内容
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class ProductOrder { private int id; private String title; private Long amount; }
VideoOrder
点击查看完整内容
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class VideoOrder { private String tradeNo; private String title; private int money; }
控制台输出
点击查看完整内容
videoOrder1Avg1=7.0
videoOrder1Avg2=9.0
total1=35
total2=54
二、JDK8 里面的Stream和流式处理框架Flink对比
-
- 为啥java程序本身可以做的,还要学Flink?
- 想实现当下企业用一个Flink的需求,你不用Flink也行的
- 要是你开心可以用纯java代码、或者spark其他框架
- JDK8 Stream也是流处理,flink也是流处理, 那区别点来啦
- 数据来源和输出有多样化怎么处理;
- jdk stream -写代码
- flink - 自带很多组件
- 海量数据需要进行实时处理
- jdk stream - 内部jvm单节点处理,单机内部并行处理
- flink - 节点可以分布在不同机器的JVM上,多机器并行处理
- 统计时间段内数据,但数据达到是无序的
- jdk stream -写代码
- flink - 自带窗口函数和watermark处理迟到数据
- 其他太多。。。。
- 数据来源和输出有多样化怎么处理;
- 为了实现一个天猫双十一实时交易大盘各个品类数据展示功能
- 小滴课堂-老王说他乐意这样写java代码,你奈我何??
- 一个功能耗时1个月完成,需求不敢轻易改动
- 二当家小D采用了Flink进行开发这个功能
- 1周搞定,需求可以灵活变动
- 小滴课堂-老王说他乐意这样写java代码,你奈我何??
三、新一代流式处理框架Flink介绍和重要概念讲解
- 什么是Flink
- Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算
- 官网:https://flink.apache.org/zh/flink-architecture.html
- 有谁在用呢(基本大厂都在用)
- 用来做啥:实时数仓建设、实时数据监控、实时反作弊风控、画像系统等
- 概念
- 数据流
- 任何类型的数据都可以形成一种事件流,信用卡交易、传感器测量、机器日志、网站或移动应用程序上的用户交互记录,所有这些数据都形成一种流。
- 什么是有界流
- 有定义流的开始,也有定义流的结束。有界流可以在摄取所有数据后再进行计算。有界流所有数据可以被排序,所以并不需要有序摄取。有界流处理通常被称为批处理
- 什么是无界流
- 有定义流的开始,但没有定义流的结束。它们会无休止地产生数据。无界流的数据必须持续处理,即数据被摄取后需要立刻处理。我们不能等到所有数据都到达再处理,因为输入是无限的,在任何时候输入都不会完成。处理无界数据通常要求以特定顺序摄取事件,例如事件发生的顺序,以便能够推断结果的完整性。
- 数据流
- Apache Flink 擅长处理无界和有界数据集,有出色的性能
- 代码使用例子
- source、transformation、sink 都是 operator算子
本文作者为DBC,转载请注明。