Git Product home page Git Product logo

clickhousebook's People

Contributors

nauu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

clickhousebook's Issues

99页

原文:而数据文件也会依照index_granularity的间隔粒度生成压缩数据块。
压缩数据块不是得严格按照64k-1m划分吗

10.4.2

image

红色部分。第一个字符串参数,缺乏后封闭单引号

勘误

尊敬的作者:
您好!
读了《ClickHouse原理解析与应用实践》这本书后,对ClickHouse有了进一步的认识,非常感谢!
在阅读过程中我发现了一个错误,向您反馈下,根据184页的原数据表,我们可以发现第186页的INNER JOIN的结果是错的,多了下面rate=105那一行结果,P188,P189的表格中也有类似的错误。

原表
P184部分截图

结果
P186部分截图

MergeTree分区键疑问

我看官网上在介绍MergeTree引擎的时候介绍了其中的一个特点:
“如果指定了 [分区键] 的话,可以使用分区。在相同数据集和相同结果集的情况下 ClickHouse 中某些带分区的操作会比普通操作更快。查询中指定了分区键时 ClickHouse 会自动截取分区数据。这也有效增加了查询性能。”
但是接下来在介绍建表语句中的 PARTITION BY 的时候又说:“分区不会加快查询” 和“不要使用客户端指定分区标识符或分区字段名称来对数据进行分区”
这让我感到很疑惑,觉得这是一个前后矛盾的说法,所以想请教一下这个究竟是怎样理解才对呢?

关于数据字典、Log表引擎、动态列的疑问

谢谢老师的书籍,有三个疑问请教老师:

  1. 书籍中第5章讲数据字典,看开头介绍提到用于“保存常量或经常使用的维度表数据,以避免不必要的JOIN查询”,可以简单理解为就像KV存储使用吗?但由于需要绑定数据源source,单独用作KV存取似乎也不行
  2. 第164页相关的Log表引擎的使用场景是什么呢?单看介绍,似乎不像是存日志的?另外,ClickHouse是否适合存储日志,包括非结构化、半结构化、结构化的日志呢?
  3. 由于需要事先定义表的Schema,如果有动态列(字段)的情况(事先不知道有多少列),ClickHouse有解决方案吗?

谢谢老师

关于第6章6.1.2小节介绍MergeTree存储结构的问题

作者你好,我在你写的纸质书上看到介绍,MergeTree在每个partition下面的,每一列数据用下面三个文件来存储:

[Column].bin
[Column].mrk
[Column].mrk2

但我下载clickhouse来研究,在数据目录的partition下面并没有看到针对每个字段建立单独的文件来存储,而是一个通用的:

data.bin
data.mrk3

来存储,请问这是为什么呢?

我测试的clickhouse是当前docker上面的latest版本。

1644563715(1)

clickhouse中如何复用中间表

您好,最近刚买了您的书,还在学习中,想问下在CK的ETL代码中如何复用中间表,类似于hive的with as,想用于递归的场景,比如id、parentid、name的这种结构,目前了解到ck的with是变量,或者函数的层面,和期望的效果不太一致

正文43页表格倒数第二行,笔误

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 便会在安装路径下创建“ ,其中安装目录应该是数据存储目录

关于.mrk产生的疑问

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,但似乎并不能和结果对应上,故望解答一下。

笔误

  1. 第154页:earlies应该为earliest,为了保证新版kafka(从kafka 0.11开始)语义(虽然librdkafka做了兼容),建议把largest都改为latest(相关文字为auto.offset.reset=largest),smallest都改为earliest(相关文字为<auto_offset_reset>=smallest</auto_offset_reset>)
  2. 第165页:创建spripelog_1,拼写错误,应该为stripelog_1
  3. 第229页:配置文件示例,其中缩进排版问题

请问Distributed表是如何进行Merge操作的?

我看到文章中有讲ReplacingMergeTree怎么进行Merge操作,和Distributed表用的MergeTree引擎怎么进行写操作的复制,但好像没有讲该表是如何进行合并操作呢?也是由接收的主副本进行分发?

30个问题的集合

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肯定不在这个副本上,那就没有必要查它了。

读荐勘误

7.1.2 小节

关于 max_data_part_size_bytes 参数的描述有误,官网文档描述的是“如果某个part的数据量大于该值,则会被移到下一个volume”

关于6.3.4 索引的查询过程,第二点,递归交集判断错误的问题

书中这样介绍:

