从ES到ClickHouse,Bonree ONE平台更轻更快!

Clickhouse & Elasticsearch 选型对比 Clickhouse是俄罗斯搜索巨头Yandex开发的完全列式存储计算的分析型数据库。ClickHouse在这两年的OLAP领域中一直非常热门,国内互联网大厂都有大规模使用。Elasticsearch是一个近实时的分布式搜索分析引擎,它的底层存储完全构建在Lucene之上。简单来说是通过扩展Lucene的单机搜索能力,使其具有分布式的搜索和分析能力。今天很多用户在实际的业务场景中,常常面对ClickHouse和Elasticsearch技术选型的难题。 阅读详情

图片

本文字数:8052;估计阅读时间:21 分钟

作者:博睿数据  李骅宸(太道)& 娄志强(冬青)

本文在公众号【ClickHouseInc】首发

本系列第一篇内容:

图片

100%降本增效!Bonree ONE平台通过ClickHouse实现了可观测信号数据的统一!

一、背景

Bonree ONE是博睿数据发布的一体化智能可观测平台,融合了指标、调用链、日志、会话、事件等多种数据。早期时候,调用链、会话、日志的数据存到了Elasticsearch。我们历史架构如下图,大数据团队需要维护多种存储。比如,告警业务A说要做AI训练,就得自己加工一份时序数据到HDFS,指标中心业务B说加工指标,就自己加工一条链路到ClickHouse,DEM业务C想做会话分析,APM业务D又想做调用链分析,日志业务E还想做日志分析,那么业务C、D、E就分别加工各自数据到ES,这就导致完全各自业务各自加工存储。这样烟囱式的发展到一定程度后,数据不好管理,资源浪费严重,并且各业务之间数据很难做关联式的统计和分析(比如用户的网络请求和后端调用链关联的多端打通场景),产品迭代越来越重。即使在产品web页面看起来能展示到一起,但下面架构和数据已经到了盘根错节的程度,对于千亿级、万亿级甚至更多的数据非常难治理,产品在私有化大B客户项目交付时更成为不可控的空中楼阁。

图片

使用ES过程中我们也遇到了以下痛点:

  1. 数据割裂。由于可观测性的业务特性,数据融合是真正的能力,像历史烟囱式的异构存储给我们的数据融合本身就带来了阻碍。可观测性场景里有很多互相关联的分析场景(比如前后端数据融合打通业务和系统去做根因分析),这就导致要么多端数据可能不一致,要么做不到真正的关联分析或关联加工成本很高。

  2. 效率差。比如业务写入会话数据到ES的同时,相关联的快照数据写入对象存储系统,相对于快照数据的写入时间,ES数据写入响应时间需要等待至少亚秒级的延迟,导致产品上会有查询不到数据而出现天窗问题,影响体验。

  3. 分析效率低。产品有搜索+统计分析的结合场景,海量数据近30天的统计经常查不出来。

  4. 资源成本高。数据占用存储资源多,压缩效果不好,随着数据量的上涨,成本会越来越高。

  5. 维护成本高。IO资源开销大,尤其私有化混部场景,对部署在同一个机器上的其他组件,影响较大。我们经常发现很多B端用户混部时,因为ES的IO占用过高影响了其他组件的稳定性,尤其金融类大客户对稳定性要求极高,我们需要经常驻场排障。

由于ES存在诸多问题,使得我们迫切寻找一个新的架构和存储方案来进行升级,解决写入和查询的性能问题以及成本问题。

二、为什么选择ClickHouse

