一、环境:html
1.一、cassandra 集群: 用于日志数据存储mongodb
1.二、spark集群: 用户后期的实时计算及批处理数据库
1.三、codis 集群: 用于缓存一些基本数据如IP归属地,IP经纬度等,当日志上来,对日志进行补全缓存
1.四、postgres数据库: 一、用于存储维度表 二、存储统计结果echarts
1.五、消息队列 如:rabbitmq、apollo 或者kafka,用于接收产品日志数据。当日志数据低于5000条/s时,能够考虑使用rabbitmq。高于此值。建议换成apollo或者kafka。消息队列不建议留太长时间的数据,建议保留时间:15天~1月post
部署说明:大数据
spark 和cassandra 采用一对一部署,以保证后期计算时的数据本地性spa
codis集群:视具体状况而定,建议很多于3组,每组2个节点日志
postgres:开启自动vacuumhtm
二、数据收集
日志数据直接发送到消息队列(能够考虑在消息队列前加上Nginx)。
三、数据补全与拆分 外加原始数据存储
使用日志数据时,咱们可能会有一些指望,好比,
A: 后期须要按区域进行产品统计,热力图。这时能够将IP地址解析为国家、省、市、和经纬度。
B: 日志须要分发不一样部门,日志记录须要惟一标识 如:添加长整型日期戳+进程标识
数据进行补全后,A:根据产品等拆分红topic后,扔回队列,供实时计算,B:并存储一份到cassandra做为原始数据,同时供离线计算
四、实时计算
spark streaming 根据须要,订阅topic,进行实时计算
五、数据仓库
根据实际业务,订阅拆分后的topic,生成数据仓库。维度表放在postgres中,事实表放在Cassandra中.
请注意如下几点:
A、维度表
A1:采用Long做为主键,以增快后期Join效率。
A2:同时为避免过于频繁读写关系数据库,可使用codis缓存维度数据,设置ttl,如8小时。
B、事实数据,切忌放在关系数据库中。过于频繁的读写操做会对关系数据库形成过大压力。
C、若是精力、资源有限,能够先对核心日志类型作数据仓库,好比,订单。至于客户点击、浏览历史能够以后再作。
六、离线计算
6.1 spark 做业能够读取Cassandra中的原始数据,进行历史数据的离线计算。详见spark cassandra connector的使用
6.2 每日对事实表进行简单聚合后,与维度表进行join,join后的数据另外存储。供核心业务使用。
6.2.1 因为每日join,恰好按日作了缓慢变化。若须要进行历史统计能够直接用。若须要按照最新维度信息对历史数据进行统计,各个业务自行与维度表join
6.2.2 因为事实表join个全部维度表,字段比较多。可是实际使用时,各个业务只会取其中的十个八个字段,甚至更少,此时,强烈建议使用列存储,并启用压缩。
建议使用parquet存储(详见:为何咱们使用parquet),而不用rc或者orc file,缘由1:spark 原生支持parquet。缘由2:即便你用hive,hive也彻底支持parquet
七、计算结果
选择计算结果的存储位置,须要事先预估结果的记录数。切勿只考虑一天,至少要考虑一年。以每一年3000W为门坎,
若小于3000W,能够考虑存储到关系数据库。
若大于3000W,须要使用NOSQL数据库。您能够选择cassandra、hbase、mongodb等
八、结果展示
结果展示时,请考虑如下因素
数据导出:大数据的计算结果未必会是小数据,所以数据导出必定要分页。在第7步选择哪一种NOSQL,要先调研好分页实现。
可视化展示:千里之堤,溃于蚁穴。数据已经计算出来了,必定要在展示上把数据的价值体现出来。能够考虑使用折线图、柱状图、饼图、热力图、地图等,推荐使用Echarts