自己的、同行的关于数据库发展的Sparks

长期更新

Posted by HD on January 21, 2019

正文

2019.1.21 — beginning

https://projects.apache.org/projects.html?category


刷 leetcode 需要哪些基础?

https://www.zhihu.com/question/30737325/answer/524120016


2019.1.21

@zhh-4096的微博:

有些同行说数据库里面的SQL引擎是大脑是最难的,对于OLTP场景的数据库,我不这么认为,我觉得事务引擎和存储引擎才是最费神的;对于OLAP的场景,存储引擎的设计以及统计信息的准确度同样对SQL引擎的好坏有巨大影响。CBO还有些通用行,RBO纯粹就是经验的堆积,就算SQL表达式的编译也挺死板的。

技术人员做数据库这个方向的创业能省一些事,比如产品经理都不太需要了,SQL标准就在那,产品要做什么功能就看对SQL的支持程度了,把精力放在技术实现的创新上即可。最后衡量产品好不好无非是看看三个大的卖点做得如何:性能有多快?方便运维吗?能轻松从一台服务器扩展到3台甚至到上百上千上万台吗。

在SQL引擎里引入渐进式优化可能是个好思路。生成plan的时间和执行时间是成反比的,不同应用场景对这两个时间有不同要求。比如OLTP场景通常是在小数据集上做简单查询,要求快速响应,所以对生成plan的时间会限定在微妙级内;

而OLAP因为数据集大查询复杂所以更在乎执行时间,多花点时间在生成plan阶段能得到更优的plan从而降低执行时间。但是这其中有一个问题,就是要查询的数据集并不是那么显而易见的,对于一个复杂的查询应用各种过滤条件和索引后可能也只涉及一个很小的数据集,所以如果对这样的查询花了很多时间在生成plan的阶段就不是那么划算了。

所以是否可以考虑一种渐进式的优化策略,先用很少的时间得到一个初级plan然后用它去执行,随着遍历的数据越来越多那么这个plan就变成热点了,然后再额外开另一个线程去优化这个plan,优化好了再切到它,也就是说plan的优化程度是受运行时的数据集动态提升的。这里面的难点在于如果前后得到的两个plan走的是不同索引,那么切换到新的plan后如何保证之前处理过的数据不被重复处理呢?

现在像calcite这样的通用SQL引擎和spark/flink这类计算层的框架,都是比较上层的东西,反而让底层去适配它们的api,这本身就是不符合设计哲学的。从来都是下层不关心上层的东西,下层给上层提供api,而不是反过来。包括我们做分布式数据库也是一样,最底层是存储引擎提供的简单kv接口;然后事务引擎再包一下提供带事务管理的kv接口;再往上是database object model层,提供更高级的table/index接口;最上层才是SQL接口。


2019.1.28

NO.1

http://www.yinwang.org/blog-cn/2017/07/06/master-pl 来自王垠的blog-

重视语言特性,而不是语言:

变量定义
算术运算
for 循环语句,while 循环语句
函数定义,函数调用
递归
静态类型系统
类型推导
lambda 函数
面向对象
垃圾回收
指针算术
goto 语句
掌握关键语言特性,忽略次要特性
意为将重点放在其特色上。
自己动手实现其语言特性。

NO.2

关于SQL标准:

https://wiki.postgresql.org/wiki/Developer_FAQ#Where_can_I_get_a_copy_of_the_SQL_standards.3F

NO.3

https://www.zhihu.com/question/47902654

最简单的办法:关注一下SIGMOD,VLDB,ICDE上每年新发表的paper(尤其是前两个)。把title和abstract看一遍,你基本就都懂了。

NO.4

TiDB<==RocksDB<==存储

来源:http://alimy.me/post/dev_201805021940/

NewSQL: 分布式数据库TiDB、CockroachDB TiDB TiDB 开源分布式 NewSQL 关系型数据库 TiDB 是新一代开源分布式 NewSQL 数据库,模型受 Google Spanner / F1 论文的启发,实现了自动的水平伸缩,强一致性的分布式事务,基于 Raft 算法的多副本复制等重要 NewSQL 特性。TiDB 结合了 RDBMS 和 NoSQL 的优点,部署简单,在线弹性扩容和异步表结构变更不影响业务, 真正的异地多活及自动故障恢复保障数据安全,同时兼容 MySQL 协议,使迁移使用成本降到极低。