新的存储方案需要具备高写入吞吐、高读取效率、集群管理方便的特点。我们选中了ClickHouse是因为:

  1. 写入效率:ClickHouse写入可以达到100M/秒,同时在延迟性上,受攒批效率的影响,实现了亚秒级别的数据写入延迟,而且稳定性相对于ES来说更强。在ES里,随着数据量积累增加,索引的更新成本是在逐步增长的相对的,写入稳定性也在受影响。同时,ClickHouse的压缩效率明显比ES好。

  2. 读取效率:在会话场景里,业务查询数据的时间范围以及对应的统计分析都是不确定的,ClickHouse基于高频查询确认主键字段,基于常用高优查询指定索引等优化手段,保证查询效率稳定。而ES在应对非固定查询的场景下,会占用大量内存,同时由于索引块换入换出的问题,会引起IO较高的问题。

  3. 集群管理:我们自研了ClickHouse集群的管理平台,支持对ClickHouse服务的数据写入、读取、节点状态等的监控,以及常用运维操作,比如扩缩容、数据均衡等。在 ES 的集群管理上,没有方便的页面工具覆盖到扩缩容、数据迁移等运维操作。

  4. 易用性:ClickHouse基于sql查询,业务接入直接基于jdbc的方式或者http的方式就可以直接使用。在ES中,大段的Json格式的查询,有一定的学习门槛。

三、从ES迁移到ClickHouse

经过烟囱式架构重构改造,我们把ClickHouse集群横向作为可观测性所有信号数据的统一存储,用自研的ck-consumer组件统一在存储写入层做了封装,做了精细化的攒批优化和脏数据阻断,让所有数据均衡写入ClickHouse集群,用自研的 ck-manager组件管理ClickHouse集群的状态、资源隔离、DDL、高可用容错等能力,用自研的one-service组件做了统一数据服务,屏蔽了存储(尤其对于信创改造收益较大),用自研的平台管理界面丰富了ClickHouse的拓扑信息、全方位自监控和告警、SQL执行、分区管理、配置管理、任务管理、TTL过期管理策略、磁盘预估策略等运维工具能力。这样先从架构数据上做好融合,把复杂交给底座引擎,把简单留给业务,让业务高效迭代。

图片

四、写入优化

1. 按表攒批

ClickHouse是擅长按批写入数据的,批次的数据越大,吞吐量越高。为应对多场景数据涉入的状况和减少业务端对数据存储感知的需求,我们通过消费节点来完成攒批逻辑,根据每个表的个性化定制策略,实现攒批效果的最大化,这既能满足业务效率的要求,又能实现ClickHouse数据摄入的最大吞吐量。在consumer增加每个业务独立的攒批逻辑,根据业务数据特性,按照数据大小和延迟时间等策略触发写入操作。

2. 动态限流

往往资源预估并非十分精准,但无论如何系统自身要有防挂手段来保证稳定性(尤其对金融类客户申请变更需要走复杂流程,来不及马上干预)。在有限存储资源的情况下,ClickHouse集群支持的摄入量是有限的,过大的数据写入主要有两个维度的原因,一个是写入的数据量过多,另一个是写入的峰值过高。前者会通过告警功能送达运维团队,通过扩容或数据降级或限流的操作来解决。后者在有限资源情况下通过蓄洪和限流来保证存储集群的稳定性。目前,在consumer节点,我们增加了窗口逻辑来满足限流操作策略介入的需要。比如依据总parts数和服务内存情况,通过指定的策略算法,动态计算出每个业务数据摄入的上限,写入操作会加入窗口逻辑,限制数据摄入的速度,防止存储超限。

3. too many parts问题

当写入超过ClickHouse服务承受的上限的时候,会出现too many parts异常。这个异常的本意是防止ClickHouse服务在超负载的情况下挂掉,同时给维护人一个信号。因此,出现too many parts异常的时候,维护人就要关注当前服务是不是遇到超高峰数据的写入了。此时可以关注的指标如下:

  • 当前服务占用的cpu是不是超预期了。关注merge任务是不是占满队列,通常写入超预期的情况下,parts数量也是暴涨,ClickHouse为了保证查询效率,merge任务就会暴涨,而merge任务是消耗硬件资源的,如果资源不够,merge任务运行缓慢,就会降低parts数量的减少效率,从而导致parts数量缓慢增加,当增加到parts_to_throw_insert的数值时,就会产生too many parts的异常。

  • 关注写入数据攒批的状态,如果写入频繁,单批次数量较小,会导致parts数量增长很快,很容易触发到merge任务运行的最大值,从而引发too many parts异常。

经过团队合理优化攒批大小后,too many parts的问题得到有效解决,并且我们对parts单独增加了界面化监控。

五、读取优化

