00:00
好,那上一节呢,我们已经把scoop安装好了啊,并且呢,也测试了这个环境也是没有问题的,对吧?那现在我们就开始学习scoop的使用啊,这个scoop怎么用啊,啊,其实很简单啊,在这呢,我们可以先敲一个命令啊,叫做scoop,诶,Helpp scoop harp啊那这个呢,就会给我们提示SOP的用法,来我看一下这个用法其实很简单。哎,是不是就执行这样的一个命令就行,对不对?首先我们先调用scoop程序的入口,也就是我们刚刚调用的B目录下边的scoop这个脚本,那之后呢,我们需要给它传入一个command,然后后边呢,再传入若干个二,也就是参数对吧?啊,OK,那这个command的都有啥?完了之后这个参数又有啥呢?诶,我们主要看一下啊,我们先看下边啊,下面是不是有一个valuable command啊,对吧?那这就是我们可以入的command命令,好,我们来看一下都有啥啊,首先我们先看这个。这个大家应该比较熟悉对吧?啊是这是不是就是我们刚刚为了测试环境使用的list database对吧?啊,那除此之外还有啥啊,是不是还有一个export完之后呢,还有一个import呀,对吧?Import哎,就是导入啊,在这后边是不是有说明,是不是就将数据库里边的一张表的数据导入到HDFS上啊对不对,那导出呢?导出是不是将HDFS上一个路径的文件导出到数据库的一张表里。
01:19
没错吧,诶这就是所谓的导入和导出啊,那实际上我们使用库op的时候呢,诶咱们主要就是用这样的两个命令,那由于我们现在要做的呢,主要就是将my serve当的数据导入到HDFS上,对吧?那所以现在呢,我们就先重点学习一下importt这个命令,那import这个命令到底应该怎么用呢?啊,其实刚才咱们就说过了啊,那是不是就是调用scoop这个脚本对吧?然后呢,传入一个importt之后呢,再传入一大堆相关的参数就可以了。对吧?啊,那其实这里边啊,关键就是这个参数它应该怎么传好,那现在呢,我们通一个例子啊,去学习一下啊,那比如说我现在呢,呃,就想将啊我们JA贸库下边的user info这张表的数据啊,给它导入到HDFS的一个路径上啊,那我们来看一下咱这些参数到底应该怎么传啊好,那现在我们一起来写一下啊来,我打开一个sli啊首先呢,在这我们需要先调用scoop b目录下面的scoop这个脚本,对吧?然后呢,传入一个inport的命令对不对,然后后边呢,是不是再传入相应的参数啊对吧?那我们传入参数的格式应该是什么样的呢?是这样的啊,我们需要哎传入一个杠杠K,然后空格啊后边呢再写上哎对应的value,好,那接下来我们再来看一下这儿具体要传哪些参数啊,其实我们可以先想一想啊,咱们现在要做的工作是啥呀?
02:36
是不是就是数据的导入啊,那我们所传参数的内容无非就是数据从哪儿来,然后呢,数据它又到哪儿去,对吧?啊,那咱们来分析一下咱的数据从哪儿来啊,咱的数据是不是来自于买circleql数据库的一张表,没错吧,那的数据到哪去,是不是到HDFS一个路径啊,那所以说我们要传的主要的参数啊,就是诶买三个当中的哪个库啊,里边的哪个表对不对,以及HDF上的哪个路径。
03:03
啊,那当然啊,我们要想从MY词Q数据库里边读取数据,那我们必须得指明数据库的uri以及用户名还有密码啊,这是我们大家要注意的啊OK,那我们要传的参数呢?其实主要就是这些啊好,那现在我们就来传一下啊,来我们宣传与my circleql相关的参数啊,那实际上与my circleql相关的参数呢?诶,主要就是数据库的uri以及用户名啊,以及密码对吧?还有我们要同步的数据库的库名以及表的表名,没错吧?啊OK,那我们之前在测试词库环境的时候,是不是就已经传入过uri以及用户名和密码了呀,对吧?那所以在这儿呢,我们直接去拿一下就可以啊好,我们现在打开文档,然后找到之前的那条命令,是不是有这个对吧?那这些就是我们刚刚提到的U2I用户名和密码,来咱们给它拿过来啊,现在CTRLV给它替换一下。OK,我们再来看一下啊,这里边呢,首先有一个杠杠connect,后边呢,是不是就是咱们JDBC的UI啊对吧?那后边呢,就是用户名,然后呢,后边呢是密码啊,这块呢,大家也要根据自己的实际情况进行相应的修改啊,这一定要注意一下啊好,那现在这个数据库就可以连上了,对吧?啊,那我们如何去指明库名和表名呢?啊,其实很简单啊,库名在哪指定?库名就在这个uri当中指定对不对?那我们只需要在后边呢再填上一个J,这样一来是不是就能够指定我们要同步的数据库的库名了呀,对吧?那表明怎么指定呢?
04:26
诶,表明我们需要再加一个参数,后边呢需要加上一个杠杠a table,后边我们要同步的表是谁,你就把谁的表名写在这儿就行了,比如说我们现在要同步的是user info,对吧?那你就把user info写在这就行了,啊,OK啊,那这样一来呢,我们就已经指明了我们的数据是从哪来的了,对不对,它是来自于hi doop102这台节点的买circleq数据库的j Mo库下边的user info这张表。没错吧,然后大家要注意一下啊,那你说我们要这么写的话,那scoop它同步的是不是就是这张表全表的数据啊。对吧?啊,但是有些情况下呢,诶,我可能并不需要全表的数据,我可能只需要某几列啊,或者说呢,诶某几行对不对啊,那我应该怎样去指明列和行呢?这个呢,其实也很简单啊,就只需要我们加上额外的两个参数就可以了啊,比如说我现在呢,只想获取这张表的某几列啊,我们来看一下啊,咱这张表有这么多列对吧?比如我现在呢,只想获取ID和login name这两个列,那应该怎么去指明这两个列呢?来我们去写一下啊。
05:29
OK,在写之前啊,这儿有一个注意事项,我需要说明一下啊,那有同学发现啊,就是我们这一行啊,已经到头了,对吧?啊到了之后呢,他就直接按回车,然后换行继续往后边传三了啊,那我问一下大家,你说这样写行不行?啊,这样也肯定是不行的啊,因为在shell当中啊,只要我们按回车换行,那它是不是就会当做两条命令处理啊,对不对,所以这样写肯定是不行的,那我在这儿就是想换行,那应该怎么办呢?在这儿呢,诶,我们需要去使用一个换行符啊,这换行符是什么呢?其实很简单,就是一个反斜杠啊,然后大家要注意的是啊,就是这个换行符必须位于每一行的末尾啊,也就是这个换行符后边呢,是不能有任何字符的,这个一定要注意啊,然后在咱们这儿呢,这个换行符还有一个要求什么要求啊,就是这个换行服前面呢,它必须得有一个空格。
06:19
啊,为什么必须都有空格啊,这个我需要给大家解释一下啊,因为在我们后续去执行这个命令的时候啊,这个换行符会被自动的去掉,然后呢,这个前后两行的数据呢,会被直接连接在一起啊,那你想一想,如果这个换行符前面没有空格,那这个user in跟下一行的杠杠是不是就连接在一起了呀?没错吧,那所以说这个换行符前边必须得有一个空格啊,这个呢,是大家需要去注意的一个地方啊,OK啊,那我们可以按照这种方式呢,把前面这条命令呢,也给它格式化一下,这样看着更整齐一点,对吧?OK,那应该怎么办呀?啊,比如说我在这儿呢,一行一个参数对吧?所以在这儿我需要先加一个换行符,然后呢回车对吧?那同理,在这个位置是不是也是可以加一个换行符回车呀,对不对,那这儿呢,也是一样的,哎,换行符回车啊,这个呢也是。
07:07
换行符回撤啊,那这样一来的话呢,咱们这个命令呢,看着就更整齐一点了啊,一行一个参数,当然啊,这个命令最终被执行的时候呢,诶,换行符会被自动去掉啊,那所有的这些参数呢,还是会被解析到一行的啊,这个大家可以放心啊啊,那接下来我们继续穿参啊,那刚才我们说到了啊,说我们现在想要的不是这张表的全表数据,对吧?哎,我们只想要它的ID login这两个列对不对?那应该如何指明这列呢?啊,在这我们需要传上一个杠杠column斯碳水Co mns columns,然后后面呢,需要传入我们所需的列名,然后大家要注意啊,就是多个列之间呢,是用逗号分隔的,也是在这儿呢,我们需要传入一个ID,然后逗号再来一个哎,Login name OK,那这样一来的话呢,我们就指明了我们所需要的列了,完之后呢,诶,我们空格,然后换行符,哎,再回车啊然后呢,我们再继续传参。
08:02
啊,然后现在假定啊,哎,我们所需的也不是这张表的全部行啊,我只想要其中的某几行对吧?那比如说呢,哎,我现在呢,只想要啊,这个ID大于等于一,并且小于等于20的,哎,那这个我应该怎么传呢?其实很简单啊,也是一个参数啊,杠杠就可以了啊然后where怎么写啊,这个where的写法呢,就跟我们serve当中的过滤条件是一样的,对吧,也是怎么写,是不是就是ID大于等于一对不对,And的ID小于等于20就可以了。没错吧,啊,完了之后大家一定要注意一下啊,由于这个参数呢,它中间啊是有多个空格的,对吧?啊,那如果说我们不加任何处理,那它是不是会被当成多个参数啊,没错吧,那所以在这儿呢,我们必须得处理啊,那怎么处理啊。其实很简单,是不是就是加引号就行,没错吧,那咱们加引号的时候,我应该加单引还是双引呢?啊,其实在这儿呢,加单眼或者双眼都可以啊,那单眼和双眼什么时候才有区别。
09:00
啊,比如说我这个参数里边呢,哎,它需要去解析外部的变量,对吧,比如说我在这儿呢,ID不是小于等于20的,而小于一个什么呢?小于一个,哎,比如说这样的变量没错吧,那这种情况下,咱们要想让这个变量得到解析,是不是就必须得加双引对不对?那反之呢,我们用单引就行啊,那当然在这儿呢,我们没有变量需要解析,所以说单眼或者是双眼都无所谓啊,在这儿呢,比如说我用单眼二,来这边呢,也加一个单眼二啊,这个呢,是大家一定一定得注意的啊。好,那现在呢,我们就已经把my circle相关的参数都传完了啊,那就现在数据从哪来我们就已经明确了,对吧?那接下来呢,接下来是不是就是数据到哪儿去啊,对吧?啊,那咱们的数据到哪去啊,是不是到HDFS的一个路径没错吧?啊,那这个路径应该怎么指明呢?啊,也是一个参数啊,具体什么参数我们来看一下,那首先在这儿呢,先写一个换行符,然后回车啊,后边杠杠target DR啊,这就是我们的目标路径对吧?在后边呢,我们需要给它指明一个HDFS路径,那比如说我在这儿呢,就需要给它传到user info这个路径下,对吧?根目录下边的user info,那你就这样写就行了,好,那接下来我们继续往下进行啊,那下面呢,其实还有一个与路径相关的参数啊,叫什么呢?叫做delete target Di t,然后呢,Di。
10:18
啊,那这个参数的作用是啥呢?我给大家解释一下啊,那大家都知道啊,就是此库吧,它的底层就是map对吧?啊,那map呢,它有一个特点啊,MA6任务呢,在执行之前会先去检查一下输出路径是否存在对吧?那如果存在呢,是不是就直接报错停止运行啊对吧?这个一定要注意一下啊,那对于此库的任务来说啊,它的输出路径是不是就是target Di啊。没错吧,那也是死库,这个任务在执行之前呢,会先去检查他get DR这个路径是否存在啊,那这个参数它的作用就是啥呢啊,如果这个路径存在,它就会把这个路径先删除。啊,这样一来呢,就能够保证这个scoop任务能够顺利的执行的,那通常情况下呢,我们为了保证scoop同步数据的任务是可重复执行的,哎,我们都会加上这个参数啊,这个要注意一下啊,好,那数据到哪去也就完事了啊,那其实scoop inport的这个命令的必要参数我们就都传完了啊,也就是现在这个命令啊,我们拿去执行啊,他就已经能够把这张表的数据写到这个路径上了。
11:25
但是现在呢,我们还有另外几个非常重要的参数也得看一下啊,哪几个参数呢?来我们看一下文档啊,来打开文档来就是这几个来CTRLC我先粘过来,然后再给大家解释啊,CTRLV,好,那现在我们先看第一个啊,第一个参数呢,叫做fields terminated by,对吧?那实际上根据这个字段的名,我们就能猜出来它的作用是啥啥,是不是就指明一个分隔符啊,对吧,大家都知道啊,那MYQL当中的数据是不是都是结构化的数据对吧?那现在我们要给它导到HDFS上对不对,是不是以一个文件的形式存在啊,那所以说每个列之间是必须得有一个分隔符才行,对吧?那这个参数就是用来指定分隔符的,在这儿呢,我们指定的分隔符呢,是杠T啊好,我们继续往下看看下一个下一参数啥,下一参数是不是number maps啊对吧,那这个一看是不是就是map的个数。
12:14
哎,大家都知道啊,那scoop底层是map reduce,而且只有map没有reduce对吧?啊在这儿呢,我们指明的就是scoop这个任务的map个数,那说白了其实就是死库同步数据这个任务的并行度,对吧?OK,那这个参数的默认值呢,是四啊,也就默认情况下它有四个map啊,那当然呢,这个参数呢,得根据我们这张表的数据量去定对吧?数量大那这个参数呢,相应就要调大一点,数据量小呢,诶,我们相应的就要调小一点,这个呢,大家要注意一下啊好,那我们再来看最后一个参数啊,Li by对吧?这个Li自然指的是啥呀。像这个split呢,在这指的就是Mr map端的切片啊,大家都知道啊,MAP6任务呢,在map端会对输入文件进行切片处理,对吧?啊,然后呢,进行并行的计算没错吧?那这儿这个split呢,在这儿其实指的就是切片这个操作啊,那这个参数在这儿的含义是不是就是按照ID这个字段进行切片啊。
13:13
没错吧,诶,那它具体的切片逻辑是什么样的呢?啊,在这我给大家解释一下啊,让他是这样去切片的啊,首先啊,他会先在我们前边规定的目标数据当中找到这个ID的最大值和最小值。那咱这儿呢,就是一到20对吧啊,最大值是20,最小值是一对不对,那之后呢,他就会根据这个字段啊,把咱这个数据呢分成若干份啊,那分成几份呢?诶由这个参数决定啊,比如说咱这儿这个参数是二对吧啊,那OK,他就会把这个数据呢分为两份啊,那具体怎么做的呢?很简单啊,他会先找到最小值和最大值的一个中间值,比如咱这呢,就是十对吧啊OK,那完之后呢,他会把一到十来归为第一份,那从11~20呢,归为第二一份啊那这样一来呢,相当于就完成了这个数据的切片了。
14:02
那后边呢,再由一个map去负责一个切片啊,OK,那这就是scoop的一个切片策略啊,那当然了,这个split by参数啊,它的值也不一定非得是ID,你也可以指明为其他字段,但是通常情况下呢,这个字段我们就指定为主键啊好,那截止到现在啊,Scoop inport的这个命令就完事了啊,然后有一点大家要注意一下啊,就最后一个参数,我们就不要再加换行符了啊,这个要注意一下啊好,那现在完事之后呢,我们把这个命令给它粘出来,然后咱们现在去执行一下啊,来CTRLC注意啊,这个命令呢,我们需要放到scoop的根目录下边执行啊,来,我们粘过来直接回车。啊,这个任务呢,已经开始执行了啊,他需要的时间可能有点长,因为他需要跑一个MA6对吧,所以在这儿我们稍微等一下啊。好,那这个任务呢,已经执行完成了啊,如果没有问题的话,那HDFS的这个路径下是不是会出现我们上传的文件呀,对吧?那咱们现在去查看一下来我们打开HDFS的web页面啊,然后去找一下来到根目录,大家来看这儿是不是已经出现了一个user in for啊,对吧?那现在我们点进去,大家注意观察里边一共有几个文件,是不是一共有两个文件啊,为啥是两个文件呀?
15:15
啊,因为我们指定的map的个数是不是二,那scoop呢,它又没有reduce,那所以说最终文件的个数是不是就跟map的个数是一致的,没错吧?啊,那现在我们来查看一下这两个文件的内容啊来,我们先看第一个文件点点完之后呢,点这个hide the feel。来,大家注意观察,你看这里边儿呢,是不是就有我们从一到十的这十行数据,没错吧,这是第一个切片啊好,那我们再来看一下第二一个文件啊,第二个文件的内容是不是就是从第11到第20这十行数据啊,对吧?OK啊,那咱们的SOP任务呢,就算是执行成功了,然后我们再回过头来看一下scoop这个命令啊,实际上这个命令啊,还有另外一种写法啊,就是这三个参数实际上是可以用一条SQL语句替代的。
16:00
啊,来,我们仔细看一下这三个参数的内容啊,然后来分析一下它应该用哪条SQL语句去替代。是I。没错吧,啊,OK,那接下来呢,我们给它替换一下,替换完之后呢,我们再去执行一下,然后看一下效果是什么样的啊啊,那这个参数名应该是什么呢?诶,参数名是杠杠,Query q u ery啊然后边呢,就需要把我们刚刚所说的这个circleql语句填在这儿啊,那当然呢,这三个参数它一会儿是不是就没有用了呀,对吧,咱们一会儿再删啊好,那后边呢,写上我们这条词后语句应该是select ID login name from userin for,然后后边呢,加上一个获理条件wherer,诶咱们直接拿一下就行啊,是把它拿过来呀,对吧?来CTRLC,诶放在这个位置,那有了这条SQ语句,是不是上面这三个参数就没有用了,对吧?咱给它删除就可以吧?啊然后大家注意一下啊,这个四个语句当中是不是也有空格啊,对吧?那所以说在这儿是不是也得加引号,没错吧?啊,在这呢,呃,我们先给它加上一个单引号,好弄完之后别忘了写上这个换行符啊好了,那现在呢,我们把这个s school命令再拿回去重新执行一下,看一下它能不能执行成功,诶,CTRLC拿过来。
17:21
来,我们重新执行回车。好,然后大家要注意一下啊,你看这个位置是不是报错了对吧,他报了一个什么错,我们来看一下啊,看这一句就可以啊,来看他怎么说啊,他说query select ID log等等等,这是不是就是我们刚刚所写的那个circle语句啊,对吧?啊,他说这个circle语句where子句当中,Where子句是不是就是where过滤条件对不对,过滤条件当中呢,必须得包含一个dollars。那这个Dollar conditions到底应该如何包含在这个过滤条件当中呢?啊,这个其实很简单啊,你加的时候呢,你就把它当做一个circle当中的过滤条件啊,那普通的过滤条件怎么处理,那咱这就怎么处理就行了,来我们再回到这个库的命令啊,也是在这儿呢,我需要怎么办?是不是需要再来一个and Dollar conditions啊?
18:11
没,没错吧,这个呢,大家要注意一下,你就把它当做一个普通的过滤条件就行,然后我给大家解释一下这个Dollar conditions的作用啊,那是它就好比是一个站位服啊,那在此库执行任务的过程当中呢,它会被替换成不同的过滤条件。啊,比如说我给大家举个例子啊,那咱这儿是不是指定的这个map的个式是二啊,对吧?啊,也就是说我们一会儿同步数据的时候呢,会有两个map并行的去同步数据,没错吧,那这两个map他们是不是都会去执行这样的一条语句啊,对不对,他们都得从user表当中啊,去获取这样的两个字段啊,但是这两个map的过滤条件它不能是完全一样的,对吧?如果完全一样的是不是咱们就相当于重复的同步的两份数据?没错吧,那这个不一样,它体现在什么地方呢?诶就体现在这个Dollar conditions上面,那到时候第一个map执行的SQL语句的Dollar condition呢,诶会被转换成ID大于等于一,哎,小于等于十啊,那第二一个map呢,诶它的Dollar conditions呢,会被转换成ID大于等于11,小于等于20,那这个呢,就是Dollar condition的作用,然后还有一个注意事项啊,就这个Dollar符啊,大家都知道Dollar符呢,是shell当中的特殊字符,对吧?啊那在这儿我们不希望这个倒拉符被错误的解析,那所以说这个circle语句啊,它外边引号呢,我们最好使用单引号啊,那如果说你非要使用双引号的话呢,那这个倒拉符一定要加上一个反斜杠进行转移啊,这个是大家一定要注意的啊,好了,那这个命令我们就完事了啊,那接下来我们把它CTRLC粘出来,然后呢,再去执行一下,看一看它能不能执行成功来,我们还是放到这个102去执行一下,然后回车。
19:53
好,那这个任务呢,已经开始执行了啊,那他需要一点时间,我们稍微等一下。OK,那这个任务已经完成了啊,那然后大家注意一下啊,呃,在这儿我们是不是加上了delete target d这个参数了,对吧?那所以说它会把我们第一次执行生成的文件先删除,然后呢,再写入新的文件,对吧?那现在我们再去检查一下这个路径下有没有新的文件生成啊好,那现在我们还是打开hdfs web页面来我们刷新一下。
20:18
来,大家注意观察一下啊,那你看这儿是不是有两个新的文件生成了,没错吧,而且这两个文件的内容呢,跟刚才的应该是一样的,OK啊,那就说明我们第二种写法也是没有问题的啊好,那scoop的使用我们讲这么多就够了。
我来说两句