00:01
好,接下来我们看一下这个大表,交易大表。啊,两个都是大表,但你的位置就无所谓了吧,也没有什么小表,没有什么大表好,大表就是大表的时候你要考虑的问题,其实就是这个空气。空的。就是你交易字段里边啊,它有时候会有的表里边是空的吧,而且空的时候特别多的时候啊,他会发给一个reduce去处理啊等等这种问题。那对于这种空气啊,有两种处理方式,首先。是我们将这个空K啊直接过滤掉,第二种就加空K转换。转换成一个其他的内容发送到不同的去处理,这两种执行的方式,那我们一个个来看一下。它是这样的,它是由于空气过多,它相同的可以发送到同一个reducer,然后导致数据倾斜了,然后我们这里边呢,同样的还有这个。
01:10
还有那ID的一个数据也有100万条,就是空气特别多的这种数据,那我们把这个数据也放在什么。导到我们集群里面来。那ID的1万条,然后我们跟我们之前那个大表跟教育码交啊历史服务器你要看一下是吧,因为这个地方你需要去看一些日志了,到时候看一些日志了,那我们先创建一下这个。他说要一个原始表是吧,其实原始表就是类似于咱们那个大表,他把最终呢,还是把大表的数据给他放进来了,你看他这个字段还是ID的,直接说吧,他这个字段跟那个大表还是一样的。
02:03
然后我们再建一个浪ID的推广,这个里面放的就是刚才我们导过来的这些数据吧,OK。走一下,然后把数据导进来。我们其实是不用倒那个OC了,这个是教我们已经创建过了,对吧。是不是啊,交应table就是交应之后把数据存到哪啊,因为我们不能直接打印到控制台嘛,你要用一个表来接收数据啊,用一个表来接收数据,教你table,我们已经有了这个表,不用创建了。接下来我们其实就是分别加载原始数据和空ID的一个数据。我们可以尝试一下,我们就用那个B推那张表可以吧,啊,因为这样的啊,其实这样的这个做这个测试呢,其实还有一个原始数据。你看一下原数据是什么,你会发现跟那个数据是一样的,跟那个big table里面一样的,不过他是100万条,应该是100万条的,就是那个大表里的数据啊。
03:04
对吧,刚才还记得,还有印象吗。然后。这这是1万下吧,9万了是吧,他下面还有一点看一下100多是吧,就最后反正就是其实人家搜索的一些东西啊,呃,就是这张表其实跟我们那个大表啊,是数据是一样的,我们直接可以用大表是吧。用大表,然后就是我们把这个空子段的表来,我们把它拿过来吧,子弹的把它搞进来。那ID的这个数据好,接下来就执行之间的一个交易码测试,第一种方式我们是过滤空ID,那我们过滤空ID之前呢,先不过滤。来把这个拿回来,CTRLC这个执行了是吧,我们我得干掉,因为我们要把这个改一下,我们没有表里没有数据是吧,我们要把它改成什么是吧。
04:10
杠就省得导那么多数据了,集群本身就挺累的啊,重复数据导那么多干什么呢?Connect,然后是JDBC,然后括号,然后是二二。哈,是吧。好,然后我们把这个刚才的这个这样粘到这来,然后把这个改成。Big table啊讲这个来看一下它最终执行的一个时间。中。这个执行完了,你看我们之后要做的一些事情就过滤掉。
05:01
空ID就是先啊做一个子查询。将这个ID不为空的拿出来吧,哎,不为空的拿出来提前过滤,哎,看它那个直行效率会什么样的。这边还没有执行完是吧。我们可以把这个语句也拿过来改一改吧。Over校验这个改成big table吧,是吧,因为我们or表虽然我们建立,但是我们并没有往ORI表里边找任何数据的,我们是用那个big table,刚才给大家看了这个big table,其实跟那个or表里面数据是一模一样的,一模一样的就是原始数据啊。好,他是。41秒是吧,41秒是这个语句执行的一个效率,然后接下来我们看一下,提前把这个空给过滤掉。
06:01
啊,他这个执行效率是什么样子的走。这是常用的啊,针对于空气的一种处理手段,处理手段。还有我们需要看的一个点,第一个是这个时间,还有一个点看一下啊在这。往回这个地方,然后刷新一下。这个最新的这个已经执行完了是吧,最新的这个是不是我们过滤空气。执行了这个呢,是没有过滤的吧,啊没有过滤,你要记住这个,那我们看一下它是17啊17它的时间。是不是快很多,省了很多时间吧,十秒呢,将近是吧,咱们才100万兆数据就十秒,而且是虚拟机,所以这个提高效率还是很可以的,可以的。还有一种啊,这是我们第一种方案,就是把空气啊提前给它过滤掉,不让他参加参与那个教育的比较。
07:19
啊,空气很多的时候啊,第二种还有一个就是。空可以对应很多,但是不是异常数据。因为我们现在过滤掉它就是什么数据就没了呀,他不参与这个交易之后,这个表里面肯定没有数据了吧,啊没有这个数据了,但是有时候啊,这个空K的数据,它只是ID没了,但是其他的内容我们还要。那你就不能给它过滤掉了,那这个时候也要给它保留,那这个时候我们采取的方法是给空自段赋个值。给公司大负个值,但你不要用NVL吧。为什么不能用NVNV是可以给控制复值,但是为什么不能用啊?
08:07
你想想看,你负的值会是这地方,假如负一个负一,你本来是想着让这个字段不到一个reduce里边,现在防止数据倾斜嘛,然后你改成改成了负一,最后还是到一个reduce里边了吧,就没有意义,所以我们负值啊,负的肯定是一个随机值。附一个随机值之后,那是不是它会分散到不同的丢C里边来,哎,防止数据倾斜的是这个意思,好,那我们做一下,假如说。设置五个video。啊,设置五个video,看不同的reduce当中它处理的一个数据吧,不同的reduce处理的一个效率走一下。哎。在这教育两张表示是不做,看这两张表是不做任何处理的,看出来了吗?也就这样。
09:01
这个是这个对吧。不做任何处理的,直接交易空没有做任何处理啊,我们看它在五个reduce的情况下会是什么样子啊,会是什么样的,每个角处理的一个时间长短,因为是这样到这个地方来啊,你点进来。再点,然后。不是点错了,在这就每一个还是先点历史啊,然后先点历史啊,点历史你看reducer reduce阶段现在只有一个reduce法啊,刚才我们设置了五个,你要看不同的reduce之间,他们之间执行的一个时间差。啊,这个时间差主要是体现在数据倾斜吧,如果时间某一个reducer远高于其他的几个reducer,是不是说明数据倾斜了呀?啊,数据倾斜了,你要尽量的避免这种情况,这个已经执行完了,我们退回去找到最新的那个。
10:02
就是最新的是这条吧啊。哎,这个时候他就有五个了,他就有五个了,来看一下啊,他那个时间十八七。很不均匀吧,啊很不均匀的好,这个因为我们数据量不是很大,如果数据量特别大的时候,这个地方会产生严重的一个数数据倾斜啊,数据倾斜就会导致某一个reducer的一个任务呢,拖慢整个的一个任务的进行啊,啊会是产生这种情况,那我们做什么处理呢?我们把这个空K啊,给它做一个随机值,让它分散到不同的reduce里面去啊,然后来避免掉这种负载均衡,同样的还是五个,然后来把这个语法拿出来。看了首先吧,用过了吧,拼接一个字符,然后拼接一个加一个随机数,然后用了。
11:04
Case问,啊,当它是空的时候你再拼接吧,不空的时候你就没必要拼接了啊,没必要拼接了,接下来我们再把这个O啊改成这就OK了,来走一下。刚才一个十八一个七,你看这次执行的一个结果啊,它会不会产生这种类似的一个数据倾斜。当然你们在测试的时候,你按照文档上你去建一个表,然后把数据导进来,这也没有问题是吧。但是我就没有这样做了,就是省点空间嘛,能省一点是省一点是吧,100万数据呢。
12:11
好,这边已经执行完了,然后我们看一下这。最新的一个任务刷新一下啊,就最上面的一个任务吧,History,然后看他的一个reducer,看他一个reducer,就有同学可能有疑问,那这个时间很长了是吧?哎,时间很长了,其实这样的,因为这个时间长长在哪啊,给空字段赋值的这个地方。长在这,但是你看它之间。数据是不是均衡了呀,我们要避免到的是数据均写,因为我们啊,现在测试这个数据量很少特别少。牺牲这一点时间是划算的,数据量大的时候,当你空气啊,你数据量一大,而且空气特别多的时候,你就会发现有有一个任务有可能都跑不完,因为交给一个角色他处理不过来。
13:08
就直接扔就死掉了。这个时间长是长在咱们这个随机算法的。拼接的这个函数多了这个这执行这个操作嘛,啊,空气特别多的时候。这个函数执行的一个时间很长,而不是说咱们说把cookie啊加一个随机数之后,它的一个map跑的更长了,不是这样的,是他在拼接字符的时候拼更长的时间,但是我们的目的是什么?尽量的减少他们之间那个什么数据倾斜问题吧,哎,尽量减少他们之间的一个数据倾斜问题,是这样的,所以说我们牺牲这一点,给他负随机数的一个时间呢,是划算的,是划算的,这是我们所讲的cookie啊,它的一个两个解决方法,也就是大表降一大表的时候最容易产生的问题。
我来说两句