00:00
接下来我们看一下最常用的从my circleql读取数据,将数据写到HDFS,那首先呢,我们可以看一下官方模板对吧,B data叉点PY杠二呢是买so raer-w h dfser啊回车,那其实这中间这个参数呢,大家可以瞅一眼。首先是reader跟writeer的配置啊,那后面这个是速率配置,那我们关注的就是reader跟write,那这中间有很多参数,大家瞅一眼,你看my circle reader里面可以指定列。可以指定什么连接地址对吧,JDBC的地址还有一个表明,那还有什么用户名密码,还有过滤条件。那当然不仅仅是这些,还有其他的东西可以配啊,那writer一样的,那因为这个比较常用呢,咱们单独对这个参数做一个介绍啊,来在咱们的文档里面啊,做两个PPT。
01:03
我们是reader reader分开看的啊,看一下reader,这是一个my circle reader来。这个不用讲,最关键是参数里面卡,那卡里面就是可能我买SQL里面,比如说有ABC3个列,但是呢,我可以指定只同步ACB,我就不要了啊,这是可以的嘛,你只要在这里指定列名就可以了,那么也可以写一个星星呢,就代表所有列,但是大家注意,咱们其实一般在工作中啊,尽量避免使用星。啊。避免使用星啊,你写星也行。呃,比如说你这张表有十个字段,咱们正常习惯上来讲,还是将十个字段都写出来,因为这样比较放心嘛,包括顺序啊,名字啊什么的。好,那里面呢,是一些连接配置这个URL,这个大家。
02:00
应该都懂了,就是咱们所谓的JDBCMYL啊,3306那个对吧,那这个table呢,可以指定咱们同步的表,我们可以写多个表面,大家发现没有,这个CDBC也好,这个table也好,都是什么。这么一个数组啊,对吧,表示可以传多个啊,表示可以传多,包括JDBC也是啊,支持多个连接地址,那后面呢,大家注意咱们这个中这个黑括号。括起来表示什么意思呢?表示这个是可选的,也就是说我不写它不影响啊,不影响,那另外这个query circle大家要注意啊,Circle咱们在SCO里面是不是也有一个杠杠query啊,是不是也可以写circle,也就是说定义我要怎么从my circle里面查数据,对吧,这个是非常的灵活的,但是。你有没有想过一个问题,我前面不是指定的列指定的表吗?那跟circle中间如果写的不一样会怎么样啊?哎,大家注意,如果你写了query circle,它会忽略什么,忽略你列的配置表的配置,完完全全按照你的circle来,也就是说它的优先级是最高的啊,优先级是最高的,那其实大家看到后面有一个什么where也是可选的,这是不是一个过滤条件呢?
03:21
其实过滤条件有啥用,咱们用SCO的时候,是不是有几种同步策略,一种叫全量,一种叫增量啊。对吧,还有新增级变化,那么大家想一想这个是怎么实现,不也是在搜Q里面指定一个物业条件吗?对吧?啊,比如说我要。只同步新增的数据,咱们正常是T加一对吧,比如说我今天要同步昨天的数据,我是不是只要VR创建时间等于昨天。那不就变成一天的增量了嘛,对吧,所以这个V是经常呢,咱们也是会去写的啊,因为你第一次全量之后,接下来应该都是每天的增量啊。
04:02
啊,这知道这一点啊,知道这一点,那后面的用户名密码就是你买SQL的用户名跟密码啊。V,刚才讲过了啊,这一般是没有使用这个circle的时候,根据咱们的列,根据咱们的表指定一个过滤条件,那还有一个叫切分键啊,这个一般咱们叫切分键,那么一般是什么意思呢?咱们是不是要切分成多个task?那正常来讲。它你不指定它自动切,但是咱们可以指定切分字段,让它切的更均匀,因为你既然是分,就有可能分的不均匀的时候,对吧,比如说task你按照它自动按照某个规矩切,如果切的不均匀呢。或者说你指定的切分键不好,是不是有可能出现一个倾斜,比如说这边有呃十几条夸张一点啊啊这边。
05:01
100万条,这边1万条,1万条1万条,那这样的话,某一个task它的任务是不是很繁重啊,对吧,那这个时候你就可以来指定一个切分键,那一般咱们用的是自增的组件,而且是整形的啊,不要指定字符串类型啊,自增的比如说咱们经常用的自增的ID嘛,这个就很合适啊,它是连续的,而且不重复的,均匀的。这都是一些小常识,那切分键是可选的啊,你不指定也行,他自己帮你切。这是一个reader my reader,再看看一个hdfs writer几个参数,首先是它的名字啊,这固定的,那主要是参数呢,这边是一个什么列。写入的字段大家注意,这里可不能写星啊。为啥呢?你是要被写入的,那么被写入的对象,它的字段的顺序跟字段的类型是不是得严格被要求啊?比如说我的my circle有ABC3个字段,这个是int啊,这个是ver,差,这个是int,那我把它导入到HD have表或者就have表啊,咱们来理解,那这边我是不是很有可能只有AC2个字段了?
06:31
或者我只有,呃,我有abcd多个字段的,但是现在呢,我同步的是不是比如说我只同步AC。那如果你不指定它是默认,就按AB去写入了,那类型又不一样,比如说A是int b是string,是不是就报类型错误了对吧?这个大家能想象得到,你是被要求的那一方啊,对你的限制是比较严格的,所以你这个type是必须指定类型啊,啊这边是大家要注意的一个点啊,还有就是你要搞清楚不同数据源跟hi之间它的类型对应关系是什么。
07:10
对吧,这一点你是也是要确定清楚的啊,不能乱写。好,后面是压缩啊,当然这边咱们没有用刚才那种啊黑括号把它包裹起来,它也是可选的啊,你不写的默认就没有压缩啊。那。FS defpo FS,这个可以说老生常谈的,你要连接HDFS必填的一个配置对吧?也就是name node的一个节点地址,大家注意这个不是word地址啊,是defor FS的地址,正常呢,要么是8020,如果是呃哈多三点几,你可能会修改成9820啊,要么是这个,要么是这个肯定不是9870哈多3NAME note页面的端口是不是9870啊,或者二点哈多二点几是50070对吧?这个是页面端口啊,不是这玩意儿啊,你要搞清楚啊,要么8020,要么9820,你可以,如果你不确定,你可以看配置文件啊,一会儿带大家看一眼接下来字段的分隔符,对吧?你是斜杠001啊,还是杠T,还是逗号,还是分号,咱们汉键表是不是要指定分隔符啊,啊,这边就是写入的时候我用什么分隔符啊,这个你也要注意跟你的have表要对应起来,在实际使用的过程中啊,呃,文件名,因为我们现。
08:34
现在写的是HDFS啊,你可以指定一个写过去的一个文件名啊。那还有一个fire type写入的文件类型对吧,TXT还是orc,说白了就是存储格式嘛,啊,前面这个是压缩啊,压缩有啥呀。什么snap啊,拉泽罗啊,这种才是压缩对吧,文件格式是test orc这种啊。
09:03
帕。你是不是要指定写入哪个路径下面了,对吧?啊,这个你要指定啊写入模式。协助模式其实很简单,是追加呢还是覆盖?对不对,覆盖写呢,那你是不是要先清除对应路径下的数据再去写入啊,那如果追加就是后边追加就行了啊。当然他不会帮你删啊,如果是追加,那他直接。根据文件名写入啊,那如果是呃,也不是覆盖了,就是这种不冲突的。那他会报错吗?还有一点我们再深入思考一下,同学们,如果我写HDFS,我不是多个任务在并行吗?对吧?假设我有三个并行,我同时再往HDFS里面写,那会不会有一个问题啊,同学们。
10:07
他是写同一个文件吗?不是,它每一个并发每一个线程它的文件名,比如说你叫a.TST,它会在后面拼接上一串东西,这个也是a.TST后面拼接上一串东西,a.TST后面拼接上一串东西。那么你想想,如果。因为咱们HDFS是支持多客户端对同一个对象。写入啊,也就是说同一个文件你只能被一个东西写入,你不可能多个同事写的啊,这个应该是一个常识,那么。这个后面这个就是现成名了啊,你知道就行,你要看不顺眼就行,好这是一个问题,第二个问题,同学们如果这个失败,这个成功,这个成功。对吧,只要是并发,只要是分布式啊,当然这不是分布式啊,但但它是并发对吧,那只要是并发就存在一个问题,有的成功有的失败。
11:11
那这个时候不就数据不一致了嘛,对吧,那任务失败退出,但是有一部分数据写过去了,那咋办呢?他其实是这样啊同学们这一点是必须要跟大家说清楚的,你三个比如说一共就三个task去写啊,那这个失败,这个成功,这个成功你是不是写入两份呢。对吧?虽然你对塔差整体任务报失败,但是你是不是遗留了一部分东西在哪?对吧,那这个时候呢,你就他会做一个处理,如果任务失败呢,他会将成功这些写入的这些文件都怎么样删掉。因为他其实是不是还带着后缀呢。对吧,因为他最终会做一个事,将他们合并起来,那你他如果失败,他会将这些文件删掉啊删掉。
12:03
这是它的一个执行过程,这是他对于数据一致性的保证,这个是大家必须要知道的啊好,嗯,那咱们来准备一张表呗。嗯,My circle MP,我在my circle里面,我先创建一个data,呃,我叫它啥呢,叫data它啊。然后呢,要建一张表,那这表我就不挑了,这个没什么技术含量对吧?哦对,我先切一下数据库啊,又是贝塔差,好,咱们这一张表啊叫student,那么就两个字,造一个ID一个name啊,这个没什么好敲的,粘就行了啊。瘦cables,那往里面插几条数据呗。
13:00
好,张三李四王五啊,好三条数据。From student,瞅眼删掉数据啊。好,那数据准备好了,接下来我需要启动我的HDFS。雅安呢,你想起就起呗,因为咱们也不走,也不急于雅不基于MR也不走,雅恩,对吧,先起了吧。好。那HDFS好了没有?啊,等他安全模式退出啊。还有两秒,还有一秒。好了。现在可以了,那我。先来做个啥呢?把那个模板拷出来。
14:03
咱们正常不会怎么样,不会说这在这里创建文件,然后vim里面一行一行去敲啊,那不可能,通常呢,咱们还是打开一个记事本对吧。来这里把它写好,那如果甚至我们是不是有一些在线的Jason格式化,对吧,你写完之后格式化一下,这样比较好看,这个我就不去做了啊。那我们直接把配置拷过来吧,啊,这个也也没什么,咱们改一改就行了啊,改一改。这是基于官方模板写的啊来MySQL reader不用改,呃列名呢,ID name啊,这边不用写类型,因为你是读嘛。呃,连接地址我需要改一改啊,因为我的主机名叫哈杜北一啊,大家可能是用哈杜北102嘛。写一个表名student用户名,诶用户名密码你们就根据自己的来就行了啊,那千分键我就不指定了啊writer hdfs writer,好,呃,大家注意这个是咱们之前提到列一定要写,而且必须指定类型,而且顺序不能错。
15:18
对吧,你想想我上面是ID跟name,如果这边我把它们顺序调换一下。那是不是就乱套了?大家注意,他可不会根据名字去找啊。我能不能在MYSQL里面列名叫ABC啊,我同步到have里面,我列名我叫AABCC啊,这是允许的。对吧,这是允许的,但是你的位置跟类型只要能对应的上就行啊,所以这个你要看你细不细了,对吧,做一个细致的人啊,像铅一样细,好那接下来这个地址。这肯定是不对的,对吧,我的话是哈杜18020,哎,对了,说到这个我们说的不是页面端口啊,应该是它的客户端RPC端口,那这个在哪里呢。
16:14
呃,我的话在你的哈豆安装路径ETC哈豆下面是不是有几个核心配置文件呢?啊,应该是在咱们Co杠赛。说这个东西啊。我呢就是8020,你们看你们是什么版本,是什么端口,对吧,你要写对应地址就可以了。啊呃,分隔符呢,杠T的话,我们来一个这个吧,我来个竖线对吧,我们看一下效果,那写出的文件名我指定为这个student.tst,那路径呢,我放在HDFS跟路径啊,模式呢追加啊类型test。这就完事了。
17:05
那这就写完了,速率呢,我并发还是给个一先啊。好,写完了拷贝推出一下啊YM错吧,这个是my circle two h DFS点这。对吧,我们要新建一个JS文件,好把它粘过来,好保存退出,接下来我们执行并data塔差点PY,呃,Job里面有一个my circle to h d FS,对吧,回车。其实已经跑完了啊。你嗯,好,你看。每次写完一定要确认一下啊。写出多少条失败多少条对吧?来我们看看日志了,这边有一些东西啊,同学们,嗯。
18:06
你看。由于我们配置的写入模式,为什么追加写入前不做清理工作啊?然后呢,他写入的时候,你看,呃,写入的文件名叫什么,来看这一段。是不是一串东西啊?他帮我们新建了一个文件夹,文件夹里面写了一个student.tst后面是不是跟着一串东西啊?对吧,一串东西好再往下。好,这还是这这一串。看一下看一下,你看这边做的叫个什么。Rene。是吧,呃,我们可以做一个对比,之前是这样。啊,我也不用截了,都在一个屏幕,它一开始写入的时候是这个路径,这个文件,那写完之后。
19:08
他是不是重命名呢。重命名成什么。从这个。区别在哪里呢?区别是不是在于这个东西啊。他帮我们创建了一个什么临时路径。是吧,但后缀是一样的啊,后缀是一样的。其实这个东西就涉及到一个事儿了,怎么保证数据自信,我是不是写入一个临时文件?对吧,然后如果全部成功我就怎么样,因为你是多线程对吧,全部成功的话我就修改。文件名、路径。对不对,类似的一个思想,那么如果个别失败,那就是什么,那就是任务失败啊,就不失败,那怎么样删除临时路径,你看他就是通过这种方式来保证咱们的一致性,这一点大家要清楚啊,这一点是很重要的一个事儿啊。
20:21
行了,废话少说,我们看一眼吧,来看一下这个文件。跟目录对吧,看有没有一个student.txt你看后面带了一个后缀对吧,来点开我看一下。啊,多点了一下,你看是不是这两列,而且分隔符是什么竖线,那有的同学说你现在只导入HDFS,那我导入have呢,哎,我们看一眼,我们看到GIHUB上面的介绍,它是不是分为have跟HDFS啊,对吧,而且都支持读写,那么如果你要写入have,来,我点一下写。
21:07
啊,等一下他。它其实也只是写入到HDFS,因为呢,它不支持直接就进到这个表里面。也就是说也不是这么讲,咱们help是不是分为原始数据跟原数据啊,你是不是只要把数据放入到对应的。表路径下就是不是就相当于进去了,对吧?当然不建议这么做啊。因为如果分区呢,对吧,如果分区不存在,你是不是还得修复分区。啊,有点慢。那。这这这这也太慢了吧。或者我在这看就行了呗,来,呃,这有一个什么呢,B data差点PY,比如说杠二,My circle reader,杠w have writer,你看有没有。
22:10
他就没有这个东西。他就没有这个writer叫hi writer,它只有一个叫hdfs writer。哎哟。有点卡稍等啊,去不去咱们一会儿再看吧,好吧。
我来说两句