摘要:在国家实施大数据战略加快建设数字中国的伟大时代背景下,随着各种新型大数据技术的快速发展,flink在企业批流一体化大数据平台建设过程中,逐步稳固了江湖地位。本文将用flink转换算子演示对一个json文本进行数据清洗。
科学技术是第一生产力,值此“新基建”建设如火如荼时,大数据进入信息化发展的新阶段,各地正在大力推进大数据产品创新发展,数字成为数字经济中的关键要素,时代正经历百年未有之大变局,疫情这个黑天鹅还在四处挥舞,数据治理提升到了国家高度,未来十年国家将以数据治国,企业将以数据经营,个人将以数据谋生。2003年到2006年,谷歌陆续发表了奠定大数据理论基础的三篇论文:《Google File System》、《Google MapReduce》、《Google Bigtable》,自此,大数据技术如星星之火,燎原全球。MapReduce,Storm,Spark,Flink,Blink各种计算引擎如雨后春笋,遍地开花。无论技术怎么变,获取数据,清洗数据,分析数据,应用数据的发展主线不会变。本文将以flink计算引擎的map算子清洗json文本,以求管中窥豹,一睹flink的风采。
准备材料:
1、json样例
说明:json文本采用压缩格式,可以使用工具:https://www.bejson.com/
{"searchTime":1553650604,"code":200,"results":{"id":"449","items":[{"id":"47","name":"name47","cllx":"NTC","url":"1.jpeg","csys":"red","score":96.03},{"id":"48","name":"name48","cllx":"YGC","url":"2.jpeg","csys":"black","score":97.03},{"id":"49","name":"name49","cllx":"PC","url":"3.jpeg","csys":"blue","score":99.03}]}}
2、网络工具中的瑞士尖刀nc
下载链接:https://eternallybored.org/misc/netcat/
3、Java工程师的宝刀idea
下载链接:https://www.jetbrains.com/
4、maven火炮集群
flink最新版本为1.12.1,此处使用1.7.2
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.11</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_2.11</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.59</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.me.flink.SocketWindowJsonConvert</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
知识点原理:
一、flink作业运行环境:StreamExecutionEnvironment
使用抽象工厂模式实现,子类有LocalStreamEnvironment,StreamContextEnvironment,RemoteStreamEnvironment,StreamPlanEnvironment,本文使用LocalStreamEnvironment。作业缺省名称为Flink Streaming Job,默认使用StateBackend持久化checkpoint状态,默认checkpoint时间间隔为500毫秒,默认超时时间为60秒,缺省消息处理语义为EXACTLY_ONCE。
类图结构:
本次使用关键接口:
getExecutionEnvironment,获取运行环境。
socketTextStream,从socket源读取文本送到map算子
setParallelism,设置并行度,默认为任务所在机器的CPU数。
execute,提交到集群或本地执行作业。
二、flink算子,map,将一个对象转换为另外一个对象,属于1-1映射。使用的场景有数据值转换,数据key转换,聚合等。
MapFunction类图结构
实现关键接口:map。
调试步骤:
1、运行nc
2、shift+F9启动调试
首先使用StreamExecutionEnvironment获取flink运行环境,从socketTextStream读取nc输入流,IP为本地IP,端口为9000,。使用CarEntity获取json转换结果,方便编码清洗。
将上面示例json文本串贴入nc,回车
json文本转实体
red值清洗为1
打印清洗后的值
关键源码:
SocketWindowJsonConvert类
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<String> text = env.socketTextStream("localhost", 9000, "\n");
SingleOutputStreamOperator<CarEntity> StreamRecord = text
.map(new MapFunction<String, CarEntity>() {
public CarEntity map(String s) throws Exception {
CarEntity entity = JSON.parseObject(s).toJavaObject(CarEntity.class);
return entity;
}
})
.setParallelism(1);
DataStream<JSONObject> jsonObjectDataStream = StreamRecord.map(new MapFunction<CarEntity, JSONObject>() {
public JSONObject map(CarEntity carEntity) throws Exception {
CarEntity.Results rs = carEntity.getResults();
List<CarEntity.Results.Items> items = rs.getItems();
items.forEach(v ->{
if (v.getCsys().equals("red")){
v.setCsys("1");
}
if (v.getScore() < 60){
v.setScore(60f);
}
});
return (JSONObject) JSON.toJSON(rs);
}
});
jsonObjectDataStream.print().setParallelism(1);
try {
env.execute("json convert");
} catch (Exception e) {
e.printStackTrace();
}
匿名类可以使用拉姆达表达式优化,不过不优化呢阅读性比较友好,仁者见仁智者见智。
CarEntity类
public class CarEntity {
private int code;
private String searchTime;
private Results results;
public static class Results{
private int id;
private List<Items> items;
public static class Items{
private int id;
private String name;
private String cllx;
private String url;
private String csys;
private Float score;
}
}
}
收工。