Jark's Blog

当你的才华还撑不起你的野心时,你就应该静下心来学习。


  • 首页

  • 归档

  • 分类

  • 标签

  • 演讲

  • 关于

Flink 原理与实现:内存管理

发表于 2016-04-29   |   分类于 Flink   |  

如今,大数据领域的开源框架(Hadoop,Spark,Storm)都使用的 JVM,当然也包括 Flink。基于 JVM 的数据分析引擎都需要面对将大量数据存到内存中,这就不得不面对 JVM 存在的几个问题:

  1. Java 对象存储密度低。一个只包含 boolean 属性的对象占用了16个字节内存:对象头占了8个,boolean 属性占了1个,对齐填充占了7个。而实际上只需要一个bit(1/8字节)就够了。
  2. Full GC 会极大地影响性能,尤其是为了处理更大数据而开了很大内存空间的JVM来说,GC 会达到秒级甚至分钟级。
  3. OOM 问题影响稳定性。OutOfMemoryError是分布式计算框架经常会遇到的问题,当JVM中所有对象大小超过分配给JVM的内存大小时,就会发生OutOfMemoryError错误,导致JVM崩溃,分布式框架的健壮性和性能都会受到影响。

所以目前,越来越多的大数据项目开始自己管理JVM内存了,像 Spark、Flink、HBase,为的就是获得像 C 一样的性能以及避免 OOM 的发生。本文将会讨论 Flink 是如何解决上面的问题的,主要内容包括内存管理、定制的序列化工具、缓存友好的数据结构和算法、堆外内存、JIT编译优化等。

阅读全文 »

Flink 原理与实现:如何处理反压问题

发表于 2016-04-26   |   分类于 Flink   |  
流处理系统需要能优雅地处理反压(backpressure)问题。反压通常产生于这样的场景:短时负载高峰导致系统接收数据的速率远高于它处理数据的速率。许多日常问题都会导致反压,例如,垃圾回收停顿可能会导致流入的数据快速堆积,或者遇到大促或秒杀活动导致流量陡增。反压如果不能得到正确的处理,可能会导致资源耗尽甚至系统崩溃。那么 Flink 是怎么处理反压的呢?
阅读全文 »

Flink官方文档翻译:安装部署(集群模式)

发表于 2016-02-26   |   分类于 分布式系统   |  
本文主要介绍如何将Flink以分布式模式运行在集群上(可能是异构的)。
阅读全文 »

Flink官方文档翻译:安装部署(本地模式)

发表于 2016-02-26   |   分类于 分布式系统   |  
本文主要介绍如何将Flink以本地模式运行在单机上。
阅读全文 »

迟到的2015年终总结

发表于 2016-01-10   |   分类于 随笔生活   |  

这是一篇迟到了很久很久的2015年终总结……

这一年,是我人生的又一个转折点。因为,我终于走出了校园,迈进了社会。阿里是一座大学,让我很快就适应了这里的生活。尤其是园区的五个食堂可以每天都吃不同的食堂,午饭有补贴、晚饭免费、夜宵免费,害的我半年就胖了10斤…斤…

言归正传,今年主要就分为两个阶段,前半年是在校的毕业期,后半年是入职的菜鸟期。

阅读全文 »

高效Macbook开发之道(工具篇)

发表于 2015-11-21   |   分类于 杂项资源   |  
程序员就像工匠,若想高效地编写出漂亮的代码,就得要有一把好"锤子"——好的开发工具。就像老罗提出匠心与情怀,程序员对于手中的工具也是饱含工匠情怀的。所以,本文就讲讲那些我用出情怀的高效工具们。
阅读全文 »

Clojure学习笔记(三):并发与引用

发表于 2015-11-06   |   分类于 编程语言   |  

很多人是为了更好地进行并发编程而选择了Clojure,但Clojure所有的数据都是只读的,除非你使用引用类型(Vars、Ref、Atom、Agent)来标明它们是可以修改的。Clojure处理并发的思路与众不同,采用的是Software Transactional Memory (STM)来实现的,即软事务内存。你可以将STM想象成数据库,只不过是内存型的,它只支持事务的ACI,也就是原子性、一致性、隔离性,但是不包括持久性,因为状态的保存都在内存里。引用类型是一种可变引用指向不可变数据的一种机制。Clojure的并发API分为四种模型:

  1. 管理Thread local变量的Var。
  2. 管理协作式、同步修改可变状态的Ref
  3. 管理非协作式、同步修改可变状态的Atom
  4. 管理异步修改可变状态的Agent
阅读全文 »

Clojure学习笔记(二):语法

发表于 2015-11-06   |   分类于 编程语言   |  

定义函数

  • 匿名函数
    匿名函数(fn) (fn [x y] (+ x y)) 创建一个匿名函数, fn 和 lambda 类似,fn还有一个简写形式 #(+ %1 %2)。如果只有一个参数,那么可以用 % 代替 %1

  • def
    def可以将一个匿名函数绑定到一个name上。

    (def my-add (fn [x y] (+ x y)))
  • defn

    defn 是 def 与 fn 的简写。一般我们也都是用defn。

    (defn my-add
    "this is a comment"
    [x y]
    (+ x y))
    (println (my-add 3 4)) ; -> 7

    ; 函数的重载
    (defn my-add
    ([x y]
    (+ x y))
    ([x y z]
    (+ x y z)))
    (println (my-add 3 4)) ; -> 7
    (println (my-add 3 4 5)) ; -> 12
阅读全文 »

Clojure学习笔记(一):数据结构

发表于 2015-11-06   |   分类于 编程语言   |  

最近学习了Clojure,好记性不如烂笔头,把一些知识点记录了下来。原本想放在一篇文章里的,谁知太长了,只好分成了三篇,本文是第一篇。由于是笔记,比较杂乱,建议阅读前先系统地学习Clojure(比如 Clojure - Function Programming for JVM),然后用本笔记知识梳理。

概述

Clojure是一个动态类型的,运行在JVM(JDK5.0以上),并且可以和java代码互操作的函数式语言。这个语言的主要目标之一是使得编写一个有多个线程并发访问数据的程序变得简单。

Clojure的发音和单词closure是一样的。Clojure之父是这样解释Clojure名字来历的

“我想把这就几个元素包含在里面: C (C#), L (Lisp) and J (Java). 所以我想到了 Clojure, 而且从这个名字还能想到closure;它的域名又没有被占用;而且对于搜索引擎来说也是个很不错的关键词,所以就有了它了.”

阅读全文 »

Thrift 实践

发表于 2015-10-07   |   分类于 程序设计   |  

上一篇文章我们了解了thrift的概念以及类型系统,本文我们通过一个简单的实例来更深入地了解thrift的使用。我们的实例非常简单,就是实现一个登录注册功能,其用户名密码缓存在内存中。

编写thrift文件

我们编写一个account.thrift的文件。

namespace java me.wuchong.thrift.generated

enum Operation{
LOGIN = 1,
REGISTER = 2
}

struct Request{
1: string name,
2: string password,
3: Operation op
}

exception InvalidOperation{
1: i32 code,
2: string reason
}

service Account{
string doAction(1: Request request) throws (1: InvalidOperation e);
}
阅读全文 »
1…345…9
WuChong

WuChong

当你的才华还撑不起你的野心时,
你就应该静下心来学习。

90 日志
12 分类
77 标签
RSS
Creative Commons

Links

Apache Flink
© 2013 - 2024 WuChong
由 Hexo 强力驱动
主题 - NexT.Mist