公司现状:CDN公司(可以百度一下),边缘节点服务器会产生很多用户请求日志,要对日志进行各种分析和原始日志打包,最终分析结果进行收费、让客户可以获取请求日志各种分析结果、为客户进行原始日志按域名按天按小时分割打包。
先说满足这样的大数据实时计算需要的几个基本组件(一定要注意版本问题,java大数据机器间通信用的是RPC 而不是restful_api,如果版本不对应很可能出现版本间的兼容问题):
1.日志收集 -从CDN边缘节点服务器进行日志收集
2.日志缓存 -收集上来的日志存储到一个缓存设备
3.数据计算 -对收集的日志进行计算,域名请求数分析、地区统计等等
4.计算结果存储 -对各种分析结果进行存储,要方便查找
5.日志打包结果存储
首先说公司刚开始的日志系统分布:
logstash-forward (边缘节点日志收集,上传到有logstash的机器) -》
kafka 强大的数据缓存组建 (由logstash收集日志到kafka) -》
elasticsearch (分布式、可扩展、实时的搜索与数据分析引擎) (用logstash从kafka取出数据存到es) ->
spark(大规模数据计算引擎,从es取出原始日志然后通过spark计算结果) -》
elasticsearch (进行计算结果数据存储),hadoop(原始日志打包存储) -》
nginx + django服务 进行反向代理、负载均衡、地址隐藏 django进行界面展示-》
可客户直接访问观看
说一下版本(zookeeper 3.4.7 kafka_2.11-0.8.2.1 logstash-2.2.2 elasticsearch-2.4.6 hadoop-2.6.4 spark-1.6.1)
现在这样的系统由于经常出现问题,es报红,或者计算有问题等,这是由于刚开始一个人做完还没完全稳定就直接撤人了,转了几次到了我手里(因为我懂java,android但是部门基本上是以python为主)。到我手里了是个挑战也是一个机遇嘛,然后就开始了填坑之旅。。。。。。。。。。。。
还有一点是这样不能够很好的保持数据的实时性。
再次说公司原技术上改进:
简短几句心酸路程,刚开始接手什么也不懂:不懂spark hadoop 还有 scala(线上的spark统计用scala写的).
其中遇到也解决了各种问题,就举例最主要的两个。
elasticsearch获取到某个域名原始日志然后写入本地文件(虽然不会写,但是这么多年编程scala的大概对日志的处理逻辑还是能看懂的),本地压缩,然后python调用hadoop本地命令行将日志上传到hadoop,先临时解决了问题
elasticsearch报红、kafka堆积
elasticsearch升级到了5.5.2,发现不会出现这样的问题。 但是又出现了新的问题:spark不能兼容这样的es版本, 给老大反映情况(提了 我倾向的用python脚本计算这一条路和对es降级尝试的路),听命于领导就先对原来的elasticsearch-2.4.6进行了配置改动-但是发现还是偶尔会出现es报红的情况。 只能用另一条路用python脚本代替spark,使用es自身的聚合功能进行计算,这样就解决了问题。
总结:所以最后的解决办法是 去掉spark 先用python脚本直接聚合统计方式请求es获取结果,这样也满足线上要求,就先这样了。
logstash-forward (边缘节点日志收集,上传到有logstash的机器) -》
kafka 强大的数据缓存组建 (由logstash收集日志到kafka) -》
elasticsearch (分布式、可扩展、实时的搜索与数据分析引擎) (用logstash从kafka取出数据存到es) ->
python脚本(调用elasticsearch的resultful_api获取统计结果,同时打包原始日志到本地上传到hadoop) -》
elasticsearch (进行计算结果数据存储),hadoop(原始日志打包存储) -》
nginx + django服务 进行反向代理、负载均衡、地址隐藏 django进行界面展示-》
客户直接访问观看
说一下版本(zookeeper 3.4.7 kafka_2.11-0.8.2.1 logstash-2.2.2 elasticsearch-5.5.2 hadoop-2.6.4 python以及python elasticsearch库)
最后再说一种现在的架构:
公司在我刚开始接手的同时已经公司招聘了一个大数据人员(但不是本部门的),本部门也要有新项目有更大的数据量要计算需要跟他对接,但是等了好几个月仍然没有啥成果,老大忍不住了让我去看看他的大数据代码、提改进建议催进度(他主要用spark最终结果存到hbase,java写的代码),然后发现代码写的比较烂(因为java基本的静态变量 方法封装 继承多态等一看就是新手),业务逻辑也有点问题-跟老大反映,但是不同部门管不着也不能说啊,细节不说了,最终又开始了新架构的尝试之旅。
1.filbeat 边缘节点日志收集,上传到有logstash的机器(或者可以用flume) -》
2.kafka 强大的数据缓存组建 (由logstash收集日志到kafka) -》
3.spark(大规模数据计算引擎,从kafka取出日志,通过scala编写的spark代码把计算结果存入es) -》
4.elasticsearch (进行计算结果数据存储) -》
5.nginx + django 界面展示或接口让客户获取服务
同时并行的原始日志打包 (刚开始日志打包考虑到了用spark或者flume直接上传到hadoop,但是后来发现现有机器这样的速度赶不上实际需要,)
3.flume(自定义sink插件,filter插件 从kafka的另一个topic中获取日志数据,把日志按域名,按小时打包到本地) -》
4.python 调用hadoop命令行上传本地打包好的日志到hadoop ->
5.nginx + django 界面展示或接口让客户获取服务
版本信息
apache-flume-1.6.0-bin hadoop-2.6.4 kafka_2.11-1.0.0 spark-1.6.1-bin-hadoop2.6
elasticsearch-5.5.2 hbase jdk1.8.0_144 logstash-6.1.1 zookeeper-3.4.5
jdk1.7.0_45(刚开始hadoop使用 后来spark要求更高就用了1.8版本)
当然每个阶段都需要增加监控,这里用的是zabbix监控配合脚本监控