What Colocate Join
我们都知道 Join 的常见连接类型分为以下几种:
Join 的常见算法实现包含以下几种:
分布式系统实现 Join 数据分布的常见策略有:
Colocate/Local Join 就是指多个节点 Join 时没有数据移动和网络传输,每个节点只在本地进行 Join,能够本地进行 Join 的前提是相同 Join Key 的数据分布在相同的节点。
Why Colocate Join
相比 Shuffle Join 和 Broadcast Join,Colocate Join 在查询时没有数据的网络传输,性能会更高。 在 Doris 的具体实现中,Colocate Join 相比 Shuffle Join 可以拥有更高的并发粒度,也可以显著提升 Join 的性能,这一点在后面会解释。
How Colocate Join
核心思路
对于 colocate tables,在任何情况下都要保证数据的本地性。 具体包括:
实现中最复杂是第 3 点: 处理 colocate tables 的 balance。
术语定义
Colocate Group
我们将一组具体相同 Colocate 属性的 Table 称为 Group,下图中 t1 和 t2 拥有相同的 Colocate Group。
Colocate Parent Table
我们将决定一个 Group 数据分布的 Table 称为 Parent Table,下图中 t1 是 Colocate Parent Table.
Colocate Child Table
我们将一个 Group 中除 Parent Table 之外的 Table 称为 Child Table,下图中 t2 是 Colocate Child Table.
如下图,如果一个表有 N 个 Partition, 则每个 Partition 的第 M 个 bucket 的 Bucket Seq 是 M。
1 数据导入时保证本地性
Doris 的分区方式如下所示,先根据分区字段 Range 分区,再根据指定的 Distributed Key Hash 分桶:
所以我们在数据导入时保证本地性的核心思想就是 两次映射 ,对于 colocate tables,我们保证相同 Distributed Key 的数据映射到相同的 Bucket Seq,再保证相同 Bucket Seq 的 buckets 映射到相同的 BE。
具体来说,第一步:我们计算 Distributed Key 的 hash 值,并对 bucket num 取模,保证相同 Distributed Key 的数据映射到相同的 Bucket Seq。
第二步:将同一个 Colocate Group 下所有相同 Bucket Seq 的 Bucket 映射到相同的 BE,方法如下:
2 Colocate Join Query Plan
对 HashJoinFragment,由于 Join 的多张表有了数据本地性保证,所以可以去掉 Exchange Node,避免网络传输,将 ScanNode 直接设置为 Hash Join Node 的 Child。
3 Colocate Join Query Schedule
查询调度的目标: 一个 Colocate join 中所有 ScanNode 中所有 Bucket Seq 相同的 Buckets 被调度到同一个 BE。