CockroachDB (蟑螂DB/小强DB) CockroachDB(中文名蟑螂DB,所以又可以称为小强DB),是构建于事务处理及强一致性KV存储上的分布式SQL数据库,支持水平扩展、自动容错处理、强一致性事务,并且提供SQL接口用于数据处理,是Google Spanner/F1的开源实现。 CockroachDB适用于应用对数据要求精确、可靠、完全正确的场景,支持自动复制、均匀分布、基于极小配置的数据恢复,可用于分布式的、可复制的联机事务处理(OLTP),多数据中心的部署,私有云的基础构建,它不适用于读少写多的场景,可以用内存数据库来代替,也不适用于复杂的join查询,重量级的数据分析及联机分析处理(OLAP)。

NO.5

后Hadoop时代的大数据架构

https://zhuanlan.zhihu.com/p/19962491

NO.6

`一名分布式存储工程师的技能树是怎样的?

作者:grakra

链接:https://www.zhihu.com/question/43687427/answer/123682560

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

说的很好, 关系数据库的WAL, 事务太重要了.建议看stonebraker的architecture of a database system. 和Jim gray的Transaction. 回头看dynamo和gfs, 收获很多. 理解会更加深入. 其实学习完全可以按照这样的roadmap

1. WAL + RSM 
2. RSM(分布式共识): TOB协议, Quorum-based协议, 和Primary-backup协议. 
3. partitioning & replication + local storage engine. 
4. local storage engine: bdb, innodb, leveldb. 
5. 磁盘和网络优化技术. 
6. 分布式一致性(隔离性). 
7. 分布式事务: stm, mvcc, 乐观锁. 
8. 分布式查询优化 
工程实现超高的编程技巧
1.能够像haskell那样impure和pure分离。
2.幂等的设计,让部分有状态的模块成为metal unit, 同时幂等设计和failstop能够将有效地避免非bf.
3.元编程能力,降低代码的冗余和耦合,代码更适合扩展和组合。
4.超高的系统编程能力。
5.单测,mock测试设计能力。
6.漂亮的日志输出。
7.会做pperf
8.会使用docker加速自己的开发效率。

周边涉及

1.精通MySQL sharding,不知道它的痛,就不知道为啥要坚定不一地搞分布式关系数据库。

2.精通大数据的bi解决方案,不知道它的痛,就不知道为啥要好全新的分布式列式数据库。

3.区块链,分布式计算引擎也了解一点。

NO.7 :

解释好,相关领域的关键名词,务必要解释得通透,透彻。

NO.8:

作者:Xiaoyu Ma

链接:https://www.zhihu.com/question/27974418/answer/38965760

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

大数据本身是个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞生的。你可以把它比作一个厨房所以需要的各种工具。锅碗瓢盆,各有各的用处,互相之间又有重合。你可以用汤锅直接当碗吃饭喝汤,你可以用小刀或者刨子去皮。但是每个工具有自己的特性,虽然奇怪的组合也能工作,但是未必是最佳选择。

大数据,首先你要能存的下大数据。 传统的文件系统是单机的,不能横跨不同的机器。HDFS(Hadoop Distributed FileSystem)的设计本质上是为了大量的数据能横跨成百上千台机器,但是你看到的是一个文件系统而不是很多文件系统。比如你说我要获取/hdfs/tmp/file1的数据,你引用的是一个文件路径,但是实际的数据存放在很多不同的机器上。你作为用户,不需要知道这些,就好比在单机上你不关心文件分散在什么磁道什么扇区一样。HDFS为你管理这些数据。

存的下数据之后,你就开始考虑怎么处理数据。虽然HDFS可以为你整体管理不同机器上的数据,但是这些数据太大了。一台机器读取成T上P的数据(很大的数据哦,比如整个东京热有史以来所有高清电影的大小甚至更大),一台机器慢慢跑也许需要好几天甚至好几周。对于很多公司来说,单机处理是不可忍受的,比如微博要更新24小时热博,它必须在24小时之内跑完这些处理。那么我如果要用很多台机器处理,我就面临了如何分配工作,如果一台机器挂了如何重新启动相应的任务,机器之间如何互相通信交换数据以完成复杂的计算等等。这就是MapReduce / Tez / Spark的功能。MapReduce是第一代计算引擎,Tez和Spark是第二代。MapReduce的设计,采用了很简化的计算模型,只有Map和Reduce两个计算过程(中间用Shuffle串联),用这个模型,已经可以处理大数据领域很大一部分问题了。 那什么是Map什么是Reduce? 考虑如果你要统计一个巨大的文本文件存储在类似HDFS上,你想要知道这个文本里各个词的出现频率。你启动了一个MapReduce程序。Map阶段,几百台机器同时读取这个文件的各个部分,分别把各自读到的部分分别统计出词频,产生类似(hello, 12100次),(world,15214次)等等这样的Pair(我这里把Map和Combine放在一起说以便简化);这几百台机器各自都产生了如上的集合,然后又有几百台机器启动Reduce处理。Reducer机器A将从Mapper机器收到所有以A开头的统计结果,机器B将收到B开头的词汇统计结果(当然实际上不会真的以字母开头做依据,而是用函数产生Hash值以避免数据串化。因为类似X开头的词肯定比其他要少得多,而你不希望数据处理各个机器的工作量相差悬殊)。然后这些Reducer将再次汇总,(hello,12100)+(hello,12311)+(hello,345881)= (hello,370292)。每个Reducer都如上处理,你就得到了整个文件的词频结果。

` 这看似是个很简单的模型,但很多算法都可以用这个模型描述了。`

Map+Reduce的简单模型很黄很暴力,虽然好用,但是很笨重。第二代的Tez和Spark除了内存Cache之类的新feature,本质上来说,是让Map/Reduce模型更通用,让Map和Reduce之间的界限更模糊,数据交换更灵活,更少的磁盘读写,以便更方便地描述复杂算法,取得更高的吞吐量。

有了MapReduce,Tez和Spark之后,程序员发现,MapReduce的程序写起来真麻烦。他们希望简化这个过程。这就好比你有了汇编语言,虽然你几乎什么都能干了,但是你还是觉得繁琐。你希望有个更高层更抽象的语言层来描述算法和数据处理流程。于是就有了Pig和Hive。Pig是接近脚本方式去描述MapReduce,Hive则用的是SQL。它们把脚本和SQL语言翻译成MapReduce程序,丢给计算引擎去计算,而你就从繁琐的MapReduce程序中解脱出来,用更简单更直观的语言去写程序了。

有了Hive之后,人们发现SQL对比Java有巨大的优势。一个是它太容易写了。刚才词频的东西,用SQL描述就只有一两行,MapReduce写起来大约要几十上百行。而更重要的是,非计算机背景的用户终于感受到了爱:我也会写SQL!于是数据分析人员终于从乞求工程师帮忙的窘境解脱出来,工程师也从写奇怪的一次性的处理程序中解脱出来。大家都开心了。Hive逐渐成长成了大数据仓库的核心组件。甚至很多公司的流水线作业集完全是用SQL描述,因为易写易改,一看就懂,容易维护。

自从数据分析人员开始用Hive分析数据之后,它们发现,Hive在MapReduce上跑,真鸡巴慢!流水线作业集也许没啥关系,比如24小时更新的推荐,反正24小时内跑完就算了。但是数据分析,人们总是希望能跑更快一些。比如我希望看过去一个小时内多少人在充气娃娃页面驻足,分别停留了多久,对于一个巨型网站海量数据下,这个处理过程也许要花几十分钟甚至很多小时。而这个分析也许只是你万里长征的第一步,你还要看多少人浏览了跳蛋多少人看了拉赫曼尼诺夫的CD,以便跟老板汇报,我们的用户是猥琐男闷骚女更多还是文艺青年/少女更多。你无法忍受等待的折磨,只能跟帅帅的工程师蝈蝈说,快,快,再快一点!

于是Impala,Presto,Drill诞生了(当然还有无数非著名的交互SQL引擎,就不一一列举了)。三个系统的核心理念是,MapReduce引擎太慢,因为它太通用,太强壮,太保守,我们SQL需要更轻量,更激进地获取资源,更专门地对SQL做优化,而且不需要那么多容错性保证(因为系统出错了大不了重新启动任务,如果整个处理时间更短的话,比如几分钟之内)。这些系统让用户更快速地处理SQL任务,牺牲了通用性稳定性等特性。如果说MapReduce是大砍刀,砍啥都不怕,那上面三个就是剔骨刀,灵巧锋利,但是不能搞太大太硬的东西。

这些系统,说实话,一直没有达到人们期望的流行度。因为这时候又两个异类被造出来了。他们是Hive on Tez / Spark和SparkSQL。它们的设计理念是,MapReduce慢,但是如果我用新一代通用计算引擎Tez或者Spark来跑SQL,那我就能跑的更快。而且用户不需要维护两套系统。这就好比如果你厨房小,人又懒,对吃的精细程度要求有限,那你可以买个电饭煲,能蒸能煲能烧,省了好多厨具。

上面的介绍,基本就是一个数据仓库的构架了。底层HDFS,上面跑MapReduce/Tez/Spark,在上面跑Hive,Pig。或者HDFS上直接跑Impala,Drill,Presto。这解决了中低速数据处理的要求。

那如果我要更高速的处理呢?

如果我是一个类似微博的公司,我希望显示不是24小时热博,我想看一个不断变化的热播榜,更新延迟在一分钟之内,上面的手段都将无法胜任。于是又一种计算模型被开发出来,这就是Streaming(流)计算。Storm是最流行的流计算平台。流计算的思路是,如果要达到更实时的更新,我何不在数据流进来的时候就处理了?比如还是词频统计的例子,我的数据流是一个一个的词,我就让他们一边流过我就一边开始统计了。流计算很牛逼,基本无延迟,但是它的短处是,不灵活,你想要统计的东西必须预先知道,毕竟数据流过就没了,你没算的东西就无法补算了。因此它是个很好的东西,但是无法替代上面数据仓库和批处理系统。

还有一个有些独立的模块是KV Store,比如Cassandra,HBase,MongoDB以及很多很多很多很多其他的(多到无法想象)。所以KV Store就是说,我有一堆键值,我能很快速滴获取与这个Key绑定的数据。比如我用身份证号,能取到你的身份数据。这个动作用MapReduce也能完成,但是很可能要扫描整个数据集。而KV Store专用来处理这个操作,所有存和取都专门为此优化了。从几个P的数据中查找一个身份证号,也许只要零点几秒。这让大数据公司的一些专门操作被大大优化了。比如我网页上有个根据订单号查找订单内容的页面,而整个网站的订单数量无法单机数据库存储,我就会考虑用KV Store来存。KV Store的理念是,基本无法处理复杂的计算,大多没法JOIN,也许没法聚合,没有强一致性保证(不同数据分布在不同机器上,你每次读取也许会读到不同的结果,也无法处理类似银行转账那样的强一致性要求的操作)。但是丫就是快。极快。

每个不同的KV Store设计都有不同取舍,有些更快,有些容量更高,有些可以支持更复杂的操作。必有一款适合你。

除此之外,还有一些更特制的系统/组件,比如Mahout是分布式机器学习库,Protobuf是数据交换的编码和库,ZooKeeper是高一致性的分布存取协同系统,等等。

有了这么多乱七八糟的工具,都在同一个集群上运转,大家需要互相尊重有序工作。所以另外一个重要组件是,调度系统。现在最流行的是Yarn。你可以把他看作中央管理,好比你妈在厨房监工,哎,你妹妹切菜切完了,你可以把刀拿去杀鸡了。只要大家都服从你妈分配,那大家都能愉快滴烧菜。

你可以认为,大数据生态圈就是一个厨房工具生态圈。为了做不同的菜,中国菜,日本菜,法国菜,你需要各种不同的工具。而且客人的需求正在复杂化,你的厨具不断被发明,也没有一个万用的厨具可以处理所有情况,因此它会变的越来越复杂。

NO.9

作者:有点文

链接:https://www.zhihu.com/question/27974418/answer/156227565

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

学习很重要的是能将纷繁复杂的信息进行归类和抽象。** 对应到大数据技术体系,虽然各种技术百花齐放,层出不穷,但大数据技术本质上无非解决4个核心问题。



1. **存储,**海量的数据怎样有效的存储?主要包括hdfs、Kafka;
2. **计算,**海量的数据怎样快速计算?主要包括MapReduce、Spark、Flink等;
3. **查询,**海量数据怎样快速查询?主要为Nosql和Olap,Nosql主要包括Hbase、 Cassandra 等,其中olap包括kylin、impla等,其中Nosql主要解决随机查询,Olap技术主要解决关联查询;
4. **挖掘,**海量数据怎样挖掘出隐藏的知识?也就是当前火热的机器学习和深度学习等技术,包括TensorFlow、caffe、mahout等;


`大数据技术生态其实是一个江湖….

