1作者: super_ar2 个月前原帖
嗨,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>我们很想听听你的反馈,看看你是否用现有工具很好地解决了这个问题。感谢阅读!