查询调度的策略:第一个 ScanNode 的 Buckets 随机选择 BE,其余的 ScanNode 和第一个 ScanNode 保持一致。
4 Colocate Join At Bucket Seq Level
目前,Doris 的 Hash Join 是 Server 粒度的:
对于 colocate join,由于同一个 Colocate Group 下相同 Bucket Seq 的 Bucket 分布在相同的 BE,所以我们将 Join 的粒度从 Server 粒度降至 Bucket Seq 粒度:
5 Colocate Join Metadata Maintenance
对于 colocate join,我们需要维护以下几个核心元数据:
6 How to decide a query can colocate join
7 Colocate Join Support Balance
核心思路 :
新增一个 daemon 线程专门处理 colocate table 的 balance,并让正常的 balance 线程不处理 colocate table 的 balance。
何时 balance :
有 BE 节点新增,删除,down 掉时。
balance 的粒度 :
正常 balance 的粒度是 bucket,但是对于 colocate table,我们必须保证同一个 colocate group 下所有 bucket 的数据本地性,所以我们 balance 的单位是 colocate group。
balance 对查询的影响 :
当一个 colocate group 正在 balance 时,colocate join 会退化为原始的 shuffle join 或 broadcast join。
balance 流程:
当有 BE 节点删除或长时间挂掉时,选择目标 BE 的策略:
和正常 balance 时的选择策略相同,考虑集群的整体负载,尽量选择负载较低的 BE。
当有 BE 节点新增时,选择目标 BE 的策略:
Colocate Join Performance
测试数据:
Table A,B,C 都有 10 天数据,1 天一个 partitions,每个 partition 有 570 万数据。
测试集群:
4 台低配物理机,每个 BE 24CPU,96MEM
测试 SQL:
select count(*)
INNER JOIN [shuffle] B t5
ON ((t1.dt = t5.dt) AND (t1.id = t5.id))
INNER JOIN [shuffle] C t6
ON ((t1.dt = t6.dt) AND (t1.id = t6.id))
where t1.dt in (xxx days);
select t1.dt, t1.id, t1.name, t1.second_id,t1.second_name,
t5.id, t5.weight_time,t5.list,
t6.ord_id, t6._id
INNER JOIN B t5
ON ((t1.dt = t5.dt) AND (t1.id = t5.id))
INNER JOIN C t6
ON ((t1.dt = t6.dt) AND (t1.id = t6.id))
where t1.dt in (xxx days)
limit 10000;
Test Result for SQL1:
Test Result for SQL2:
可以看到,Colocate Join 相比 Shuffle Join 有明显的性能提升, 而且随着集群规模越大,Join 的数据量越多,Colocate Join 的优势会更明显。
How To Use Colocate Join
社区最新代码已经支持 Colocate Join,只不过默认是关闭的,只需要在 FE 配置中设置 disable_colocate_join 为 false,即可开启 Colocate Join 功能。
具体使用时只需要在建表时增加 colocate_with 这个属性即可,colocate_with 的值可以设置成同一组 colocate 表中的任意一个,不过需要保证 colocate_with 属性中的表要先建立。
假如需要对 table t1 和 t2 进行 Colocate Join,可以按以下语句建表:
create TABLE `t1` (
`id` int(11) COMMENT “”,
`value` varchar(8) COMMENT “”
) ENGINE=OLAP
DUPLICATE KEY(`id`)
DISTRIBUTED BY HASH(`id`) BUCKETS 10
PROPERTIES (
“colocate_with” = “t1”
CREATE TABLE `t2` (`id` int(11) COMMENT “”,`value` varchar(8) COMMENT “”) ENGINE=OLAPDUPLICATE KEY(`id`)DISTRIBUTED BY HASH(`id`) BUCKETS 10PROPERTIES (“colocate_with” = “t1”);
Colocate Join 目前限制
Colocate Join 适用场景
Colocate Join 十分适合几张表按照相同字段分桶,并高频根据相同字段 Join 的场景,比如电商的不少应用都按照商家 Id 分桶,并高频按照商家 Id 进行 Join。
Colocate Join FAQ
一句话总结, 凡是不能进行 Colocate Join 的场景都会自动退化为原始的 Shuffle Join 或者 Broadcast Join 。
Q1: 支持多张表进行 Colocate Join 吗?
A: 支持
Q2: 支持 Colocate 表和正常表 Join 吗?
A: 支持
Q3: Colocate 表支持用非分桶的 Key 进行 Join 吗?
A: 支持:不符合 Colocate Join 条件的 Join 会使用 Shuffle Join 或 Broadcast Join
Q4: 如何确定 Join 是按照 Colocate Join 执行的?
A: explain 的结果中 Hash Join 的孩子节点如果直接是 OlapScanNode, 没有 Exchange Node,就说明是 Colocate Join
Q5: 如何修改 colocate_with 属性?
A: ALTER TABLE example_db.my_table set (“colocate_with”=”target_table”);
Q6: 如何禁用 colocate join?
A: set disable_colocate_join = true; 就可以禁用 Colocate Join,查询时就会使用 Shuffle Join 或 Broadcast Join
总结
大多数支持 Join 的 OLAP 系统都会考虑支持 Colocate Join,比如 MemSQL, SnappyData, 阿里 AnalyticDB 等,阿里 AnalyticDB 更是在数据模型中就引入了 Table Group 的概念。总的来讲,Colocate Join 通过在数据导入,查询 Plan,查询调度,数据 balance 时对数据本地性的保证和考虑,可以显著加速特定场景的下 Join 查询,是一个十分有用的 Feature。
Linux技术文档操作系统
数据库运维技术服务 » ApacheDorisColocateJoin原理实践教程
香港服务器首选树叶云,2H2G首月10元开通。树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云 服务器 和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
集成直流稳压电源设计报告
目 录 一、设计目的. 1二、设计任务及要求. 1三、设计步骤. 1四、总体设计思路. 2五、实验设备及元器件. 5六、测试要求. 5七、设计报告要求. 6八、注意事项. 6直流稳压电源的设计一、设计目的1.学习基本理论在实践中综合运用的初步经验,掌握模拟电路设计的基本方法、设计步骤,培养综合设计与调试能力。 2.学会直流稳压电源的设计方法和性能指标测试方法。 3.培养实践技能,提高分析和解决实际问题的能力。 二、设计任务及要求1.设计并制作一个连续可调直流稳压电源,主要技术指标要求:① 输出电压可调:Uo=+3V~+9V② 最大输出电流:Iomax=800mA③ 输出电压变化量:ΔUo≤15mV④ 稳压系数:SV≤0.0032.设计电路结构,选择电路元件,计算确定元件参数,画出实用原理电路图。 3.自拟实验方法、步骤及数据表格,提出测试所需仪器及元器件的规格、数量,交指导教师审核。 4.批准后,进实验室进行组装、调试,并测试其主要性能参数。 三、设计步骤1.电路图设计(1)确定目标:设计整个系统是由那些模块组成,各个模块之间的信号传输,并画出直流稳压电源方框图。 (2)系统分析:根据系统功能,选择各模块所用电路形式。 (3)参数选择:根据系统指标的要求,确定各模块电路中元件的参数。 (4)总电路图:连接各模块电路。 2.电路安装、调试(1)为提高学生的动手能力,学生自行设计印刷电路板,并焊接。 (2)在每个模块电路的输入端加一信号,测试输出端信号,以验证每个模块能否达到所规定的指标。 (3)重点测试稳压电路的稳压系数。 (4)将各模块电路连起来,整机调试,并测量该系统的各项指标。 四、总体设计思路1.直流稳压电源设计思路(1)电网供电电压交流220V(有效值)50Hz,要获得低压直流输出,首先必须采用电源变压器将电网电压降低获得所需要交流电压。 (2)降压后的交流电压,通过整流电路变成单向直流电,但其幅度变化大(即脉动大)。 (3)脉动大的直流电压须经过滤波电路变成平滑,脉动小的直流电,即将交流成份滤掉,保留其直流成份。 (4)滤波后的直流电压,再通过稳压电路稳压,便可得到基本不受外界影响的稳定直流电压输出,供给负载RL。 2.直流稳压电源原理直流稳压电源是一种将220V工频交流电转换成稳压输出的直流电压的装置,它需要变压、整流、滤波、稳压四个环节才能完成,见图1。 图1直流稳压电源方框图其中:(1)电源变压器:是降压变压器,它将电网220V交流电压变换成符合需要的交流电压,并送给整流电路,变压器的变比由变压器的副边电压确定。 (2)整流电路:利用单向导电元件,把50Hz的正弦交流电变换成脉动的直流电(3)滤波电路:可以将整流电路输出电压中的交流成分大部分加以滤除,从而得到比较平滑的直流电压。 (4)稳压电路:稳压电路的功能是使输出的直流电压稳定,不随交流电网电压和负载的变化而变化。 整流电路常采用二极管单相全波整流电路,电路如图2所示。 在u2的正半周内,二极管D1、D2导通,D3、D4截止;u2的负半周内,D3、D4导通,D1、D2截止。 正负半周内部都有电流流过的负载电阻RL,且方向是一致的。 电路的输出波形如图3所示。 图2整流电路图3输出波形图 在桥式整流电路中,每个二极管都只在半个周期内导电,所以流过每个二极管的平均电流等于输出电流的平均值的一半,即 。 电路中的每只二极管承受的最大反向电压为 (U2是变压器副边电压有效值)。 在设计中,常利用电容器两端的电压不能突变和流过电感器的电流不能突变的特点,将电容器和负载电容并联或电容器与负载电阻串联,以达到使输出波形基本平滑的目的。 选择电容滤波电路后,直流输出电压:Uo1=(1.1~1.2)U2,直流输出电流: (I2是变压器副边电流的有效值。 ),稳压电路可选集成三端稳压器电路。 总体原理电路见图4。 图4 稳压电路原理图3.设计方法简介(1)根据设计所要求的性能指标,选择集成三端稳压器。 因为要求输出电压可调,所以选择三端可调式集成稳压器。 可调式集成稳压器,常见主要有CW317、CW337、LM317、LM337。 317系列稳压器输出连续可调的正电压,337系列稳压器输出连可调的负电压,可调范围为1.2V~37V,最大输出电流 为1.5A。 稳压内部含有过流、过热保护电路,具有安全可靠,性能优良、不易损坏、使用方便等优点。 其电压调整率和电流调整率均优于固定式集成稳压构成的可调电压稳压电源。 LM317系列和lM337系列的引脚功能相同,管脚图和典型电路如图4和图5.图4管 脚图 图5典型电路输出电压表达式为:式中,1.25是集成稳压块输出端与调整端之间的固有参考电压 ,此电压加于给定电阻 两端,将产生一个恒定电流通过输出电压调节电位器 ,电阻 常取值 , 一般使用精密电位器,与其并联的电容器C可进一步减小输出电压的纹波。 图中加入了二极管D,用于防止输出端短路时10F大电容放电倒灌入三端稳压器而被损坏。 LM317其特性参数:输出电压可调范围:1.2V~37V输出负载电流:1.5A输入与输出工作压差ΔU=Ui-Uo:3~40V能满足设计要求,故选用LM317组成稳压电路。 (2)选择电源变压器1)确定副边电压U2:根据性能指标要求:Uomin=3V Uomax=9V又 ∵ Ui-Uomax≥(Ui-Uo)min Ui-Uoin≤(Ui-Uo)max其中:(Ui-Uoin)min=3V,(Ui-Uo)max=40V∴ 12V≤Ui≤43V此范围中可任选 :Ui=14V=Uo1根据 Uo1=(1.1~1.2)U2可得变压的副边电压:2)确定变压器副边电流I2∵ Io1=Io又副边电流I2=(1.5~2)IO1 取IO=IOmax=800mA则I2=1.5*0.8A=1.2A3)选择变压器的功率变压器的输出功率:Po>I2U2=14.4W(3)选择整流电路中的二极管∵ 变压器的副边电压U2=12V∴ 桥式整流电路中的二极管承受的最高反向电压为:桥式整流电路中二极管承受的最高平均电流为:查手册选整流二极管IN4001,其参数为:反向击穿电压UBR=50V>17V最大整流电流IF=1A>0.4A(4)滤波电路中滤波电容的选择滤波电容的大小可用式 求得。 1)求ΔUi:根据稳压电路的的稳压系数的定义:设计要求ΔUo≤15mV ,SV≤0.003Uo=+3V~+9VUi=14V代入上式,则可求得ΔUi2)滤波电容C设定Io=Iomax=0.8A,t=0.01S则可求得C。 电路中滤波电容承受的最高电压为 ,所以所选电容器的耐压应大于17V。 注意: 因为大容量电解电容有一定的绕制电感分布电感,易引起自激振荡,形成高频干扰,所以稳压器的输入、输出端常 并入瓷介质小容量电容用来抵消电感效应,抑制高频干扰。 五、实验设备及元器件1.万用表 2.示波器3.交流毫伏表 4.三端可调的稳压器 LM317一片六、测试要求1.测试并记录电路中各环节的输出波形。 2.测量稳压电源输出电压的调整范围及最大输出电流。 3.测量输出电阻Ro。 4.测量稳压系数。 用改变输入交流电压的方法,模拟Ui的变化,测出对应的输出直流电压的变化,则可算出稳压系数SV.(注意: 用调压器使220V交流改变±10%。 即ΔUi=44V)5.用毫伏表可测量输出直流电压中的交流纹波电压大小,并用示波器观察、记录其波形。 6.分析测量结果,并讨论提出改进意见。 七、设计报告要求1.设计目的。 2.设计指标。 3.总体设计框图,并说明每个模块所实现的功能。 4.功能模块,可有多个方案,并进行方案论证与比较,要有详细的原理说明。 5.总电路图设计,有原理说明。 6.实现仪器,工具。 7.分析测量结果,并讨论提出改进意见。 8.总结:遇到的问题和解决办法、体会、意见、建议等。 八、注意事项1.焊接时要对各个功能模块电路进行单个测试,需要时可设计一些临时电路用于调试。 2.测试电路时,必须要保证焊接正确,才能打开电源,以防元器件烧坏。 3.注意LM317芯片的输入输出管脚和桥式整流电路中二极管的极性,不应反接。 4. 按照原理图焊接时必须要保证可靠接地。
建构主义的学习环境设计和建构主义的教学设计的区别
建构主义学习环境概括为一种支持学习者意义建构的各种资源、关系、工具和情景性任务的组合。 建构主义的核心是强调学生主动建构知识的意义,有人认为基于建构主义的、以学为中心的教学设计主要是学习环境的设计。 显然,这忽视了学习者的“自主学习”,这是一种本末倒置。 建构知识的意义--这是建构主义的基本出发点,也是建构主义追求的最终目标。 但是意义的建构是要由学习者自己完成--学习者在适当的学习环境下通过自主学习才能完成。 学习者是学习过程的主体,学习者的自主学习才是对所学知识实现意义建构的内因,学习环境只是促进学习者主动建构知识意义的外部条件,是一种外因。 外因要通过内因才能起作用。 设计理想的学习环境是必要的,因为这有利于促进学习者的意义建构;但是更应重视学习者自主学习的设计,因为缺少这种自主学习,就是有再理想的学习环境,意义建构也无从说起。 O(∩_∩)O~希望帮到你!
门捷列夫发现了(什么)和(什么),使化学学习和研究变得有规律可循?
元素周期律 元素周期表(似乎不好用发现)
发表评论