00:00
接下来我们来数了解一下数据导出的功能,那数据导出主要有两种方式,一种呢是通过export。任务来导出,其实它底层还得用什么broker啊,这个需要依赖于broker,另外一种是将查询结果直接导出啊,那我们先来看一下export啊。同样的,他得利用broker。导出到远端存储,比如说HDFS,对吧,还有其他的一些,那么我们了解一下它基本原理是什么呢?首先呢,你用户提交一个。导出作业,他会先统计这个作业涉及到的所有数据分片啊,所有的table thatt,然后将这一些tablet进行分组。啊进行分组,每一组呢,它会生成一个特殊的查询计划啊,比如说我一共我这个导出任务涉及到的数据分配有100个,好,那现在分组,比如说是五个一组。
01:00
那这个时候它就会生成几个呢?20个查询计划。对吧,啊,分组执行。那每个分组,每个查询计划会读取自己对应的数据分片啊,然后通过broker写出去啊,这是大概的一个执行过程。那下面我们有详细的一个介绍啊,看这张图,那我们提交作业是提交给谁啊fe,那fe主要做两个事情,第一个叫painting,第二个叫exporting,对吧?Painting呢,其实就是做一个查询计划的拆分,就是我们刚才讲的做一个分组啊,拆分生成多个查询计划之后呢,根据这个查询计划去执行。那我们来具体看一下啊,Fe的一个调度导出调度器啊,它会有两个阶段的动作,第一个阶段叫pending,它生成。一个pending task向be发送快照命令。
02:04
对吧,对所有涉及到的数据分片做一个快的生成多个查询计划啊核心在这里生成多个查询计划,那exporting阶段呢,它是做什么呢?开始执行查询计划。啊,其实就这两件事啊,查询计划的拆分呢,就像我刚才讲的,呃,生成的多个查询计划,每个查询计划是不是只负责一部分的数据分片呢?对吧,那。就是分组嘛,那每个组的数量由什么来决定呢?由fe的一个参数,这个port table number per task,这个参数默认值是五啊,当然你可以去修改,对吧?这个就像我们刚才举的例子,假设涉及到了一共呢,是100个table net。那这个默认分组小组内部的数量是五啊,就每个小组是五个,那就是分成20个组对吧,一个组一个查询计划,那这个参数可以在我们创建作业的时候去指定啊。
03:07
通过作业的属性,不用去改配置文件啊,直接在创建作业时候去指定就可以了。另外一个查询计划是怎么执行呢?其实对应的就是什么第二个阶段啊exporting啊,开始执行,往下看它是什么顺序执行。顺序执行,另外每一个查询计划,它是可能扫描呃多个分片对吧?啊,默认是不是五个,那它是以行的形式进行组织的啊,它是按行来读取的,默认呢是每1024行作为一个批次啊,它是按批出批的方式来处理,另外呢,它也有一个自动重试机制啊,重试呢默认是三次啊。如果三次都失败了,那么就直接整个作业失败退出。另外就是它的一个现象,它导出的时候起的文件名啊。
04:01
首先会建立一个临时的目录啊,大家注意是目录啊,是这种格式的,那后面这串数字是一个作业的ID啊,作业的ID,那数据首先导入到这个临时的目录。当所有的数据都导出后,才会将。这个目录里边这些文件重命名。到。真正的路径下面去,那其实这种方式是为了什么?为了保证一致性,你想想我我导出还会重试对不对?比如说我一共有十行数据,在导出过程中已经导出去五行了。那这个时候失败重试了。失败重试,那如果他又从头倒,那前五行是不是重复了好?那如果从试全部失败,你又重新执行一遍,那是不是这十行重新导入,那之前是不是已经导入了五行,这是不是还有数据重复的问题?那么一般解决这种问题的思路跟所有框架都一样,什么Co呀,Data叉呀,导数据一样的道理,就类似事物的一个操作啊类啊,类似的类啊类事物。
05:14
也就是说啊,我不直接写到正式路径,正式文件,我先将呃数据写出到一个临时的,可能是目录,临时目录下的临时文件,那如果全部成功,我再对他做一个什么rena。对吧,中间任何一个环节出问题,比如说在这个过程。诶,导出到临时路径的时候,临时文件的时候出问题,那是不是不会影响我们啊,真正的那个路径啊。对吧,啊。这个就是保证一致性的一个方式吧,这个原理大部分框架都这么来用的啊,涉及到文件系统的导导导出的时候。行,这个是它的一个相关原理啊。
我来说两句