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

鸿的学习笔记

专栏作者
330
文章
279232
阅读量
49
订阅数
维度建模已死?
只要是做数据仓库的同学都或多或少了解和实践过维度数据建模,在大银行、运营商等传统领域,维度数据建模更是其数据分析和建模的核心理念。感兴趣的同学可以读下《数据仓库工具箱:维度建模权威指南》和阿里巴巴的《大数据之路》,从这两本书可以了解到维度数据建模的理论和工程实践。
哒呵呵
2022-04-14
3690
现代元数据平台
这是一个新概念:The Modern Metadata Platform,直译就是现代元数据平台。这个概念是伴随着 Modern Data Stack 概念而生,是其中的一部分。
哒呵呵
2022-03-11
5330
关于数据仓库的一些观点
2021年有两条主线,一个是生态系统和商业模式的成熟,比如早在2020年就上市的云数据仓库公司 Snowflake 公司站稳了在资本市场的脚跟、Databricks、Dataiku、Datarobot 等公司估值更高了并且募集了大量的资金,甚至正在追求 IPO;另一方面则是新一代的数据和机器学习创业公司正在崛起,无论是几年前还是几个月前成立的公司都在过去一年左右经历了突飞猛进的增长。
哒呵呵
2021-10-19
6360
大数据知识体系之数据采集
数据平台数据采集系统日志采集网络数据采集设备数据采集数据同步数据存储数据计算实时计算离线计算数据挖掘数据服务数据模型数据建模方法论数据模型管理体系表设计数据管理元数据收集和搜索数据血缘数据质量计算任务管理平台成本管理数据应用互联网工业政务
哒呵呵
2021-06-17
1.4K0
Kafka 能成为一个数据库吗?
近些年,圈子里有一个讨论很有趣,是关于 Kafka 到底可不可以认为是一个数据库,这个讨论起始于2017年,并由此衍生出了 KSQL、KarelDB 等基于 Kafka 完成的数据库。这篇文章简单回顾下争论双方的观点。
哒呵呵
2021-03-16
1.2K0
关于 Lakehouse 的一些笔记和看法
这是最经典的数据仓库模型,模型上面的不多说,可以参考数据仓库理论。从技术角度上来说,
哒呵呵
2021-02-24
6750
计算应该与存储分离吗?
这篇文章构思了很久,因为我不是做计算机底层研究的,也没做过数据库,一直在应用层打转转,最多读过几篇相关的文章,所以担心我的知识储备不够写这么一篇比较严肃的话题,后来有朋友说服了我,可以不聊纯技术方面,而是谈谈笔者对大数据时代,计算与存储应该分离吗?于是就有了本文。注意,本文不牵扯到具体的技术细节和代码,要是被读者发现了有错误,请大胆指出。
哒呵呵
2020-04-23
2.3K0
我所了解的大数据的历史(2)
接着说谷歌,上篇文章提到了 GFS 。那么谷歌为什么要硬着头皮去啃分布式系统这块硬骨头呢?首先,我们要知道谷歌刚开始成立时是一家搜索公司,方便用户查询互联网上的信息。因此谷歌必须要存储整个互联网上的信息,那这个数据量是庞大的。对于这个需求,传统的数据库或者更深入地说,单机是远远不够的,必须要使用分布式系统搭建集群;但是那个时候要搭建集群,可供选择的方案大多像 Oracle 的 RAC 一样,需要昂贵的机器。因此谷歌必须要自行去解决这个问题:
哒呵呵
2020-02-18
3160
为什么数据库常使用有序数据结构而编程语言使用哈希表结构
在编程语言里哈希表结构(例如 Go 中的 Map,Python 中的 Dict,Java 中的 HashMap 等)要比有序索引的数据结构(例如Tree)更常见。作者提到了,Google 对 C++ 哈希表结构的优化总体上减少了1% CPU 使用率和4% 内存的使用。然而在数据库中,最常见的是默认使用像B树一样的有序索引。
哒呵呵
2019-12-25
8280
为运营分析而设计的数据系统
OPAP系统构建了一个实时查询的系统可以使用者立马能够查询到实时数据。举个简单的例子,当用户参加一项活动时,产品经理或者是运营人员希望能够马上获得用户的参与效果,并且快速的探索用户的行为特征,从而立马改进活动以获得更好的效果。正所谓:越来接近实时的数据,越有价值。OPAP系统的意义便在于此。
哒呵呵
2019-09-02
9940
简单聊聊数据存储格式
在现实生活中存在着两个不同的数据处理模型,一个是OLTP,另一个是OLAP。两者的区别不在这篇文章详细叙述,感兴趣的可以阅读参考文章。因为OLAP和OLTP所面临的困境是不一样的,所以两个选择的数据存储方式也就不一样了。OLTP的数据存储模型大多逃不过Key-Value、B-Tree、LSM-Tree三种行式存储,而OLAP对应的则是列式存储。
哒呵呵
2019-07-12
1.3K0
日志采集技术笔记
使用Linux的rename机制保证文件写入要么成功,要么失败,绝对不能出现写了一半的情况。
哒呵呵
2018-10-18
1.7K0
Stream和Table的联系
传统的Table领域和目前的Stream领域看似横亘着不可跨越的鸿沟,类似于经典力学和量子力学,但Stream和Table的依然存在着相关性。在研究这个理论之前,先回顾下什么是Table?一张Table是一堆拥有行列性质的数据,每一行都有着唯一的主键(无论是隐性还是显性的,具体可以参考我之前写的文章:https://mp.weixin.qq.com/s/aHjt2ssmUWJEfFdf8necMQ),但是在某种程度上,一张表的存储结构是一个只增不减的log(LSM树或者是B树),事务就是对这个log上的某条记录快照的更改及最终应用在log上。
哒呵呵
2018-10-18
6260
Apache Kafka设计理念探究
创造一个分布式的实时流处理平台,也正是因为这个原因,Kafka选择了将日志分区和消费者群组模型。
哒呵呵
2018-09-18
5290
深度学习性能分析(下)
我们分析了TX1设备的系统内存消耗,它使用CPU和GPU的共享内存。 图5显示最大系统内存使用量初始为常数,然后随批量大小增加。这是由于网络模型的初始存储器分配(其是大的静态分量)以及处理批处理时所需的存储器的贡献,其与图像的数量成比例地增加。 在图6中,我们还可以注意到,对于尺寸小于100MB的网络,初始分配永远不会下降到200MB以下,并且其后是线性的,斜率为1.30。
哒呵呵
2018-08-06
4150
计算机基础小整理
一、CPU 在平时写的程序可以视为数据和指令的组合体,所有的程序都是copy了一份到内存中才能运行,内存地址是指在内存中保存命令和数据的场所,通过地址来标记和指定。地址是由一系列整数值构成。 程序员编写的程序会先转换成C系列语言,再编译转换成机器语言的exe文件,运行时再在内存中生成副本,由CPU解释并执行程序。 计算机现在的主流都是冯·诺伊曼结构,当然还有λ架构,神经网络架构等 CPU的组成: 寄存器:暂存指令,数据等处理对象 控制器:把内存上的指令读进寄存器,根据指令结果控制计算机 运算器:运算从内存读进去的数据 时钟:CPU开始计时的信号 内存是指计算机的主存储器,通过控制芯片等与CPU相连,负责存储指令和数据,每字节(一字节=8位)都有一个地址编号。 机器语言指令分为: 数据转送 运算 跳转 call/return 二、二进制小结 所有数据在计算机内部都是转成了二进制数据,计算机才不会管它是数值,文字还是图片。 二进制转十进制 int('11',2) Out[16]: 3 十进制转二进制 bin(10) Out[17]: '0b1010' 移位运算,先拿十进制,我们熟悉的做一个比方,例如:30 30 左移一位:300,扩大了十倍 右移一位:3,缩小了十倍 这就是移位的核心,移动几位,变大和减少的数值就是你所使用进制的基数,只不过二进制你要考虑到负数 具体看看: bin(39) Out[18]: '0b100111' bin(0b100111 >>1) Out[20]: '0b10011' 0b100111 >>1 Out[19]: 19 在二进制中表示负数,是用最高位作为符号位,0表示正数,1表示负数。 但是计算机在做减法运算时,实际上是加法运算,通过位溢出来处理,也就是取反加1 逻辑右移:移位后,在最高位补0 算术右移:移位后,在最高为补上原来的符号数 三、浮点数 先来看: sum = 0 for i in range(100): sum += 0.1 sum Out[28]: 9.99999999999998 是不是很奇怪? 这就牵扯到二进制表示小数了 例如二进制1011.0011怎么表示成十进制,就是小数点后面的位权改成1/2的倍数,结果就是11.1875 浮点数就是使用符号,尾数,基数和指数来表示小数 其实说到这里,大家应该明白为啥浮点数会出错了吧。 各个语言都有自己的机制去解决这个问题 四、内存概论 数据类型:存储在内存的大小和和该区域的数据类型 内存实际上一个内存IC,IC引脚的开关表示着0和1,通过地址去确定这些IC。 磁盘缓存:将磁盘一部分数据读进内存 虚拟内存:把磁盘的一部分作为内存使用。把实际内存的内容和磁盘上的虚拟内存的内容进行部分置换,同时运行程序。 有两种方式:分页和分段 windows采取的是分页式,在不考虑程序的构造的情况,把运行的程序按照一定大小的页进行分割,以页为单位在内存和磁盘中置换。 五、压缩数据 文件就是字节数据的集合 RLE算法: 使用字符*重复次数进行压缩。 哈夫曼算法: 多次出现的数据用小于8位的,不常用的数据用多于8位的表示 哈夫曼树解决分隔符问题: 按出现的频率排序,以两个最小的数拉出一条线枝干,左边是0,右边是1,以此类推
哒呵呵
2018-08-06
3960
读会搜索引擎
搜索引擎一般由索引管理器,索引检索器,索引构建器,文档管理器组成。 索引管理器,顾名思义是管理带有索引结构的数据,负责对索引的访问。那么索引是怎么管理的呢?不可能总是放在内存里,索引通常来讲是作为二级存储的二进制文件,二级存储可以理解为 硬盘之类的,二进制文件是除了文本文件以外的文件(文本文件是指由ascii码等方式显示的文件)。 索引检索器,是负责利用索引对全文进行搜索,输入是应用层传输过来的数据,和索引管理器一起协同查询文档,并以某种方式反馈给用户。 索引构建器,从文本中生成索引的组件。通常而言,构建器会将文本解析成一个个单词序列,再将单词序列转换为索引结构。 文档管理器,存储着文档,负责取出与查询结果匹配的文档,如果有需要的话会选取一部分作为摘要。 只要根据ID的来检索数据库就好,至于自己用文件夹存储呢,还是用mysql之类的数据库可以自己考虑。 此外,还会有爬虫和搜索排序系统,最出名的当属pagerank。
哒呵呵
2018-08-06
4690
事务处理的数据存储
在上篇文章我们讨论了数据模型,今天试着讨论更基础的数据存储和搜索。数据存储根据开发者使用,可以分为一般的事务处理和数据分析,因为这两者面临的情况不一样。事务处理聚焦于快速的存储和搜索少量的数据,但是数据分析需要读取大量的数据去进行聚合,而不怎么考虑读取花费的时间。后者一般称为数据仓库。 首先我们先看看传统数据库和大部分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
5940
简单聊聊py的高性能编程
高性能编程的含义是通过编写更为高效的代码或者改变操作方式,也就是找到更合适的算法去降低时间上的开销。 计算机的模型可以分为三种,分别是计算单元(CPU,GPU),存储单元(硬盘,内存之类的)还有它们之间的连接。计算单元给我们的是我们能有 多块的速度去解决问题,它可以将接受到的输入变成对应的输出以及改变状态的能力。存储单元一方面是能存多少数据,另一方面是对这些数据的读写有多快,越靠近CPU的存储速度越快 ,其包含的数据量也越少。计算单元和存储单元之间的连接则是决定了数据移动的数据有多快,光速是有限的,它决定着物理的极限,总线带宽也决定着一次传输能有多少数据。 #一个简单计算质数的代码,按照其实还有更好的优化方法,具体请看《编程珠玑》 import math import time def check_prime(number): sqrt_number = math.sqrt(number) start = time.time() for i in range(2, int(sqrt_number) + 1): if (number / i).is_integer(): return False end = time.time() print('sum_time',end-start) return True check_prime(10000000) check_prime(10000019) 理想的计算模型:(以下不是真实的python计算过程,只是为了讲解) 1.number的值会存放在随机存储器上,为了计算sqrt_number,需要将number传入到CPU当中去。在传入的时候应该尽可能的利用靠近 CPU的缓存,而不是如下的写法: sqrt_number = math.sqrt(number) number_float = float(sqrt_number) 这样意味着将数据两次经过总线传输,将数据尽可能的少移动,保持在需要的地方是必须的。也就是说移动计算,而不是移动数据。 2.python的虚拟机为了尽可能的抽象做了很多工作,但是相应的牺牲了性能,比如 快: for i in haystack: if (exp): return False return True 慢: value = True for i in haystack: if (exp): value = False return True 虽然结果是一样,但是运行时间在足够大的数据量就会发生巨大的差别,这也是上述所说的尽可能的少移动数据 3.为了可以矢量操作,也就是在循环时将循环值也就是i值尽可能的一次性读入CPU,在CPU内进行计算,返回相应的值,需要借助numpy这样的用C写的库区实现, 4.抽象的代价也意味着python的对象不再是内存中的最优化布局,因为内存需要自动处理并且释放,这就影响了向CPU缓存的效率。 5.动态语言不可避免的代价就是,没有编译器从全局角度去优化对象的内存布局和CPU指令 6.最后一个则是臭名昭著的GIL了。
哒呵呵
2018-08-06
4010
索引
最简单的索引策略就是:将key值的offset存入在内存,使用hash表进行管理,在搜索时,会先根据key值找到offset,进而由offset找到对应的value值。不过看起来很简单,问题在于hash表需要保存在内存。一旦重启,索引就需要重新载入。
哒呵呵
2018-08-06
5240
点击加载更多
社区活动
腾讯技术创作狂欢月
“码”上创作 21 天,分 10000 元奖品池!
Python精品学习库
代码在线跑,知识轻松学
博客搬家 | 分享价值百万资源包
自行/邀约他人一键搬运博客,速成社区影响力并领取好礼
技术创作特训营·精选知识专栏
往期视频·千货材料·成员作品 最新动态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档