00:00
行,各位同学,那咱接下来呢,就来看一下咱们这个流量域的最后一张表,这张表呢,我们称之为错误事实表啊,这个错误对应的业务过程很简单,那是不是就是我们在使用应用或浏览PC端的页面的过程当中所报的一个一个的错误记录啊,对吧?只要有一条报错信息,那我是不是最终就会记录在咱们这张表啊,对吧?哎,这个给它搞清楚就行了,好了,那接下来呢,我们还是直接看看一看,就是这张表最终的这个表结构是什么样的,来,咱们把它拿出来,拿出来之后呢,给它CTRLC,诶,拿过来放在我们的笔记当中,构好看一下咱这张表最终的一个这个表结构啊呃,那现在呢,我们先从表名开始看起,表名呢叫做dwd traffic errorc是不是就是流量域错误这张实时表啊,对吧?那接着往下走,那刚才就提到了这张表呢,每行数据我对应的应该是一次报错记录对吧?一行代表一次报错记录,这个给他搞清楚就行了,那接下来呢,咱们继续往下,我们来明确一下这张。
01:00
表当中的具体字段,OK,好,那现在问一下大家,你说这张表当中的字段可能来自于哪种结构的日志?是页面日志啊,还是启动日志啊,还是说两边都有可能,其实说它都有可能的,对不对,因为我这个错误啊,我在浏览页面的时候可能会发生,我在启动应用的时候是不是也可能会发生,对不对,那所以说那咱这张板的字段,我既可能来自于页面,也可能来自于这个,诶这个启动啊,是这样的啊好,那咱接下来呢,就来简单的明确一下啊,我们就不再对着上去看了,大家现在对这个日志的字段基本上有了一个印象了,对吧,应该比较熟了,我们现在直接看一眼就行啊,来咱们看一下这个表的资本到底都来自于哪儿,我们先看上面那些,这些从这个pro ID到这个very code,肯定是来自于哪呢?肯定是来自于common的,对吧,里边都是维度信息,这个咱不说,然后往下走,从配置item开始,到这个什么呃,Source type这些肯定来自于哪儿呢?配置对不对,这个也不多说,那接下来往下走看这从NT开始,到这个什么open ad这些东西肯定都是来自于start的,是这个道理吧,OK,这个很简单,接下来。
02:10
再往下走,那这两个呢。Action还有display这些东西啊,应该来自于哪,应该是来自于页面,知道吧,对不对,这个actions它不就是那些动作吗?这个displays不就是那些曝光吗?这肯定是来自于页面日志的,对不对?好,那接着往下走,那下边呢,我们看这几个字段。这几个字段呢,对应的就是错误信息了,对不对,那这个错误是不是既可能是启动日志里边的错误,也可能是页面日志里边的错误,对吧?因为咱们这儿呢,应该是能够回忆起来的啊,就是在我们的一个完整的页面日志里边,我可能会有一个error对不对?OK,那如果我在这儿呢,是一个什么?呃,我这儿我看能不能会一下啊,OK,那如果这呢是一个启动日志,启动日当中完整的结构里是不是也会有一个I,对吧?那所以说我们这儿看到的这个I字段呢,既可能是来自于页面的,也可能是来自于诶这段启动的,OK,也就从这儿能看出来,咱们这些字段其实是来自于我们这两种结构的日志的,而且这几乎包括了这两种结构当中的所有字段。
03:11
对不对,OK,那其实大家可以想一想,我这个为什么要包包含这么多的字段呢。对吧,为什么既要包含页面信息,也要包含启动信息,还要包含动作信息,还要包含这个曝光信息,这些为什么都包含在了错误失值表当中,那他们在这张表当中都是作为一个什么存在的?其实也应该都算做一个什么呀,一个维度吧,对吧,因为我比如说举个例子,那咱们现在我保存这个所谓的错误记录,那咱们将来的目的是什么呀?我为什么要保存这个错误记录啊,是不是将来我们可以去分析一些,比如说我这个错误的原因呀,对吧?可以用来辅助我们去定位这个错误啊,对不对?诶是这样的,OK,好,那你想一想,那就你要是想找错误发生的原因,那是不是所有可能跟错误相关的信息,咱们都应该包含在这张表当中啊,对吧?那比如说举个例子,那我们以这个页面信息为例,对不对?那你要想定位错误是不是有可能,你就要先定位是用户在浏览哪个页面的时候报的错呀,对不对?OK,那所以说这个页面信息我们有必要给他留下来对不对?OK,那启动的信息咱们有没有必要留下来呢?也有也有必要给他留下来对不对?比如说我们启动的时候是不是可能会有一些比如说什么广告的信息啊等等,是不是会有这些东西啊,对吧?比如说这个广告我加载没成功,是不是也可能会导致启动失败啊等等等这样的一些东西,那就说我这个错误跟启动也可能会有关系,对吧?啊,那完了之后呢,曝光。
04:33
能跟这个动作是不是也可能会有关系,比如说我在做某个特定的操作的时候,对不对,做某个特定的动作的时候,他就会报错对不对,那这个是不是也可能有关系,曝光也是同理,那所以说这些信息其实都可能会跟咱们这个最终发生的错误有关联关系,既然有可能有关系,那我们就应当给它放在这个错误的表当中,诶所以说这样一来就会导致咱们这张表啊,这个字段就非常非常的多,哎,这一点大家理解一下就行了啊好了,那这个字段那为什么这么多,咱就搞清楚,然后这里边其实还有一个小问题,大家需要注意一下,就是哪呢?就是这俩字段,各位同学你看咱这俩字段咱就是怎么的,咱是不是就直接从我们那个ods层的日志表当中,是不是原封不动的搬过来了呀,对吧,在日志表当中,也就是ods那个原始表,OK,原始表当中action我是不是就用这个结构体数组保存的,对不对,那Dis类也是用结构体数组保存的,对吧?那相当于我们直接从原始表原封不动的把它俩拿过来了,没有对它进行一个什么炸裂的操作,对不对?好。
05:33
那现在问一下大家,咱这儿为什么没对它进行拉练?为什么呀,为什么没对他进行打量,这个炸开之后啊,其实就会导致什么,导致咱们这张表的力度发生变化,对不对,为啥?因为大家都知道啊,就是咱这张表是一个什么表,我们是一个error表,是一个错误表,对吧?我必须得保证我这一行指代的是一个错误记录,对不对?OK,好,那你想一想,就是在原表当中,我们去随便找一个找一个这个找一套,找一套数据啊,这是我们ods那个原表的数据,对吧?你会发现我这里边的,这里边有没有error,这个error都是空的,哎,OK,你看这,诶这有error对吧?你看我这一个error是不本身前面就会对应一个display数组,一个动作数组啊对吧?在原本当中,它本身就是这样的一个对应关系,那如果我把原本的数据,比如说它给炸开,或者把它给炸开,那就会导致什么,我们得到的数据一行还能保证是一个唯一的错误吗?不能了,对不对,那所以说力度就会发生变化,这个呢我们不能接受,所以最终呢,我们这儿呢,并没有把这个数组和动作给它炸,数组还有曝光给它炸开。
06:37
啊,动动作和曝光给它炸开没有炸开啊,这际样咱就原封不动的给它保存在这儿了啊,这样主要是为了保证我们这个表的力度,它一行得是一个I2才行啊,这一点要保持住啊,当然呢,呃,这个当然了,我们这样去设计一张表呢,呃,会给我们将来使用它带来一些稍微稍微稍微会带来一些麻烦,为什么呢?就是想大家想一想,就是虽然我保存的时候我没给它炸开,但是将来我用这个数据的时候,我还能这么用吗?我能直接拿一个这个什么结构体数组去分析吗?这样能行吗?这个肯定是不行的啊,OK,为什么给大家举一个具体的例子啊,比如说将来呢,我们会用这张表去做一个这样的分析,做一个什么分析呢?比如举例子啊,呃,假如说我现在有一个这样的场景,那我们这儿呢,有一个错误,哎出现了对不对,而且这个错误出现的次数也比较多,我现在想干啥呢?我想定位一下这个错误的原因。
07:28
我想看一看啊,就是说OK,那哪个动作跟咱们的这个都跟跟咱们这个错误的关系是比较密切的,我想定位一下是不是说,诶我看一看是不是在做某个特定的动作的时候,OK,我这个错误它就会发生,哎我想分析分析,哎看一看这个有没有这个情况,OK,那大家想一想,你说我们将来要分析得怎么分析。那怎么分析啊,其实很简单啊,OK,你要想去分析一下这个错误与特定的某个动作的一个关系,这个得怎么做呢?啊,首先你是不是得从先从这张表里把数据咱们得查一下对吧?OK,你得先查出来什么,得查出来咱们要分析的那个特定的错误记录吧,对不对?OK,所以首先你得先干净什么,比如说根据这个I扣的对吧?找到我们要分析的那个所有的错误记录对不对,OK,找到了,找到之后,那咱们这个数据应该长什么样的,应该是这样的啊,你刚查出来应该是多个动作对应一个错误表达那个错误叫错误A啊,是多个动作是不是对应一个错误,对吧?在原本当中是不是应该是这样的一个结构啊,对吧?但是你这样有法分析吗?没法分析,咱要想分析我必须得先干啥呢?啊对,必须得先把这个动作给它炸开,炸开之后我们应该变成一个什么样的结构了呢?是不是变成了一个这样的结构,就是诶,一个动作对应一个错误,一个动作对应一个错误,一个动作是不是对应一个错误啊对吧?哎,咱们得先炸成这种结构,炸成这种结构之后怎样去分析这个相关性。
08:48
性的很简单,你只需要达到这个数据,然后对谁进行一个分组抗就行了。对动作进行一个分组抗是不是就完事了,对不对,葛入外这一个动作,然后呢,再抗的星对不对,抗的星的结果越多,那就表明什么,表明是不是在出现这个错误的时候,那个动作发生的这个次数越多呀,对吧?那是不是从侧面就能看出来,OK,是不是这个动作可能跟这个错误A它的关联性是比较强的呀,对吧?诶是这样的,也就是说你要想去做做这个分析,你想去用这个数据,那咱们也得先把这两个数组给它炸开才能用,是这样的啊,OK,好,那所以说这块呢,大家稍微的注意一下就行了,就是我们这张表当中存,诶我没有给它炸开,但是将来用咱们还是得给它炸开的,这一点要搞清楚啊,OK,行了,那这个完成之后,我们继续往下走,那截止到现在这张表的行和列咱们就介绍完了,介绍完之后我们最终明确一下它的这个分区规划啊,这个分区规划相对比较简单,就是一个什么INC增量分区对吧?这个咱就不多说了,来视频我给他停一下。
09:48
呃,来吧,各位同学,那咱接下来呢,继续往下走,下面咱要做的呢,其实就是这张表的数据状载了对不对?那当然它的数据状载我们由于没历史数据,也是只需要做一次就完事了,对吧?我们直接看一看这个select的余怎么写,首先我们应该select from OS log INC对不对?那接接下来呢,是不是得过滤一下14号的分区啊,零六杠幺四,这个没啥可说的,那然后呢,咱得过滤什么样的数据?
10:12
这回得根据谁去过滤啊,得根据艾瑞那个字段过滤吧,对不对,我们得找到艾瑞不为空的数据吧,是这个道理吧?OK,那咱们需要用它去过滤,那这样一来呢,我们就能找到所有的这个报错的这个记录,OK,那找到之后呢,那这里边我们就能够,诶是不是从这里边去选我们所需要的每个字段了呀,对吧?那这里边我们有没有哪些字段需要特别处理一下了,其实要有的话,其实就这一个吧,就如pro ID去跟那个维度表去照,跟那个ods pro那张表去照一下就完事了,对吧?别的字段是不是基本上都是直接拿呀,对不对,这个呢,咱们就不再去1.2去说了啊,所以这个circle其实最终写起来应该不会再拿,那现在呢,我们就把文档当中的这个状态也就拿出来,咱们过一下就行啊,来拿过来。来我们看一下最终的结果,CTRLC来放在这个位置好了,那现在我们看一下最终的这个词和语句啊,先看子查询,首先是select,然后呢,是不是后边有一个log OC对吧?然后我们找到它十字二分区,然后I不为空,这其实就是这个核心的逻辑,好找到之后呢,我们就按照要求从这里边是不是逐个字段去选择就完事了,对吧?你需要哪个你就从里边去拿就行了,然后需要注意的还是这个start,是不是需要加这个反引号,进行一个呃,相当一个转移的操作呀,对吧?这个要注意,好,那接下来我们继续往下走,由于这个艾瑞code,我们需要跟呃这个表去做一个关联,拿这个pro ID对吧?所以这儿还得再写一个杂询,那他俩照完之后我们往上看,往上看,那这边是不是就能拿到我们所需的每个字段了,对吧,最终再把数据写到13号分区,把这个三就是这么写,这个搜看起来虽然很简单啊,但是呢,呃,大家在执行的过程当中可能会遇到一个问题,所以接下来呢,我需要给大家现场的执行一下这个骚扰,别的没问题,这个确实有点特殊,那我们来看一看他有什么问题。
11:56
啊呃,那在这这样啊,我先把咱这张表这个建表语句我先给它,呃建出给他执行一下,先把表建出来,然后呢,我们执行一下这个insert装载语句啊来走。
12:08
这个三号其实说实话很简单啊,但是他在执行的过程中,你会看现他会报错对不对,OK,他报的是一个什么错误呢?来看一眼,呃,其实说实话,这儿报出来的错误往往也不是一个详细的一个信息,对吧,他只是告诉我们一个结果,只是告诉我们OK,你这个任务他失败了,但是具体为什么失败,咱是不是还是得去看日志啊,对吧?那这个看日志咱们一般去哪看啊,前面就提到过,我们应该可以从两个地方去看,一个是亥务本地的日志,一个是雅安上边是不是那个日志啊,对吧,两边都可以看,那这个我们通常情况下怎样能判断出来这个问题到底出在哪了呢?如果你报,你这报的错误是什么呢?说什么fail的啊,什么to,哎,Create,什么那个Spark session,对吧,是不是就是创建Spark绘画失败啊,对吧,那出现这个问题,那有可能是本地出错了,有可能是远程出错了,对不对,因为你这个绘画没创建出来,两边是不是都有可能啊,对吧?那如果出现它这样的一个错误信息,Spark job fail doing runtime什么意思,是不是就是SPA的作业。
13:09
D在执行的过程当中失败了,对吧?既然都执行到这个Spark作业这一步了,那肯定是哪出错了。肯定是雅安上面报错了,对不对,是这样的,OK啊好,那所以说那现在我们就可以去哪看错误日志呢,去雅安上面看错误日志,好,那接下来呢,我就给带着大家呢,去看一看这个雅上面日志,有些同学呢,他找不着日志,找半天也不知道看哪对吧,那现在呢,我们就一起去看一下,来我们找到嗨豆1038088没问题吧,OK,这个刷新一下啊呃,这个可能是,呃,我把这个退一下啊,来重新刷新。哎,还是不行啊,这个我清一下缓存吧。呃,来我们再重新的去访问一下这个hi doop103,诶,什么情况?来我换个浏览器啊,咋回事?这是来我们访问一下杜103,呃,然后呢,后边是这个8088对吧?诶,走好,这边就能访问了,因为浏览器有有有有问题啊行,那咱们先不管它,那现在我们就来到了这个雅的8088界面了,对吧?那这时候我们首先需要先找到我们当前所启用的这个SPA的应用,对不对,这是不是就是第一个呀,对吧?它是正在运行的一个状态,那现在咱们点击application master,那这时候呢,我们实际上就能够跳到Spark的这个web UI界面,对吧?那进来之后我们首先看的是哪?这应该是job,对吧?这个页面大家之前在学SPA的时候应该看过吧?
14:29
看过对吧?这是job对不对?那OK,那你注意观察,那个job里边呢,咱们有两种类型,一种是completed jobs,一个是field jobs,那咱显然得看field失败的job对吧?啊,那完之后这个下边就是我们失败的一个任务,那这时候我们点这儿,这儿是不是有一个这个超链接啊对吧?那你点它点完之后我们就能够跳到这个stage界面,OK,那stage这边呢,我们也是分为哎不同的情况的,那这里边呢,有成功的stage,有fail的stage,是失败的任务,对吧?那败的这个阶段对不对?OK,那现在呢,我们点击field stage,然后呢,我们当你点随便点一个就行,点进来之后呢,你会发现,OK,大家注意观察,那这儿是不是有这样的四个task呀,对吧?啊,OK,那这四个task呢,其实他们都是什么的状态,失败的状态对不对,那这时候呢,我们就需要去看一看,那这个到底是为什么失败了,OK,那我们随便点就行,那这儿是不是有这个log,你点谁点stand error是不是就行,对吧?点点完之后呢,我们就会跳转到这个错误的日志的界面,好,那现在终于找到日志了,找到日志之后,那咱现在是不是就可以去。
15:29
看一看这个问题到底是如何出现的了呀,对吧?OK,那接下来呢,我们就简单的把它点开看一看,注意观察,你这么看也是不全的啊,这块不知道大家有没有注意过,这儿有一个click here forlo,对吧?你点一下就能够看到全部的日志啊,对吧?你一定要点一下,点完之后你就从上往下一直走走,找到它刚开始报错的那个位置,再往下看,你看是不是就是从这儿开始报错的呀,对吧?OK,那这里边他为什么会报错呢?那其实在这儿呢,我们可以简单的去看一看,大家来看啊,他报的这个错误原因是什么?说什么map operator以initialization field,对吧,什么意思?什么map端的一个操作初始化失败了,对不对?为什么失败了呢?因为有一个什么unexpected column vector type list对不对,是不是看到了一个就是就是不期望得到的一个裂的类型,List子的类型啊,对吧?哎,这个list子大家可能看到之后并不敏感啊,在这儿我给大家说一下,其实正常就是这个,你看到list你应该能。
16:29
讲到什么呢?那这个所谓的列的类型,List类型指的是什么类型呢?指的是A类型啊是这样的,就是在have原本当中,那我们呃,Have的这个AR瑞类型对应到Java当中的类型,其实就是一个什么类型的,就是一个例子的类型啊这是这样的,OK,这一点大家稍微注意一下,这也是这样的,是不是就是由于一个什么AR瑞类型的字段导致我们现在这个问题啊,这个出出出现了呀,对吧?OK,那咱们这有没有这个额,这个俄瑞类型的字段呢?有没有,其实有,你看啊,咱们在写这个三的时候,是不是我们就选了两个这样的字段啊,对吧?Action display,它是不是就是一个数组类型,那是不是由它导致的这个问题呢?那接下来我们可以测试一下,比如说我把这俩字段给它注掉,你这样要是注掉的话,那这个位置是不是咱也得注掉啊,对吧?呃,OK,那当然这个注掉之后我们就不能再in色了,因为我们in色的话,是不是一个字段类型是呃,这个个数对不上的呀,对吧?所以我们把这个音色的先给它注掉,那现在我们只跑一下这个select啊,OK,那现在我们再来看一看它还报不报错,稍微等一下诶,你会发现这个。
17:29
数据是不是直接就出来了,他就不发错了,那所以说这个问题显然是由于这两个字段导致的,那我们这俩字段咱们写的有毛病吗。说实话,咱这俩字段写的没毛病,我们什么什么都没干对吧,是不是就是单纯的查了一下,然后上面又查了一下就完事了,对吧?那所以这个显然不是咱们circle有问题,这是have它本身的问题,这是have的什么问题呢?这实际上是have on Spark的问题啊,OK,那什么意思呢?比如举个例子,我现在呢,把咱们的引擎我给它切一下,我切成什么呢?比如说我切一下这个site一下啊have.ein这个参数大家应该还记得吧,EI是不是设置那个计算引擎的家,对吧?你比如说我给它设置成mmr引擎直接回车好回车完之后是不是当前会话,咱们就是MR引擎啊,对吧,我再执行一下这个select宇宙来,咱们稍微等一下啊。
18:16
稍等一下。你看他能不能执行成功,你看他还会不要错啊呃,我们其实可以去监控一下那个盐的界面,我在这再打开一下,看看能不能打开了啊开度把诶。呃,嗨豆103,然后呢,我来一个8088,哎,OK,那咱现在就已经出来了,我知道刚才为啥了,刚才跟我这个浏览器的那个搜索引擎有关系,我昨天给他设计成那个大大克go了,另外一个引擎啊,现现现在应该没问题了,好各位同学,那现在注意观察,我再刷新一下啊,那我这儿呢,是不是已经把那个mmr的一个任务执行完了呀,对吧,这是MAP6的类型的,对吧?然后他有没有报错呢?你会发现根本就没报错,这个数据是不是正确的查出来了,然后往后看这是不是有actions,这有第这是不是能够正确的显示到,那就说明实际上我们这个circle没问题,出现问题的是谁呢?是have on Mr,呃呃,不不是,不是one Spark,是one Spark,说了半天,这个结论是错的是吧?是one Spark,呃,然后需要给大家说明一下这个问题,就是one Spark呢,他确实在某些情况下是会存在bug的啊,然后这些问题呢,目前也是没有解决的,呃,然后呢,我们之前的解决方案是什么呢?反正我们之前就是比如说某一个特定的。
19:30
三口对吧,你用SPA去跑它出问题了,那我就怎么做呢?呃,对,我就给它切到mmr啊是这样的,我们之间是这么去搞的,当然这个,呃,如果你这样给它切成MR之后,那是不是在当前绘画下边去执行其他所有S的时候,它都是MR引擎了,对,但其实这个SPA引擎呢,在绝大多数的情况下是没问题的吧,只是在某些特定的这个场景下可能会出问题,对不对,那这种情况下咱们怎么办呢?我在它开头,我给它设置成mmr,然后呢,我在它。结尾对不对,我再给它放上一个set,就是我再给它怎么样呢?再切回spale,那将来我们把这个circle,呃,比如说放到咱们最终那个SH脚本里边去执行的时候,是不是就是执行到它的时候就是mmr引擎了,然后他执行完之后又回SPA引擎了,对吧?啊就是这样一个逻辑,这一点大家稍微的理解一下就行了,好了啊,OK,那这个问题就是,呃,是海王SPA的问题,让大家意识到就行了,然后这边给大家简单说一下啊。
20:23
就是呃,通过这个问题呢,就是大家呢,得知道我们到底怎样一步一步的去这个雅安上边看咱们这个任务的日志,咱们得知道怎么看才行,对不对啊,首先你来到这个位置,当然现在已经变成history sir了啊黑你再点是不是就到历史服务器了呀,对吧?啊,是这样的啊,我这没起历史服务器,这个应该是看不了的啊,如果呃这个正在运行,就是APP master,然后一步一步的往里找,找到那个错误咱们得会找才行啊,行了,那就说这么多,来,我把视频停一下。
我来说两句