对于很多网商的公司来说,获取点击流,监控数据,日志数据是必不可少的,比如用户打开的网页,点击的按钮,停留了多久,方便统计并生成报表
往往,这类数据是海量级别的数据,相比较于商品和订单这类的数据,数据量要多出2到3个数量级,每天产生的数据量超过TB级别
所以早期我们只能通过抽样来凑活着做分析,知道大数据等技术的出现
对于如此海量级别的数据,我们可以考虑使用Kafka来存储海量原始数据,这符合了当下的潮流 “先存储再计算” 直接保存海量的原始数据,再对数据进行实时或者批量的计算
这种方式,除了比较吃存储空间,其他都是优点
不需要二次分发就可以同时给多个流或者批计算提供数据
计算任务出错,可以回滚重新计算
对数据有新的分析需求,可以直接利用历史数据进行计算出结果,不用等待新的数据
但是这种对于存储的要求就比较高,需要由足够大的容量,可以跟的上数据的写入速度,那么第一个方案就是Kafka,利用kafka,进行分布式的流数据的存储和非凡
Kafka利用自身简单的数据存储结构和查询语言,使得其比一般的系统更加简单,性能更加优于一般的存储系统,其提供无限的消息堆积能力,具有超高的吞吐量,可以满足大部分的需求,每个原始数据采集服务作为一个生产者,把数据直接发给Kafka,下游的计算任务,作为消费者订阅数据,也可以按照时间或者位点来读取数据,而且有着合适的生态圈,Flink和Spark提供了直接接入Kafka的组件
但是Kafka仍然具有一些局限性,kafka的无限存储利用的是数据分片,这个在Kafka中叫做Partition,每个分片可以分布在不同的存储节点上
写入数据的时候,会均匀的写到这些分片上,理论上分片足够多,就是无限的,但是一个分片的存储容量是有限的,所以总能被写满
虽然支持扩容,但是没法重新分配数据,所以扩容解决不了多少,这也是Kafka的局限性
除了Kafka,还有什么解决方案呢?
除此外就是HDFS来进行存储了,使用HDFS来存储很简单,原始数据写为一个文本文件,保存在HDFS中,比如我们可以根据时间和业务属性进行组织目录结构
click/20210114/Beijing_0001.csv
这种方式手机所谓的数据,组成对应的格式
HDFS就可以进行无限的容量扩充,但是,HDFS的吞吐量不如Kafka,只能达到百兆左右
而且查询能力支持Hive,查询的性能比Kafka强太多了
而现在的业界,很多开源的团队,正在努力的吞吐量和存储能力结合起来,做出相对完美的流存储
常见的开发方向有
1.分布式流数据存储,项目有Pravega和Pulsar的存储引擎Apache BookKeeper.利用Kafka的流存储的技术之上,提供了无限的扩容能力
2.时序性的数据库,InfluxDB和OpenTsdb这种时序性数据库,有着很好的读写能力和非常方便的查询和聚合数据的能力,一般存储的是海量的监控数据
对于点击流这种大量的数据,我们一般的处理方式都是先存储在计算,计算后存入特定的数据库中,供业务系统查询
对于海量数据的存储,要求的是写入和读取性能,和容量,对于查询并不高,HDFS的容量高,但是读写一般,Kafka的读写好,但是并不是无限的容量
还有一个思考问题
为何Kafka的吞吐性能是HDFS的几倍
1.采用了批处理的方式提高了吞吐量
2.利用了磁盘文件顺序读写性能高的特点
3.利用了操作系统的PageCache进行缓存
4.利用了零拷贝技术加速了消费
hdfs总结下来更像是硬盘,Kafka更像是磁带