1作者: super_ar1 天前原帖
嗨,HN!我们是 Ashish 和 Armend,GlassFlow 的创始人。我们刚刚推出了我们的开源流式 ETL,它在将 Kafka 流数据导入 ClickHouse 之前进行去重和合并。<a href="https:&#x2F;&#x2F;github.com&#x2F;glassflow&#x2F;clickhouse-etl">https:&#x2F;&#x2F;github.com&#x2F;glassflow&#x2F;clickhouse-etl</a> <p>我们为什么要构建这个工具: 对于批量数据的去重是相对简单的。你可以将数据加载到一个临时表中,然后通过哈希或键找到记录的最新版本并保留它们。之后,将清理后的数据移动到主表中。但是,你尝试过对流式数据进行这样的处理吗? 我们的前一个产品的用户正在从 Kafka 到 ClickHouse 运行实时分析管道,并注意到由于重复数据,分析结果是错误的。源系统在从 CRM、商店系统和点击流中获取相似用户数据时产生了重复数据。 <p>我们希望利用现有的 ClickHouse 选项来解决这个问题,但 ClickHouse 的 ReplacingMergeTree 具有不可控的后台合并过程。这意味着新数据已经进入系统,但你永远不知道合并何时完成,在此之前,你的查询将返回不正确的结果。 <p>我们考虑过使用 FINAL,但对于实时工作负载的速度并不满意。 <p>我们尝试了 Flink,但管理 Java Flink 作业的开销太大,自建解决方案将使我们不得不设置和维护状态存储,可能是一个非常大的存储(唯一键的数量),以跟踪我们是否已经遇到过某条记录。如果你的去重服务失败,你需要在处理新记录之前重新恢复该状态。这对我们来说维护成本太高。 <p>我们决定通过构建一个新产品来解决这个问题,并很高兴与大家分享。 <p>关键区别在于,流在导入 ClickHouse 之前就已经去重。因此,ClickHouse 始终拥有干净的数据和更少的负载,消除了错误结果的风险。我们希望更多的人能从中受益,因此决定将其开源(Apache-2.0)。 <p>主要组件: <p>- 流式去重: 你可以定义去重键和时间窗口(最长可达 7 天),它会实时处理检查,以避免在进入 ClickHouse 之前出现重复数据。状态存储是内置的。 <p>- 时间流连接: 你可以通过几个配置输入实时连接两个 Kafka 流。设置连接键,选择时间窗口(最长可达 7 天),就可以了。 <p>- 内置 Kafka 源连接器: 无需构建自定义消费者或管理轮询逻辑。只需指向你的 Kafka 集群,它会自动订阅你定义的主题。有效负载默认以 JSON 格式解析,因此你可以立即获得结构化数据。作为底层技术,我们选择了 NATS,以确保其轻量和低延迟。 <p>- ClickHouse 接收端: 数据通过优化性能的本地连接器推送到 ClickHouse。你可以调整批量大小和刷新间隔,以满足你的吞吐量需求。它会自动处理重试,因此在瞬时故障时不会丢失数据。 <p>我们很想听听你的反馈,看看你是否用现有工具很好地解决了这个问题。感谢阅读!