知识卡片
Lambda架构的两个理论假设:数据不可变性与Monoid性质
内容
Lambda架构把整个系统抽象成”查询是应用于数据集的函数”——数据是自变量,查询结果是因变量,这个抽象要成立、并且要能支撑架构的核心优点(可重计算、容错),依赖两个理论假设。第一个是不可变假设:Lambda架构要求原始数据一旦写入就不再变化,这个假设在大数据系统里天然成立,因为日志类数据记录的是”某个时刻某个用户发生了什么行为”,这件事一旦发生,历史记录本身不会被改写(就算业务上要”撤销”,也是追加一条新的撤销记录,而不是去修改原来那条记录)。第二个是Monoid假设:源自范畴学,核心特性是满足结合律,比如整数加法满足(a+b)+c=a+(b+c)——这个性质之所以重要,是因为它决定了一个计算过程能不能被拆解成多个独立的部分分别计算、再合并,这正是批处理和实时处理能够各自独立计算、最后在服务层合并出正确结果的数学基础。并不是所有统计量天然满足Monoid特性,比如”多个数的平均值”就不满足——多个分组的平均值不能直接结合出总体平均值,但只要把平均值拆解成”总和÷个数”这两个更基础的量,总和和个数各自都是满足Monoid特性的加法运算,就可以先分别计算总和与个数(这两部分都能独立计算再合并),最后在合并阶段再做一次除法得到最终的平均值。这条经验揭示了一个通用的技巧:当某个统计量本身不满足可以独立并行计算再合并的性质时,不要放弃并行化,而应该尝试把它拆解成若干个更基础的、确实满足这个性质的中间量,先并行算出这些中间量,再在最后一步做一次简单的合并计算。
参考来源
- 位置:《高可用架构(第1卷)》第3章《电商架构热点专题》"3.4 Lambda架构与推荐在电商网站实践"节,"3.4.1 Lambda架构"(源文件:_epub-src/OEBPS/Text/Chapter3_4_2.xhtml)
- 结论依据:原文说明"不可变假设:Lambda架构要求data不可变……Monoid假设……其一个重要特性是满足结合律……不满足Monoid特性的函数很多时候可以转化成多个满足Monoid特性的函数的运算。如多个数的平均值数,多个平均值没法直接通过结合来得到最终的平均值,但是可以拆成分母除以分子",直接支撑本卡片结论。
- 原始内容:不可变假设:Lambda架构要求data不可变,这个假设在大数据系统是普遍成立的……Monoid假设……满足结合律。如整数的加法就满足Monoid特性……不满足Monoid特性的函数很多时候可以转化成多个满足Monoid特性的函数的运算。如多个数的平均值数……可以拆成分母除以分子。