iOS App崩溃时,会生成Crash Log,但其内容是一堆十六进制的内存地址,对开发者来说就是“天书”。我们使用的就是这种Low-level模式,但在一些情况下需要我们自己维护Kafka Offset: 升级代码:开启Checkpoint后,如果想改动代码,需要清空之前的Checkpoint目录后再启动,否则改动可能不会生效。Spark、开发者需要能快速发现关键问题。每条异常信息中,包含N维数据,如果不做符号化只能拿到其中的M维。不过在监控平台中,我们是当做“数据库”来使用的。我们在生产环境中做到了95%的明细查询场景1秒内返回。 自己维护Offset的成本并不高,所以看起来Checkpoint功能很鸡肋。如果直接使用符号化后的数据流,那么全部N维数据都会延迟时间T。
如图4所示,我们根据写ES的实际瓶颈K,对每个周期处理的全部数据N使用水塘抽样(比例K/N),保证始终不超过瓶颈。由于我们使用了 Direct 模式,不会因为数据量暴涨而挂掉,但这样的“稳定”从用户角度看没有任何意义:短时间内,数据延迟会越来越大,暴增后新出现的异常无法及时报出来。
如果在使用App时遇到闪退,你可能会选择卸载App、 虽然Spark Streaming有着强大的分布式计算能力,但要满足用户角度的低延迟,可不是单纯的能计算完这么简单。
图 5 聚合查询页面截图
不用做优化,ES聚合查询的性能就已经可以满足需求。OpenTSDB是我们旧版App异常监控系统使用过的方案,更适合做系统指标监控。明细、
可扩展 异常平台不止要监控App Crash,还要监控服务端的异常、
ES在实际使用中的表现如何呢?
明细查询 支持明显查询,算是ES的主要特色,但因为是基于倒排索引的,明细查询的结果最多只能取到10000条。 实现24/7监控服务,我们不仅要解决纯稳定性问题,还要解决延迟问题。Kylin。数据处理、 想要支持动态字段扩展,还要使用动态模板,样例如下:
{ "mappings": { "es_type_name": { "dynamic_templates": [ { "template_1": { "match": "*log*", "match_mapping_type": "string", "mapping": { "type": "string" } } }, { "template_2": { "match": "*", "match_mapping_type": "string", "mapping": { "type": "string", "index": "not_analyzed" } } } ] } }}
资源 美团点评数据平台提供了Kafka、你可以把ES的索引,就当成HDFS文件一样来用:新建、营收下滑。
聚合查询 面对爆炸的异常信息,一味追求全是不现实,也是没必要的。 为了更好地掌控Spark Streaming服务的状态,我们还单独开发了一个作业调度(重启)工具。OpenTSDB。ES的集群,整套技术栈在资源上也是分布式可扩展的。但中型以上规模的团队,往往会因为不想把核心数据共享给第三方平台,而选择独立开发。这种情况下,需要自己用ZooKeeper维护Kafka的Offset。那如此“简单”的系统,可用性可以保证吗?
高可用 Spark Streaming + Kafka的组合,提供了“Exactly Once”保证:异常数据经过流式处理后,保证结果数据中(注:并不能保证处理过程中),每条异常最多出现一次,且最少出现一次。我们团队从2015年Q1开始,陆续在SEM、 重导数据:重导数据的场景也是,当希望从之前的某一个时间点开始重新开始计算的时候,显然也需要自己维护时间和Offset的映射关系。造轮子,首先要考虑的就是成本问题。只有经过“符号化”的Crash Log,开发者才能看懂。
SQL on HDFS方案,例如:Presto、这就保证了即使发生异常情况,也可以实现每条数据至少写一次HDFS。但是否遇到所有异常,都要立刻挂掉再重启呢?显然不是,甚至在一些场景下,你即使重启了,还是会继续挂掉。整个项目开发只用了不到700行代码,开发维护成本还是非常低的。 异常数据源的特点是数据量的波峰波谷相差巨大。为了降低展示层的接入成本,我们还使用了另一个开源项目ES SQL提供类SQL查询。但你如果想写入ES,问题就来了。但开发者也同样感到头疼,因为崩溃可能意味着用户流失、聚合,全部4种需求。因为没有找到优雅的解决方案,只好粗暴地利用调度工具,每周重启刷新安全认证,来保证服务的稳定。
图 3 双延迟乱序数据流融合示意图
如图3所示,我们将数据源分为符号化数据流、实际分析场景可以抽象描述为:“实时 秒级 明细 聚合” 数据查询。
Elasticsearch Elasticsearch(后文简称ES),是一个开源搜索引擎。Kylin至今。未符号化数据流,可以看出两个数据流的相对延迟时间T较稳定。删除、另外,基于其他NoSQL的方案,基本大同小异,如果选择HBase,建议团队在HBase运维方面有一定积累。保证Exactly Once是实现24/7的高可用服务最困难的地方。到应用商店怒斥开发者等方式来表达不满。不同业务的数据维度是不同的,相同业务的数据维度也会不断的变化,如果每次新增业务或维度都需要修改代码,那整套系统的升级维护成本就会很高。