- 博客(174)
- 收藏
- 关注
原创 13. 状态的底层存储——CopyOnWriteStateMap
不管是ValueState、ListState、MapState,它们的底层存储都是用的StateTable<K, N, S>,而StateTable的底层存储又是StateMap<K, N, S>的数组,每个StateMap代表一个keyGroup。在获取元素时,先根据key计算出来它所属的keyGroup,拿到对应的StateMap,再通过map.get(key)的方式获取到对应的元素。K:keyBy时用的keyN:namespace, 用于区分窗口。
2023-08-27 21:24:46 315
原创 Spark Shuffle
本文介绍了Spark Shuffle的演进,以及Spark中各种数据操作所应用的Shuffle类型,最后介绍了Spark Shuffle和MR Shuffle的优缺点
2023-01-13 18:35:45 813
原创 Kafka
文章目录一、Kafka 是什么1.1 Kafka 定义1.2 两类消息队列模式1.2.1 发布/订阅模式1.2.2 点对点模式(一对一)1.2.3 消息队列的好处1.2.4 Kafka 使用的消息队列二、Kafka 架构三、Kafka 工作流程3.1 概述3.2 实现细节——segment 和 index四、Kafka 生产者4.1 分区4.1.1 为什么要分区4.1.2 分区策略(写入哪个分区)...
2020-03-09 23:49:54 257
原创 hive cbo优化引起的bug
有一个任务,在混部集群默认开启,导致任务reduce个数太小,只启了2个reducetask,而maptask中读取的数据又很大,使得大量数据都写到这2个reduce task中,任务最终失败,在关闭这个参数后,可以启动1100个reducetask。对比执行计划,在开启这个参数后,hive 认为只会读取50000多行数据,而实际上是几十亿。hive.stats.fetch.column.stats导致reduce个数划分太小。
2023-11-19 12:08:55 157
原创 4. Scala不可变Set详解
本文介绍了Scala immutable.Set的底层实现,详细介绍了添加元素的过程,以及其对空间的消耗,最后对比了mutable.Set、AppendOnlySet、Java的HashSet内存占用
2023-09-10 22:59:52 976 2
原创 22. 数据结构——职责链模式
类图:Handler(如Manager):定义一个处理请求的接口实现后继链ConcreteHandler(如JingLi、ZongJingLi):处理它所负责的请求如果可处理该请求,就处理之;否则转发给它的后继者Client向链上的具体处理者对象提交请求有多个对象可以处理同一个请求,哪个对象处理该请求在运行时刻自动确定你想在不明确接受者的情况下,想多个对象中的一个提交一个请求可处理一个请求的对象集合应该被动态指定。
2023-08-30 20:24:30 71
原创 21. 数据结构——迭代器模式
类图:Iterator(迭代器)迭代器定义访问和遍历元素的接口ConcreteIterator(具体迭代器)具体迭代器实现迭代器接口对该集合遍历时跟踪当前位置Aggregate(聚合)集合接口具体集合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。
2023-08-30 20:23:35 95
原创 20. 数据结构——组合模式
为组合中的对象声明接口在适当的情况下,实现所有类共有接口的缺省行为声明一个接口用于访问和管理Component的子组件Leaf(Rectangle、Line、Text等)在组合中表示叶节点对象,叶节点没有子节点在组合中定义图元对象的行为定义有子部件的那些部件的行为存储子部件在Component接口中实现与子部件相关的操作Client通过Component接口操纵组合部件的对象你想表示对象的部分-整体层次结构。
2023-08-30 20:22:07 71
原创 19. 状态变化——备忘录模式
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
2023-08-30 20:20:25 51
原创 18. 状态变化——状态模式
与许一个对象在其内部状态改变时改变其行为,这个对象看起来就像改变了其类。状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
2023-08-30 20:18:55 70
原创 17. 接口隔离——中介者模式
用一个中介对象来封装一些列对象的交互。中介者使得个对象不需要显示地互相引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。类图:**减少了子类生成。**中介者将原本分布于多个对象间的行为集中在一起。改变这些行为只需生成Meditator的子类即可。这样各个Colleague类可被复用**它将各Colleague解耦。**Mediator有利于各Colleague间的松耦合,你可以独立改变和复用各Colleague类和Mediator类**它简化了对象协议。
2023-08-30 20:18:04 56
原创 16. 接口隔离——适配器模式
将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作。你想使用一个已经存在的类,而它的接口不符合你的要求;你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作。
2023-08-30 20:16:11 60
原创 14. 接口隔离——门面模式
为子系统中的一组接口提供一个一致(稳定)的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(服用)。Facade门面角色:客户端可以调用这个角色的方法。此角色直销子系统的所有功能和责任。一般情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去,也就说该角色没有实际的业务逻辑,只是一个委托类。subsystem子系统角色:可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。子系统并不知道门面的存在。
2023-08-30 20:11:45 56
原创 11. 对象创建——Builder模式
PersonDirector类就可以根据用户的选择来建造小人了,而在建造的过程在指挥者这里完成了,用户就不需要知道了,而且,由于这个过程每一步都是一定要做的,那就不会少让少画一只手、少画一条腿的问题出现了。像这种因为粗心而导致程序异常在平时开发中还是比较常见的,比如我们在程序里需要画100个不同的小人,在高矮胖瘦上有细微的差别,我们在每次创建小人时都用上述的代码,这样是很容易有遗漏。**主要解决:**主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;
2023-08-30 19:04:25 112
原创 7. 对象创建——简单工厂
依据上面的实现方法,我们可以直接在Operation里新添加一个switch分支,但是这样导致的问题是如果频繁地添加运算符,就会频繁地修改Operation类,很容易在添加代码的时候将原有的代码改变。**分析:**其实,上面的实现方式违反了开放封闭原则,我们要使用一种结构,使得可以在不修改原有代码的基础上增加功能。此时,对于客户端来说,业务层使用的是什么计算逻辑是无感知的,就可以动态的添加运算符了,这就是简单工厂模式。**需求变更:**此时,我们需要新添加一个运算符,取余运算。
2023-08-30 18:50:49 43
原创 3. 组件协作——策略模式
定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)。
2023-08-30 18:46:38 47
原创 hive写动态分区加distribute by
在程序的最后,按照动态分区的字段在程序最后加一个distribute by,在本例中,就是加distribute by type, salt,此时就可以保证相同的type 和 salt的数据,会在同一个task中执行,最后输出的文件个数也是在可接受范围内的,输出文件个数为 type * salt * ceil(file_size / 256m),在本例中,因为每个文件都小于256m,所以生成的文件个数就是4 * 512 * 1 = 2048。
2023-08-29 16:18:43 311
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人