00:00
好,那么我们的基本概念介绍完了,我们先谈一下当时我们要演示的这一套,当时是遇到了一个什么问题。啊,我们刚才说卡夫卡进这个地方呢,有bug,卡夫卡出这地方有bug,实际上呢,啊,卡夫卡进这个地方,呃,这个bug是早先被这个KHUB上另外一个社区的贡献者解决掉了啊那么卡斯卡出这个bug呢,是我在备课的过程中呢,呃,发现这个bug,然后我给他解决掉了,然后并且呢,提交到了get HUB上。啊,那么现在呢,这个Doris出的这个bug呢,其实我也是解决掉了,但是呢,这个我还没有提到这个get HUB上。也就是说,如果我们去这个仓库里面拉取这个代码。实际上Doris出的这个bug还是存在的,因为你想这个我写的代码,它还没有进这个Doris进Doris进于插座的仓库嘛,是吧?啊,所以说这个Doris插件,它实际上现在你从这个远程的分支上拉,它还是有bug。
01:06
啊,那么我们呢,这个地方实际上是用get克隆出来了一份项目。你可以看到我们get的这个。啊,有一个。远程你看就是他这个官方的一个GI的地址。啊,那么我们现在呢,实际上是在它的这个队伍分支上,然后在这个队伍分支上之后呢,啊,对这个项目又做了一次编译,然后把它上传到我们的服务器上,啊,然后我们把它这个项目放到了这个TEST2。这个啊,目录下。然后呢,在TEST2里面,我们可以看一下它里面的情况。啊是吧,然后再进的这个目录,我们可以看到是这样一个结构啊,然后呢,我们在这个里面。我们可以看到还是有一个EX04的这个脚本,嗯,你可以看到的话,是他跟我们之前演示的从卡卡消费数据完了,把这个数据再写到Doris进行一个指标统计的需求,是一模一样的一个配置。
02:09
这个地方会出一个什么样的bug呢?我们去跑一下就知道了。啊,实际上呢,这个版本呢,就是这个bug,其实从这个2.1.0到目前哈,就到啊4月8号的时候,其实这个bug还一直没有解决,所以说呢,其实我从这个啊,虽然说我们备课的时候是用2.1.0发现了这个bug,但是实际上到这个目前的这个地方呢,啊,我们已经比对过一次代码没有发现。啊,它有一个修改的痕迹啊,那么实际上呢,这个地方它应该还是会导致同样的错误,我们再去跑一下这个脚本。你可以看这个卡,还是给他指定一个路径。
03:00
啊,等待他的提交啊,我们可以看到这个任务呢,他已经提交上去了,但是呢,因为我们卡夫卡里面呢,有遗留的数据。啊,等他消费的时候呢,你看他就开始包异常了,就整个这个异常很大很大很大很长很长。啊,那么我们怎么样去定位这个bug呢?实际上我们可以去看它这个站追踪的这个痕迹。呃,首先呢,我们知道can诺它是对它的做了一层包装,所以说呢,我们重点要关注什么呢。啊,重点要关注这个包里面带塔诺的,带塔诺的,然后我们呢,还要再看,就是说按照这个站追踪的踪迹呢,我们往下看,一层层看。啊,看谁是在下下面的这个。然后最后呢,我们可以看到这里面有一个。啊,抛出的这个异常叫Java class cast exception,说是这个类的这个造型的错误。那么Java的这个U的这个里面的our list这个集合呢,它不能造型成这个char,也就不能转换成字符的一个。
04:00
啊序列,然后出问题的方式,出问题的地点呢,你可以看到这个位置。呃,也就是说我们在这个。在这个。代码里面呢,可以看到啊,是Doris output format啊这个flash。这个东西啊,它在这个。这个Java文件里面的。第210行,也就这个问题,这个地方开始就出问题。那么我们呢,这个时候其实可以去,呃,原代码里面去看一下,它这个报错的这个代码是怎么怎么写的。啊,于是这样呢,我们就去点开idea。啊,在idea呢,我们就去找他,我先看一下他这个报错的位置。是这个an fli Doris s,然后这个S下面还有个Doris outp,我们去找他这个代码。
05:01
我们先去看一下这个。Link。那这啊,这这个connects里面有一个这个。呃,对,Doris的。然后在src底下我们可以看到,哎,就这个库啊,有一个他说是阿的210行。也就是这里它会报一个E,呃,这个报一个这个造型错误,也就是这个Bach呢,它没有办法去转换成一个trans,那么这个地方呢,你要读原码的话,就需要去呃领悟它的一个意图。那么怎么样去领悟一个代码的意图呢?这个实际上要对这个基本上来说呢,实际上嗯,你要解决这行bug的话,你可能要往下读一下,再往上读一下,那么看往上读怎么读,首先呢,我们要看一下这个Bach,就是它Bach是什么东西呢?它为什么要进行一个啊强转呢,啊这样的话我们往上看。
06:05
往上看。然后这个拜师实际上呢。它是什么?它是一个类,它是一个类似的集合,嗯。那么我们上一讲的话,实际上已经讲过了,就是他跟这个Doris的一个,呃,提交数据的方式,实际上是通过这个stemlo的啊,那么这种方式呢,实际上它要求你对数据进行一个展批的操作,而且这个Doris它本身啊,就提倡就是让你展批。啊,那么我们可以看到这里面的这个泛型呢,实际上是一个object,也就是他是一个什么都可以往里面放的这个be。啊,那么我们再往下看。我看刚才那个方法。就是我们这个这个flash里面,就在flash里面呢,呃,它有一个result,你可以看到这个result,它干什么呢?他一直在抢,在试图,他试图把这个什么,他试图把这个be转成一个字串。
07:08
啊,把这个Bach转成个字符串,也就是说啊,这个batch呢,它必须得是一个字符串,我们之前说到了就是啊,因为你要是用STEM load的话,它实际上是要用一个HTTP请求的方式向这个啊Doris里面发数据,那么他把这个BA呢,作为字符串的意思呢,它实际上是想作为一个请求体发送。啊,那么这里面的话,实际上你可以看到它这里在调用这个to string方法啊,Result to string的方法,然后这里呢,又有一个啊,你看write values as the string啊,也就是把这个值当做string来写啊,完了之后另外一个呢,就是它这里面通过string join,然后this.line也就是一个行的分隔符啊,再把这些字符串,也就又又是把这个batch转成一个啊字符串的方式,然后给它这个照起来。
08:01
那么我们显然是跑到了这一行,那么这个地方呢,它为什么会报一个错呢?显然啊,这个BY它是一个这个。呃,List集合的话,它是没有办法直接调整成这个类型的,不过我那个编译为什么没有报错呢?实际上我们可以看到这个状。那么string中文的这个源码呢,实际上它要求的这个charscript呢,实际上在这里是一个可变长的参数,那么可变长的参数呢,实际上啊,这个地方希望我们向你传递的可能就是啊,至少你像我们是一个集合。我们是一个集合,那么我们是一个集合的话,应该是什么呢?应该是变成一个,呃,字符串的一个数组,它可能更合适是不是啊,这个往这个里面传参,那么我们现在就要考虑去转变我们外面的一个。一个这个。代码让它既符合这个string join,就是把这个字符串进行一个拼接的意图啊,又能对这个呃。
09:02
又能很好的把这个拜确实转成我们的一个字符的,这个字符串我们可以调什么呢?你像我们是拜师是集合的话,其实它有一个图而瑞的方法。啊,它有个图尔瑞方法啊,图尔瑞方法里面呢,它其实要求我们传进去一个呃数组。那么我们想这个地方呢,就可以传,就可以干什么呢?就可以传一个字符数组了,呃,我们这时候就拗又一个什么呢?又一个传二,然后这个地方要求我们传一个大小。啊,大小是多少呢?就是百的。盖的盖啊,如此一来的话呢,这个bug应该就可以解决了,我们现在呢,可以去把它啊编译一下。呃,放到我们的这个服务器上来看一下这个问题有没有解决啊,这个地方我们编译的时候呢,啊,其实它这里面有一个test和一个这个代码格式的检查会比较耗时间,而且这个test呢,我们刚才发现就是呃,它。之前做的几个版本的这个test呢,有一些这个东西,它不能很好的支持在Windows和Linux Linux上的这个开发的一个跨平台性啊,所以说呢,我们在这里进行一个编译,对它进行一个。
10:14
那么这个过程呢,是比较漫长的啊,在这个地方呢,我们去指定几个参数,一个就是呃,清除,清除我们之前编译的内容完了之后打包啊,最后呢,通过这个两个参数呢,去设定,也是我们要跳过检查。我们要跳过检查啊,同时呢,我们还要跳过这个代码的格式审查啊,经过这两三个设定,这好我们编译也是快一些,我们现在呢,去把这个跑一下。可以看到这边已经在开始变异了。好的,我们可以看到呢,这个地方是build success,也就是我们的编译呢,已经成功了。啊,那么这个过程结束之后呢,我们去把这个包,呃,其实在这个根据这个开发文档呢,我们知道编译的包呢,它其实会在这个Dis这个项目底下,然后有一个B,我们可以看到这个文件,其实我们要把它上传到我们的服务器上,然后再把它解压出来,啊按照之前的这个步骤再跑一遍,刚才那个一经3804,看这个问题能不能解决掉。
11:15
我们这个地方呢,就是直接。We in flo。然后把他直接拉到我们的这个服务器上来。我们在这个地方呢,在创建一个目录,叫这个什么吧,TEST3。那我们这边跟过来。把我们的这个。呃,编编译好的这个新的这个包给他这个上传上来。
12:00
然后这个上传的过程呢,比较慢啊,因为这个包也是比较大的,然后这个啊,我们会先剪掉,然后大家直接看后面的部分。啊,刚好在这个过程中呢,呃,我们去。做另外一项准备。就是我们把这个错误的信息,把这个错误的信息啊,到这儿就差不多了,感觉。啊,差不多了啊,把它复制一份,把它复制一份保存到我们的一个word里面,做一个临时的存放。啊,因为待会儿我们还会操作这个控制台,然后您把这个东西弄下来有什么好处呢,就是。啊,可以让我们待会儿去提交这个PR的时候,更好的描述这个问题啊,因为待会后面去演示具体如何提交PR时候,就是会方便我们的一些操作。好,我们这个文件呢,已经上传完成了,我们去一下test里面看看。啊,把它解压一下。
13:07
然后呢,我们CD进来看一眼。这个地方呢,我们要注意一个问题,就是因为我们刚才编译的时候呢,是在Windows上进行的,然后因为一些换行符的问题呢,实际上这里面可能。呃。这个问题也是我会发现的,实际上它会导致,嗯,先给大家演示一下吧,比如说我现在复制一份文件。比如说这个。我们还是之前那个三四。啊,到当前的这个路径下。刚才的这个一下。然后我们现在还是跑这个交。
14:13
你可以看到这里面他报了一个错叫什么,呃,No such file or directory,没有这个文件或路径,但是呢,啊,这个地方,这个拜跑的时候呢,你会发现它有一个很奇妙的一个。啊,JM,这个是因为这个Windows里面的一些字符,还有这个。呃,Unix Linux里面的这个字符呢,它不通用的一个问题,这个地方我们需要去注意。啊,那么解决它的一个方式呢,其实也很简单,就是我们去编辑一下我们这个请脚本。然后呢,我们在这个命令模式里面看一下这个F,你会发现这个file的一个文件格式,它实际上是DOS,这个实际上是微软的一个专用的改是命模式F等X。
15:15
回保存一下,然后呢,同样底下,因为这个里面还涉及到另外一个角度,就是底下有一个底下它有一个这个疑问。样式把它改一下。然后我们现在启动他这个任务。发现他这个问题就没有了,也就是这个no such file or directory这个问题就解决掉了。啊,那么这个就是开发环境的一个问题,我们看到这个任务呢,现在已经成功的提交,然后呢,我们这边还是把这个伪数据生成的这个我们跑一下。嗯,那么接下来我们看这个任务它没有发生崩溃,那么具体他有没有起到作用呢?我们去这个MYSQL里面啊,去Doris里面看一下我们的这个数据有没有去发生一个改变,然后这边呢,起一个这个买的客户端,然后host的话是口102,然后端口的话呢,是9050吧。
16:22
用户是P3亿。啊,少打了一个。是一个A。少打一个D。嗯,好吧,这是9030。啊,完了之后呢,我们直接就到这个DB里面。我看一下这个。把它这个查询一下。
17:06
啊,可以看到这个数据,它已经在发生改变了,最后一行是吧,啊,992995啊,它已经在发生一个改变了,啊,这就是我们这个。呃,一个。源来解决问题的一个方式。
我来说两句