ClickHouse 失败并出现错误“DirectoryMonitor:额外信息的校验和不匹配:损坏的数据”
Posted
技术标签:
【中文标题】ClickHouse 失败并出现错误“DirectoryMonitor:额外信息的校验和不匹配:损坏的数据”【英文标题】:ClickHouse failed with the error "DirectoryMonitor: Checksum of extra info doesn't match: corrupted data" 【发布时间】:2020-10-15 11:46:02 【问题描述】:我的二进制文件在数据中带有曲线(我的错)。 ClickHouse 无法将其插入表中并停止处理其他数据。我刚刚打开二进制文件进行编辑并修复了错误的字段。之后,ClickHouse 获取了该文件并给出了关于无效校验和的错误。
default.affiliate_program.DirectoryMonitor: Code: 40, e.displayText() =
DB::Exception: Checksum of extra info doesn't match: corrupted data. Reference: cb322c17e14d6816abfcdc16842e7bdd. Actual: f4afe41e77b9a92bfa4048648a3aebbb.,
之后,ClickHouse 将文件传输到损坏的文件夹并继续。 是否可以更改校验和或其他任何内容以处理我重写的文件?
【问题讨论】:
【参考方案1】:https://github.com/ClickHouse/ClickHouse/issues/16005
无法更改分布式表的 .bin 文件。它具有内置校验和,因此需要重新计算它,但这很麻烦。
但还有另一种方式。可以手动选择和插入未损坏的 .bin 文件select * from file('/path/to/file.bin', 'Distributed')
更多详情:https://github.com/ClickHouse/ClickHouse/pull/9653
【讨论】:
【参考方案2】:我只是扩展了@Denny Crane 的原始问题和答案。
由于错误的配置default-profile,我收到了类似的错误 - 它被标记为readonly。结果后续数据插入到分布式表会导致如下错误:
database.table.DirectoryMonitor: Code: 164, e.displayText() =
DB::Exception: Received from **:9000.
DB::Exception: default: Cannot execute query in readonly mode. Stack trace:
0. Poco::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x10519be0 in /usr/bin/clickhouse
1. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x8f5072d in /usr/bin/clickhouse
..
插入分布式表时:
.. 数据块刚刚写入 本地文件系统。 ..您应该检查是否发送了数据 通过检查文件列表成功(等待发送的数据) 在表目录:/var/lib/clickhouse/data/database/table/."
(详情见Distributed Table Engine)
让我们查看 /var/lib/clickhouse/data/database/table/ 文件夹内部并检查 'hanging' bin-file 以找出问题的原因:
sudo vim /var/lib/clickhouse/data/database/table/default@../3757.bin
bin 文件的顶部是原始的 sql-query 和查询设置。在我的情况下,readonly 设置为 1(见最后一行)是不允许执行插入的问题根源(格式 bin 文件将来可以更改,输出会不同):
εû×^L<88>^H¡©^Cõ^FINSERT INTO database.table(column_list) VALUES^V
use_uncompressed_cache^@^A0^N
load_balancing^@^F
random^Q
force_primary_key^@^A1^K
log_queries^@^A1^H
readonly^@^A1^P
..
要修复它需要:
修复根本原因(在我的情况下需要正确定义 default-profile)并检查测试插入是否正常工作
在集群的每个节点上做
将“挂起”的 bin 文件从 /var/lib/clickhouse/data/database/table/default@../
移动(而不是复制)到 /var/lib/clickhouse/user_files/
从 CH 打开文件并重新插入
# check data availability
SELECT count()
FROM file('*.bin', 'Distributed')
# re-insert data
INSERT INTO database.table
SELECT *
FROM file('*.bin', 'Distributed')
# FROM file('3757.bin', 'Distributed')
从原始文件夹/var/lib/clickhouse/user_files/
中删除已处理的“挂起”文件
【讨论】:
以上是关于ClickHouse 失败并出现错误“DirectoryMonitor:额外信息的校验和不匹配:损坏的数据”的主要内容,如果未能解决你的问题,请参考以下文章
创建 Direct3D12 设备失败并出现 E_NoInterface
从具有 O_DIRECT 的 HDD 读取()失败并显示 22(EINVAL,无效参数)