应用场景
智能推荐
1、小红书推荐系统
实时数仓
什么是实时数仓
数据仓库(Data Warehouse),可简写为DW或DWH,是一个庞大的数据存储集合,通过对各种业务数据进行筛选与整合,生成企业的分析性报告和各类报表,为企业的决策提供支持。实时仓库是基于Storm/Spark(Streaming)/Flink等实时处理框架,构建的具备实时性特征的数据仓库。
阿里巴巴菜鸟网络实时数仓设计:
数仓分层处理架构(流式ETL):
ODS -> DWD -> DWS -> ADS
ODS(Operation Data Store):操作数据层, 一般为原始采集数据。
DWD(Data Warehouse Detail) :明细数据层, 对数据经过清洗,也称为DWI。 DWS(Data Warehouse Service):汇总数据层,基于DWD层数据, 整合汇总成分析某一个主题域的服务数据,一般是宽表, 由多个属性关联在一起的表, 比如用户行为日志信息:点赞、评论、收藏等。
ADS(Application Data Store): 应用数据层, 将结果同步至RDS数据库中, 一般做报表呈现使用。
大数据分析应用
IOT物联网
Internet of things(IOT)
华为Iot数据分析平台架构
智慧城市
金融风控
电商行业
Flink快速入门
概述
-
Flink是什么
Flink是一个面向数据流处理和批处理的分布式开源计算框架。
-
无界流VS有界流
1) 无界流:有定义流的开始,但没有定义流的结束, 会不停地产生数据,无界流采用的是流处
理方式。
2) 有界流:有定义流的开始, 也有定义流的结束, 需要在获取所有数据后再进行计算,有界流
采用的是批处理方式。 -
编程模型
DataSet 一般用来处理有界流数据。
DataStream一般用来处理无界流数据。
案例
环境搭建
pom
<!-- Flink核心依赖组件 -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-walkthrough-common_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
</dependency>
批处理案例
功能: 通过批处理方式,统计日志文件中的异常数量。
public class BatchProcessorApplication {
public static void main(String[] args) throws Exception {
// 1. 定义Flink运行环境
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
// 2. 读取数据源 (日志文件信息)
DataSource<String> logData = env.readTextFile("./data/order_info.log");
// 3. 清洗转换数据
logData.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
@Override
public void flatMap(String value, Collector<Tuple2<String, Integer>> collector) throws Exception {
// 1) 根据正则, 提取每行日志的级别
Pattern pattern = Pattern.compile("\\[main\\](.*?)\\[");
Matcher matcher = pattern.matcher(value);
if(matcher.find()) {
// 2) 如果匹配符合规则, 放置元组, 输出数据
collector.collect(new Tuple2<String, Integer>(matcher.group(1).trim(), 1));
}
}
}).groupBy(0).sum(1).print(); // 4. 根据日志级别, 汇总统计日志级别的次数,打印结果
}
}
流处理案例
功能: 根据IP统计访问次数
public class StreamProcessorApplication {
public static void main(String[] args) throws Exception {
// 1. 创建运行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 2. 读取Socket数据源
DataStreamSource<String> socketStr = env.socketTextStream("flink1", 9911, "\n");
// 3. 转换处理数据流
socketStr.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
@Override
public void flatMap(String s, Collector<Tuple2<String, Integer>> collector) throws Exception {
// 数据的格式: IP API接口信息(分隔符, 采用tab键)
// 示例:10.10.20.110 getOrder
String[] arrValue = s.split("\t");
collector.collect(new Tuple2<String, Integer>(arrValue[0], 1));
}
}).keyBy(0).timeWindow(Time.seconds(5)).sum(1).print().setParallelism(1);
env.execute("accessLog");
}
}
Flink部署环境
- 安装配置JDK8环境
- 下载Flink安装包
https://www.apache.org/dyn/closer.lua/flink/flink-1.11.2/flink-1.11.2-bin-scala_2.11.tgz - 安装配置
1) 解压
tar -xvf flink-1.11.2-bin-scala_2.11.tgz
2)运行
bin/start-cluster.sh
主节点访问端口:
vi conf/masters:
localhost:8081
- 访问控制台
http://10.10.20.132:8081/#/overview
Available Task Slots: 有效任务槽数量
对应配置文件: vi conf/flink-conf.yaml
taskmanager.numberOfTaskSlots: 1
TaskManger与JobManager关系
Flink任务提交
POM文件增加打包插件
<build>
<plugins>
<!-- 编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<!--<encoding>${project.build.sourceEncoding}</encoding>-->
</configuration>
</plugin>
<!-- 打jar包插件(会包含所有依赖) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<!--
zip -d learn_spark.jar META-INF/*.RSA META-INF/*.DSA META-INF/*.SF -->
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!-- 可以设置jar包的入口类(可选) -->
<mainClass>com.wangj.flink.usage.stream.StreamProcessorApplication</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
注意,这里不能采用spring-boot-maven-plugin打包插件, 否则flink不能正常识别。
可视化界面提交任务
运行验证
在TaskManager当中可以查看输出结果。
命令行
[root@flink1 flink-1.11.2]# bin/flink run -c com.wangj.flink.usage.stream.StreamProcessorApplication examples/flink- usage-1.0-SNAPSHOT.jar
Job has been submitted with JobID 4c127f68f6683e5a9342410d7b6540db