00:00
我们已经用flink从各种不同的数据来源读取了数据,进行了测试,那我们还介绍了怎样从自定义的数据源去读取数据。那在这个过程当中,其实还有另外一个问题,就是我们读取出来数据最终其实是要在run方法里边通过它的运行上下文去发到下游任务的,而这里边我们会有一个泛,这个function的泛其实就代表了接下来在flink的内部,我们在任务之间传递数据的类型到底是什么。它也就代表了我们在测试的过程当中看到得到的这一个data stream,它本身的类型是什么样。在前面我们做测试的过程当中,要么就是像这里的inte,这是一个基本数据类型的包装类啊,那这个就比较简单,要么呢,呃,像前面我们讲到的click source,我们是把它定义成了自己定义的一个简单对象类型。
01:04
而且前面我们介绍过这个类型,其实flink还是有所要求的,比方说要求它必须得是public的啊,那另外呢,就是它里边必须得有一个空参的构造方法。而且它的属性也必须都是public的,而且属性的对应的内部的那些类型也必须都是可序列化的啊,相当于是一有一些特殊要求的链。那我们就会想到,为什么flink对它里边的数据类型有这样那样的各种要求呢?那除了这些类型之外啊,除了类似于简单的类和基本数据类型包装类之外,Flink还能处理其他的数据类型吗?这就涉及到flink里边到底支持哪些数据类型,所以接下来这一节我们就是详细的来探讨一下flink所持的数据类型。提到这一部分,我们可能就会想到flink,它支持的数据类型可能是比较有限的,比较特殊的,那怎么还会有支持的数据类型呢?
02:10
其实整体来讲的话,我们非常容易理解,就是作为一个数据处理的框架啊。它flink是必须要知道数据的类型是什么样,那数据类型到底是一个什么含义,它其实就代表了在我们当前的这个机器的内存当中一一段数据,它占据了一段内存空间,那么它到底表达什么含义呢?比方说八位的一个字节,到底它是单独表示一个含义,还是说两个字节16位合在一起去表达一个含义,这其实就代表了数据它里边所包含的信息。作为一个数据处理的引擎,作为一个框架,Flink必须要知道这个数据长什么样,它里边包含的信息怎么样去提取,这样才能正确处理数据,所以这就是我们所说的数据类型的意义。
03:04
那那如果说一定要做一个比较,做一个类比的话,那我们可以想到处理流数据的时候,那就相当于这个数据是随着水流不停的流动的。所有的这个物体,那在这个水流,在这个河上可以去漂浮小木块儿,也可以漂着一艘大船。那我们自然就想到了小木块儿的话,这个就比较简单,哎,我们只要就像我们说的啊,告诉这个link。它到底是有有几个字节啊,然后这几个字节到底占用了。多大的这个内存空间我们就知道了啊,然后怎么样解析,其实也就也就知道了,比方说啊,那int到底应该怎么解析,我们自然就清楚了,它的计算方式是什么样的,那如果是,如果是,呃,对应的这个long如是short,这这些所有的类型我们其实都是知道的,非常简单就可以把它做处理。但是还有一些类型会比较复杂。
04:03
就比方说它是一个包装类型,像我们前面讲到的,如果是一个圆组怎么办呢?哎,如果是一个类似的对象的类型,里边有各种各样不同的属性,属性里边可能还有一些更加复杂的类型的组成,这种情况又怎么办呢?啊,所以所有的这些事情,Flink必须要非常的清楚它内部的结构,然后才能正确的处理这些数据。因为接下来flink可能它不是直直接把这个数据读出来就完事了,我们的数据不是简简单单的一直在内存里边存放的,还有可能在分布式架构里边,我们要经过网络传输,因为前面我们提到运行式架构不同的任务可能是在不同task manager的不同的S上面去执行的。啊,那所以这个过程肯定我们都有可能不在一台机器上了,那就涉及到。要进行网络传输,那另外呢,还有就是说,如果我们要做故障恢复的时候,可能有一些状态是要进行存盘,然后再进行读取的,那整个这个过程都涉及到了数据的序列化和反序列化。
05:15
啊,那如果说flink不了解数据,它底层的结构到底长什么样,数据的每一个啊,就是比方说我们序列化之后啊,已经变成了一个,变成了一个bit的序列,那这种情况下,如果要是不了解的话,那自然就没有办法把它正确的解析出来。所以作为一个框架,必须有一整套自己的类型系统来处理这件事情。那flink里边它自己的类型系统是什么样的呢?呃,它简单来说,它是用了一个统一的类,叫做type information,所谓的类型信息来统一表示所能处理的。那flink当中的类型信息type到底是什么东西呢?接下来我们可以结合源码当中的定义来看一看link当中的类型系统到底是怎么一回事。
06:13
我们可以在代码当中直接去搜type information。我们可以看到,在Java源码当中,这本身是一个抽象类。它其实就是flink当中所有数据类型描述符的一个鸡肋,也就是说所有在flink当中支持的数据类型。它们其实都是type information的子类啊,那么在这一个抽象类里边就定义了数据类型的一些基本属性,而且我们通过搜索它的方法也可以看到有一个。抽象方法,它会为数据类型创建typeerizer,也就是创建一个类型的特定的序列化器,在这个ializer里边就有序列化和反序列化对应的方法啊,那当然了,还有这个equals,我们可以去做比较,有对应专门的这个比较,那另外还可以重写这个to string和。
07:11
哈哈,西扣的方法,这些都是太里边提供的抽象方法。那对于flink而言,它具体支持的数据类型又到底有哪些呢?呃,简单来说的话,就是对于常见的Java和skyla里边的数据类型,弗link都是支持的。那具体来说。其实最简单的我们都可以在这个源码里边看到一些具体的分类,比如说就在type information,它所属的这个type infer下边,我们就可以看到有各种各样不同的type infer。啊,这里我们看到有一个inte type infer,很明显这就这就是一个整数类型的定义,类型信息的定义,那么它是继承自numeric type iner,也就是数值类型信息。
08:05
而numeric typeer又继承自basic typeer基本数据类型信息,所以这里边其实就会发现啊,很多数据类型应该都包含在这个basic type infer里边,都属于基本数据类型。那么basic type,当然它就继承type information,所以我们从这里就可以看到它们之间的继承关系,可以对于flink里边的类型系统,它的大致的框架有一个初步的了解。啊,那这个basic type infer里边其实包含的内容是很多的,我们如果直接在这个包下边定义出来的具体的类来看的话,可能会发现只有type infer,别的我们常见的那些类型好像都看不到,其实他们在basic type infer里边都有对应的具体的定义,比如说这里边有string,有bully,有bit short in,这些都都是有的。
09:06
那这里面的区别在于我们可以看到。Bit short int long这四个四种类型其实都是整数类型,所以他们在定义的时候,具体这里边是一个static final啊,是一个常量的定义,其实就是直接了一个type INF。拗了一个对象出来。而比如说像float和double,那么它都是小数,所以对应的这个type infer,那就是fractional type info小数的类型信息。那对于其他的一些类型呢,比如说这里的Bing或者是string啊,那么。他就直接用最底层的basic type in去定义出来就可以了。啊,那所以总体总结一下的话。Flink当中其实是支持所有的Java基本类型以及它的包装类的,那还要加上void的re,包括时间相关的data以及local time啊,这些类型都是支持的,还有Q里边支持的big de和big,这些所有的都属于基本数据类型。
我来说两句