翻译自Spark官网文档,版本:2.3.0 spark内存管理概览 Spark很大一部分内存用于storage和execution,即存储和执行任务。execution memory指的是在shuffle,join,sorts,aggregation操作中使用的内存,storage memory指的是用于整个集群缓存数据和传播中间数据的内存。 spark中storage和execution分享一个统一的区域(M),当没有execution memory被使用,storage可以占用全部可用内存,反之亦然。storage占用execution memory时且有必要时execution可以驱逐storage,直到storage memory使用量低于一个阈值(R)。也就是说R描述了一个小于M的缓存区域,绝不会被驱逐。execution占用storage memory时因为实现复杂所以storage不会驱逐execution。 spark有两个相关配置项: 1. saprk.memory.frac 继续阅读 >>


高朴 18/04/09 23:30:55
题目是:给一个数组:[1, 2, 2],找出所有子数组,例如这个数组的子数组有:[], [1], [2], [1, 2], [2, 2], [1, 2, 2] 看这篇博客得到了思路:巧用递归求字符串的子集 基本思想就是:求子集,每一位都只有两种状态,在子集中或不在子集中。那把每种情况都输出就可以了。 import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; public class Test { static Set<List<Integer>> set = new HashSet<>(); public static void main(String[] args) { int[] arr = {1, 2, 2, 3}; boolean[] booleans = 继续阅读 >>


高朴 18/03/20 12:43:49
今天要搞清楚的问题是为什么需要上面那个被黄色框圈住的“抽象装饰器类”。 装饰器模式实现了不破坏原有类的情况下动态扩展一个类的功能。 “为什么需要抽象装饰器类”,搞清楚这个问题最好的办法是手写一个装饰器模式,然后去掉中间的抽象装饰器类,看看会发生什么。 下面根据最上面的UML图写一下代码: // 顶层接口 public interface Shape { void draw(); void f1(); void f2(); } 下面是一个提供了抽象装饰器类的装饰器类实现方式: // 抽象装饰器类 public abstract class ShapeDecorator implements Shape { protected Shape decoratedShape; public ShapeDecorator(Shape decoratedShape){ this.decoratedShape = decoratedSha 继续阅读 >>


高朴 18/03/12 23:32:53
避免创建不必要的对象,这一条告诉我们,要尽可能的重用对象。书中举了几个例子来讲解一些无意识的创建不必要的对象的情况。 1. String类的使用 String str = new String("abc"); 上面这条代码执行过后,会生成两个对象,参数”abc”本身就是一个String对象,new String()又会产生新的String对象。 正确的做法如下: String str = "abc"; 无论这条语句执行多少次,对象只会有一个。 2. 自动装箱机制 long sum = 0L; long start = System.currentTimeMillis(); for (int i = 0; i< Integer.MAX_VALUE; i++) { sum += i; } long end = System.currentTimeMillis(); System.out.println(sum + " 用时: " + (end - star 继续阅读 >>


高朴 18/03/11 22:43:40
第一章1.3节提出了一个概念“版本空间”,搞明白之后其实是蛮简单的一个东西,按书上说的西瓜问题的假设空间如下(Ø表示不存在好瓜坏瓜之分): 编号 色泽 根蒂 敲声 1 * * * 2 青绿 * * 3 乌黑 * * 4 * 蜷缩 * 5 * 硬挺 * 6 * 稍蜷 * 7 * * 浊响 8 * * 清脆 9 * * 沉闷 10 青绿 蜷缩 * 11 青绿 硬挺 * 12 青绿 稍蜷 * 13 乌黑 蜷缩 * 14 乌黑 硬挺 * 15 乌黑 稍蜷 * 16 青绿 * 浊响 17 青绿 * 清脆 18 青绿 * 沉闷 继续阅读 >>


高朴 18/01/31 23:39:55
上面这张图就可以很清晰的说明这个问题。(图中最小的方块代表一个partition,包裹partition的方块是RDD,忽略颜色) Job Spark的Job来源于用户执行action操作,就是从RDD中获取结果的操作,而不是将一个RDD转换成另一个RDD的transformation操作。 Stage Spark的Stage是分割RDD执行的各种transformation而来。如上图,将这些转化步骤分为了3个Stage,分别为Stage1,Stage2和Stage3。这里最重要的是搞清楚分割Stage的规则,其实只有一个:从宽依赖处分割。宽依赖概念请戳这里 知道了这个分割规则,其实还是有一点疑惑,为什么这么分? 其实道理蛮明显的,子RDD的partition会依赖父RDD中多个partition,这样就可能会有一些partition没有准备好,导致计算不能继续,所以就分开了,直到准备好了父RDD中所有partition,再继续进行将父RDD转换为子RDD的计算。而窄依赖完全不会有 继续阅读 >>


高朴 18/01/24 23:04:34
我的新博客地址:geekgao.cn RDD被设计为可以记录依赖关系,关系可以分为两类:窄依赖和宽依赖。 窄依赖:表示父亲 RDD 的一个分区最多被子 RDD 一个分区所依赖。 宽依赖:表示父亲 RDD 的一个分区可以被子 RDD 的多个子分区所依赖。 如下图,左边是窄依赖,右边是宽依赖: 作者:gaopu12345 发表于 2018/01/23 23:24:28 原文链接 https://blog.csdn.net/gaopu12345/article/details/79145980 阅读:140 继续阅读 >>


高朴 18/01/23 23:24:28
下面使用到了两个插件,maven-shade-plugin和addjars-maven-plugin。凡是讲到打包,前一个插件基本都有说,但是第二个插件很少提到。 后面这个插件解决了这样一个问题:我有一些本地jar包,不是使用maven引入的,我该如何将这些本地jar包打入最终的jar包中呢? 有些人说可以使用system类型的dependency引入本地jar包。 有些人说system类型的dependency绝不该使用。而应该将jar包装到自己本地的仓库中,然后在dependency中按照正常引入方式引用自己本地的jar包。 正确方式是下面的,但是操作起来对新手就很不友好,我不就是想打个包嘛,搞得这么复杂。下面第二个插件addjars-maven-plugin就是将正确做法做成了一个插件,只需要提供jar包的路径就可以成功打包。 <plugin> <groupId>org.apache.maven.plugins</groupId> 继续阅读 >>


高朴 17/11/21 20:53:55
文件生产速度过快,flume会出现消费不及的现象,下面这个参数调节一下应该会有改善: maxBackoff 这个参数代表当source向channel放数据时检测到channel满了后等待多久再进行重试,默认是4秒。如果已经出现消费不及现象,channel频繁被撑满,然而满了后还要等很久,造成文件越来越多,降低这个参数可以有效缓解消费不及。 官网链接:http://flume.apache.org/FlumeUserGuide.html#spooling-directory-source 作者:gaopu12345 发表于 2017/11/21 20:38:26 原文链接 https://blog.csdn.net/gaopu12345/article/details/78596686 继续阅读 >>


高朴 17/11/21 20:38:26
问题触发的环境:kafka source + memory channel + hdfs sink 日志截图如下: 这里说的内容是:queue空间不足。sink好像没有紧跟source,或者是buffer大小太小。这里的queue代表什么?sink没有紧跟source的具体含义是什么?buffer又是什么?我分析源代码后,将结果在下面铺开向大家展示。 memory channel内部结构 memory channel内部有三个队列,分别是图中的putList,queue,takeList。有两个参数来控制他们的大小,默认值都是100,分别是: capacity:代表queue的大小,主要的存储event的部分。 transactionCapacity:代表putList和takeList的大小。 channel是如何被使用的 channel之上有一把锁,当source主动向channel放数据或者sink主动从channel取数据时,会抢锁,谁取到锁, 继续阅读 >>


高朴 17/09/10 16:27:52