Storm Topology : Elasticsearch & Redis 构建实时性低延时数据统计分析 呈现大数据分析效果

写在前面

Storm实时分析系列文章已经有多篇了,每篇的重点不一样,今天的Storm文字直播分享的是Storm实时分析过程中的延时处理。在整理Storm 探针的过程中,发现Storm涉及的知识点还是很多的!最近所做的Storm工作都是基于Low Level API开发,而官方显示还有Tident高层次接口,数据落地方案也有不同的实现方案。在这里分享的是实战的心得,不一定是最佳的处理方案也不是实际落地方案,而是包含个人色彩的理解模型方案与实战方案的融合,仅供参考。

一天一收获

作为一个有态度的Storm经验分享者,先给大家介绍一下阅读完全文可以收获的知识点:

  1. ES落地优化经验
  2. 落地频率的取舍之道
  3. 实时数据呈现的Topology设计

业务背景

本大数据Storm业务背景是基于链路跟踪的日志分析处理,呈现出链接实时响应状态(正确率,调用关系,平均响应时长等等),链路跟踪的日志标记了同一请求的日志,同一请求日志有一样的跟踪标识,并且日志记录分收发时间。每个业务的请求调成关系图要实时计算出来。

日志特征

1.收发日志为2条日志,意味着时长计算需要将日志合二为一

2.链路跟踪为多条日志,意味着要从多条日志中生成调用关系

3.ES最初设计统计结果存储跨度为分钟,即每个接口的统计状态都是按分钟存储统计数据,每分钟的调用次数、总消耗时长

第一版 Topology

第一版Topology的处理满足了基本数据呈现指标,调用关系图生成、正确率、平均时长都能计算出来。美中不足之处在于,数据是合并到分钟存储,为了确保日志处理到分钟,设置了一定的时间窗口,等日志统计完再写到ES。时间窗口的设计导致查看到的数据存在延时。

实时性优化

优化方案有两种,一是调整ES落地频率,提升实时性,同时改造查询接口,将每分钟的结果合并处理!二是借助Redis等内存解决方案,将查询结构分成内存区以及ES区。方案一相对更好实施,只需调整落地频率,并改查询接口做调整,方案二则需要引入新的内存解决方案。虽然没有选用方案二,但是个人还是更倾向于方案二。

ES采用批量插入模式,效率会更高,否则日志处理速度会很慢。实战经验显示,逐条插入几个小时,批量插入可能几分钟。

升级版 Topology 【Dream Version】

方案二利用了redis存储统计结果,落地ES的数据还是按分钟存储,不会像方案一,一分钟数据可能产生多条统计数据。从存储上、实时性上,方案二都更加完美。方案一的频率会影响ES存储量,所以采用方案一的话,落地频率是把双刃剑,得有所取舍。方案二则会更加灵活,不会增加ES存储负担。

The End

目前来讲,还没有在正式环境运行,我们也算是在吃Storm螃蟹,是否应用得当,也要更进一步的看运行效果。实时性的要求,也要看业务运用的情况。优化也是一个需要探索的事情,今天就先到这里。

预告

近期会推出

Docker+Linux+FileBeat+Kafka+LogStash+Elastic+Storm+MySql

系列部署实战文章,关注公众号,每天进步一点点。

巧妙拆分bolt提升Storm集群吞吐量

Storm 1.2.2 Run Under Windows 7 : 试错填坑之路!大数据玩得是耐心与不放弃!开启干货模式纯享版

Storm实时大数据windows实验
Storm实时大数据windows实验

年前准备的大数据日志平台系统文章,缺少Storm环节,之前开发是在eclipse中直接跑的Storm,计划赶不上变化!Storm 1.2.2在Windows下跑得比较闹心。Storm 1.2.2 在windows 7下试玩,就是一个虐心之路,需要耐心需要一点一点排除问题。完整的看完本文,可以有如下收获:

  1. 能征服windows 7+Storm 1.2.2的配置
  2. 能跑起Storm Topology并查看拓扑的实时运行图,截取Storm Topology Visualization 图片,如本文封面。
  3. 收获跑storm1.2.2典型问题的三个文章链接,亲测好用,疗效显著

Docker+Linux部署大数据环境预告

年前的部署都是在windows下进行,后续将进行Docker+linux下的大数据环境配置实验,感兴趣的小伙伴可以关注本公众号。

写在前面

玩开源有一个需要重点注意的地方,不同的版本兼容性不一样,本次大数据实验是在windows 7 +storm 1.2.2 + zookeeper-3.4.12 的搭配下进行,其他环境下仅供参考。zookeeper-3.4.12部署与搭建请参考:

大型互联网平台日志系统(FileBeat+Kafka+LogStash+Elastic+Storm+MySql)小白的入门实战篇