1. 查询加速

  • orderBy和primaryKey的高效使用:orderBy相关字段是表数据的排序设置,它对高频查询的效率有重要。一般orderBy的设置要尽量覆盖当前表业务的高频查询,从低基数到高基数进行排序设置。primaryKey默认与orderBy一致,如果filter条件没有覆盖所有的orderBy字段,则可以提取部分字段作为primaryKey,但是primaryKey必须是orderBy字段的前缀。

  • 索引使用:高频查询要充分利用主键索引,主键索引满足不了的高频查询,借助索引来加速。针对等值过滤使用BF索引,针对范围查询使用minmax索引,针对全文模糊检索使用tokenbf索引。

  • 物化视图:针对固定优化查询场景,使用物化视图,大大提高查询效率。但物化视图不保证和原表的数据一致性,需要业务自己维护或业务可容忍。物化视图要按需合理使用,否则如果创建过多的物化视图,也要同时考虑parts过多的风险。

  • projection:针对部分预聚合场景,使用projection的效率更高,查询有更友好的自动路由,且业务不用考虑和原表数据一致性的问题,减少业务侵入,正所谓“数据同源、同生共死”。有些首页统计或者个性化查询加速场景,经常用到projection来保障,业务也不用修改查询,这点非常受益。但projection也有一些限制,比如对高基维度不太友好。

  • 大数据量查询过滤:例如调用链有百亿到千亿级数据。查询指定调用链,调用链详情在存储的时候会出现一天出现多条,同时出现跨分区的情况,但需要在海量数据中快速查找到指定的数据。即使加了索引之后,在扫描调用链超大量数据时,过滤之后还是会命中很多的granularity。这里可以按照调用链ID排序,分区内通过一级索引快速命中指定的调用链数据。同时为了查询出跨分区的调用链详情数据时,调大时间范围可以将调用链完整的数据全部查询出来。这样在数十亿条数据中查询一条完整的调用链数据耗时控制在毫秒级别。再比如按巨大量级调用链的耗时排序展示的场景,可以通过分位特征计算,缩放数据范围,也可以达到高速查询的效果。

2. 压缩和编码

ClickHouse提供了多种编码以及多种编解码器,极大提高数据的压缩效率,节省IO、存储等资源。ClickHouse支持的压缩算法举例:

  • NONE : No Compression.

  • LZ4 : Applies LZ4 fast compression.

  • LZ4HC[(level)] : LZ4 HC (high compression) algorithm with configurable level.

  • ZSTD[(level)] : ZSTD compression algorithm with configurable level.

我们场景经过测试对比,大部分ZSTD的压缩效率是LZ4的5~6倍。若想要更高的压缩效率,数据的存储编码是一种更好的优化手段。ClickHouse提供的特殊编码算法举例:

  • Delta : This approach stores the difference between 2 neighbor values. It can be combined with LZ4 and ZSTD.

  • DoubleDelta : This approach stores the difference between 2 neighbor delta values (delta of deltas). Suitable for time series data.

  • Gorilla : Calculates XOR between current and previous value. Suitable for slowly changing floating numbers.

  • T64 : It crops unused high bits of values in integer data types(include Enum, Date, DateTime) and puts them into a 64×64 bit matrix.

  • FPC : Used in floating point values. XOR between the actual value and the predicted value.

针对以上编码算法的特性,类似时间等递增字段我们选择基于DoubleDelta编码的ZSTD(1)压缩算法,String类型使用ZSTD(1)的压缩算法。

3. 字段精细化

ClickHouse提供了非常精细的数据字段进行压缩,比如整数就支持int8、int16、int32、int64,ClickHouse之所以这么细化数据类型,是为了高效的存储和计算,所以在业务使用端,也要做到精确化管理。

  • 低基数的String使用 LowCardinality,会将string类型的字段使用类似于码表的手段将转换成数值类型字段进行存储,进而提高压缩率。

  • 能用更少位数的数据存储,就选择最少位数的数据存储,比如优先使用int8,而不是默认使用int64。

  • 半结构化数据优先使用Map结构,其次是JSON结构。

4. 天窗问题