在一个夜黑风高的晚上,江湖第一大帮会Google三本阵法修炼秘籍流出,大数据技术江湖从此纷争四起、永无宁日...

这三本秘籍分别为:

《Google file system》:论述了怎样借助普通机器有效的存储海量的大数据;

《Google MapReduce》:论述了怎样快速计算海量的数据;

《Google BigTable》:论述了怎样实现海量数据的快速查询;

**以上三篇论文秘籍是大数据入门的最好文章,通俗易懂,先看此三篇再看其它技术;**

在Google三大秘籍流出之后,江湖上,致力于武学开放的apache根据这三本秘籍分别研究出了对应的武学巨著《hadoop》,并开放给各大门派研习,Hadoop包括三大部分,分别是hdfs、MapReduce和hbase: hdfs解决大数据的存储问题。 mapreduce解决大数据的计算问题。 hbase解决大数据量的查询问题。

之后,在各大门派的支持下,Hadoop不断衍生和进化各种分支流派,其中最激烈的当属计算技术,其次是查询技术。存储技术基本无太多变化,hdfs一统天下。

以下为大概的演进:

1,传统数据仓库派说你mapreduce修炼太复杂,老子不会编程,老子以前用sql吃遍天下,为了将这拨人收入门下,并降低大数据修炼难度,遂出了hive,pig、impla等SQL ON Hadoop的简易修炼秘籍;

