文章目录
- (一)技术选型
- 1)数据采集工具
- 2)数据存储
- 3)数据计算
- 4)数据可视化
- (二)整体架构设计
- (三)服务器资源规划
(一)技术选型
1)数据采集工具
除了Flume这个数据采集工具,其实还有一些类似的数据采集工具,Logstash、FileBeat,这两个也可以实现数据采集。
那这三个日志采集工具我们需要如何选择呢?
首先从性能消耗上面来说,Flume和Logstash的性能消耗差不多,都是基于JVM执行的,都是重量级的组件,支持多种数据源和目的地。
FileBeat是一个只支持文件数据采集的工具,是一个轻量级组件,性能消耗比价低,它不是基于JVM执行
的,它是使用go语言开发的。
采集数据的情况:
第一种是把采集工具部署到产生数据的服务器上面
web项目产生的日志数据直接保存在服务器上面,并且这个服务器的性能比较高,可以允许我在上面部署Flume数据采集工具,这样也不会对上面的web项目的稳定性产生什么影响。
第二种是把采集工具部署在一个独立的服务器上面
web项目产生的日志数据直接保存在服务器上面,但是这个服务器的性能一般,并且对web项目的稳定性要求非常高,如果让你在上面部署一个其它服务,这样这个服务器的稳定性就没办法保证了,进而也就无法保证web项目的稳定性了,所以这个时候可以选择在产生日志的时候使用埋点上报的方式,通过http接口把日志数据传输到日志接收服务器中。
那针对第一种情况肯定是要选择一个性能消耗比较低的数据采集工具,优先选择FileBeat针对第二种情况的话就不需要考虑性能消耗了,因为采集工具是在独立的机器上,不会影响web项目,这个时候我们需要考虑的就是采集工具的功能是否完整,因为在采集数据的时候可能需要对数据进行一些简单的处理,以及后期可能会输出到不同的存储介质中。
Flume默认不持直接采集MySQL中的数据,如果想要实现的话需要自定义Source,这样就比较麻烦了其实采集MySQL中的数据有一个比较常用的方式是通过Sqoop实现。
Sqoop中有两大功能,数据导入和数据导出
- 数据导入是指把关系型数据库中的数据导入HDFS中
- 数据导出是指把HDFS中的数据导出到关系型数据库中
我们后期在做一些报表的时候其实也是需要把数据仓库中的数据导出到MySQL中的,所以在这选择qoop也是非常实用的。
所以针对数据采集这块,我们主要选择了Flume和Sqoop。
2)数据存储
数据采集过来以后,由于我们后面要构建数据仓库,数据仓库是使用Hive实现,Hive的数据是存储在HDFS中的,所以我们把采集到的数据也直接存储到HDFS里面。
还有一点是后期在做一些数据报表的时候,是需要把数据仓库中的数据导出到MySQL中的,所以数据存储也需要使用到MySQL。
3)数据计算
在构建数据仓库的时候,我们前面说了,是使用Hive构建数据仓库,一般的数据处理通过SQL是可以搞定的,如果遇到了比较复杂的处理逻辑,可能还需要和外部的数据进行交互的,这个时候使用SQL就比较麻烦了,内置的函数有时候搞不定,还需要开发自定义函数针对复杂的数据清洗任务我们也可以考虑使用Spark进行处理。
4)数据可视化
在数据可视化层面,我们可以使用Hue进行数据查询
如果想实现写SQL直接出图表的话可以使用Zeppelin
如果想定制开发图表的话可以使用Echarts之类的图表库,这个时候是需要我们自己开发数据接口实现的。
(二)整体架构设计
我们采集的数据主要分为服务端数据和客户端数据
什么是服务端数据,就是网站上的商品详情数据以及你下的订单信息之类的数据,这些数据都是在服务端存储着的,一般是存储在类似于MySQL之类的关系型数据库中,这些数据对事务性要求比较严格,所以会存放在关系型数据库中。
- 什么是客户端数据呢,就是用户在网站或者app上的一些滑动、点击、浏览、停留时间之类的用户行为数据,这些数据会通过埋点直接上报,这些其实就是一些日志类型的数据了,这种类型的数据没有事务性要求,并且对数据的完整性要求也不是太高,就算丢一些数据,对整体结果影响也不大。
- 针对服务端数据,在采集的时候,主要是通过Sqoop进行采集,按天采集,每天凌晨的时候把昨天的数据采集过来,存储到HDFS上面。
- 针对客户端数据,会通过埋点上报到日志接收服务器中,其实这里面就是一个Http服务,埋点上报就是调用了这个Http服务,把日志数据传输过来,日志接收服务收到数据之后,会把数据落盘,存储到本地,记录为日志文件,然后通过Flume进行采集,将数据采集到HDFS上面,按天分目录存储。
- 服务端数据和客户端数据都进入到HDFS之后,就需要对数据进行ETL,构建数据仓库了。
数据仓库构建好了以后可以选择把一些需要报表展现的数据导出到MySQL中,最终在页面进行展现。
(三)服务器资源规划
测试环境:
生产环境:
说明:
1:由于NameNode开启了HA,所以SecondaryNameNode进程就不需要了
2:NameNode需要使用单独的机器,并且此机器的内存配置要比较高,建议128G
3:DataNode和NodeManager需要部署在相同的集群上,这样可以实现数据本地化计算
5:数据接口服务器需要使用至少两台,为了实现负载均衡及故障转移,保证数据接收服务的稳定性
6:Flume部署在日志服务器上面,便于采集本机保存的用户行为日志信息;还需要有单独的Flume机
器,便于处理其它的日志采集需求
7:Hive需要部署在所有业务机器上
8:MySQL建议单独部署,至少两台,一主一备
9:Sqoop需要部署在所有业务机器上
10:Zeppelin可以单独部署在一台普通配置的机器上即可
11:Azkaban建议至少使用三台,一主两从,这样可以保证一个从节点挂掉之后不影响定时任务的调度
服务器资源计算:
针对Hadoop集群的搭建在线上环境需要使用CDH或者HDP
具体Hadoop集群需要使用多少台集群需要根据当前的数据规模来预估
假设集群中的机器配置为8T,64 Core,128G
1:如果每天会产生1T的日志数据,需要保存半年的历史数据: 1T180天=180T
2:集群中的数据默认是3副本: 180T3=540T
3:预留20%左右的空间: 540T/0.8=675T
这样计算的话就需要675T/8T=85台服务器
如果我们在数据仓库中对数据进行分层存储,这样数据会出现冗余,存储空间会再扩容1~2倍。
注意:没有必要一开始就上线全部的机器,我们可以前期上线30台,后面随着业务数据量的增长再去动态扩容机器即可。