首页
学习
活动
专区
工具
TVP
发布

鸿的学习笔记

专栏作者
330
文章
280227
阅读量
49
订阅数
Modern data stack的前世今生
古老的大数据技术孕育了云计算,从云计算中衍生出了SaaS、PaaS等云服务,而云服务又让大数据技术在新时代获得了新生。
哒呵呵
2022-06-08
8850
闲聊 modern data stack
2021 年一个有趣的新变化就是:Building the modern stack with open-source data solutions,换成比较容易理解的话,就是基于开源软件构建自己的数据处理流程。如果是在国内玩大数据的人,可能对此还有些不太理解(比如我),现在各家互联网公司基于 Hadoop 生态圈等一系列开源组件构建的大数据平台解决方案早就已经成熟,那modern data stack价值在哪呢?通过对What I Learned From The Open Source Data Stack Conference 2021的阅读,我发现这是为了解决传统企业的数字化转型问题的,让这些企业也能使用上方便高效的处理工具洞察数据,而不用局限于某一家提供闭源的商业解决方案的公司。用文中的话来说,就是通过开源软件,企业可以自己掌控数据,保证用户数据隐私安全,而不用担心数据被第三方公司利用。
哒呵呵
2021-12-24
1.2K0
关于大数据和数据库的一篇学习笔记
这篇文章来自于我非常崇敬的一个学者 Martin Kleppmann(下文用马丁指代) 的一篇访谈,包含了很多有趣的观点,比如为什么要写Designing Data-Intensive Applications(缩写为DDIA)这一本书,关于计算机行业专有名词乱用的点评,对分布式系统里广为流传的 CAP 定理的批评以及讨论了事件溯源(Event Sourcing)这种架构的适用场景和缺点,最后还附带了对计算机行业里去中心化趋势的看法。
哒呵呵
2020-07-27
7160
计算应该与存储分离吗?
这篇文章构思了很久,因为我不是做计算机底层研究的,也没做过数据库,一直在应用层打转转,最多读过几篇相关的文章,所以担心我的知识储备不够写这么一篇比较严肃的话题,后来有朋友说服了我,可以不聊纯技术方面,而是谈谈笔者对大数据时代,计算与存储应该分离吗?于是就有了本文。注意,本文不牵扯到具体的技术细节和代码,要是被读者发现了有错误,请大胆指出。
哒呵呵
2020-04-23
2.3K0
闲聊大数据是什么
今年回家有人问了我一个问题,大数据是什么?在这个领域里工作了这么久,竟然一时不知道怎么回答。是的,大数据到底是什么呢?每个人都在谈论,比如大数据分析、大数据XX,政府工作报告上“大数据”这样的关键字眼也经常出现,但是大数据这个名词含义下到底是什么呢?
哒呵呵
2020-02-18
4810
关于用户画像的碎碎念
最近做了一个某个类型的用户特征分析,让我对用户画像这个领域有了新的看法。这篇文章是对之前整个特征分析过程的一次梳理和总结。
哒呵呵
2018-08-06
6250
事务处理的数据存储
在上篇文章我们讨论了数据模型,今天试着讨论更基础的数据存储和搜索。数据存储根据开发者使用,可以分为一般的事务处理和数据分析,因为这两者面临的情况不一样。事务处理聚焦于快速的存储和搜索少量的数据,但是数据分析需要读取大量的数据去进行聚合,而不怎么考虑读取花费的时间。后者一般称为数据仓库。 首先我们先看看传统数据库和大部分NoSQL的数据存储引擎。这个实际上分为两个流派,一个是基于日志结构,主要使用了LSM树,另一个是基于OS的页的结构,就是所谓的B树。这么说可能比较难懂。让我们想象一下,假设你有一个excel,里面存储了一条数据a,b,如果我们想查询a,我们可以遍历excel找到满足以a开头的数据a,b。这就是一个简单的数据库,存储数据时,只要简单的添加在下一列。查找时进行遍历,找到符合条件的。让我们想想这会有什么问题。对于数据存储,我们只需要简单的添加数据,对于磁盘这样极有效率,当然实际上的数据库还要考虑并行处理、磁盘存储空间不足等等情况。存储数据的file,就是所谓的log。另一方面,对于搜索数据,这个效率就相当慢了,因为每次搜索数据都需要遍历整个文件,时间复杂度是线性的增长,这时候我们就需要索引了。显然索引对于整个数据存储文件而言,是额外的存储结构,维护索引结构会牺牲write的效率。 对于索引结构,首先想到的是key-value结构。例如对于数据a,b c,f,d这种数据,我们可以用一个索引a,0 b,3这种hash map的形式0和3代表着文件的offset,我们查找数据的时候,先去hash map找到对应的key值,获得offset,我们就能获得key值对应的value。这听起来很简单,然而这就是Bitcask的实现方式。这个索引结构是完全存储在内存当中,如果超出内存的话,就会放在磁盘上。如果数据一直在增长,磁盘空间肯定会有不足的那一刻,解决办法就是将数据拆分为固定大小的segment,以及在合适的时候,合并segment,根据时间戳,保留最新的value值,重新写入新的segment,对旧的进行删除。对于实际的工程,我们还需要考虑 1.文件存储的格式,一般而言应该是以bytes存储 2.删除数据时,应该加上一个标签,比如tombstone,在合并segment时,对数据进行删除 3.数据库崩溃重新恢复,Bitcask使用的是快照的方式在磁盘保存索引结构 4.并发的写入数据,这个需要检查点来处理数据写入时数据库崩溃 5.并发控制,因为文件的immutable,所以并发控制相当简单。 但是这个依然存在问题,让我们想想,那就是hash table必须存储在内存中,这个对于大数据时很不友好,即使你是存储在磁盘上。并且对于范围查找很不友好,因为你需要遍历所有key去查找一个范围内的一个key。 为了解决范围查找,人们又提出了在创建索引时,我们可以按照key值进行排序,这样的存储方式叫做SSTable。这样有下面的几个好处,合并segment变得更有效率了,因为你只需要读取开始的key和结束的key就可以了。在保存索引时,也不需要将所有的key存储在内存里,只需要保存每个segment的开始key和结束key。读取数据时,也不需要遍历所有的key值了。那么对于维护索引呢?我们在写入数据时,会先写入memtable(存储在内存的例如红黑树之类的数据结构)。当memtable超过某个阈值时,会将memtable写入到磁盘的segment中。在读取数据时,我们会首先在memtable中查找数据,然后再根据时间逐步读取segment。每隔一段时间,后台进程便会合并segment,清理垃圾数据。这样处理的唯一问题,就是memtable遇到服务器崩溃。我们可以牺牲一部分write的效率,生成一个独立的log去立马保存写入的数据,这个log的唯一用途就是防止memtable的丢失。 上面的就是现在HBase、LevelDB、Lucene这些使用的LSM树结构。对于其的优化,目前可以使用布隆过滤器、size-tiered等方式去优化读取和合并segment。除了LSM树,目前还有一个广泛使用的索引,那就是B树。 B树主要是利用了操作系统的页结构,将数据拆分成一个固定尺寸的block块,使用存储address和location,类似于指针的方式存储数据。具体细节不多说,网上的文章一大堆。我们需要考虑的是负载因子和二叉树的平衡。对于每次的写入和修改数据,我们都需要找到key值在系统里对应的address去修改数据,重新写入,同样为了防止数据崩溃,一般的数据库会使用预写日志(WAL)去保存每一次数据的修改和写入。 除了这些索引,还有所谓的二级索引。这个类似于倒排索引。不仅如此,还有基于列的存储方式,这个大多是为了数据仓库服务的。
哒呵呵
2018-08-06
5960
闲话聊聊事务处理(中)
上面提到了multi-object事务,但是要完美的处理multi-object事务并不容易。因为我们必须要面对并发问题导致的bug,而隔离性要求数据系统必须要向使用者把并发问题隐藏起来,让使用者因为只有自己一个人使用。在实践中,这个并不容易做到,完美的隔离性要付出相当大的性能代价,所以大多数的数据库提出了Weak Isolation Level的概念,虽然弱化版的隔离性还是会导致各种潜在的问题,但是这个代价相对于性能的巨大提升是可以接受的。那我们来看看几种不同的Weak Isolation Level。
哒呵呵
2018-08-06
4350
没有更多了
社区活动
腾讯技术创作狂欢月
“码”上创作 21 天,分 10000 元奖品池!
Python精品学习库
代码在线跑,知识轻松学
博客搬家 | 分享价值百万资源包
自行/邀约他人一键搬运博客,速成社区影响力并领取好礼
技术创作特训营·精选知识专栏
往期视频·千货材料·成员作品 最新动态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档