nauu / clickhousebook Goto Github PK
View Code? Open in Web Editor NEWClickHouse原理解析与应用实践
License: Apache License 2.0
ClickHouse原理解析与应用实践
License: Apache License 2.0
原文:而数据文件也会依照index_granularity的间隔粒度生成压缩数据块。
压缩数据块不是得严格按照64k-1m划分吗
我看官网上在介绍MergeTree引擎的时候介绍了其中的一个特点:
“如果指定了 [分区键] 的话,可以使用分区。在相同数据集和相同结果集的情况下 ClickHouse 中某些带分区的操作会比普通操作更快。查询中指定了分区键时 ClickHouse 会自动截取分区数据。这也有效增加了查询性能。”
但是接下来在介绍建表语句中的 PARTITION BY 的时候又说:“分区不会加快查询” 和“不要使用客户端指定分区标识符或分区字段名称来对数据进行分区”
这让我感到很疑惑,觉得这是一个前后矛盾的说法,所以想请教一下这个究竟是怎样理解才对呢?
谢谢老师的书籍,有三个疑问请教老师:
谢谢老师
您好,最近刚买了您的书,还在学习中,想问下在CK的ETL代码中如何复用中间表,类似于hive的with as,想用于递归的场景,比如id、parentid、name的这种结构,目前了解到ck的with是变量,或者函数的层面,和期望的效果不太一致
在使用日期作为分区键后,查看partition.dat 文件的内容是 h=4这样的数据,和书中的说的有出入。不知道是不是版本的问题,我使用的版本是20.3.12
1、正文43页表格,根据前面的描述,乘法不需要要求第一个数的S大于第二个数的S。除法需要,所以表格笔误了,应该把(S1>=S2放在除法那一行)
2、正文44页,DateTime64类型的例子,toTypeNmae列输出的应该是DateTime64(2)
3、顺便问个问题,DateTime64可以设置精度,是不是变相可以支持毫秒,微秒之类的呢?谢谢
4、正文第47页,汉字倒数第二段,“在同一数据行内每个数组字段的长度必须相等”,咋一看感觉是数组中每个字段长度必须相等,比如[1000,1001],1000与1001长度都是4,相等,那如果是100和1000是否就不等,是否就报错呢。其实细看上下文,能理解这句话意思。不过我觉得可以改下,帮助理解,比如:每个数组长度必须相等,删除“字段”两个字;或者改成:每个数组字段的数量必须相等,把“长度”换成“数量”。
5、正文47页,嵌套表例子中部门id为UInt8,实际insert的是1000,10001,这个产生了益处,我这查询1000和1001分别输出232和17了,刚开始看半天没明白,后来才察觉是数据长度不够,这个溢出在clickhouse不报错么?跟您的溢出值16,17,18还不一样
6、正文50页,第四段,”ClickHouse 便会在安装路径下创建“ ,其中安装目录应该是数据存储目录
P110中,图6-18
中举例说明了.mrk中的文件内容,其中压缩文件中的偏移量示例中为0和12016
。
在后续P112中,说明了12016=12000+8+8
,其中8为头信息压缩后的大小。
不过我在此有个疑问,第二个8指的是什么大小。
书中提及定位方式可参考图6-19
,不过图6-19
似乎含义是,12016=12000+8+8
的第二个8似乎是第二个压缩块的头信息?
但这样的话,第一个偏移量0
又没有包含第一个数据块的头信息。
即如果
12016=12000+8+8
中第二个8的含义是第二个压缩块的头信息,那么图6-18
中偏移量示例应该为8和12016
?
后来我参考官方示例,导入了同样的文件,可以看到书中示例数据均为真实数据。
执行下述语句
od -l -j 0 -N 480 --width=24 JavaEnable.mrk2
并且发现了下面数据:0,12016,26693
。
再执行
clickhouse-compressor --stat < ./JavaEnable.bin
可以得到所有数据块压缩后的大小,其中前三个为12000,14661,4936
。
经过简单计算,可得:26693=12016+14661+8+8
。似乎也有一个8的多余。(毕竟截止第三个数据块开始只有3个,但实际计算中包含了4个8。)
同时对clickhouse-compressor --stat < ./JavaEnable.bin
展示的结果进行统计,发现总的数据块压缩共有135个,总大小为1396487字节
。而JavaEnable.bin
在系统中占用了1394327字节
。1396487-1394327=2160=135*16
。
故似乎.bin
文件中,似乎还有文中未提及的空间,查看网上资料似乎有一块checksum,但似乎并不能和结果对应上,故望解答一下。
我看到文章中有讲ReplacingMergeTree怎么进行Merge操作,和Distributed表用的MergeTree引擎怎么进行写操作的复制,但好像没有讲该表是如何进行合并操作呢?也是由接收的主副本进行分发?
join_tb2没有rate=105的表项
Pxx代表页码。
【1】P55 "物化视图目前不支持同步删除",为什么呢?MV的更新是在有新数据插入的时候触发;而Clickhouse的数据删除也是以增代删,理论上应该也可以同步啊。
【2】P79 "可执行文件"。非常不理解这种字典的使用场景,它与本地文件有什么本质区别?
【3】P81 上半部分字典配置。如果不只是能指定filter,如果还能指定select字句来增加projection岂不是更加灵活,就像一个view一样。
【4】P83 MongoDB字典,字典的字段如何与MongoDB的字段进行映射呢?MongoDB是支持嵌套的。
【5】P90 "sample by intHash32(UserID)" 加了这句之后,数据的存储模型有什么变化吗?他是如何帮助后面可以高效的采样的呢?
【6】P92 "MergeTree通过标记文件建立了primary.idx稀疏索引与.bin数据文件之间的映射关系"。这里如果能讲primary.idx与.mrk文件的映射关系,读者就会更加清楚了。
【7】P104 minmax的汇总信息以什么方式存储在哪里?
【8】P105 ngrambf_v1 布隆过滤器为什么能提升like语句的查询效率?
【9】P107 每个压缩块都有压缩方式字段,是不是意味着每个数据块都可以使用不同的压缩方式?
【10】P121 "如果一个分区内某一列数据因为TTL到期全部被删除了,那么在合并之后生成的新分区目录中,将不会保护这个列字段的数据文件",如果此时select该字段,会返回数据吗?是返回null还是返回默认值?
【11】P127 "注意,如果一次性写入大于1MB的数据,分区也会被写入cold卷",这个似乎不是很实用,能否根据数据的age来确定是否存到code卷呢?比如1年以前的数据已到cold卷,以节约成本。
【12】P131 "在修改ORDER BY时会有一些限制,只能….",如果新增拍下字段,已有的数据会重建吗?为什么新增排序字段不能通过MODIFY ORDER BY语句完成,而是需要通过ALTER ADD COLUMN完成,这个语句有什么pros/cons吗?
【13】P140 "数据会按照ORDER BY id, ver DESC",为什么是DESC?
【14】P141 应用程序如果决定ver呢?多线程访问下,是不是也存在ver字段冲突?譬如两个线程使用了一样的ver进行插入和删除。
【15】P150 "当通过MySQL表引擎向远端MySQL数据库写入数据的同时,物化视图也会同步更新数据",如果通过MYSQL的原生借口写入数据,而不是从ClickHouse里面写,MV还能同步吗?
【16】P164 TinyLog使用场景是什么?
【17】P166 Log与TinyLog有什么本质区别?比MergeTree好在哪里?
【18】P172 应该是一个笔误 router.post('/ user', …" 斜杆(/)与user之间多了一个空格。
【19】P180 "SAMPL 0.4" 这里是连续的取40%的数据吗?没有任何的随机性?
【20】P185 第5行,表中第二行"1,ClickHouse,105",原表中没有rate=105的表,貌似原始表join_tb2少了一行。
【21】P188 "(3)将右表中未被连接的…",那么左表中未被连接的数据行呢?
【22】P191 "这是因为中执行PREWHERE查询时,只需要获取JavaEnable字段进行数据过滤",WHERE查询时不能这么做吗?这个不应该在优化器里面用户无感的做掉了的么?为什么引入一个新的关键字PREWHERE?
【23】P201 倒数第4行,NULL为什么不是排在最后或者最前?
【24】P212 唯一性,应用侧如何以相同的block写入呢?另外相反,如果确实有2条一样的数据需要插入,如何才能不被reject掉呢?
【25】P215 "/block_numbers …. 都会依照相同的block_numbers顺序进行" 这是为了保证副本merge之后与主副本完全一致?
【26】P216 "/queue ….会将执行任务添加至该节点", 这个添加动作会失败吗?log与mutation的执行顺序重要吗?不同的执行顺序会导致不同的结果吗?貌似insert和delete顺序不同,最终结果是不一样的。
【27】P223 "与此同时,主副本还会锁住执行线程", 锁住执行线程意味着什么?后续无法进行merge计划?
【28】P237 本地表是如何与Distributed表关联起来的?是通过表名的前缀(test_shard_2)关联的吗?
【29】P242 "首先在CH5节点,对分布式表…",Client端可以轮换这个节点,以分散写入压力吗?
【30】P245 "分布式查询的核心流程",这里有可能根据key进行分支裁剪吗?如果一个key肯定不在这个副本上,那就没有必要查它了。
关于 max_data_part_size_bytes
参数的描述有误,官网文档描述的是“如果某个part的数据量大于该值,则会被移到下一个volume”
书中这样介绍:
如果存在交集,且MarkRange步长大于8(end-start),则将此区间进一步拆分成8个子区间(由merge_tree_coarse_index_granularity指定,默认值为8),并重复此规则,继续做递归交集判断。
但是根据 图6-12,正确的描述应该是
如果存在交集,且MarkRange步长大于或者等于8(end-start),则将此区间进一步拆分成8个子区间(由merge_tree_coarse_index_granularity指定,默认值为8),并重复此规则,继续做递归交集判断。
感谢作者的无私分享,感谢编辑的辛勤工作!
P83 配置中,多出一行
如有不妥,还望海涵。
89页,数据总会以数据片段的形式写入磁盘,且数据片段不可修改;这个不可修改是什么情况呢
1.建议(P184-185):针对ALL以及ANY相关join,给出的测试数据表存在问题,join_tab1与join_tab2通过id关联不存在2表中可以找到多条匹配数据,故无法区分all以及any怎么返回匹配的全部/第一条数据,建议调整join_tab2的数据
2.错误(P189):9.5.3中join_tab1join_tab2、join_tab3关联结果出现a.name = ClickHouse b.rate=105的数据,该数据在测试数据表join_tab2中不存在
3.错误(P232):10.4.2第三段文字中// 1分片,2副本...是使用的10.2.3的多副本示例,但是在P214 10.2.3的示例为1分片,1副本...还望确认下
4.争议:在P230处案例为2分片 0副本的sharding_sample集群,对应的每个shard配置中只有一个replica,同样N分片N副本的案例为1分片1副本,每个shard内部两个replica,而在官网的Distributed介绍案例[Getting Started -> Tutorial]中和书中含义不同,案例为3分片,每分片1副本的集群perftest_1shards_3replicas中每个shard下只有一个replica,故到底一个shard下一个replica是表示1分片一副本还是书中的1分片0副本???
https://imgtu.com/i/5sglRg
https://imgtu.com/i/5sg8Mj
关于数据插入原子性描述说服务端处理数据才具有,这个服务端处理指的什么操作呢?平常都是在服务器上用cli登陆数据库执行数据导入,insert select等语句,这个怎么算服务端处理呢
"tokenbf_v1会自动按照非字符的、数字的字符串分割token",这句话在官方文档中,描述为(non-alphanumeric characters)非字母字符。我在看书的时候不是很理解"非字符"这个概念,不知是否是我自己理解问题。
1、别字问题:正文第一页,倒数第二段落末尾处,“随着现代化终端系统对实效的要求越来越高”,此处“实效”是否应为“时效”;
2、crontab执行时间:正文第29页末尾,“在默认的情况下,每隔10秒就会”,此处是否应为每隔10分钟,分时天月周
3、正文第33页: --time那个例子,没有加--multiquery ,但是执行了2个sql
我在单台服务器测试, 磁盘的写入速度是150MB/S
测试插入的速度只有47MB/S, 只有磁盘IO的1/3。
是我没用对吗, 还是它只有这个速度
原文第七行:
按照目录规,
应为:
按照目录规则,
ASOF SQL示例:
SELECT a.id, a.name, b.rate, a.time, b.time FROM join_tb1 AS a ASOF INNER JOIN join_tb2 AS b ON a.id = b.id AND a.time = b.time
该SQL 执行失败:(SQL工具 DBeaver)
SQL 错误 [403]: ClickHouse exception, code: 403, host: 10.202.249.105, port: 8123; Code: 403, e.displayText() = DB::Exception: No inequality in ASOF JOIN ON section. (version 20.4.4.18 (official build))
书中表述:
而紧随其后的 a.time = b.time 则是 asof_column模糊连接条件,这条语句的语义等同于:
a.id = b.id AND a.time >= b.time.
我觉的好像不是这样,将 最上面的SQL中 a.time = b.time 替换为 a.time >= b.time 则能执行成功。
说明 a.time = b.time 在语义上不等于 a.time >= b.time
是由于 ClickHouse 版本升级的原因吗
ServerErrorHandler: Poco::Exception. Code: 1000, e.code() = 104, e.displayText() = Connection reset by peer, Stack trace (when copying this message, always include the lines below):
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.