2022-08-21

1.

org.apache.spark.sql.catalyst.optimizer.ColumnPruning

org.apache.spark.sql.catalyst.optimizer.ReplaceIntersectWithSemiJoin

org.apache.spark.sql.catalyst.optimizer.ReplaceDistinctWithAggregate

org.apache.spark.sql.catalyst.optimizer.ReorderJoin

org.apache.spark.sql.catalyst.optimizer.PushDownPredicates

org.apache.spark.sql.catalyst.optimizer.PushDownLeftSemiAntiJoin

org.apache.spark.sql.catalyst.optimizer.CollapseProject

org.apache.spark.sql.catalyst.optimizer.EliminateLimits

org.apache.spark.sql.catalyst.optimizer.ConstantFolding

org.apache.spark.sql.catalyst.optimizer.RemoveNoopOperators

org.apache.spark.sql.catalyst.optimizer.InferFiltersFromConstraints

org.apache.spark.sql.catalyst.optimizer.RewritePredicateSubquery


PushDownPredicates 这个规则通过其他的操作把 filter 操作下推到离数据源更近的地方,这样做可以将计算转移至数据源端,减少 spark 加载和计算的数据量,但不是所有的操作都支持。比如,如果表达式不是确定性的,这就不行,假如我们使用类似 first,last,collect_set,collect_list,rand 等,filters 操作就不能通过这些操作而进行下推,因为这些函数是不确定性的。

ReorderJoin 规则对 join 进行了重新排序,并将所有的条件下推到 join 中,使得过滤操作可以尽早发生。实则是贪心算法,基于代价的优化器,Spark 会根据 join 的成本选择代价最小的 join 操作,也就是有多个表 join,cbo 优化会按特定的顺序进行 join。多表连接顺序优化算法使用了动态规划寻找最优 join 顺序,优势在于动态规划算法能够求得整个搜索空间中最优解,而缺点在于当联接表数量增加时,算法需要搜索的空间增加的非常快,计算最优联接顺序代价很高。



2.

在 lambda 架构中,通过双线计算,用离线补充实时数据,完成整体数据输出+展示。

lambda 架构优点:

职责边界清晰。离线和实时各自计算各自范围内的数据;

容错性。离线数据可以补充实时计算历史统计的数据;

复杂性隔离。离线数据,可以很好的掌控。采用增量算法处理实时数据,复杂性比离线要高很多。通过分开离线和实时计算,把复杂性隔离到实时计算,可以很好的提高整个系统的鲁棒性和可靠性。

lambda 架构缺点:

针对 lambda 模式来说,存在以下几个问题点:

同样需求两套代码

集群资源使用增多,因为离线任务+实时任务

离线结果和实时结果不一致问题

批量计算 T+1,当数据量大的时候,可能晚上计算不完,导致依赖任务延时

存储成本增大

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容