调用链改造前使用ES存储统计数据,使用公司自研的BRFS小文件系统存储调用链详情数据,无法做到数据写入的原子性,经常会导致列表数据和详情数据不一致的天窗问题。之前是在业务层自己做处理,但成本较高且方案不通用。为了解决此问题,我们使用Null引擎将详情数据和统计数据一起入CK库。再通过物化视图将数据进行分拆到不同的表中,这样就保障了多页面之间数据一致性。

六、参数调优

ClickHouse开放了很多参数,参数调优是个细活。拿几个举例吧:

  • max_bytes_before_external_group_by:通过维度聚合查询时,当内存消耗超过这个阈值,GROUP BY会把多余的临时数据输出到文件系统并在磁盘进行处理计算,通常会建议配置成当前服务内存的80%。

  • max_bytes_before_external_sort:涉及数据排序时,当内存消耗超过这个阈值,ORDER BY 会把多余的临时数据输出到文件系统并在磁盘进行排序计算,通常会建议配置成当前服务内存的80%。

  • max_memory_usage:单条查询可以使用的最大内存,通常对不同的硬件配置以及不同的业务诉求配置不同的内存大小,我们场景一般会配置成当前服务内存的80%。

  • max_execution_time:单条查询可以执行的最长时间。一般跟业务相关,是业务可容忍的最大查询时间。

  • max_threads:用于控制一个用户的查询线程数,可以在合理范围内提高查询并行度。

  • background_pool_size:表引擎操作后台的线程数。太大会影响cpu资源,太小会影响parts数量,从而可能触发parts_to_throw_insert的异常。

  • parts_to_throw_insert:表分区之中活跃part数目超过多少,会抛出异常。针对不同的业务量,这个数字应该是不同的,用来保证相应的资源匹配相应的写入量级。

  • ttl_only_drop_parts:ClickHouse在数据过期的时候可以使用merge进行删除数据,做到了数据即时删除,但是也引起了一些风险。在删除数据时会消耗大量资源删除这些数据,而且数据量越大,对于系统整体的资源消耗越明显。如果希望这些资源用在入库和查询上,而不是浪费在释放一些磁盘的工作上,可以通过调整参数ttl_only_drop_parts=1,来设置过期的时候按照分区删除,并设置合理的分区,在牺牲很少一部分磁盘的情况下将mergeTTL这些资源节省出来提供给查询和入库,从而减少merge频率,降低负载。

七、多租户

ClickHouse为了保障多业务稳定查询,支持了多租户,减少业务之间的影响。我们基于ClickHouse的多租户能力,给予每条产品线单独的租户,实现租户资源个性化配置,满足不同业务不同优先级的诉求。

图片

系统是根据各个租户的业务重要程度与场景响应需求来制定对应的租户资源显示的。目前ClickHouse支持了多租户资源限制,但是对于ClickHouse内部的资源还没有绝对隔离,在这一点上,我们是通过完整的监控告警链路来跟进,减少资源冲突带来的不稳定性,支持租户资源的快速释放,从而快速解决某些应急场景。

八、高可用保障

1. 监控

我们自研了界面工具,方便监控和运维:

  • 首要跟踪的监控是写入和读取两个方向,比如每分钟写入量,写入耗时、查询QPS等,针对特定敏感业务可以个性化跟踪。

  • 针对节点本身的状态信息进行监控,比如服务负载、merge任务数、parts数量等,这些指标可以及时发现服务的稳定性风险。

  • 针对集群的均衡性进行监控,比如parts数据同步的延迟时间、各个节点的查询均衡性、各个节点的写入均衡性等,避免集群倾斜。

图片

2. 容错

  • 写入节点单节点异常,不影响整体服务写入。

  • ClickHouse单节点异常,不影响整体集群的写入也不影响读取。

  • 还有其他数据问题、服务问题等容错,这里先不开展了。

3. failover

数据的摄入和读取需要高可用机制来满足需求,比如写入端某个consumer节点异常,或者某个ClickHouse节点异常等情况,我们如何保证集群的稳定性。

图片

当consumer节点或者ClickHouse节点遇到异常时,manager节点能够感知到节点异常进行流量调度,使异常节点不影响数据正常摄入和查询,同时调整流量写入策略,保证consumer节点写入的稳定性,避免发生级联雪崩状况。

