00:00
那我们来看一看啊,它怎么配呢?我们先看一看my circle的reader应该怎么办?那来到这个我们的文档当中,在文档当中啊,我们这有一个同步my circlel到HDFS的这么一个案例,那接下来我们就做一下买circleql到同步HDFS的这个案例,那在看这个同步同步案例之前呀,我们还是先来到官方文档当中,在官方文档我们来看一看my circleql reader,在my circleql reader的这个插件,你看它的实现原理非常简单,那就是通过JBBC连接到数据库,然后呢,通过select查询的方式将数据发送到下游,哎,就这么简单好了,那接下来我们看一看它是怎么使用的,那my circle reader呢,在这它有两个模式,你看第一个是配置一个从my circle到本地的作业啊,你看呃,这呢,你看有两个,呃,它有两个配置的方式,那对应的我们文档上也给大家介绍了,第一种方式叫做table mode的方式。第二种方式叫做。
01:07
哦,Quary circle的方式啥意思呢?Table木,也就是说我们指定一个表名就完事了啊,我通过指定一个表名,我就可以同步这一张表的数据了,我们不需要自己写circle,那query circle目我们不光呢要提供一个表名,我们呢还可以自己来写一个自定义的SQL语句,我是一些过滤条件呢,或者是一些其他的这个啊条件呢,我可以通过自定义的circle,那table mood呢,它可能相对来说要限制的要死一些,那它俩具体有什么区别,我们一个一个来看,那首先呢,我们看的是这个。My circle reader是table mode的模式啊,我们看看怎么样买用my circle table mode的模式来做一个呃,同步的实例,好了,那接下来我们把这个配置参数啊给它拿过来,我就不一个一个的在文档当中来给大家找了,我在这儿CTRLCCTRLC,然后我还是来到我的再格式化当中,我给它CTRLV粘贴一下,粘贴完之后我先折叠所有,那折叠所有我们一个一个的打开。
02:17
首先打开的第一层是一个job吧,我们说这个叉啊,它每一个任务我们都要给它封装成一个job吧,那封装成job吧,之后我们在这里边还有两个模块,一个是settingings settinging是settingings啊,它是跟配置相关的啊,就是优化参数相关的,那除了这个呢,我们还有一个content,那content呢,它是我们最终配置读和写的,我从哪来数据到哪去?那我们先看reader插件,那reader插件里边也有两个模块啊,一个是name name这个地方我们要配置一个写死的my circle reader,这个不能变啊,这个是给data叉看的,那这个permeter呢,是告诉我们,哎,你要从MYQL当中读数据,那你读取哪一个MYMYSQL当中的哪一个表呢?我们看一看。
03:07
首先我们先看这个connect啊,这个地方是很好理解的,在这里有这么一个参数叫做connect connect connect这我们指定一个jbb CU URL,从这台机器上的my circle的GL数据库当中来同步。好,那同样你同步这个数据库当中的哪一个表呢?我们在这儿可以指定一个table的表名,好了,那现在我知道了,我要同步这个表,那上面你看我们这儿还有一个column,我同步这个表的哪些字段呢?我也可以给它进行一个指定啊。再来那这个column,还有这个我们说完了,说完了之后我们还要指定一下,我想同步,我想我想呢,连接到这个买circle口,我呢是不是还要给他指定一个用户名和密码啊,那对应的user name和password,我们也要给他一个指定啊,那同样我在执行的时候,你看我们还给可以给他一个外条件来进行过滤我这一张表。
04:09
我可能有一个字段叫做ID,那这个ID我只同步ID大于等于三的,那么ID小于三的我就不会同步了,这就是相当于我们circleq语句的外条件嘛,C select号from表Y2ID大于等于三,只不过我不需要写circleq了,我在这来一个外热条件,然后我指定一个表,它就会帮我们封装成一个select查询的circle,哎,帮我们封装成一个circle啊,来进行my circle的查询,OK,那这个就是my circle reader相关的一些配置,那接下来我们看看这个是writer h DFS writer,刚刚啊数据我们已经从my circle当中读出来了,接下来我就要往hfs当中写数据了,那写数据的时候我们对应呢,也要有一些的配置,首先是这个name,我们要指定HD FS writer,它不能变,哎,必须写此,那主要看的是啊这些参数相关的,诶那啊先不看它,我们先看啥呢?首先我们要往HDF。
05:09
在写我们是不是要指定一个。Depot FS啊,找到HDFS的你嘛。那同样你往HDFS写,你写入到哪一个路径呢?我们在这要指定一个pass,哎,我们最终啊要把这个数据写入到的一个路径,那你写入到这个路径下,你入到哪一个文件当中呢?我们在这要指定一个文件的名字叫做file内,那同样那这个文件我们是不是还可以指定一些压缩的格式和文件类型啊,那文件类型我们用的是text,那压缩的格式呢?我们在这儿可以用GZ格式的压缩好了,那这些大家都能理解,可能有一点大家就不理解了。我们的HDFS难道还有列吗?
06:00
我们的HDFS有列的这个概念吗?大家回想一下,我们在学HDFS的时候,我们说HDFS上难道也有字段,我们的HDFS它没有列的概念,但是我们在做数据统计的时候,我们要把数据给他拿到哪来统计啊?我们是不是要把HDFS的数据我给你漏到haveve当中吧,那我想漏到have当中,我的这个HDFS上这个数据,我是不是要有一些列名了,我只有有了这个HDFS上有列名了,然后呢,我have当中,我在创建表的时候,我是不是也有这些字段名啊,那么HDFS上我们这的这个列名和have当中的字段名,我们给它做一个一一的对应,那么就可以把HDFS上的数据给它漏得到have当中了,对啊,这个列。
07:00
列名以及类型是给还有用的。哎,就是这个意思,那同样我们这儿还有一个参数,你看指定一个字段的分隔符。那我们在创建have表的时候,我们创建过have表吧,创建have表我们是不是也有一个file deter这么一个字段呢?指定我们字段之间的分隔符,这个分隔符我们用的是啥啊?那我们在这儿指定的这个分隔符就要跟我们创建have表的时候的分隔符保持一致,那我才能把数据给它漏到have当中,哎,我们创建have表的时候,我们用的是反斜杠T,那我们在这个地方也要给他指定一个反斜杠T,同样这个column力。我们创建have表的时候,列名和列的类型我们指定的是啥,那在这个地方我们指定的它就也是啥好了,那这下面还有一个write mood write mood它是一个写入模式,那这个写入模式end很明显它是一个追加的模式,那除了这个end,它还有一些其他的模式,那这个openend它具体怎么理解啊,我们呢,来到文档当中来看一下。
08:13
呃,在文档当中呢,它这也有一些参数的说明,那我们打开一个一个的看看啊,那首先是my reader my s reader,这个不能变啊,Reader的名称啊,接下来是用户名和密码,这个也不用多说,Connection连接信息也就不多说了啊,要找到myself的连接地址,然后指定一个数据库,那接下来我们还要指定一个表名吧,Table的表名我们需要同步哪一张表呢?那我同步这张表,我还要指定我同步这张表的哪一些字段呢?有可能这个表我只需要同步部分字段啊,那我就需要指定一下我具体需要同步的列名,那还有可能啊,啊,我需要同步所有的字段,那同步所有的字段我也可以不指定类名,我怎么办?我直接在这来一个星哎就完事了,通过一个星,它就代表我同步所有MYS表当中的字段,那接下来我们这还可以来一个外条件,你比方说S量星符号表我where ID大于等于三。
09:14
真的在这个地方,外面条件我就可以给他来指定一下,那接下来这还有一个字段叫做死Li PK,那这个死Li PK之前呢,我也跟大家说过它呀,是用来做我们的这个job切分的,如果说啊这个lit PK字段。我们没有写它啊,它不存在,或者说我们写它了,但是呢,这个字段值它就是一个空。那么这个字段它不生效,那它什么时候生效呢?当我们把这个参数给它配置上了之后,并且呀,我要在这个后面给它指定一个我column当中的列的时候啊,我指定哪一个字段,指定了一个具体的字段,那么它才会生效,它才会根据这个my circlel reader的逻辑来进行切分,你看这是他说了,它是一个分片的字段嘛,诶,Data叉啊,会启动多个task同步,我配置了它之后,Datax就会启动多个task同步,如果说我没有配置,或者说我不提供这个Li PK或者呀,我这个值为空,那么它就只有一个task,那这一个task我就就是我们所说的一张表生成一个task。
10:31
那还记不记得我们在最开始的时候说,我的my radio在同步的时候,它既有table幕的模式。啊,既有黑木的模式,也有一个叫做query circle木德的模式,哎,通过circle语句的方式来查询,那么这个Li的PK呢,它只有在table mode模式下才会生效,在query circle mode的模式下,它就不生效query circle mode,它只有一个task,那为什么这么干呢?呃,原因呢,我们在讲query circle mood的时候,我们再具体分析一下啊,在这呢,我们现在就知道这个字段,它只在。
11:11
Table木的模式下生效就完事了,好再来,那接下来我们看一看HDFS的writer hdfs writer啊,首先我们要指定一个name,然后呢,我们指定一个这个列的信息,那这个列的信息你看它目前只支持这一些简单的数据类型啊,你像这些什么DEC啊,啊,还有各种一些复杂的数据类型啊,在这目前是不支持的,我们只能支持一些简单的数据类型,那后面如果说MYS中数据源包含Di SIM mode类型,我们怎么办呢?我们可以在同步过来的时候,我给它进行一个转化,把Di SIM mode类型啊,我给你用S类型来代替,那么have当中呢,我们就仍设置它是这个decem类型,哎,就可以了。
12:00
好了,那也就是说my circle reader,它这个对应的支撑啊,支持还是不太好的啊,但你看还有当中我们可以怎么办呢?我们可以,但它虽然不支持,我们可以干嘛呀,我们可以曲线救国呀,我把你的数据类型给你改变一下,你买soql买Q当中的数据类型是decem某小数类型,那我在这个地方,我在查询的时候,我给你变成一个词缀类型,然后写入到have中的时候,我这呢还可以用decem类型来存储,那好了,我们在这指定了一些类名,然后呢,下面我指定了一个文件系统以及文件的路径,还文件的名字,还文件存储的类型啊,HDFS存储的类型,HDFS存储时候的压缩格式,那HDFS存储的时候字段的分隔符,那下面write mode。看这right mood呀,它这这个这个这个参数值是aend,那除了aend还有一个值叫做no conflictate,那end它是啥意思呢?诶end呢,我们我们应该也学过这个单词啊,它叫追加的意思,那你看它的意思啊,就是说我们在这不是设置了一个文件夹嘛,也就是HDMS文件系统的存储路径,那好了,我们呢,在存储的时候把数据啊写入到这个文件夹当中的一个文件当中了,我们这是不是指定一个文件名字,文件名字就叫做base province BP好了,那好,那大家想这么一个问题。
13:34
我再执行的时候,我现在执行一次了吧,执行一次之后,我觉得我没过瘾,我还要执行一次,我再执行一次,我是不是还是要写入到这个文件夹下面呢。那同样我写入到这个文件夹下面,我是不是写入的名字还是叫base province啊名文件名也是它,那这个时候有两种方案,一种方案叫做a pen的模式写入追加,但是这个追加它并不是说我直接追加到之前的这个文件当中了。
14:10
我在这儿生成了一个新的文件,那同学说不对呀,我在这一个HDFS的目录当中,我不可能说存在两个都叫BP的这么一个名字啊,确实它的文件名啊,肯定不能重名,那你看这个地方。File name base province,它是一个什么呀?HDFS文件系统名字的前缀啊,那也就是说了,我们在这设置的名字,它不单单是一个名字,它是一个前缀,那它还有一个后缀,那后缀是什么呢?后缀它是一个32位的啊字符串,后缀它是一个32位的字符串,它不是32啊,它是一个32位的UUID的随机字符串,能理解吧?那我给你做一个随机,你虽然说前缀相同了,但是你们的后缀是不是就不相同了呀?后缀不相同,我在这通过aend的模式我就可以写入了,那这个是其中一种方式啊end。
15:13
追加这儿还有一个方式叫做no conviyate,这也是什么意思呢?我刚刚不是追加吗?你有相同名字的,我能让你写入进来,哎,我给你来一个后缀,那那compate它在写入的时候呢,它就会进行一个判断,他要判断我当前这个文件夹当中有没有同名的文件,这个同名的文件并不是说我整个文件名啊,而是有没有相同的前缀,有没有这个前缀都为BP的,如果说你之前已经存在了前缀为base province的这么一个文件了,那么我再往这个文件夹当中写的时候,再次往这个目录当中写的时候。他不会帮我们生成一个新的文件了,它会干嘛呢?它会报错,它会告诉我啊,当前的这个目录下存在一个文件名相同的这么一个文件啊,这有两个方式,End和no complicated OK,那接下来我们就体验一把。
16:17
体验一把这个table木的它是什么情况,那怎么体验呢?我把这个配置文件给他拿回来。CTRLC我给它复制一下啊,我给它CTRLC复制一下,那复制到哪呢?那来到我们的这叉,这叉在这啊,我make DR一个文件夹叫做job啊,在啊。无法创建已存在啊,它已经存在了,你看job目录它是存在的,那我直接CD到job目录进来,进来你看一看,它有一个给我们的自检测命令,叫做job点森,那我这呢,不用它,我vim一个base_p base province,点一个次回车,回车,然后把这个配置文件给它粘贴进去,那这个配置文件呢,就是我们刚刚写的table Mo的这个模式啊好了,然后我冒号WQ保存,保存完了之后我执行一下data叉的启动命令,那data叉的启动命令大家还记得啥了吗?是一个Python吧,我通过一个Python环境,然后找到我并目录下面的data差点PY,然后呢,再找到我job目录下面的谁呀,我刚刚配置的base provice啊,这呢。
17:40
Base province,然后我一回车,一回车之后,他现在就开始执行了,但执行的时候你看他这报了一个错,什么错,他说拒绝连接,拒绝连接谁呀,我们的哈杜op原因呢,是因为我的哈杜op没有起来啊,你看我没有启动,那怎么办?我在这执行一下呗,HDp.STT啊,因为我们要往HDFS写数据嘛,那往HDFS写数据,我必然就要让他怎么办呢?我要让这个HDS启动呢,啊现在看还没启动,好了,HDMS已经启动完了,那他现在在启动雅恩啊雅恩,我们是其实不需要启动的,我这为了方便啊,我就直接执行了,其实你们直接启动一个HDFS也可以往里写,OK,那接下来我再执行一下data叉的启动命令,然后我一回车,你看他就已经启动了,那你看他这报了一个错,什么错呢,他说呀。
18:40
您配置的pass不存在,那怎么办呢?我们配置的路径不存在,它要求我们。给它创建出来,也就是说我们的这个叉,它想往HDFS写数据,我们就必须要先干一个事儿,我们必须要先把呀这个路径给它创建出来,哎,只有我给它创建出来了,我们才能往里写啊,这个叉呢,它不会帮我们主动的把这个路径创建出来,这个路径啊也必须要我们手动创建,那也就是说我们在项目当中,诶,在这个脚本里,我们不光要校验这个文件夹里面有没有文件,我们还要校验一下这个文件夹下面。
19:26
哎,这个文件夹存不存在啊,不存在,我们给它创建出来。然后我再执行一下,你看那他现在就可以执行了,嗯,上面的地方他会把我们刚刚的配置啊,给它解析出来嘛,解析出来然后他做一些对应的封装,那好我们等着他执行完成,OK,你看这他现在就已经执行完成了,当打印出这些信息的时候,他就执行完成了,你看启动的时间,结束的时间,以及耗时流速。读出记录总数32条,它一共读出了32条数据,那我们来看一看base promise这个表啊,找到base promise这个表一共有多少条数据啊,你看在下面呢,我们这张表一共有34条数据,那他为什么只有32条呢?我表当中有34条数据,但你只读出了32条,对吗?原因呢,是我们在封装job吧的时候,我们在这设置了一个参数叫做外耳,外耳条件,我们设置了啥呀?哎,对啊,设置了ID大于等于三,那么ID为一和二的这两条数据我们就查不到了,34减二,那不就剩32条了吗?哎,是这个原因啊,所以说我们现在就能很明显的看得到了,我们在这配置的参数,它呀就会给我们封装成一个circle语句当中的外条件啊,OK,那到这儿这个table目的模式我们也就体验完了。
20:57
那这个叉,我们说my circle reader它有两个模式,那接下来我们看一看my circle reader之query circle mode,它跟table mood又有什么区别?好,我给他拿过来。
21:12
我给它复制出来,然后来到我们的这个Jason格式化的工具当中,然后我ctrl a ctrl a给它粘贴进来,然后我折叠所有,折叠所有之后我一层一层的打开,我们看一看有什么区别啊,跟之前的打开之后,首先我们看到的是一个照吧,因为啊这个叉它会把我们的这一次任务首先给封装成一个job,然后在这job里呢,有两个选项,一个是settingings,一个是content,那settinging我们可以在这里边设置一些流速啊,并发的配置等等等等。那再有content是我们配置读插件和写插件的,那这里呢,对应就有一个reader插件和writer插件,Writer插件我们就不多说了,为什么呢。因为啊,这个writer插件它还是hdfs writer,我不管你是table木的,你还是qua circle木的,你对应用的hdfs writer都是哎一份啊都是一样的,Hdfs writer都是一样的,而且这个写入模式啊,它都是A喷的模式,以及这个路径它都是一个路径。
22:20
好了,那大家想一想,唯一不一样的是哪儿啊?应该就是我们的reader吧,那reader这个地方名字也都是一样的,都叫做my circle reader啊,名字都是一样的,不一样的在哪呢?我们打开看这个perter,首先我们要干嘛呀?我们想要读取my circleq的数据,我们就要通过用户名和密码来连接到我们的my circleql,那连接my circle我们是不是得知道一个jdbc URL呢?所以说我们通过这个JDBCUURL啊,我就能找到我在哈杜1023306的这个买SQL下面的gma数据库,然后我在这儿,我之前的的模式,大家应该还记得这是啥吧,Qua的模式里这个地方它就是一个table,那我们在下面呢,指定一个表名就完事了,但是我们现在是query circle了,所以说我在这要写一个circlel语句,你看大家看一看啊,跟我之前的有没有什么区别,我在这select它一个字段啊,这么多字段,然后from了我这么一个表,你看你之前不是table吗?那好了,表在这呢,然后我这些字段,我现在没有这个column了啊,Column我不需要了,但是我这个字段直接都在SQL里给查询了,你需要哪一个字段啊,我需要这张表当中的哪一个字段,那我对应的就去查询哪一个字段就完事了。
23:45
接下来这儿还有一个外,那我之前还有一个外参数,但是现在我不需要了吧,因为这个外条件我们也可以给它封装到这个circle当中,那大家再想一个问题啊,你说既然你的这个query circle。
24:02
还有table木,他们两个实现的效果一样,那我为什么还要给他俩拆分开呢?一个是用circle,一个是用table,那这种情况你说我们它既然没有什么区别,是不是就没有什么存在的意义啊,那既然它有这两种模式,肯定是用起来呀,是有一定的区别的,那我们刚刚说的只是相同点,那大家想想不同点在哪?我的query circle模式啊,我这写一个词后语句和我指定一个表名来说,它们有什么区别呢?大家想想。那我们看一看啊,我们指定circle的时候,我们在在这呢,可以指定一个circle,那大家想一个问题,我们的table木的模式,我直接指定一个表,也就是说我只能同步这一张表的数据,或者说我在这一个job当中同步多张表,当然了,我想在这一个job当中同步多张表啊,我们必须也要保证这这些表他们的表结构都是一样的,也就是说分库分表的时候,我们才可以用一呃这一个照里同步多张表,那我们呢,就不考虑同步多张表,咱就以一张表来举例。
25:16
那我们同步一张表,我想用table木的模式,我就只能仅同步这一张表,但是我们想一想,我如果说用query circle,我们在这儿可以写一个circle,那circle我们能写什么样的circle呢?大家想想,我是不是可以写一个John呢?你比方说我在这个地方select一个什么什么,然后from表,然后再来一个外条件什么什么,然后left join,或者是直接来一个in the draw,或者是什么什么的照我可以做一些更复杂的关联查询啊,甚至是说呢,我可以直接在这个地方执行一个聚合,哎,我执行一个count,我执行一个sum。啊,我把我执行的这个结果,然后呢,我在write目的我在这个hdfs writer的时候,那我对应的这个字段,我给它对应上,这是不是也可以呀。
26:12
哎,那这个就是query mood和table mood它们两个的一个区别啊,我想用这个query circle mood,我呢就能做更灵活的事,但是它有一点在query circle目当中有这么一个字段,它就不生效了,叫做split PK splilit PK,为什么呢?因为lit PK呀,我们在这是要指定一张表的主件啊,我们lit PK是要指定一张表的组件,但是我们这张表做一个关联查询了,那关联查询之后,你说我们的这张关联之后的这个表,那它的主件是谁呀?哎,那这个就不是很好定义了,包括我们的对个叉,它也无法呀来找到我们关联之后的这个表,那我们只是把关联之后的数据给它发送到下游了,所以说query circle它有一个好事,好事就是它可以进行一个关联查询。我甚至还可以在这。
27:12
直接直接进行一个聚合,但它有一个不好的点,它没有办法啊,设置死不利的PA了,也就是没有办法做一个更细力度的并发处理,那这个呢,就是它的一个缺点,但是啊,大家想一想,你说我们会在query circle这里我直接做一个聚合吗?啊,我直接在这做聚合,或者说我直接在这儿做照呀,是不是没有必要啊,我们完全可以把聚合还有照的这个过程,我们给放到have当中来做,我们把数据一张一张表同步过来,同步过来之后我直接在have里做聚合和照不就完事了吗?这个过程大家应该能体会得到啊,那在这呢,呃,虽然说query circle啊,Query circle目它用的比较少,但是我们还是要体会一下啊,然后我们来到文档当中,在文档当中呢,它对应也给我们列出了一些参数的说明,那我们打开看一看,My circle reader之快,Read circle。
28:11
首先我们在这要指定一个name,叫做my circle reader,那perter呢,我们在这里边有这么多参数,用户用户名和密码,ROOT6个零,这啊我就不多说了啊,上面是固定写法,下面是用户名和密码,然后我们再来一个JDBC的URL,找到我们的my circle,接下来我就可以通过一个circleql语句啊,这就完事了,通过一个circleql语句来进行我们的my circleql查询了,那查询完之后我就可以用我的这个writer了,你看我们的writer,把数据啊发送到writer当中了,Writer呢,它就可以往下游写了啊,Writer跟我之前的那个writer是一样的,那在这儿这些参数我就不给大家详细介绍了啊。那我呢,我把这个配置拿出来,我们再呃,CTRLC算了,从文档当中粘啊,我把这个配置我们再拿出来,拿出来我们体验一下query circle它是什么样的。
29:08
CTRLCCTRLC之后,然后我们来到文档当中。呃,来到叉CL当中,我CD到OPT model data叉里的drop本目录,我在这呢,再创建一个job,我叫做vim。Base province啊,不能叫base provi了,我叫base pro_circle第二一个。再次好,那这个我把这个配置给它粘贴进去好了,那大家想一想啊,我之前呢,写入到HDFS的路径在这呢啊,我之前写入HDFS的路径是斜杠base province,那我现在在往这个斜杠province里写,我们在这儿是不是对应的就会生成两份文件呢?你看我现在是在这呢,我如果说我现在在往base province这个目录下写,你说我能不能写进去啊,我已经有一个重名的文件了,哎,是不是也能写进去啊,原因我们设置的这个文件名,它并不是一个最后的名字,它只是一个前缀,那我在执行的时候,它也会给我分配一个36位的UUID字符串,所以说我再往这写,它也是能写进去的,那我这里对应的呀,就生成了一个文件,但是哎,我就不往这写了,我往哪写呢?
30:31
我改一个目录啊,你不叫base promise吗?我叫我叫你base promise,哎,行吧,那就写到base promise这吧,行就先写到这冒号WQ,然后我保存,保存完之后我们就来执行一下,那我在执行的时候,我还是要通过Python,然后呢找到我们的。CD1点点啊,通过这个Python的py ho,然后找到我们变目录下面的data,插点PY,再找到job目录下面的base promise告circle点,再那我接下来以回我看看它就正在执行了。
31:11
OK,他现在可以正常通过了啊,原因呢,是因为我们的这个文件夹已经创建出来了,那在上午的时候,我们第一次执行的时候它是不行的,原因是因为base promise这个目录我们还没有创建啊,Data叉想执行,那我数据的这个目录它必须要存在。OK,那到这儿它已经执行成功了啊,大家可以看一看,数据的条数是32条,那我们在这儿刷新一下,应该出现两个文件了,那下面的这个文件呀,就应该是。我刚刚生成的这个文件,OK,那到啊,不是上面这个文件,看时间啊,在这呢,这个时间是最新的,那上面这个文件就是我刚刚通过query circle的模式写进来的啊,OK,那我在这,哎,那这个怎么怎么搞呢?其实我们可以查看一下啊,嗯,你比方说我把它给拿过来。
32:04
复制。复制,然后我来到这个地方,我可以执行一个哈杜命令,我记得哈杜有这么一个命令,哈杜FS,呃,杠LS吧,然后我右键粘贴,粘贴过来之后我把它拿过来。不是。复制完了,我右键粘贴,然后我一查询,嗯,Get。是叫get吧,呃,KK啊是叫K,我们K一下看看,哎,你看它是一个乱码,原因呢,是因为我们用了什么呢?我们是不是用了一个GZ压缩呀,它不能直接解压,那我们想看一看压缩,压缩之后的文件,我们应该怎么办?我在这个地方加一个JK给它进行一个解压,我再回车。OK,那他现在就把我们写入的这个文件给他打印出来了啊,你看这个就是我们写入的这一份文件啊,那接下来我们看一看下面的这个功能叫做data叉传参啊,为什么要用data叉传参呢?它能传什么参数呢?我们看看啊,Data叉啊,它支持一个传参的功能,诶怎么传参呢?它可以在命令上啊进行一个传递,参数传递到我们的这个脚本当中,那这个脚本它如何接收参数呢?啊,我们可以通过一个Dollar大括号诶接收我们传递过来的参数,好,那穿参功能有什么作用呢?在我们的项目当中呢。
33:39
我们看一看啊,那首先我们来到HDFS,你看我们现在啊,同步了这一个表,同步了MYSQL的这么一个表,叫做base province,那同步过来之后,你别忘了呀,我们同步到HDFS就是离线了,离线计算了,那离线计算怎么算呢?是不是按天来存储啊,啊按天来存储吧,哎,按天来进行计算嘛,那我想计算每一天的数据,我是不是要给他按。
34:09
天来进行一个划分呢,哎,我直接把这一天的数据,你比方说我来一个2020杠零六杠一四,我把整个这个文件夹的数据,我给它漏的到have当中,那么我是不是直接可以计算一整天的数据啊,不然我还要在这一个文件夹当中,我还得判断我哪一个是今天的数据,我才能进行计算,那我给他来一个日期,哎,我是不是整个这一天的数据都是今天同步的。好了,那接下来电子叉的传参功能,它就能帮我们干这个事啊,我们在这呢,给你加一个Dollar大括号,来一个DT。哎,这样啊,这个参数DP参数它就变成一个动态的了,那这个参数我现在是这么接收了,那我怎么传过来呢,我们看一看。
35:03
啊,我们呢,可以在这个执行命令上加一个杠P啊,然后双引号,再来一个杠大D,杠大地后面我们接上一个DT,哎,这个DT就是我们要传递的参数名,再来一个等号,后面是我们的参数值啊OK,那接下来我们就来一个呗,这个动态传参啊来到这,来到这,我CD到job哦,V I'm,一个base province,第二个在这里啊,怎么做了,哎,Base pronce这个后面呢,我来一个目录,那来一个目录啊,倒了号,然后大括号,然后我们的参数名,哎,DT,然后冒号WQ保存,哎,那保存完了,那它如何来传呢?哎,我CD点点啊,你看我在这直接Python。然后B目录下面的date差点PY,然后指定到job目录下面的base province点好,那接下来我一回车看能不能执行成功呢?
36:11
哎,他执行失败了,什么原因呢?原因是我们这个路径不存在,你看啊,当我们没有穿参的时候,哎,我直接就执行这个命令,它会把我们整个的这么一个目录当做一个目录啊,整个的这么一个字符串当做一个目录,他把Dollar大括号DT整个的当做一个目录了,它并没有当做一个动态参数,那如果说它想变成一个动态参数怎么办呀?哎,我们要在这给它加上。杠P,然后啊杠P什么呢?双引号啊双引号,然后杠大D啊杠大D,我们再给他一个DTDT啊等号,等号等于一个参数的值啊2020杠零六杠一四好,那接下来我再回车,我们看一看。
37:06
行不行呢?哎,他还是错了,他说我们这个参数不合法,为什么呢?因为这个路径不存在,你看他现在是不是已经能动态识别了呀,诶之前它是啊不看了,之前呢,它没有办法识别,他把我们的这个Dollar大括号当成了一个路径了,那现在它已经获取到我们这个参数了,但是啊,他说我们这个路径不存在,所以说我们呢,要先把这个路径给它创建出来啊,复制。啊,来到这儿,嗯哈,杜帕FSFS-make DR make DR,然后右键粘贴回这,OK啊创建完了,嗯,创建完了,接下来我再执行一下,然后再执行一下。没事。哎,这回看起来没有问题了啊,Task group和组那已经创建成功了。
38:07
好,然后他已经写成功了啊,32条数据啊,目测应该是没有问题,我们来到HDFS上看一看,哎,我在这儿刷新一下,你看它就出来了一级目录,2020年6月14号那里边呢,它也有一个文件,我们刚刚写进去的啊,OK 32条数据啊,没有问题,OK,那这个这尔差的传参啊,到这儿我就暂停一下啊啊。好了,那接下来我们再看另外一个案例,叫做同步HDFS的数据到哪啊,到我们的MYSQ。啊,同步HDFS的数据到MYSQL啊。嗯,来吧,我们看一看,那同步HDFS的话,我们用的是什么了呀?哎,是不是reader和writer就变了,我们要用的是HDFS的reader以及my circle的writer了,好了,那我们呢,先把这个配置拿过来啊,简单的看一眼。
39:10
CTRLC啊,拿过来,拿过来之后,我们来到这ctrl a右键粘贴我们看看啊,那首先折叠所有,那第一个事,首先我们这个一个对的差的任务啊,我们给它封装成一个job,那这里有content和裁定丝,我们主要看的是content,这个里边有两个模块,一个是reader模块,一个是write模块,我们看一看reader里边,诶名字变了,现在叫做HDFS的reader了啊,哎,这个呢不能变,那hdfs reader我们要配置哪些参数呢?啊,首先我们要知道要从哪一个HDFS读数据,其次我们要知道读哪一个目录下面的数据,哎,我们在这儿啊,指定一个文件的目录啊,不是指定最终的文件,而是指定一个目录就完事了,好,那完事之后我们在这儿还配置了一个什么呢?
40:09
啊,我们呢,还配置了一个芯,哎,你看还有一个column芯,代表同步我们HDFS上哪一列的数据,那同样HDFS啊,它是没有列的概念的,但是我们have它是有列的概念的,那如果说我们要想同步所有列的数据,哎,我们在这儿就给它指定一个星就完事了,好了啊,稍后我们再看看啊,那现在有这么一个问题啊,那如果说我想同步前三列的数据。这列名是什么呢?我们也不知道啊,对吧,我们现在,诶,因为我们看不到have,我们也不知道这个列名是什么呀,那怎么办呢?稍后我再告诉大家,好,我们先往下看,那同步的时候我们还要指定一个文件的格式以及压缩呀,什么编码格式啊,诶等等等等,诶这有这么几个参数,你看啊,这个不用说吧,Five dailyter这个叫什么呢?字段的分割符,那这还有一个now format。
41:12
那返乡当这是什么意思呢?啊,Now值的存储格式,哎,这个呢,你们在创建have表的时候,应该指定过这么一个now值的存储格式吧,好啊,关于not的存储格式这块啊,稍后呢,我也会,哎,做一个详细的讲解给你们,那reader没别的了,就是读HDFS的数据啊,指定这么一个目录,然后指定一个列名以及文件相关的参参数,完事,那我们看看writer吧。啊,Writer内my circle write啊,Permeter,我们看看如何往my circle里写呢?哎,首先我们要通过一个用户名和密码啊,连接到我们的JDBCRL啊,然后指定我们往哪一个表写数据啊,那稍后呢,我们会创建一个test province这么一个表啊,然后那我们写到哪一个列当中呢?哎,对应的这个列呀,我们要给它指定上来啊,这个列哎,要跟上面对应啊,不管是什么reader和writer,只要是有列的概念,我们就必须要上下对应啊,那这还有一个write写入模式,Write please,诶,那这是什么意思呢?啊,嗯,稍后呢,那现在我们就来到文档当中,看看这参数相关的一些解释进来。
42:36
那首先我们再把hdf reader的参数过眼啊,名称固定写法hdfs reader不变,那接下来HDFS文件系统name no啊的连接地址啊,还有文件的路径存储在哪啊啊,这是列名,那如果说给他一个星代表识别所有的列,那我只想识别其中的几个列怎么办呢?哎,这么整啊,通过一个INEX0,哎代表我们列的,所以是第几列,它不是指定一个列名了,它是指定第几列,然后再来一个type的类型,哎,我给你同步出来啊,你看。
43:17
Index type类型。然后再来。File type文件类型啊,Text file啊,RC啊,R啊qus啊,哎,等等等等啊,那再有压缩格式啊,编码格式。Now值的存储格式,哎,这个呢,稍后我们会详细的来讲啊,这个闹值的存储格式啊,再有字段的分隔符啊,这个不用多说了吧,我们这个数据啊,它是按列来存储的嘛,HDFS数据按列存的,那每一列我是用什么来分割的呢?啊反斜杠T。好,那再看下一个。Writer。My circle writer看一看啊,那my circle writer它这里又有什么东西呢?名称固定写法,哎,数据库名啊,用户名,连接密码啊,然后指定一个JDBC的URL和一个目标的表,那么现在我就可以往这里写数据了,那往哪一个列写呢?哎,往这个列写,那主要就看下面这个right目这个参数re place是什么意思呢?哎,这个呀,是控制我们的写入方式的。
44:30
啊,这个please它是控制我们写入方式的啊,那它有几个可选值呢?它有三个可选值,第一个可选值叫做please,也就是我们所说的这个,哎,现在这个。那第二个呢,叫做insert,那第三个叫做up,哎,这么三个可选值,每一个可选值它都对应了一个circle语句,哎,它都对应了my circle上面的一个circle语句,那分别都对应什么呢?啊,我们也能看得到insert它对应的就是insert into,诶,插入,那right呢,它对应的是right into,这个可能有同学没见过啊,那它是什么意思呢?它呀,也可以插入啊,啊,那稍后我们再说,那update呢,那就update语句呗,对啊,它是update的语句,但它不是我们简单的这个update语句。
45:26
它叫做on duplicate。哎,那么这三个参数它又有什么区别呢?那in,色into不用多说了吧,那我们往S句里写,用的都是它呀,用的都是色into,那那用它就完事了呗,我们就是要插入啊,用它行不行呢?我们分析一下啊,这个in inside into啊,它有两种模式。哎,它有两种模式,一个叫做有主件和一个叫做无主见的时候,对于我们表来说啊,有主见和无主件,那有主件和无主见他们都有什么区别呢?好,我们先说没有主见的时候啊,无主见。
46:12
当我们这个表没有组件呢?我们执行insert into往这里插入,我插入一个ID等于一的这项数据,那么它会把ID等于一的这条数据给我们插入进来。好,那假设啊,我执行这一次in s into,我没过瘾,我再来一次in s into ID等于一,那么它会把ID等于一的这个数据再次给我们插入进来,哎,这个是ins色into,在没有主键的情况下。那他如果说有主见了呢?啊,有主见了,那他怎么办呢?那我同样啊,我插入了一个ID等于一的这条数据,它能插进来没有问题。啊,那现在是有主见了,那假设啊,我没执行过瘾,我再执行一遍ID等于一的这条数据,那么。
47:04
他会报错了再执行,他会报错,报一个什么错呢?他会说主见已存在。啊,他会说一个错,叫做组件已经存在报错了,那么他一报错了,我们date叉是不是就挂了呀。啊,那data叉就挂了,诶那这种情况我们是不是不想看到啊,哎,我们不想让data叉挂掉,那怎么办呢。你看啊,那我们看看第二个模式吧,Re place into来place into和ondoplicate k update,他们两个都必须要求我们的MYSQL表是有主见的,你如果说没有主见,那么这两个模式直接报错。好,那我们看看这两个模式它是怎么执行的呢?那假设啊,我们现在哎,用replace模式执行一个ID等于一的这条数据啊,它进来的时候,诶,它怎么办呢?它是先判断啊,我这里有没有ID等于E的这条数据,我现在没有,那我给你插入进来好了,那接下来我没执行过瘾,我再次执行一次ID等于一的这条数据。
48:19
那我再执行了,那他进来首先会判断呢,我有没有ID等于一啊,那如果没有插入,那现在我有了怎么办?我把你替换掉,哎,它相当于执行了两个词后语句,先执行一个delete。如果说存在的话啊,他先执行一个delete,执行完delete之后再执行一个insert。先把你删掉,删掉之后我再插入,这叫什么呀?哎,这叫替换啊OK。好,那接下来我们看看on duplicate k of date,那它呢,哎,它也要求我们这必须是有组件的啊,必须有组件好了,那接下来我执行一个ID等于一的这条数据,同样执行之前呢,它也会先判断我有没有ID等于一的这条数据啊,哎,没有,那没有,我插入进来好了,那接下来我再执行一次,再次执行,哎,它还没判断有没有啊,哎,那现在有了,那有了它怎么办呢?它不是替换它呀,是进行一个更新啊,我现在ID等于一,那么我把你ID等于一,哎,我给你更新一下,哎,那同学说,那老师你这两个rele和up,它最终得到的结果是一样的,哎,我们现在只有一个字段,你感觉是一样,那如果说我们这里有两个字段。
49:45
啊,或者说有更多字段,你看啊,我这有一个D等于一啊,这有一个did字段,我还有一个什么呢?我还有一个name ame,那除了这个之外,我还有一个年龄。
50:01
啊,这么聊啊,三个字段ID,然后内,那我现在呢,通过。In place into,我们看看啊,你看我之前写入一个ID等于一的这个数据年龄是18,哎,内是张三,那如果说我这次执行第一次啊,ID等于一啊,那我再执行一次ID等于一,它会怎么办?它会把我这条数据给覆盖掉啊,他会把如果说是一样的话,他会把这个数据给覆盖掉。啊,ID是一样的,它会把这个数据给覆盖掉,那好了,那接下来我再执行一个什么呢?我在执行一个on duplicate k update ID等于一,那它怎么执行的呢?它执行的是ID等于一啊,然后name。不是张三了,变成了李四了啊,LS李四,那它会怎么办呢?ID等于一不变,年龄18不变,内变了,你从张三变成了。
51:10
例四了啊,是这么一个情况,OK,那么这个是on k update please啊,相当于我整条给你删除了,然后进行一个插入,那on Du place k的K,它不是删除,直接在原有的基础上进行一个更新啊好了,那现在问题来了,这三个值你说在生产环境当中,我们用哪一个比较好啊?来第三个,那首先我们分析一下啊,In色into好不好呢?因色into我们刚刚分析了。要么会出现数据重复,要么怎么的。是不是报错呀,你看啊,为什么会出现数据重复呢,假设。啊,假设我们在执行的过程当中啊,哎,我执行完这一次执行完了,但是执行完了我不知道我执行完了呀,然后我不小心呢,我又执行了一次,那是不是在这一个目录下面会出现两个文件呢,而且这两个文件的内容都相同,这就是inl into模式啊,在无组件的情况下。
52:17
啊,这这不是那啥了啊,这是表不是目录了,这是一个表,我执行了一次了啊,执行一次我不知道啊,然后我又执行一次,那是不是又会写一遍啊,在没有主见的情况下,这个数据是会出现重复的,那这肯定不是我们想要的,那再有如果说你有主见了啊,有主见了,那这个时候他还会报错,但我们不想让他报错,我们想让他干嘛呢?我们是不是想让他把之前的删掉啊,只留下最新的一份。这个是我们想要看到的嘛,我们只想看到它是有最新的一份,好,那么replace和on Du k它就可以做到,一个是替换,哎,一个呢是直接的在原有的基础上进行更改,那么这两个模式啊,其实我们用哪一个都行啊,用哪一个都行,那我们呢,就选择用re relicate啊,Relicate c模式了啊啊re replace模式,OK,那么接下来我们就来测试一下MYS。
53:20
这个writer啊和h DFS reader。那我呢,那在测试之前,首先我要建一个表,建一个test province,在MY创建一个。我们稍后呢,哎,把HDFS上的数据啊,就写入到这表当中啊,然后打开我的客户端工具。稍后我们就把HDFS上数据就写入到这个表啊,然后查询新建一个查询右键粘贴啊运行好了,那这个表我们已经创建完了,那创建完了我们来看一看吧,F5刷新,F5刷新啊找一下啊test province哎,没有问题啊,现在是空的啊,没有数据,那么接下来我把这个给它粘贴出来,这是test province好,嗯,从文档上粘贴也可以啊,从这粘贴也可以,我这个地方已经粘贴了啊嗯,完事之后我们啊来到查菜。
54:24
然后CD到造本路进来之后,Vim test塔下划线,下划线pce province第二一个再进来,进来之后我把这个粘贴进来,好粘贴完了冒号WQ保存好了,那接下来我们看一看啊,它诶执行的是哪一个目录了啊,再回头看一眼。他读取的是哪个目录了?嗯,Reader看read,它读取的是啊base province这个目录啊base province目录,那我们看一看我们创建的这个表有没有主见呢。
55:07
那我们创建这个表,哎,我们指定了一个primary k是ID啊,我们这个表是有主件的,为什么?因为我们用的是Rep这个模式吧,那replicate这个模式它要求我们必须有组件存在,如果说没组件它会报错的,好,那既然有组件的话,它是不是会帮我们进行一个驱重啊,那好啊,我们来到这个HDFS上看一看。好啊,它同步的是base province这个目录啊,那行,那这里有几个文件呢?啊,有这么多文件啊好,有这么多文件,那来吧,那我们执行一下看一看,那这样吧,我把它删掉,把这个删掉,我删掉一个。三条鱼,好,现在变成一个了吧,还有一个目录啊,OK,然后我CD1点点Python Python,然后B目录下面的data差点PY,然后找到job目录下面的test_province点,哎,接下来我一回事。
56:14
嗯。好。稍等啊。嗯。OK,哎,我们看一看那启动的时间,结束时间总耗时11秒啊,这是读和写的速度,哎,我们看读出的记录数64条。啊,为什么是64条呢?那不对呀,那我这里一共只有一个文件呢,我当前这个目录它一共只有一个文件呢,那这呢为什么是64条啊,哎,注意啊,我们这儿还有一个嵌套文件,我这个文件夹下面还有一个嵌套文件夹,那么它会进行一个文件夹的便利,如果说你是一个文件,它会直接读取,那如果说他发现你是一个文件夹呢,它会进行一个遍历读啊这个呀,它也给我们读出来了,那么我这个文件和我这个目录下面的这个文件,它俩的内容是不是一样的呀,都是ID从三到多少啊,从三到30。
57:21
四啊,从三到34。那好了,现在问题来了,我现在两个文件一共64条数据,ID都是三到34,那我的买三口当中有几条数据呢?那我是不是有64条数据啊,那我们刷新一下看看啊F。看哪呢,看这一共是32条,哎,为什么呀,因为repl模式它会给我们进行一个去重,哎,相同ID的就给我们替换了啊,每个ID它只是一个唯一的,它不可能相同啊。哎。啊,ID都是相同的,没有重复的,好,那么这个就是我们的my circle这个reader啊,啊不是这个是我们的my circleql writer和hdfs reader啊,OK。
我来说两句