Flink应用(3)

1 回顾

上一篇文章对Flink中的核心概念之Time和Window设计之因做了深入的探讨。先来回顾一下:

EventTime是具有反演特性的现代流式计算建模的核心,在如何避免传输延时带来的错窗问题上,Flink使用watermark和Lateness机制进行处理,使得整个基础更加稳固。同时提供丰富的Window生成和计算机制,使得编写流式计算应用变得简单。

成熟的计算系统还必须具备健壮性,才能承担起更重要的业务应用。Flink中的窗口计算大多需要依赖历史计算结果,这种计算称之为有状态的。在分布式系统中,状态是引起复杂性的根源之一。Flink如何保证有状态的计算足够健壮,将在本篇进行说明。

Flink应用(2)

1 回顾

上一篇文章对Flink简单应用做了介绍,本文继续介绍Flink的核心概念。根据上一篇介绍,Flink的两个核心概念Time和Window是对最深刻的描述。先来回顾一下:

Time为数据打上一个维度标签,使得数据集合转化为。Window利用Time对进行进一步抽象,按照一定的区间组合来处理这种数据,从中发现特征,寻找商业价值。

Time是的关键维度,无Time不成。Time是Window的基础,因为Window是依据Time的值来进行划分(Global Window可以看作Time从0到无穷大)。剖析Window前,首先需要明确Time是否足够清晰。或者说上一篇文章介绍的EventTime、ProcessingTime、IngestTime是否足够完备?答案是否定的。那么Time还有哪些模糊地带,或者是还有哪些问题需要考虑?

Flink应用(1)

1 Flink与大数据计算

Flink以Stream模型为基础对数据计算进行建模,为批和流的处理实现了统一。并在低延迟、稳定性、编程接口友好等方面具有较大的优势,是大数据实时计算的利器。从下图(摘自官方)可以看出,Flink将来自各个数据源(Source)的数据进行计算,让后将结果交给各个下游数据宿(Sink)进行后续消费。同时,对于Source和Sink也可以是Flink计算应用,进行更复杂的级联,构建更丰富的数据处理模式。

Flink

Android Dex动态加载、调用与安全

首先,动态加载与调用不是个新问题,方法也非常直接。关键就是使用DexClassLoader。

这个方法有一个副作用,那就是/proc/self/maps下会留下很多份dex加载记录,需要到jvm GC时才能释放,内存泄漏倒是没有,就是不太好看。

对于入参不是String,返回结果不是String的情况,做个Ser/De来搞定即可,接口的界面也能保持干净。

Java动态脚本

动态脚本有诸多用途,对于不停机变更执行逻辑,实现部分开放式的业务动态性非常有帮助。不过好的设计需要考虑性能、边界、变更控制等问题,以达到“受控的动态”能力。

JVM提供了不错的脚本接口,从invokedynamicGraalVM,多语言、动态语言、高性能是发展方向。

Groovy作为可以和Java无缝交互的动态语言,利用了invokedynamic来实现核心功能,开发比较活跃,是动态化比较好的选择。下面介绍几种Groovy嵌入Java应用的方法。为达到class缓存、线程安全等目的,一些其他的方法不做介绍。