4. 重启慢

当集群容纳的数据量比较多的时候,ClickHouse的重启耗时会比较长,通常会达到几十分钟到小时级别不等。重启服务时间过长,对于整个服务的高可用会挑战很大,写入端的稳定性、容错性以及实时性,都会受到挑战。clickhouse23.11版本具备懒加载功能,clickhouse主线程启动后,库表分级异步加载模式去保证服务启动加速,期间读写请求优先级大于加载中库表优先级。

图片

5. 自运维工具

我们基于manager组件研发了ClickHouse集群的运维工具,目前可以做SQL任务管理、配置管理、分区管理、数据迁移等。方便在私有云场景对故障能有干预能力。

图片

九、效果

23年我们持续做架构精简,并围绕ClickHouse底座也做了大量的研究和落地工作:

图片

后来将调用链/日志/会话的几个ES集群全部迁移到ClickHouse之后:

  • 性能方面:写入效率根据不同业务提高了3-5倍,SQL查询P99耗时从4s+降到356ms,平均耗时降到62ms。稳定性更强,团队内部会定期演练一些故障场景,能够应对超预期的流量和更多容错场景。

  • 资源方面:我们自建云集群下线了24台ES机器(16C32G3T),同时扩容了10台同等配置的ClickHouse,节省了58%的机器成本。如果从单资源类型成本考虑,更加节省。相比ES,ClickHouse在内存和磁盘方面优势更加明显。以下仅是在我们自建云集群的对比结果(千亿级数据量),私有化客户量级会大更多。

图片

十、最后

未来,我们会更加专注ClickHouse集群的更多优化,主要聚焦在以下方向:

  • buffer实时引擎。打造纯实时ClickHouse底座,继续瘦身kafka链路和consumer组件,在可观测性核心场景做到真正的写入即可见。二开支持bufferr层的WAL高可用。

  • merge的效率提升。merge资源有时会和写入、查询资源互撞,影响系统稳定性,如何做到更佳的平衡和控制,需要再进一步摸索。

  • 存算分离。目前ClickHouse存算分离能力没有开源,需要考虑实际扩容单一类型资源的成本问题。

以上三个方向的优化与完善都能够进一步提升ClickHouse集群的性能、时效性、稳定性,帮助我们应对更多的业务场景,让业务发展稳中提效。

征稿启示

面向社区长期正文,文章内容包括但不限于关于 ClickHouse 的技术研究、项目实践和创新做法等。建议行文风格干货输出&图文并茂。质量合格的文章将会发布在本公众号,优秀者也有机会推荐到 ClickHouse 官网。请将文章稿件的 WORD 版本发邮件至:Tracy.Wang@clickhouse.com

​​联系我们

手机号:13910395701

邮箱:Tracy.Wang@clickhouse.com

满足您所有的在线分析列式数据库管理需求

信创 CDC 实战 | TiDB 实时入仓难点与解决方案解析(以 ClickHouse 为例) 本文介绍如何构建稳定、高兼容性的 TiDB → ClickHouse 实时同步链路,支持信创场景下的日志级数据采集、结构变更感知与秒级延迟入仓,助力国产数据库高效落地。 阅读详情

相关推荐

E5071C 网络分析仪使用指南

E5071C 网络分析仪是 Keysight(原 Agilent)推出的一款高性能矢量网络分析仪,广泛应用于射频(RF)和微波(MW)电路设计、天线测试、滤波器优化等领域。它以高精度、宽频率范围(9 kHz–20 GHz)、出色的动态范围和灵活的测量功能著称。本文将详细介绍 E5071C 的基本操作方法,帮助用户快速上手并高效使用该设备。

2501_90901792的博客 4185

ClickHouse和Elasticsearch压测对比,谁才是yyds?

点击关注公众号,Java干货及时送达????文章来源:https://my.oschina.net/u/4090830/blog/5570795目录1 需求分析2 测试环境准备3 采集工具准备4 压测执行及结果分析1 需求分析1.1 分析压测对象1)什么是 ClickHouse 和 ElasticsearchClickHouse 是一个真正的列式数据库管理系统(DBMS)。在 ClickHouse 中,...

