-
Map中的Hash问题
今天是祖国70大庆,没有出游而是选择了工作。因为这个里面涉及到一个接下来工作的核心,用Int替代String作为Map的key。我必须要充分的论证。关于Hash的问题一直萦绕在我心头。在数据库计算,所有关乎Map的计算都会是一个耗时的计算,比如分组比如HashJoin等。因此可以肯定得说想加快计算速度,首先得搞定Map。所有Map中理论速度最快必然是Hash Map,get操作时间为产量时间。所以Hash Map必然是首选。Hash Map分组查询这里不深究其实现,只关注于其使用。Equa...…
-
Spark BroadcastHashJoin Timeout异常简单分析笔记
异常信息如下java.util.concurrent.TimeoutException: Futures timed out after [300 seconds] at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:219) at scala.concurrent.impl.Promise$DefaultPromise.result(Promise.scala:223) at org.apache.spa...…
-
编码 笔记
端午节假期宅在家中闲来无事,翻出了《编码》这本书。里面偏软件的内容我略过没看,但是偏向硬件的真是解答了我的很多疑惑。逻辑门高中应该是数学课上学过简单的逻辑运算,那个时候就曾疑惑过,逻辑门凭什么可以在输出端为0的情况下输出端为1?是怎样的黑魔法可以在断开的情况下还能让灯泡亮呢?这个疑惑就如同发现永动机,明知不对还不得不相信就是这样。当时老师给的答案一如既往的简洁,规定就是这样。这个答案是正确的,逻辑上的确如此,可是我更像知道现实中是如何做到这看似不可能的事情,而这本书告诉了我真实的实现方式。...…
-
事务隔离笔记
有人觉得为了支持两阶段提交,而对性能和可用性造成的影响,这样的代价太高。而我们却认为把这些滥用事物的性能问题留给应用程序员,而不是让他们去处理事物一致性的问题。 —James Corbett et al., Spanner: Google’s Globally-Distributed Database(2012)闲聊事务事务被创造本来就是为了简化编程模型。让下层数据库对于并发的处理,上层应用尽量够忽略潜在的并发问题。但是也不是所以应用都需要事务,为了更好的性能或可用...…
-
分布式锁分析
分布式锁的目的是为了确保几个节点在处理一些任务的时候,同一个时间只有一个(或者最多只有一个)执行某任务。这些任务可能向共享存储中写入数据,或者执行某些计算。从宏观视角来看,使用锁无法两个目的:效率和准确。为了区别这两个目的,我们可以看一下没有锁会发生什么 效率:采用锁避免执行多次同一个任务,特别某些昂贵的操作。如果没有锁的情况下,那么结果会明显增加执行任务的代价。 准确:通过锁避免同时更改数据,从而扰乱系统状态。这里如果没有锁,那么可能结果是文件损坏,数据丢失等严重的不一致状态。两个目...…
-
分布式锁的问题
在review导入表数据和结构处的重构时候,看到下面的逻辑,偶然发现了一个问题。 表A加写锁,加锁失败就等待。 写入数据,涉及大量的数据导入 释放锁和异常处理一个正常的锁,但是当时看到一个很老的注释,大概意思是尝试捕获OOM的异常,将表删除和锁释放掉。于是发现这里如果因为GC等待时间过程,被Server认为锁失效了那岂不是锁非常不安全了?而这是带有超时时间锁的通病。查找了一下资料发现这个问题很早就讨论过。首先简单解释一下通用的分布式锁模型。 Client A 向锁服务提供方(Ser...…
-
Spark 的 Capacity 调度策略实现
Standalone 调度在 standalone模式下面,也就是 spark 自身能够支持两周调度策略 FIFO 这个是默认策略,Job 谁先提交谁的优先级高 FAIR 这个策略可以划分资源 Pool,不同的 Pool 有不同的优先级,可以指定 Job 提交到相应的 Pool 中。目前依靠 Spark 自身提供的调度策略,无法解决长任务对于短任务的阻塞问题。我们知道 CPU 在调度的时候,都会优先运行短的任务,因为这样等待的总时间是少的。同样的道理,我们希望在 Spark 上面也是如...…
-
Spark Scheduler in Standalone Mode 分析
文中代码基于Spark 版本2.3.0目前Spark 在 Standalone Mode 下,所支持的 Task 调度策略有 FIFO 和 FAIR 两种策略。RDD 执行流程在介绍Capacity Scheduler之前,粗略说一下 RDD 如何执行的。 RDD 对象中包括 dependency 属性,表明当前 RDD 与父 RDD 的依赖关系。 DAGScheduler 利用dependency依赖关系将 RDD 按照宽依赖,也就是需要进行 shuffle的依赖作为边界,划分成为一...…
-
SparkSQL Adaptive Execution详解
SparkSQL Adaptive Execution详解原有问题在使用 Spark SQL 时,会通过 spark.sql.shuffle.partitions 指定 Shuffle 时 Partition 个数。通过数据量的大小,估计一个合理的Partition 个数。Partition大小的最佳实际是保持一块100M 左右(Adaptive Execution 功能中块大小默认64M),所以一般会用表的数据量均量和单块大小相除,得到一个Partition 的数量值,在这个基础上微调。...…
-
SparkSQL Join优化笔记
Spark SQL 数据Join优化笔记问题描述从开始定位SparkOutOfMemoryError这一异常之前,就有两个问题困扰着我。一个就是有 Spill 机制的存在,为什么还会 OOM 呢?这个问题在之前的文字中已经解释了根本原因。还有一个问题是数据量不大的情况为什么会进行 sort merge join 呢?这样我在小数据量的情况下,shuffle 操作带来了很多不必要的损耗。代码分析在SparkStrategy中的JoinSelection类中找到将关联 logical 转换成...…