1 StreamExecutionEnvironment
StreamExecutionEnvironment是对流处理引擎运行环境的抽象,可以通过调用它的接口来对运行环境进行配置
常用配置如下:
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.enableCheckpointing(Long.valueOf(params.get("blink.job.checkpoint.time")));
env.getCheckpointConfig().enableExternalizedCheckpoints(
CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION, rocksDbPath + "/meta");
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(100);
env.setMaxParallelism(2048);
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
// make parameters available in the web interface
env.getConfig().setGlobalJobParameters(params);
Class<?> unmodColl = Class.forName("java.util.Collections$UnmodifiableCollection");
env.addDefaultKryoSerializer(unmodColl, UnmodifiableCollectionsSerializer.class);
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
上面代码绝大多数通过方法名就可知其含义,在此特别说明addDefaultKryoSerializer方法。addDefaultKryoSerializer是定义二进制序列化器,序列化器的作用猜测是在各个worker之间传递java对象时,对java对象进行序列化,方便网络传输。
2 RocksDBStateBackend
blink在进行状态维护时,需要定期保存各个worker的快照,当快照内容较大时,需要使用分布式一致的数据库,目前blink支持的是RocksDB。
RocksDBStateBackend是对RocksDB的抽象,可以通过相关接口配置数据库的属性。
配置完成后,调用StreamExecutionEnvironment的setStatusBackend方法讲RocksDB与运行环境绑定。
Configuration rocksDBConfiguration = new Configuration();
rocksDBConfiguration.setString("state.backend.rocksdb.ttl", rocksDbTtl);
rocksDBConfiguration.setString("state.backend.rocksdb.checkpointpath", rocksDbPath);
rocksDBConfiguration.setString("state.backend.rocksdb.checkpoint.levels", "1");
rocksDBConfiguration.setString("state.backend.rocksdb.inplaceupdate", "true");
RocksDBStateBackend rocksDBStateBackend = new RocksDBStateBackend(rocksDBConfiguration);
env.setStateBackend(rocksDBStateBackend);
3 InputFormatSourceFunction
SourceInstance sourceInstance = new InputFormatSourceFunction(format, typeInfo);
DataStream<OutputType> dateStream = env
.addSource(sourceInstance)
.name("source_instance")
.setParallelism(10);
InputFormatSourceFunction是blink并行输入源的抽象,通过继该承抽象类并重写抽象类中的方法,可以自定义输入源。InputFormatSourceFunction又继承自RichParallelSourceFunction。RichParallelSourceFunction在网上有很多介绍,在次不直接展开,可见链接:https://segmentfault.com/a/1190000017182961。
在RichParallelSourceFunction的命名中,rich和parallel是SourceFunction的两个属性。parallel很好理解,就是并行的意思;rich的含义指的是SourceFunction定义了open和close方法,可以在流启动、结束时,实现指定逻辑。
InputFormatSourceFunction的构造函数有两个输入参数。第一参数是InputFormat,定义的是解析输入的相关处理方法;第二参数是TypeInformation,定义的是输出类型相关序列化方法。在InputFormatSourceFunction中,调用了InputFormat的configure、openInputFormat、reachedEnd、nextRecord、close、closeInputFormat等方法;调用了TypeInformation的createSerializer方法,用于指定序列化器。
当定义完输入源之后,blink把从输入源当中不断流入的数据抽象为运行环境中的数据流DataStream。bilnk任务就是基于这些数据流在进行计算。到此,定义运行环境的工作告一段落。
如果感兴趣,欢迎关注微信技术公众号