- 博客(318)
- 收藏
- 关注
原创 2020。
2020年最后一天的最后一个小时了,还是来随便写两句吧。技术/工作有幸见证了我司业务的急速扩张,当然也全程参与了大数据架构的迭代与演进过程,特别是主导了实时数仓体系的建设。累,但收获颇丰,非常值得。Flink已经成为流式计算的事实标准,新特性层出不穷,越来越强大;Zeppelin为SQL任务平台化提供了巨大的便利;ClickHouse、TiDB分别在特定领域的OLAP、HTAP方面发光发热。...
2020-12-31 23:59:01
379
6
原创 解决TiKV节点JBD2进程I/O占用高的问题
今天事情甚多,草草写一篇,尽量赶在1点之前休息。问题我们的TiDB集群上线以来,所有TiKV节点的所有磁盘I/O Util指标总是偏高,大多数时候在50%以上,极端情况下接近90%。集群采用的阿里云ECS配备的都是PL2级别的ESSD云盘(标称吞吐量峰值750MB/s、10w IOPs,且添加了挂载参数noatime和nodelalloc),主要负载是通过DM同步与简单查询50+张业务库大表,...
2020-12-28 23:59:19
1209
3
原创 聊聊ClickHouse中的低基数(LowCardinality)类型
2020年快要过去了,写博客的习惯还是得捡起来。最近刚刚忙完搬家的事情,抽出一点时间简单聊两句。为什么要有LowCardinality在常见数据库系统的类型体系中,字符串是最灵活、表意性最强的类型,但是存储成本无疑也最高。ClickHouse提供了两种简单字符串的更优的存储方式,即:存储固定长度(按字节数计)字符串的FixedString类型,以及将字符串转为定长整形枚举值的Enum类型...
2020-12-27 23:22:40
4961
2
原创 TiDB 101(TiDB入门分享讲义)
昨天为公司多个部门的小伙伴们做了关于TiDB的科普,把写的讲义直接贴在下面吧。(Markdown直接渲染成网页真的比做PPT简便太多了TiDB 101Part I - IntroductionWhat is TiDB?TiDB is an open-source, distributed, relational databaseIt is NewSQL -- takin...
2020-12-10 22:38:28
918
1
原创 漫谈Google Percolator分布式事务
前言前段时间忙双11忙到废寝忘食,这期间又被各种奇奇怪怪的小病折腾了半个多月,整个人状态不是很好,博客也连续吃灰到现在,请看官勿怪。好在今天感觉还不错,可以继续写点东西了。为了应对业务数据的爆炸性增长以及MySQL业务库分库分表现状的各种不便,笔者的团队近期用一周时间突击调研TiDB,并部署了由16个节点组成的TiDB集群,同时开始逐渐探索利用它替代MySQL的可能性。在调研过程中,我们了解到...
2020-12-05 23:46:50
850
1
原创 浅谈Java SPI原理与其在JDBC、Flink中的应用
API vs SPIAPI(Application Programming Interface)的概念对我们来说已经是见怪不怪了。在日常开发过程中,我们需要调用平台/框架提供的API,而我们的下游应用也需要调用上游提供的API。一句话:API站在应用的角度定义了功能如何实现。但是,如果我们作为服务提供方,想要丰富现有的系统,加入一些原本不具备的相对完整的能力,若是直接hack代码的话,不仅要新...
2020-11-03 23:01:13
508
1
原创 高吞吐量Flume Agent调优小结
前言所有电商企业在一年一度的双11都要迎来大促与大考,我司也不例外(所以最近真是前所未有的忙乱)。前段时间在配合执行全链路压测的过程中,发现平时不太关注的Flume配置可能存在瓶颈。Flume在笔者负责的实时计算平台里用于收集所有后端访问日志和埋点日志,其效率和稳定性比较重要。除了及时扩容之外,也有必要对Flume进行调优。今天在百忙之中挤出一点时间来写写。Flume系统以一个或多个Flume...
2020-10-27 22:51:44
1035
2
原创 Kafka Partition重分配流程简析
节日快乐~今天是属于广大程序员的节日,祝自己快乐hhhhhh随着业务量的急速膨胀和又一年双11的到来,我们会对现有的Kafka集群进行扩容,以应对更大的流量和业务尖峰。当然,扩容之后的新Kafka Broker默认是不会有任何Topic和Partition的,需要手动利用分区重分配命令kafka-reassign-partitions将现有的Partition/Replica平衡...
2020-10-24 22:52:39
2551
原创 大数据流的在线Heavy Hitters算法(下篇):基于略图的方法
Continue...之前有好几篇分上下篇写的文章都鸽了,惭愧惭愧。为了不食言,今天继续聊Heavy Hitters(频繁项)算法之基于略图(Sketch)的方法。时间紧张且限于水平,写得简单些,看官勿怪。什么是略图顾名思义,略图(Sketch)就是能够大致准确地描述一份数据集的摘要。当数据量非常大时,往往不能直接放入内存中,普通的查找树、哈希表等受制于数据规模,自然也就没有用武之地了。然而...
2020-10-20 21:11:24
2059
原创 Flink流量控制与反压机制完全总结
前言笔者最近回顾自己对Flink技术栈细节的理解,发现对Flink的网络栈、流控与反压这一套机制存在比较大的盲区。虽然平时多次处理过作业反压的问题,但是不完全理解背后的实现显然说不过去。于是专门写一篇总结,站在大佬们的肩膀上彻底搞清楚Flink是怎么做流控与处理反压的。Flink网络传输的数据流向Flink网络传输的数据流向如下图所示。Sender在发送数据时,首先写入Tas...
2020-10-19 23:11:04
1611
1
原创 聊聊ClickHouse MergeTree引擎的固定/自适应索引粒度
前言我们在刚开始学习ClickHouse的MergeTree引擎时,建表语句的末尾总会有SETTINGS index_granularity = 8192这句话(其实不写也可以),表示索引粒度为8192。在每个data part中,索引粒度参数的含义有二:每隔index_granularity行对主键组的数据进行采样,形成稀疏索引,并存储在primary.idx文件中;每隔index_gr...
2020-10-17 22:35:12
4418
1
原创 大数据流的在线Heavy Hitters算法(上篇):基于计数器的方法
Question!有海量(e.g. 日均千亿级别)的访问日志流,如何在不要求结果100%精确的前提下,尽量快速地统计出被访问次数最多的一些域名,以及它们的访问频率?Heavy Hitters(频繁项)以及它衍生出来的Top-K(前K最高频项)是大数据和流式计算领域非常经典的问题,并且在海量数据+内存有限+在线计算的前提下,传统的HashMap + Heap-Sort方式几乎不可行,需要利用...
2020-10-15 23:07:09
4830
1
原创 Flink SQL 1.11 on Zeppelin集成指南
前言大数据领域SQL化开发的风潮方兴未艾(所谓"Everybody knows SQL"),Flink自然也不能“免俗”。Flink SQL是Flink系统内部最高级别的API,也是流批一体思想的集大成者。用户可以通过简单明了的SQL语句像查表一样执行流任务或批任务,屏蔽了底层DataStream/DataSet API的复杂细节,降低了使用门槛。但是,Flink SQL的默认开发方式是通过J...
2020-10-11 23:59:10
903
1
原创 ZooKeeper快速领导选举(Fast Leader Election)机制解析
前言假期马上就要过去了,还是写点什么找找状态比较好。翻看之前的文章,发现自己说过不少ZooKeeper的应用,但还没有真正涉及到它的原理,那么本文就找个切入点来聊聊吧。Leader选举众所周知,ZK是典型的Leader-Follower架构的分布式框架,通过ZooKeeper原子广播(ZooKeeper Atomic Broadcast, ZAB)协议来保证最终一致性。只有Leader能处理...
2020-10-07 21:36:48
1260
原创 基于Flink+ClickHouse打造轻量级点击流实时数仓
前言今天事情又比较多,写得言简意赅一些,看官勿怪。Flink和ClickHouse分别是实时计算和(近实时)OLAP领域的翘楚,也是近些年非常火爆的开源框架,很多大厂都在将两者结合使用来构建各种用途的实时平台,效果很好。关于两者的优点就不再赘述,本文来简单介绍笔者团队在点击流实时数仓方面的一点实践经验。点击流及其维度建模所谓点击流(click stream),就是指用户访问网站、App等W...
2020-09-27 23:14:05
2377
2
原创 Flink on YARN的第三种部署模式:Application Mode
前言短文状态继续。长久以来,在YARN集群中部署Flink作业有两种模式,即Session Mode和Per-Job Mode,而在Flink 1.11版本中,又引入了第三种全新的模式:Application Mode。本文先回顾两种传统模式的做法与存在的问题,再简要介绍Application Mode。传统部署模式Session模式Session模式是预分配资源的,也就是提前根据指定的...
2020-09-23 23:14:03
5572
3
原创 浅谈Linux管道(pipe)
前言管道(pipe)是Linux系统中重要的进程间通信(IPC)机制,又分为匿名管道(anonymous pipe)和命名管道(named pipe/FIFO)两种。今天用脑过度,几句话简单谈论一下。匿名管道当我们在一般语境下提起管道这个词时,说的就是匿名管道。匿名管道在两个有亲缘关系的进程(即存在父子或兄弟关系的进程)之间创建,本质上是由内核管理的一小块内存缓冲区,默认大小由系统中的PIP...
2020-09-22 23:28:14
1419
1
原创 聊聊Java中的关闭钩子(shutdown hook)
今天折腾了半天才回到家,写篇简单的,然后趁早洗洗睡吧。在Java程序退出时——尤其是非正常退出时,我们可能需要先执行一些善后工作,如关闭线程池、连接池、文件句柄等,即所谓“优雅停机”(graceful shutdown)。如何保证善后工作的代码能够被执行到呢?Java为用户提供了关闭钩子(shutdown hook),它在以下情景都会被调用:程序正常退出,即最后一个非守护线程结束时;程序中...
2020-09-21 23:03:23
4696
原创 手撕一个LRU Cache
前言今天时间紧张,借一道经典面试题简单聊两句吧。LeetCode 146 - LRU Cache最近最少使用缓存(LRU Cache)是一种简单而高效的缓存机制,其思想基于局部性原理,在CPU缓存管理、操作系统内存管理以及Redis、Memcached等内存数据库中有非常重要的地位。下面来按照题目要求实现一个最简单的LRU Cache。Design a data structure th...
2020-09-17 22:34:39
534
原创 ClickHouse MergeTree变得更像LSM Tree了?——Polymorphic Parts特性浅析
前言笔者在之前的文章中已经提到过,MergeTree引擎族是ClickHouse强大功能的基础。MergeTree这个名词是在我们耳熟能详的LSM Tree之上做减法而来——去掉了MemTable和Log。也就是说,向MergeTree引擎族的表插入数据时,数据会不经过缓冲而直接写到磁盘。官方文档中有如下的描述:MergeTree is not an LSM tree because it ...
2020-09-14 22:18:10
4398
1
原创 从AggregateFunction.merge()到Flink会话窗口实现原理
前言在我们使用Flink DataStream API编写业务代码时,aggregate()算子和AggregateFunction无疑是非常常用的。编写一个AggregateFunction需要实现4个方法:public interface AggregateFunction<IN, ACC, OUT> extends Function, Serializable { A...
2020-09-13 21:57:05
2841
5
原创 Flink CEP的基石:NFA-b自动机原理简介
前言Flink的复杂事件处理(complex event processing, CEP)库能够在无界数据流中通过匹配定义好的事件模式来发现一系列事件之间的关联规律,从而有效支持趋势分析、风险监控、欺诈检测等业务场景。它提供了一套简单易用、表达性强的API,例如,在10秒的时间窗口内检测事件的报警级别:env.setStreamTimeCharacteristic(TimeCharacteri...
2020-09-09 22:34:56
1184
原创 Kafka Partition的消费分配策略
前言在之前的一篇文章中,笔者介绍了Kafka Consumer Group(消费者组)以及Rebalance(重平衡)的概念:为了使得Consumer易于组织、可扩展以及更好地容错,Kafka将一个或多个Consumer组织为Consumer Group,即消费者组。Consumer Group的唯一标识就是group.id。Group内的所有Consumer共同消费已订阅的各个Topic的...
2020-09-06 22:25:19
3155
原创 ClickHouse新特性之SQL化用户配置
Friday night,写篇超短文吧。在之前的ClickHouse版本中,我们只能通过修改users.xml文件来配置用户及相关的参数(权限、资源限制、查询配额等),不是很方便。好在从20.5版本起,ClickHouse开始支持SQL化的用户配置(如同MySQL、PostgreSQL一样),易用性增强了很多。SQL化用户配置默认是关闭的,要启用它,需要在users.xml中的一个用户(一般就...
2020-09-04 22:07:34
1055
原创 通用对象池化框架Apache Commons Pool 2简析
前言我们知道,创建Java对象会涉及到对象初始化、内存分配、类加载等多个步骤。当对象比较重量级时,频繁创建对象会带来可观的性能开销,所以在上古时代(大雾)就产生了对象池化(object pooling)的技术。顾名思义,对象池中维护了一批已经创建好的重量级对象,要使用时就从中取出一个,用完就归还到池里,通过复用对象来提高效率。我们在日常工作中时刻都在应用池化技术:线程池、数据库连接池、网络连接...
2020-09-02 22:19:19
1842
原创 Actor模型与Akka Actor体系基础总结
前言最近用业余时间把Flink的RPC基础设施翻了个底朝天,又与之前分析过的Spark RPC机制做了一些对比,越发觉得Actor模型甚为精妙,值得简单记录一下,顺便也可作为日后解析Flink RPC机制的基础入门。Actor模型Actor模型由Hewitt、Bishop和Steiger在1973年通过论文《A Universal Modular Actor Formalism for Ar...
2020-09-01 23:17:40
524
原创 Flink SQL w/ Blink Planner执行流程解析(上篇)
Foreword大数据领域SQL化的风潮方兴未艾(所谓"Everybody knows SQL"),Flink自然也不能“免俗”。Flink SQL是Flink系统内部最高级别的API,也是流批一体思想的集大成者。用户可以通过简单明了的SQL语句像查表一样执行流任务或批任务,屏蔽了底层DataStream/DataSet API的复杂细节,降低了使用门槛。那么,一条Flink SQL语句是如何...
2020-08-27 23:05:08
2497
1
原创 Flink RocksDB状态后端参数调优
Foreword截至当前,Flink作业的状态后端仍然只有Memory、FileSystem和RocksDB三种可选,且RocksDB是状态数据量较大(GB到TB级别)时的唯一选择。RocksDB的性能发挥非常仰赖调优,如果全部采用默认配置,读写性能有可能会很差。但是,RocksDB的配置也是极为复杂的,可调整的参数多达百个,没有放之四海而皆准的优化方案。如果仅考虑Flink状态存储这一方面,我...
2020-08-26 23:19:04
2238
1
原创 ClickHouse遇见RoaringBitmap
Q&AQ:如图。A:当然是自带的。其实RoaringBitmap正是ClickHouse位图的底层实现(笑RoaringBitmap的预备知识请见这里。在CH中产生位图使用普通函数bitmapBuild可以由无符号整形数的数组直接产生位图,e.g.WITH bitmapBuild([32, 65, 127, 1026]) AS bmSELECT bm,toTyp...
2020-08-21 22:42:09
5622
原创 聊聊Java WeakHashMap背后的事情
前言本月还没有写过Java相关的东西,今天终于挤出点时间来了,弄一篇基础知识吧。WeakHashMap是平时常见的HashMap的变种,它是基于弱引用(WeakReference)的。我们已经知道,不管内存是否足够,弱引用对象都会随着GC被回收,所以WeakHashMap特别适用于内存敏感的局部缓存场景。本文简单探究一下它的部分实现细节。属性WeakHashMap的属性比Ha...
2020-08-19 21:50:06
262
原创 漫谈SIMD、SSE指令集与ClickHouse向量化执行
前言ClickHouse之所以会像闪电一样快("blazing fast"),是多方面优化的结果,包括且不限于:高效且磁盘友好的列式存储,高效的数据压缩,精心设计的各类索引,并行分布式查询,运行时代码生成等。另外,ClickHouse为了最大限度地压榨硬件——尤其是CPU——的性能,实现了向量化查询执行(vectorized query execution)机制。这个名词相对于上面的那些可能没...
2020-08-13 23:47:58
4152
3
原创 Flink新特性之非对齐检查点(unaligned checkpoint)简介
前言在食用本文之前,建议看官先充分食用这两篇文章:《Chandy-Lamport分布式快照算法小记》与《深入理解Flink的轻量级异步屏障快照(ABS)算法》。屏障对齐的风险在Flink的检查点机制中,屏障(barrier)是划分快照(状态)的边界。在启用exactly once语义的条件下,当一个算子有多个输入流时,需要等待所有输入流中当前检查点N的屏障都到达其输入缓冲区,才能安全地触发检...
2020-08-11 21:05:00
7809
4
原创 解读ClickHouse日志中的SQL查询计划
截至目前,ClickHouse并未在正式版本中提供查看查询计划的原生EXPLAIN语法。虽然GitHub上对应的Pull Request已经实现了,但是还没有发布,需要自行编译新版源码才能享受到便利。不过,我们可以通过ClickHouse的日志间接地读出每条SQL的查询计划,借助clickhouse-client,命令形式如下:clickhouse-client -h <host> ...
2020-08-09 23:22:38
4211
原创 计算汉明权重的SWAR(SIMD within a Register)算法
前言在很久之前,笔者在《布隆过滤器(Bloom Filter)原理及Guava中的具体实现》这篇文章的最后,说到JDK中提供了计算整形数二进制表示中1的数量[即所谓汉明权重(Hamming weight)]的方法,并且说它是Java语言中最强的骚操作之一。本文来简单探究一下骚操作背后的思路。朴素的SWARInteger.bitCount()方法的源码中有一句注释。// HD, Figure...
2020-08-08 22:59:20
1508
原创 Flink SQL FileSystem Connector分区提交与自定义小文件合并策略
Prologue之前笔者在介绍Flink 1.11 Hive Streaming新特性时提到过,Flink SQL的FileSystem Connector为了与Flink-Hive集成的大环境适配,做了很多改进,而其中最为明显的就是分区提交(partition commit)机制。本文先通过源码简单过一下分区提交机制的两个要素——即触发(trigger)和策略(policy)的实现,然后用合并...
2020-08-04 22:36:32
3668
4
原创 简析Spark Streaming/Flink的Kafka动态感知
前言Sunday night,继续超短文模式(希望下周就可以不这么划水了hhhhKafka是我们日常的流处理任务中最为常用的数据源之一。随着数据类型和数据量的增大,难免要增加新的Kafka topic,或者为已有的topic增加更多partition。那么,Kafka后面作为消费者的实时处理引擎是如何感知到topic和partition变化的呢?本文以Spark Streaming和Flink...
2020-08-02 22:23:52
1047
1
原创 配置ClickHouse分布式DDL记录自动清理
Saturday night,继续超短文模式。在ClickHouse集群中,我们可以在DDL语句上附加ON CLUSTER <cluster_name>的语法,使得该DDL语句执行一次即可在集群中所有实例上都执行,简单方便。每执行一条分布式DDL,会在配置文件中<distributed_ddl><path>指定的ZooKeeper路径上写一条执行记录(路径默认...
2020-08-01 23:44:04
3673
原创 再谈双亲委派模型与Flink的类加载策略
类加载简书被请去喝了三天茶,笔者也度过了炒鸡忙乱的三天。今天事情终于少一点了,专栏再开,写篇基础的热热身吧。我们知道,在JVM中,一个类加载的过程大致分为加载、链接(验证、准备、解析)、初始化5个阶段。而我们通常提到类的加载,就是指利用类加载器(ClassLoader)通过类的全限定名来获取定义此类的二进制字节码流,进而构造出类的定义。Flink作为基于JVM的框架,在flink-conf.y...
2020-07-31 22:10:40
2211
4
原创 浅谈InfluxDB的存储体系与数据保留策略(retention policy)
前言在之前的这篇文章中,笔者介绍了用时序数据库InfluxDB作为Flink监控存储的方法,并且提到为了防止磁盘爆掉,要设置保留策略来使数据自动过期。经过一点探究之后,发现“Retention Policy”这个词在InfluxDB里并不只是字面意思那么简单,本文做个简要记录。InfluxDB的存储体系之前说过,InfluxDB的存储引擎是由LSM Tree改进而来的TSM(Time-Str...
2020-07-23 22:47:52
3861
4
原创 图论的起源:柯尼斯堡七桥(一笔画)问题与欧拉路径/回路
柯尼斯堡七桥问题大数学家欧拉一生中的大部分时间在俄国和普鲁士度过。1735年,他提出了著名的柯尼斯堡七桥(Seven Bridges of Königsberg)问题:柯尼斯堡(今俄罗斯加里宁格勒)的市区横跨普雷格尔河两岸,河中心有两个小岛,小岛与河的两岸有七座桥连接。在所有桥都只能走一遍的前提下,如何才能把这个地方所有的桥都走遍?当时欧拉并没有找到这个问题的解。第二年,他证明了不存在符...
2020-07-20 22:28:10
9925
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