总结如下:

一、cmd命令无法使用,跳过cmd命令,直接使用python命令

不要使用storm自带的storm.cmd,重要的事情再说一遍,直接使用storm.py去跑命令

storm.cmd提示被抛弃了,要使用storm.ps1,执行powsershel,提示问题:

$PSCommandPath为空,

Python Version 解析失败

修复方案一:$PSCommandPath为空,可升级为PowserShell 3.0 或者硬配置为当前路径

修复方案二:Python Version 使用PowerShell简单调试一下,可以修正为:

$PythonVersion = (& python -V 2>&1).ToString().Split(” “)[1];

cmd\powershell都被我跳过了,cmd,powershell一顿如狼似虎的操作,最后也是调用python,再去调java,所以直接忽略cmd/powsershell,使用如下命令:

命令执行位置:

D:\BigData\apache-storm-1.2.2\apache-storm-1.2.2\bin

常用的几个命令:

python storm.py nimbus

python storm.py supervisor

python storm.py ui

默认UI端口是8080

python storm.py jar [xxxx].jar [带命名空间的topology] [topology别名-可任性取名]

取个例子:

D:\BigData\apache-storm-1.2.2\apache-storm-1.2.2\bin>python storm.py jar storm-starter-1.2.2.jar storm.starter.StatefulTopology StatefulTopology

二、apache-storm-1.2.2.tar.gz自带Demo,编译不容易

apache-storm-1.2.2.tar.gz中自带了丰富的示例代码,因为太丰富了,所以问题也来了。

2.1 太多Demo,反而不利于starter

提示找不到kafka-avro-serializer-1.0.0.jar,maven中心库没有这个,需要另外配置存储库,而我只是一个starter,想快速的跑起storm,并不想kafka!

解决方案,配置maven存储库:

通常所在位置:

C:\Users\Administrator\.m2\settings.xml

修改mirrors节点

 <mirrorOf>*,!confluent</mirrorOf>

增加一个新的repository

<repository>

<id>confluent</id>

<url>http://packages.confluent.io/maven/</url>

</repository>

2.2 多种开发语言支持,drpc,Too Much Under A JAR For Starter.jar

编译完之后,这个新人启航的jar包有100多mb,其实我只想是跑个超级简单的demo来看一下效果。连踩2个坑,一个是多语言能力展示,用java包裹python代码,跑不起来,一个是用java包裹node.js,也没有跑成功。本想,一个一个问题kill掉,但是网上的套路都不管用。暂时先不管Storm的多语言支持。另一个是drpc服务,二次选择topology,踩到 drpc了,配置完drpc,还是不管用,再次跳过,目前也没有这个使用场景。最后,仔细的找了一个简单的,纯java血统的topology: StatefulTopology

三、其他问题

向 storm 提交 jar 包后,访问 http://localhost:8080/index.html 有时候能看到topology,但是没有节点跑。等了一会儿也没有。解决方案:将storm 中的topology kill掉, nimbus,supervisor,ui全部停了,重新提交一遍。大概在第三遍的时候出来了,懵逼的状态【可能哪一步做错了】~~截到图:

Storm实时大数据windows实验
Storm实时大数据windows实验

2.3 又见PowerShell

storm.ps1的错误提示,真心不够友好!为了检测python版本是否符合要求,写了好几行ps代码,结合ps代码本身也有版本要求。

$PSCommandPath 为空,代码直接报错

这段ps1 ,应该有提示ps版本问题。

或者,应该是有一个前置安装检查的脚本或工具,引导玩家或自动处理前置安装问题,这样子才会更加好友。这个方面微微软的sqlserver安装向导就做得比较好~

PowerShell 未经数字签名 系统将不执行该脚本

set-executionpolicy Bypass

写在后面

python storm nimbus这种命令方式是同事告诉我的,不然还在坑里爬。本来windows 7 + Storm就是非常规的组合,只是想把windows系列的文章写全了,跑通,所以才挣扎了这么久。感觉从事开源,就像一个自己的舞台,大家很努力的做一个storm,别人用得是那么的闹心,虽然官方提供了那么多文档那么多示例。storm.cmd , storm.ps1的提示真心留下了阴影。期待下一波Docker+linux玩转大数据吧,同样是zookeeper,filebeat,kafka,storm,elasticsearch等,一步一步亲测,全部跑通!

巧妙拆分bolt提升Storm集群吞吐量

参考链接:

找不到kafka-avro-serializer-1.0.0.jar

https://stackoverflow.com/questions/43488853/confluent-maven-repository-not-working

PowerShell版本问题

https://stackoverflow.com/questions/24663243/why-doesnt-write-host-pscommandpath-output-my-current-path