方志朋的博客 2373

夜间灯光遥感数据介绍及下载汇总

夜间灯光遥感数据介绍及下载汇总

qq_43874102的博客 1万+

ClickHouse与ES的优劣对比

优点:凝天小说网 https://www.2792.info ClickHouse写入吞吐量大,单服务器日志写入量在50MB到200MB/s,每秒写入超过60w记录数,是ES的5倍以上。 查询速度快,官方宣称数据在pagecache中,单服务器查询速率大约在2-30GB/s;没在pagecache的情况下,查询速度取决于磁盘的读取速率和数据的压缩率。。 ClickHouse比ES服务器成本更低。一方面ClickHouse的数据压缩比比ES高,相同数据占用的磁盘空间只有ES的1/3到1/30,节省了磁盘空间.

damimi00的博客 1万+

【Android 教程系列第 30 篇】为什么要为 App 应用加固 ?如何为 App 应用加固 ?

一:为什么要为 App 应用加固 ? 二:如何为 App 应用加固 ? 三:加固后为什么要重新签名 ?

“Allen Su”的博客 7053

eye-in-hand手眼标定系统

上一个博文说了一种手眼标定系统的特殊情况,就是相机随着机械手一起移动的情况。虽然前面简单介绍了一种办法,就是内次拍照时让相机回到之前标定的位置,但是这样处理机器人的工作效率就会大大降低,产生很多重复动作,所以这篇博文就来讲一种更简单的标定方案。 下面是halcon官方给的手眼标定系统的案例代码。 这个例子主要应用于相机固定在机械手末端的手眼系统中,而且标定板相对于机器人也是静止的。 在这...

二毛的博客 1万+

相比ES,ClickHouse简直不要太香!

文章来源:【公众号:唯技术】目录背景日志系统演进之路‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍技术详解前端日志查询系统正确使用姿势背景唯品会日志系统 dragonfly 1.0 是基于 EFK 构建,于 2014 年服务至今已长达 7 年,支持物理机日志采集,容器日志采集,特殊分类日志综合采集等,大大方便了全公司日志的存储和查询。随着公司的业务发展,日志应用...

石杉的架构笔记 5066

Autosar 下电过程-基于ETAS工具

本文介绍基于ETAS工具对应的BIP包的下电过程,仅供参考。在最后调用SBC下电时,需要理清楚SBC的休眠流程,否则可能会出现休眠又唤醒情况。后面有空会介绍9471的休眠流程。

赞的博客 809

clickhouse闭源,以后都要用国产数据库了吗?

点击下方“JavaEdge”,选择“设为星标”第一时间关注技术干货!免责声明~任何文章不要过度深思!万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案」;不要急着评判文章列出的观点,只需代入其中,适度审视一番自己即可,能「跳脱出来从外人的角度看看现在的自己处在什么样的阶段」才不为俗人。怎么想、怎么做,全在乎自己「不断实践中寻找适合自己的大道」0...

JavaEdge全是干货的技术号 2234

在 IW31 录入班次与当班负责人,并让 IW38 列表同步显示:基于 IWO10018 + IWOC0004 的一套可落地增强方案

摘要 本文详细介绍了在SAP PM模块中实现工厂设备维护订单增强的完整方案,重点解决两个核心需求:在订单创建时新增班次负责人和班次字段,并在订单列表中直接显示这些信息。文章从需求分析、技术设计到具体实现步骤进行了系统阐述。 关键实现步骤包括: 通过CI_AUFK结构扩展AUFK表,确保字段持久化存储 使用IWO10018增强在IW31/IW32/IW33事务中添加输入界面 通过IWOC0004增强在IW38订单列表中显示新增字段 采用优化的数据填充策略提升性能 该方案不仅满足业务需求,还考虑了用户体验和系统

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 174

Open3D点云数据处理(六):点云、mesh可视化(Visualizer类)

本文介绍了Open3D中Visualizer类可视化几何对象的方法,给出了常用参数解释和代码示例。

孙悟空 3024

【大数据技术】ClickHouse配置详细解读

