关于本文

 虽然接触 Java 已经十余年之久,可惜学习之初的笔记文档没能很好地保存下来。本文是近几年工作学习中遇到的一些零散的知识点,包括了 基础概念、实用的编程技巧、代码可读性、设计模式、性能优化(工具 & 编码)、测试相关、JVM 相关、常用的工具和常见问题。本着好记性不如烂笔头的初衷,在不断地踩坑和爬坑的过程中,慢慢地记录成文。期待着本文能起到抛砖引玉的作用,以看到大家的真知灼见。

基础知识

注解

GuardedBy

 @GuardedBy 注解可以作用于某一个属性或者方法,约定在访问这些被注解标记的资源时,能被同步代码块保护着。简单的使用案例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@GuardedBy("obj")
private ConcurrentMap<String, String> map = new ConcurrentHashMap<>();
private final Object obj = new Object();

public void put(String k, String v) {
synchronized (obj) {
map.put(k, v);
}
}

/**
* If you use `error prone` tool to check this, this annotation should be `@SuppressWarnings("GuardedBy")`
* {@see https://errorprone.info/bugpattern/GuardedBy}
* {@see https://github.com/apache/druid/pull/6868#discussion_r249639199}
*/
@SuppressWarnings("FieldAccessNotGuarded")
public void remove(String k) {
map.remove(k);
}

@Override
public String toString() {
synchronized (obj) {
return "GuardedByExample{" +
"map=" + map +
'}';
}
}

Tips: Code Example from Apache Druid;另外,error-prone 工具支持对多种版本@GuardedBy 进行检查

阅读全文 »

基本概念

概述

 Apache Druid™ 是目前非常流行的高性能的,分布式列存储的 OLAP 引擎(准确来说是 MOLAP)。它是一款可以快速(实时)访问大量的、很少变化的数据的系统。并被设计为,在面对代码部署、机器故障和生产系统的其他可能性问题时,依旧能 100% 地正常提供服务

Apache Druid Pumpkin

(图片来源:Vadim Ogievetsky 在万圣节的个人作品,已获得授权)

特性

分析事件流

 Druid 支持对 event-driven 数据进行快速地高并发查询。还可以实时地摄入流式数据,并提供亚秒级查询能力,以支持强大的 UI 交互

创新的架构设计

 Druid 是一种新型数据库,它结合了 OLAP 分析数据库、时间序列数据库 和 全文检索 的思想,以支持流式体系架构下的大部分应用场景

构建事件驱动的数据栈

 Druid 天然集成了消息队列(Kafka、AWS Kinesis 等)和数据湖(HDFS、AWS S3 等),使得其非常适用于流式总线和流处理器的查询层

解锁新的工作流

 Druid 旨在对实时数据和历史数据进行快速地即时分析。使用可快速更替的查询,进行趋势解释,数据探索,以响应各种分析诉求

多环境部署

 Druid 可以部署在任何的 *NIX 商用硬件上,无论是在云端还是内部部署。Druid 是 Cloud Native 的,这意味着集群扩容和缩容,就像添加和删除进程一样简单

多数据源摄入

 Druid 支持将多种外部数据系统作为数据源,进行数据摄入,包括 HadoopSparkStormKafka

多版本控制

 多版本控制(MVCCMulti-Version Concurrent Control),主要是为了解决多用户操作同一条记录时的并发问题。MVCC 设计思路是,在并发访问数据库时,不使用粗暴的行锁,而是在事务型操作更新数据时,生成一个新版本的数据。如此,可以保证读写分离,避免了读写操作互相阻塞,以提高并发性能。另外,约束任意时刻只有最新版本的记录是有效的,即也保证了数据的一致性

 而 Druid 中是使用数据更新时间来区分版本,历史节点只加载最新版本的数据。同时,实时数据索引离线数据批量覆盖同时进行的 Lambda 架构设计,既满足了实时响应的需求,又确保了数据的准确性

易于运维

 Druid 集群可以做到 Self-healing 和 Self-balancing。如果 Druid 服务器发生故障,系统将会自动绕过损坏的路由,直到这些机器恢复或被替换掉。在扩缩容集群的时候,只需要增加或下线服务器,集群本身会在后台自动 re-balance。Druid 在设计上保证了可以全天候工作,不会因为任何原因而停机,包括配置更改和集群升级

阅读全文 »

什么是人工智能

 人工智能Artificial Intelligence, AI)亦称机器智能,是指由人工制造出来的系统所表现出来的智能。 — wikipedia.org

 从 深蓝到 AlphaZero,人工智能的智力水平、普适性、学习能力 正在以爆炸式地速度快速发展;
 从 棋类到 医学,人工智能开始在各类应用领域,都在大展身手;
 从 CPU / GPU 到 TPU,人工智能的计算能力正向着无法穷举的极限不断逼近 …

 但是,我们并不浮躁,踏踏实实地点亮 AI 知识树的每个枝叶,才是我们每位富有科学精神的人所应该做的

关于本文

 我们将分为三块对 AI 进行诠释

 首先,将介绍人工智能的主流思想实用技巧,通过一些耳熟能详的有趣定理,我们可以对人工智能有些直观、初步的认识;随后,言归正传,我们将开始接触 AI 领域的几大理论支柱,由浅入深地学习 统计学微积分线性代数概率论 等知识体系;最后,落地到实践,我们需要紧跟人工智能的技术发展前沿,对重大的突破性项目进行了解、学习,以及运用。如此,对人工智能领域进行横向分层,可以很方便地找到我们学习的突破点

 不过,出于文章编排的考虑,可能部分编码就要放在其他博文中了,如有不便,还望见谅(Python、Prolog、R、Java)。本文持续更新中,若有不妥之处,还请不吝赐教哈 (^o^)/

主流思想

演绎法 & 溯因法 & 归纳法

(利用 Axure™ 绘制而成)

实用技巧

Occam 剃刀原理

 奥卡姆剃刀(Occam´s Razor),意为简约之法,是由 14 世纪逻辑学家、圣方济各会修士奥卡姆的威廉提出的一个解决问题的法则,即"切勿浪费较多资源,去做'用较少的资源,同样可以做好'的事情",相同思想见于郑板桥的删繁就简三秋树

阅读全文 »

关于本文

 本文主要是为了,记录给 Apache Druid / Apache Eagle / Apache Flink / Apache HBase / Apache Kafka / Apache Superset / Apache ZooKeeper & Apache Curator / TensorFlow / Alibaba DataX 开源项目贡献代码,尽自己一点绵薄之力的过程

 文章最后,总结了一些经验之谈,期冀能帮助到同样热爱开源、也想成为 PMC 的小伙伴们

阅读全文 »

Presto 是什么?

Presto™ (PrestoDB™) is an open source distributed SQL query engine for running interactive analytic queries against data sources of all sizes ranging from gigabytes to petabytes.

Presto™ (PrestoSQL™, a.k.a. Trino™) is a high performance, distributed SQL query engine for big data.

下文将详细介绍二者的区别

基本概念

组件

Coordinator

 负责管理 Worker 和 MetaStore 节点,以及接受客户端查询请求,并进行 SQL 的语法解析(Parser)、执行计划生成与优化(Planner)和查询任务的调度(Scheduler)

Coordinator 通过 RESTful 接口与 Client 和 Worker 交互

Worker

 负责具体的查询计算和数据读写

Discovery Server

 负责发现集群的各个节点,用于节点间心跳监控

一般 Discovery Server 混布在 Coordinator 节点上,也支持单独部署
阅读全文 »