00:00
接下来看了一个bucky沙uffle doing,这个我们讲了,其实有点像hi也好,Spark也好,一个s MB doing对吧?啊,那它呢,大家注意是在DOS0.14版本才正式加入的一个功能。它也是提供了一个本地性的优化啊,也是减少传输耗时来加速查询,这个看起来是不是跟前面讲的location join有点像对吧?啊,基本上差不多啊,区别就在于要不要挪数据,需不需要传输数据啊,那八沙布就是需要的啊,那我们看一下它的原理。我们常规join就是前面讲到的两种啊,一个广播join,还有一个沙join,他们的网络开销啊,是有一定的开销的,那比如说啊呃,广播电院的开销,比如说a join b。那A表呢,假设有三个节点啊,它有它分布在三个节点上数据。啊,那这个时候我们是不是将右表也就小表广播到呃,左表的所有节点,对吧,那它有三个节点了,那相当于说这三个节点都有A的数据啊,对吧,都有A。
01:13
那B现在要广播过去,你看现在要把自己全量广播到这个节点,也要把也要传输到另外三个节点都要传输,对不对,那它的网络开销是多少呢?3B是不是。都得传嘛,广播嘛啊,每个节点复制一份给他啊,那沙波呢。沙漠这边我们知道它是根据我们的关联字段去哈希值分散到节点对吧?也就是说呃,原先分布可能没有,那么你不是你想要的分布,但是通过沙坡交蚓,比如说我们前面按照city字段啊去做一个关联,他会做什么事呢?是不是对C取一个哈希值啊,然后再取上模对吧?比如说我有三个节点,那是模上三。
02:01
那右左表跟右表是不是都要经过这么一个计算,然后将呃最终结果一致的地方。比如说这个摩托拉是不是012啊,是不是有一部分数据要发到零,有一部分数据要分配到一节点,有一部分数据要到二节点,那对B表也一样,一部分一一,一部分零,一部分一,一部分二啊,然后呢,这样就可以在零号节点对相同。呃,CT字段的进行交易,一呢也一样,二也一样,对吧,但是这中间大家可以看到这些箭头是不是都是网络传输啊。是吧啊,它是要进行网络传输的,那么他的网络开销为多少?A加B,因为他俩都可能要是吧,内存开销就是B啊。那我们的bucket杀doing,其实关键词前面加了一个什么bucket,也就是说如果join语句命中的数据分布列,也就是分统列啊分统列,如果关联条件也就是我们join完的那个on。
03:07
或者where那个等值关联条件。那个字段是分统列的话,那他就会走bucket,纱布均匀。啊,其实区别看出来吧,首先第一个区别,它和普通沙坡join的区别,第一种杀普通沙坡join,我们关联条件不是分同列。啊,非分筒列啊。那什么样场景可以走8K的沙坡均匀呢?也就关联条件,关联字段是分筒裂。因为分筒列的话,一开始是不是相当于说已经取好哈希值跟那个取完膜了。对吧,那我们这边网络传输是不是就少了,一开始就是一开始我这张表的数据就是按照这么来分布的啊,那我们来看一下,你看呃,对于表A来讲,呃,关联条件是什么?分同列,那这个时候本身它的数据就是按照这个字段取哈希,然后再取模,对吧?呃,分布在几个筒里面,比如说这边案例是三个筒,那现在要做的是什么?只需要对右表,也就B表,它的字段干嘛呢?取哈希。
04:17
对吧,再取模他这边得到012,然后传过去就行了,我是不是只要传B就行了啊,把它拆成三份对吧,每一份去他该去的地方。对吧,那这样网络开销是不是就小了。所以他的网络开销肯定是比之前讲的广播的3B,或者杀普通沙坡交的A加B也好,肯定是比他小的。啊,他只需要多少的开销,只需要B的开销,他只需要将B表自己切成几份,然后发过去,对吧,不管你切几份,这些总的加起来是不是等于B表的大小啊,对吧?所以它的网络开销只有多少,只有B。那内存开销也一样啊,我一共需要呃,将B表传输过去,就B表这么多的数据,是不是也是只有B啊?所以从这里分析我们也可以看出来,它相对于常规的杀手或者呃。
05:13
广播会有着较为明显的性能优势,它可以减少我们的什么传输的耗时,就网络开销嘛,还有什么内存开销,它都是性能更好的。啊啊,这个也是一样啊,降低了网络内存开销,另外有一点就是什么,与location就有不同,它对于表的数据分布方式没有侵入性,也就是说。我们location是不是一开始建表就有严格的要求啊?你必须是什么?呃,Join的表分筒列的类型要一样,分桶字段的个数要一样啊,分筒的数量还要一样对吧?那分区的副本数也要一样。对吧,还要给他们进行分组,分到同一组。
06:00
这个就呃,就是对表一开始有一些要求,有一些侵入性,但八的差不多就就无所谓啊,比如说你A跟B表两张表啊,从location的种种条件来讲,它不满足。对吧,从分桶条件,它不不没那么像,那其实。呃就可以走buck的沙就呃沙Le Joy,那而且呢,他们最大的不同在于location,由于它有严格的要求,那么一开始数据的分布已经满足,可以在本地就呃,基本上不需要呃进行一个传输数据,网络开销基本等于呃可以很小,对不对?对,那8K的沙join可能还涉及到B表的数据传输啊,这就是最大最大的区别。所以如果不考虑使用限制来讲,性能和效率最高的应该是谁呀?Location join,它的性能跟效率肯定是最好的,其次呢,就是bucket的沙uffle join。对吧,虽然呃,但其实8K的沙就也有条件嘛,条件就是什么必须使用呃,A表的就左表的分同列进行关联嘛,是不是好那怎么使用呢?啊,废话少说,直接来上手啊,首先它由一个变量控制,它的功能默认呢,从一四版本加入开始,它默认值就是什么就是处啊给大家看一下吧啊受。
07:21
Mars Mars对吧,是查看所有的变量,当然有很多啊,那其实我们能快速的找一下这这一行。默认是不是就是to了对吧,如果不是,你记得set再改成to对吧,或者加个global。好,那这边set我就不用去做了呗,因为我已经开启了,那么另外一个小细节就是我们进行分布式查询的时候,优先的顺序是什么?啊,如果优先看一下满不满足location join,因为我们说它其实性能是最高的,对吧?如果不满足,再看一下满不满足bucky的沙uffle join,是吧?啊,如果也不满足,接下来会尝试着什么?看一下广播,Join,满不满足?啊,如果再不满足,那我就走沙Le joining。
08:12
对吧,前提是什么,我都没指定这个类型啊,那如果你指定呢,那就不行了。那这边的案例我改成我们刚才的那个啊,稍等一下,现在修改这个案例是什么呢?你看表一跟表二进行交易,关联条件你用ON5都行啊。那你看我关联的字段,之前前面两个案例我们用的是C字段,那现在我用的是U的ID字段,为什么呢?来看一下,刚好我这里有个之前建表语句对吧,它的你看它的分筒字段是什么U了ID对吧,那现在相当于说。是不是就满足bucket沙join的条件了?关联条件必须是分字段是吧?好,那这个时候我们experiment查看一下这个语句。
09:08
再往上翻,同样的找到join这个节点,哈希join,那么我们可以看到这一边变成了什么,八杀uffle doing。并不是broadcast,也不是那个那个什么沙Le doing的啊,并且呢,是为什么force。这就说明啊,咱们用的八沙。其实在上一个视频,如果你细心观察,当时啊,我是不是演示了一个东西啊,我是把其中呃表一先把它的这个CC名改掉了,呃,然后我在explain查看这个circle语句的时候,它是不是也是8K沙头就了,那我们看看为什么呢?它是不是也满足这个条件了,你看首先它的分筒字段也是K2。对吧,那关联条件是不是也是K2。
10:03
对吧。啊,其实从这大家可以看出来,当时不满足location,它是不是自动切换成了那个bucky的沙uffle呢?啊,只有这么一回事啊。那我们再聊几个注意事项啊,只生向于什么呢?等值交引啊,前面这些是不是都是等值交啊?另外呢,就是要包含分红列。另外呃,就是如果你左表是八是分筒列,然后右表的列不是分筒列,但是只要字段一样就行,但你类型要什么类型要一致吧。要不然不行啊,另外一个呢。8K稍后调用只能作用于o lap引擎的这种表,如果是其他的外表方式啊,那是无法生效的。
11:09
那对于分区表而言呢,每一个分区数据数据的分布规则可能不同,对吧?啊这是呃,可以每个分区不一样,那所以八体沙头阶段只能保证左表为单分区时生效。啊,左表为单分区时才能生效。所以我们要尽量使用V的条件,使分区裁剪策略生效,那就OK了。就先V过滤出分区条件啊。条路左表为cate的表。那么。能呃,八沙布它性能表现更好,为什么呢?因为它的数据分布规则是确定的啊,其实原理是一样的,对吧。综上所述呢,其实注意事项也就那么几点啊,就是关联条件要携带分农历啊分农历。
我来说两句