如果存在交集,且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 配置中,多出一行
P88 数据以何种形式被存储、如何被加载。 建议:似乎可以去掉两个"被"字
P92 更多关于数据存储的细节会在6.5节阐述。 建议:似乎改为 关于数据存储的更多细节... 更符合中文表达
P101 直至A192为止。 应为A191?
P160 倒数第6行:当 join_type 被设置为ANY时..... , 应为:join_strictness ?
P206 倒数第3行:CH才能打印计划日志。全书正文中极少使用CH指代 ClickHouse,更多用的是全称。故建议似乎改回全称 ClickHouse 更为适宜
P212 倒数第7行:ClickHouse 使用一组 zookeeper 标签定义相关配置... 全书更多使用 ZooKeeper 的拼写方式。但是此处要不要改尚存疑,毕竟 ClickHouse 配置文件中的写法就是全部小写
P215 正数第2行:大量运用了 ZooKeeper 的能力... 能力似改为:功能或者特性 更为贴切?存疑
P229 倒数第4行:它们分别指向了是.... 行末尾似乎应去掉"是"字

如有不妥,还望海涵。

勘误以及建议

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

6.4.2 tokenbf_v1描述有歧义

"tokenbf_v1会自动按照非字符的、数字的字符串分割token",这句话在官方文档中,描述为(non-alphanumeric characters)非字母字符。我在看书的时候不是很理解"非字符"这个概念,不知是否是我自己理解问题。

读书中,记录一些疑问

1、别字问题:正文第一页,倒数第二段落末尾处,“随着现代化终端系统对实效的要求越来越高”,此处“实效”是否应为“时效”;
2、crontab执行时间:正文第29页末尾,“在默认的情况下,每隔10秒就会”,此处是否应为每隔10分钟,分时天月周
3、正文第33页: --time那个例子,没有加--multiquery ,但是执行了2个sql

目录97页笔误

原文第七行:
按照目录规,
应为:
按照目录规则,

第九章 JOIN 查询 9.5.1 ASOF 连接精度的问题

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):

  1. Poco::IOException::IOException(int) @ 0xbb949fb in /usr/bin/clickhouse
  2. Poco::Net::ConnectionResetException::ConnectionResetException(int) @ 0x9c54539 in /usr/bin/clickhouse
  3. ? @ 0x4d82360 in /usr/bin/clickhouse
  4. Poco::Net::SocketImpl::receiveBytes(void*, int, int) @ 0x9c63058 in /usr/bin/clickhouse
  5. Poco::Net::HTTPSession::receive(char*, int) @ 0x9c47aa4 in /usr/bin/clickhouse
  6. Poco::Net::HTTPSession::get() @ 0x9c47b0b in /usr/bin/clickhouse
  7. Poco::Net::HTTPHeaderStreamBuf::readFromDevice(char*, long) @ 0x9c41e52 in /usr/bin/clickhouse
  8. Poco::BasicBufferedStreamBuf<char, std::__1::char_traits, Poco::Net::HTTPBufferAllocator>::underflow() @ 0x9c41d08 in /usr/bin/clickhouse
  9. std::__1::basic_streambuf<char, std::__1::char_traits >::uflow() @ 0xc5ebf3a in /usr/bin/clickhouse
  10. std::__1::basic_istream<char, std::__1::char_traits >::get() @ 0xc5f2766 in /usr/bin/clickhouse
  11. Poco::Net::HTTPRequest::read(std::__1::basic_istream<char, std::__1::char_traits >&) @ 0x9c445d3 in /usr/bin/clickhouse
  12. Poco::Net::HTTPServerRequestImpl::HTTPServerRequestImpl(Poco::Net::HTTPServerResponseImpl&, Poco::Net::HTTPServerSession&, Poco::Net::HTTPServerParams*) @ 0x9c4700e in /usr/bin/clickhouse
  13. Poco::Net::HTTPServerConnection::run() @ 0x9c6b510 in /usr/bin/clickhouse
  14. Poco::Net::TCPServerConnection::start() @ 0x9c68017 in /usr/bin/clickhouse
  15. Poco::Net::TCPServerDispatcher::run() @ 0x9c6840d in /usr/bin/clickhouse
  16. Poco::PooledThread::run() @ 0xbbfaf4f in /usr/bin/clickhouse
  17. Poco::ThreadImpl::runnableEntry(void*) @ 0xbbf81b8 in /usr/bin/clickhouse
  18. ? @ 0xbbf98e9 in /usr/bin/clickhouse
  19. start_thread @ 0x7e65 in /usr/lib64/libpthread-2.17.so
  20. clone @ 0xfe88d in /usr/lib64/libc-2.17.so

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.