2,伯克利派说你MapReduce只重招数,内力无法施展,且不同的场景需要修炼不同的技术,太过复杂,于是推出基于内力(内存)的《Spark》,意图解决所有大数据计算问题。

3,流式计算相关门派说你hadoop只能憋大招(批量计算),太麻烦,于是出了SparkStreaming、Storm,S4等流式计算技术,能够实现数据一来就即时计算。

4,apache看各大门派纷争四起,推出flink,想一统流计算和批量计算的修炼;


2019.1.30

NO.10

@zhh-4096的微博:

写完了这条微博后我突然又有了一个灵感,H2和Lealone数据库使用Copy on Write B-Tree,所有的update/insert/delete操作都会把root page到leaf page这条路径上的所有page浅copy一次,如果按这里说的把记录get出来再改,其实可以做到不copy的,把page标记为脏页就好,因为记录在运行时已经有多版本了。

NO.11

@zhh-4096的微博:

当别人还在谈论乐观并发控制谈论MVCC谈论快照隔离谈论各种锁时,我思考的方向早已经转向如何缩小冲突的范围,发生事务冲突时如何让阻塞的事务不影响当前线程,这些才是并发控制最本质的问题。从行锁到列锁就是用来缩小冲突;而异步化使得线程不受具体事务的影响,能让线程一直保持“忙碌”的状态。


2019.2.12

NO.12

@zhh-4096的微博:

` 我最想看到某一项技术背后最原始最朴素甚至不那么严谨的想法。不过我发现创造这个技术的人很少有人去说出这个想法,也许他本人也记不得当初为什么会做成这样了,或者不愿说出来,留给看官的不是晦涩的论文就是繁杂的代码。`

比如,calcite和valcano论文背后的朴素想法是什么呢?

我的推断是:SQL语言是声明式的,只表达用户想做什么,所以对于实现者来说,第一步就是想办法把SQL解析后的语法树转成某种能方便执行的另一种树型结构(执行树),比如把from子句转成扫描表这样一种可执行的操作,每一个操作对应执行树中的一个节点,按先后顺序从下往上构成一棵执行树(最下面的最先执行,是不是很符合valcano从下往上喷发的画面),考虑到执行的效率,有可能需要对操作的顺序做调整,或者把两个操作提前合并,这就是对操作的优化,优化种类很多,所以为了灵活扩展,可以针对不同的操作引入不同的优化规则,因为每种操作构成了执行树中的一个节点,所以最后问题就变成了如何把优化规则应用到执行树的问题,执行树在优化规则的作用下可能会产生结构性的变化。