本文详细解读了ClickHouse的配置系统,包括配置文件结构、加载顺序和核心配置项。主配置文件config.xml包含基础配置(日志、网络、存储路径)、查询限制(内存、执行时间)和存储引擎参数(MergeTree、分布式引擎)。用户权限配置通过users.xml管理。配置文件采用分层结构,支持配置片段覆盖,后加载的配置会覆盖同名项。典型配置包括:日志级别、监听端口、最大连接数、内存限制、合并线程数等,为ClickHouse性能调优和安全管理提供基础。

wendao76的专栏 1317

RK3568平台开发系列:Android环境下CAN的使用

在RK3568平台上,我们可以利用Android环境中的API来实现CAN的使用。通过以上步骤,我们可以在Android应用中发送和接收CAN数据,并进行相应的处理。当接收到CAN数据时,将触发onMessageReceived回调方法,我们可以在这个方法中对接收到的数据进行处理。在上述代码中,我们指定了CAN的ID为0x123,数据为{0x01, 0x02, 0x03},并设置了标志位和周期。接收CAN数据需要注册一个监听器,并在监听器中处理接收到的数据。发送CAN数据需要指定CAN的ID和数据。

2301_79330513的博客 1912

既然有了ES,为何还用ClickHouse——从原理万字总结ClickHouse为何这么快

ClickHouse全称 Click Stream, Data WareHouse,是一个用于联机分析 (OLAP) 的列式数据库管理系统 (DBMS)。由俄罗斯本土搜索引擎企业 Yandex 公司为了自己公司自家的 Web 流量分析产品 Yandex.Metrica 开发,后来经过演变,逐渐形成为现在的 ClickHouse。

程序猿周周的博客 2844

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ClickHouse为何能超越Elasticsearch?

ClickHouse还有一些其他的优点,比如异步的多主复制技术,能保证系统在不同副本上保持相同的数据,大多情况下能故障后自动恢复;采用SQL语法,比ES的DSL更加简单,学习成本更低……另外,ClickHouse也有一些缺点:•没有完整的事务支持。•无法像ES一样提供全文检索功能。•无法动态添加字段,需要提前定义好表schema。•无法支持高并发查询,默认配置QPS为100。•不适合高频地写入,否则会导致后台合并无法跟上新分区数量。

夜尽天明 2613

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

ClickHouse 最近跟Es杠上了,日志场景谁更适合

总结整个部署的过程踩了不少坑,尤其是 filebeat yml 的参数设置和 clickhouse 的配置说明。很久没有更新博客了,经常看到博客 35 岁以后怎么办的问题。说实话我自己也没想好以后怎么办,核心还是持续的学习&输出。不断的构建自己的护城河,不管是技术专家、业务专家、架构、管理等。个人建议如果能持续写代码就奋战在一线,管理彻底与公司绑定。除非你是有名的大厂,这另外看。如果所在的公司缺乏较大的行业影响力,个人感觉可以奋战在一线,未来选择新的工作。

程序员高级码农的博客 1983

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

ClickHouse基础介绍

clickhouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS),由俄罗斯最大的搜索公司Yandex开发,于2016年开源,采用c++开发

小徐的博客 1586

相比ES,ClickHouse简直不要太香

目录 背景 日志系统演进之路 技术详解 前端日志查询系统 正确使用姿势 背景 唯品会日志系统 dragonfly 1.0 是基于 EFK 构建,于 2014 年服务至今已长达 7 年,支持物理机日志采集,容器日志采集,特殊分类日志综合采集等,大大方便了全公司日志的存储和查询。 随着公司的业务发展,日志应用场景逐渐遇到了一些瓶颈,主要表现在应用数量和打印的日志越来越多,开发需要打印更多日志,定位业务问题,做出运营数据分析。 另外外部攻击问

强哥叨逼叨 3341

ClickHouse vs. Elasticsearch:十亿行数据的较量

在详细展示基准测试结果之前,我们先提供一个简要总结。10 亿行数据集ClickHouse 存储 10 亿行数据集所需的磁盘空间比 Elasticsearch 少 12 倍。聚合查询 ①(执行全数据集聚合)在 ClickHouse 上的运行速度是 Elasticsearch(查询 DSL)的 5 倍。聚合查询 ②(聚合过滤后的数据集)在 ClickHouse 上的运行速度是 Elasticsearch(查询 DSL)的 6 倍。

