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,当数据量大的时候,可能晚上计算不完,导致依赖任务延时
存储成本增大