00:10
呃,大家好,呃,我是每日互动个推的,呃,数据研发工程师,呃,花明小德。然后本期分享内容是大数据的降本提效。在呃。透明存储的实践。然后本期的内容主要分为四个方面,那么主要是从呃背景,然后透明存储的一个概念,然后文件读取的流程,以及透明存储目前的一个实现啊,这四个方面呃做一个讲解。那么第一个背景。背景的话主要是呃。做呃,说一下目前做这个透明存储的一些这个目的,以及希望这个呃,这个事情的带来的收益,那么第一个呃,一些相关的就是说我们透明存储的数据格式的一些应呃在思路上的一些应用,那么主要是针对这个market。
01:10
那么目前呃在业界呃pack的话,在搜上的应用的话,第一个就是列裁剪,那么列裁剪的意思就是说呃,当我们去做一些比如说跑数的一些任务的时候,我们可以去呃只读取需要的一些数据的列,那么这样的话可以实现一个高效的一个列扫描。去减少这些IO操作,那么传统的行是存储的话,呃,他如果需要去读取某个字段的话,他会去扫描整个行之后,然后再去读取自段数据。而劣势存储只需要去读取对应的列质段数据,这样的话可以大幅检查L,那么下面有个图里面也是,呃,比较直观的去描述了一个行式存储和列式存储。的一个在存储上的一个,呃,区别。
02:00
然后右边的话也是一个呃,典型的一个SQL,那么针对这个SQL,那么当我们比如说呃,我们只需要去计算这个费有的这个字段的值的时候,我们只需要去。针对这个分的列去进行读取,而不需不需要去扫描全整行。那么第二个呃,帕在上的应用呢,主要是位置下推。呃,这个主要是因为啊,他的的列的数据,原数据里面有相当一部分的一些呃记录数据本身性质的一些呃信息,比如说他的一些呃数据范围。还有一些,比如说呃,枚体值,这样的话可以去减少数据的IO。那么下面有一个例子,就是一个pack的文件中,呃,它的元数元数据啊,记录了每一个group它的一些列信息,呃,包括数值列的一些最小值和最大值,以及字符串列的一些枚举值信息。
03:00
呃,具体如图中所示。那么此时如果说我们要去跑个Q,那么具体Q如下,就是跟刚才那个PPT里面类似,就是select some fieldfield大于21。那么当我们。呃,对这个fair大于21这个条件进行判断的时候,如果说他能够利用到pack的文件中的最大最小值,那么我们其实是可以把一部分数据进行一个过滤掉的,比如说图中的呃范一。它的最小值,最大值是六和21,也就是说它这里面的列数据明显是不满足我们这个的过滤条件的。这样的话,这些数据就不需要进行一个读取,这样的话也就减少了一个数据的一些读取,也就是IO操作。那么。Park的一些绩效提,呃,绩效评估,也就是说我们这个数据啊,如果做一些呃。
04:04
格式切换,比如说拍之后,那么我们这个提交的一个效果。是怎么去做一个评估,那么基于刚才我我讲我讲的一些内容,那么帕的一些提倡的话,很大程度上是得益于这个列裁剪的。也就是说我们查询的这个字段数,如果说占这个表的字段数的比例越低,那列踩点效果越好。那么可以,基本上可以,呃,画一个等号,也就是说我们查询的字段数下降的减少,那就是可以带来性能的一个提升,当然前提是他是一个列存。那么目前通过分析一些公司的一些一样的日志,我们做一个简单的统计,呃,我们的DNS集群在搜Q分析任务中查询的字段,呃,占表字段的平均比例大概百分之67%左右。那么。这就意味着,如果说,如果说我们能够运用这个猎财减,那么我们提效的这个收益应该是相当可观的。
05:07
呃,还有一个是我们这个线上进行的一个数据的现状。那么目前的呃,11个集群的大概的文件格式统计是。下就是其中占比的话是T是占到百分之接近80%park的话,数据的占比大概是22%。然后呃,除了上面这个呃在跑速提效上的一个呃提升之外,呃,对于一些pack的那个。数据来而言,呃列存储,呃在一些数据的压缩上面有明显的一些优势,也就是说呃除了这个跑出的提升之外,如果我们将一些数据从text转,也会带来一些呃数据存储量的一些减少,也就是呃这样的话,也就是说我们需要的一些存储的一些机器。
06:03
就可以减少。那么也就是。呃,相当于节省了大量的一些成本。那么第二个。主要是呃,介绍一下透明存储的一个概念。那么这个透明存储概念呢?呃,直观的讲就是我们用一个一个API,能够同时兼容多种数据的一个读写,那么目前主要是针对一个pocket。未来的话,预计也可能会有一些像OC,像呃AR,呃。这样的一些数据格式,一个兼容。那么第三个数据的读写流程,那么这个是跟透明存储的一些实现会有。比较相关的一些东西,那么在这个第三第三个模块先进行一个讲解。首先介绍一下Spark读取T的一个文件的一个流程。
07:04
呃,首先第一步是在Spark driver。然后他会去通过一个呃,Text的一个input form去呃获取这个文件的一个分区信息,然后作为这个Spark的一个分区。那么第二个他会去下发这些分区信息给所有的执行节点,也就是。然后第三步,每一个呃,他在明确这个分区信息之后,1PARTITION之后,那么他会去通过这个test去构造一个record reader,那么这个record reader那么就担当了这个实际的数据读写和读取。那么第四步,也就是我刚才讲的这个数据读取,读取的这个过程。然后最后一步,也就第五步,呃,就是啊,每一个。Spark的一个task去拿到这个数据之后,我们做接下来的一些处理,那么这是一个Spark读读取那个test文件的一个整体流程。
08:06
还有个Spark,呃。写入test文件的流程,呃,这块的话,其实跟。呃,上面有有一些区别,它是不再有一个这个数据分发分区的一个过程,因为本身在我们去数据执行写的过程中,我们基本上数据已经分析好,在数据处理完之后,最后去执行这个数据的一个写入,那么核心的话也就是。呃,三个流程,那么第一个就是根据我们text去生成对应的write,那么第二步就是把我们的数数据,那么传入到我们这个里面去,第三步就是使用我们执行实际的这个数据写入。那么把上面的这个整个呃流程再做一个简化。那么可以大致分为四个过程,首先就是我们对我们文件相关的一些呃格式,那么它第一步对于些这些计算引擎而言,他都要去做一个呃获取分区的操作,也就是说他需要把这个整个读取的数据。
09:16
做一个划分,那么每一个呃分区去交给具体的一个子节点去操作,那么这一块呢,是发恢复去做这个事情的,那么第二步,当我们获取这个分区信息之后,那么我们需要把这个信息交给每一个时间的一些节点,比如说Spark。那么三步,那么对于数据读取而言,那么我们每一个分区针对不同的格式,那么它会有相对应的这个去进行实际的读。呃,读取。第四步就是调用我们这个read去把数据读取,读取到我们的比如说Spark或者map的一些计算引擎之内。那么这是一个呃,简化的一个数据的一个读写流程,那么以为一个例子。
10:07
那么第四个模块,也就是我们透明存储的这个目前的一个实现。呃,目前的我们实现的主要是说,呃,我们在调用这个find me这个抽象的一个类的时候,我们去实际化一个spi,加载我们的自己实现的一个代理类,那么我们的代理类就需要去实现相应的这个record read和呃。的这个事情,这个实际化的一个逻辑。那么通过对于不同的一个路径,呃,然后他的我们目标的一个数据格式,那么我们会分装这个数据的一个转换流程。比如说我们需要把一个。呃,Target数据,那么转化为text数据,那么我们就会生成一个,呃。相对应的自己呃呃预预,预先设置好的这个record read去把这个part的数据去呃转换为T的数据,那么还有一种常见场景就是呃写写出的时候,呃,比如说呃把T数据写成pack,那么这个写出会跟原来有有一些区别,因为T数据去转。
11:19
转化为park数据的时候,其实是呃需要一些额外信息的,也就是STEM信息,那么这一块的内容就是需要我们一些呃,像血缘或者是原数据管理这一块的呃模块去提供这样的能力。方便我们把T的数据转换成一个park的数据。然后第呃最后的就是目呃透存储的呃一些相关服务,我刚才有也有提到过,就是T转化为park的数据的时候,是需要一些额外的一些STEM信息的,比如说图中的呃原始数据为ABC,那么。假设这三个字段我需要后面存储的pack格式的字段名分别为F1 f2 f3,它包括它的数据类型,那么这块内容就需要我们。
12:09
的云数据管理模块。提供这个支持。这样的话,通过原数据管理模块和原始数据的一个结合,我们能够把呃。对应的一些原始的探数据转化成我们一些想要的一些pass的数据。啊,最后是我们透明存储的一个后续的一个规划,那么整体是分为两个方面,那么第一个是技术可行性验证,那么目前是已经有一个呃,最小化MVP的一个实现和测试,那么第二个是模块的建设,也就是说呃。模块建设的话,主要是针对我们后续的一些相关的一些生态,包括它的一些原数据管理,配置管理,因为呃透明存储这个是其是比较重度依赖于一些原数据的,比如说在text转的一些过程中。
13:04
然后还有一些就是配置化,就是我们尽量把这个呃,透明存储做到一些用户感知,然后能够在一些任务上面到一个呃。尽量透明化的一个一个切换。然后主要是内容如上。大家如果感兴趣的话,可以关注公众号,并加入社群进行交流。
我来说两句