ClickHouseDB的博客 2978

ClickHouse与Elasticsearch比较总结

目录 背景 分布式架构 存储架构 写入链路设计 Elasticsearch 再谈Schemaless 查询架构 计算引擎 数据扫描 再谈高并发 性能测试 日志分析场景 access_log(数据量197921836) trace_log(数据量569816761) 官方Ontime测试集 用户画像场景(数据量262933269) 二级索引点查场景(数据量1000000000) 数据导入性能对比 结语 优点 缺点 ClickHouse替换ES的可行性方案 参考

墨痕诉清风的博客 3820

不是 ES 用不起,而是 ClickHouse 更具“性价比”?

经过十三年的发展,某快递公司目前C端累计注册用户超2.5亿、P端(专业用户)累计注册快递员及网点经营者超130万、B端累计服务电商企业/泛电商企业/品牌企业/政府与公共组织等客户超250万家;每天快递查询调用量超4亿次、寄件下单量超30万单。

LinkSLA的博客 1639

Elasticsearch与Clickhouse数据存储对比 | 京东云技术团队

京喜达技术部在社区团购场景下采用JDQ+Flink+Elasticsearch架构来打造实时数据报表。随着业务的发展Elasticsearch开始暴露出一些弊端,不适合大批量的数据查询,高频次分页导出导致宕机、存储成本较高。

JDDTechTalk的博客 1033

数据存储新势力:Doris如何挑战ClickHouse的霸主地位?

日志存储领域正经历从ElasticSearch到ClickHouse再到Doris的技术迭代。ClickHouse凭借单表查询优势和跨数据中心能力崛起,但存在多表查询短板;Doris因均衡性能和简单架构获得青睐,却面临安全漏洞问题。两者在存储策略、资源管理等方面各具特色:ClickHouse像手动跑车般极致但不稳定,Doris则如自动挡般稳定中庸。在可观测领域,ClickHouse已成为标杆,而Doris仍在追赶。作为解决方案提供商,应保持技术中立,通过统一查询层适配多引擎,实现灵活扩展。(149字

智能运维及数据中台探索 1250

clickhouse 代替 es 如何对文档做模糊查询?

模糊查询在日志存储的场景中非常普遍。ClickHouse作为大数据分布式引擎,理所当然地会被作为日志存储的备选方案。事实上使用ClickHouse作为日志存储方案,业界目前也已经在多家企业落地,比如Uber、石墨文档、映客、快手、携程、唯品会等。日志查询的一个最大的特点是,几乎极少涉猎点查询,而模糊查询则占据了绝大部分使用场景。这也是为什么ES凭借其逆天的分词能力在日志存储领域杀疯了的原因。但ES存储的瓶颈近些年也逐渐显现, 如压缩率低,需要较大的存储成本,当数据量过大时,查询性能也比较差。

禹鼎侯的博客 4095

如何迁移ES数据到CLICKHOUSE中

示例场景:需要迁移某个应用的历史日志数据到CK中,日志数据在ES中是按天索引的,每天一个索引文件,索引规则是"应用名"+"日期"。CSV文件输出也验证了下。

qq_34458790的博客 1463

下一代智能可观测平台长什么样?来看Bonree ONE的极致演绎!

字化浪潮席卷全球的当下,企业 IT 架构正加速向云原生、微服务化演进。根据 Gartner 报告显示,超过 80% 的企业已将核心业务迁移至云环境,复杂的分布式系统架构带来效率提 升的同时,也让运维工作陷入前所未有的困局。日志分散在数十个服务节点,指标数据割裂于不同监控工具, —旦业务出现卡顿,运维人员需在海量数据中 “大海捞针 ” ,平均故障排查时间长达数小时;传统监控工具依赖人工阈值设置,被动响应式告警常导致问题发现滞后,严重影响业务连续性。

江晓龙的博客 1万+
上一篇: LangChain - 为何我们选择 ClickHouse 作为 LangSmith 的动力
下一篇: 链接物化视图在 ClickHouse 中的应用
ClickHouseDB
博客等级 码龄3年 1707粉丝 320原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值