我的编程空间,编程开发者的网络收藏夹
学习永远不晚

互联网海量数据如何存储Kafka

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

互联网海量数据如何存储Kafka

对于大部分互联网公司来说,数据量最大的几类数据是:点击流数据、监控数据和日志数据。这里面「点击流」指的是在 App、小程序和 Web 页面上的埋点数据,这些埋点数据记录用户的行为,比如你打开了哪个页面,点击了哪个按钮,在哪个商品上停留了多久等等这些。

当然你不用太担心自己的隐私问题,记录的这些行为数据不是为了监控用户,主要目的是为了从统计上分析群体用户的行为,从而改进产品和运营。比如,某件商品看的人很多,停留时间很长,最后下单购买的人却很少,那采销人员就要考虑是不是这件商品的定价太高了。

除了点击流数据以外,还有监控和日志数据都是大家常用的。

这类数据都是真正海量的数据,相比于订单、商品这类业务的数据,数据量要多出 2~3 个数量级。每天产生的数据量就可能会超过 TB(1 TB = 1024 GB)级别,经过一段时间累积下来,有些数据会达到 PB(1 PB = 1024 TB)级别。

这种量级的数据,在大数据技术出现之前,是没法保存和处理的,只能是通过抽样的方法来凑合着做分析。Hadoop 等大数据技术出现以后,才使得存储和计算海量数据成为可能。那么如果要保存像「点击流」这样的海量数据,应该选择什么样的存储系统?

使用 Kafka 存储海量原始数据

早期对于这类海量原始数据,都倾向于先计算再存储 。也就是,在接收原始数据的服务中,先进行一些数据过滤、聚合等初步的计算,将数据先收敛一下,再落存储。这样可以降低存储系统的写入压力,也能节省磁盘空间。

这几年,随着存储设备越来越便宜,并且,数据的价值被不断地重新挖掘,更多的大厂都倾向于 先存储再计算,直接保存海量的原始数据,再对数据进行实时或者批量计算。这种方案,除了贵以外都是优点:

  • 不需要二次分发就可以同时给多个流和批计算任务提供数据;
  • 如果计算任务出错,可以随时回滚重新计算;
  • 如果对数据有新的分析需求,上线后直接就可以用历史数据计算出结果,而不用去等新数据。

但是,这种方式对保存原始数据的存储系统要求就很高了:既要有足够大的容量,能水平扩容,还要读写都足够快,跟得上数据生产的写入速度,还要给下游计算提供低延迟的读服务。什么样的存储能满足这样的要求呢?这里给出几种常用的解决方案。

第一种方案是,使用 Kafka 来存储。Kafka 不是一个消息队列么,怎么成了存储系统了?实际上,现代的消息队列,本质上就是分布式的流数据存储系统。 

那么Kafka的数据是如何存储、分片、复制的?它是如何保证高可用,如何保证数据一致性的?那你会发现它和分布式存储系统,并没有什么太大的区别。唯一的区别就是,它的查询语言(生产和消费消息)和存储引擎的数据结构(Commit Log)比一般的存储系统要简单很多。但也正是因为这个原因,使得 Kafka 的读写性能远远好于其他的存储系统。Kafka 官方给自己的定位也是「分布式流数据平台」,不只是一个 MQ。

Kafka 提供「无限」的消息堆积能力,具有超高的吞吐量,可以满足我们保存原始数据的大部分要求。写入点击流数据的时候,每个原始数据采集服务作为一个生产者,把数据发给 Kafka 就可以了。下游的计算任务,可以作为消费者订阅消息,也可以按照时间或者位点来读取数据。并且,Kafka 作为事实标准,和大部分大数据生态圈的开源软件都有非常好的兼容性和集成度,像 Flink、Spark 等大多计算平台都提供了直接接入 Kafka 的组件。

Kafka 也支持把数据分片,这个在 Kafka 中叫 Partition,每个分片可以分布到不同的存储节点上。写入数据的时候,可以均匀地写到这些分片上,理论上只要分片足够多,存储容量就可以是「无限」的。但是,单个分片总要落到某一个节点上,而单节点的存储容量毕竟是有限的,随着时间推移,单个分片总有写满的时候。

即使它支持扩容分片数量,也没办法像其他分布式存储系统那样,重新分配数据,把已有分片上的数据迁移一部分到新的分片上。所以扩容分片也解决不了已有分片写满的问题。而 Kafka 又不支持按照时间维度去分片,所以,受制于单节点的存储容量,Kafka 实际能存储的数据容量并不是无限的。

#Kafka 之外还有哪些解决方案?

如果需要长时间(几个月 - 几年)保存的海量数据,就不适合用 Kafka 存储。这种情况下,只能退而求其次,使用第二种方案了。

第二种方案是,使用 HDFS 来存储。使用 HDFS 存储数据也很简单,就是把原始数据写成一个一个文本文件,保存到 HDFS 中。我们需要按照时间和业务属性来组织目录结构和文件名,以便于下游计算程序来读取,比如说:click/20200808/Beijing_0001.csv,代表 2020 年 8 月 8 日,从北京地区用户收集到的点击流数据,这个是当天的第一个文件。

对于保存海量的原始数据这个特定的场景来说,HDFS 的吞吐量是远不如 Kafka 的。按照平均到每个节点上计算,Kafka 的吞吐能力很容易达到每秒钟大几百兆,而 HDFS 只能达到百兆左右。这就意味着,要达到相同的吞吐能力,使用 HDFS 就要比使用 Kafka,多用几倍的服务器数量。

但 HDFS 也有它的优势,第一个优势就是,它能提供真正无限的存储容量,如果存储空间不够了,水平扩容就可以解决。另外一个优势是,HDFS 能提供比 Kafka 更强的数据查询能力。Kafka 只能按照时间或者位点来提取数据,而 HDFS 配合 Hive 直接就可以支持用 SQL 对数据进行查询,虽然说查询的性能比较差,但查询能力要比 Kafka 强大太多了。

以上这两种方案因为都有各自的优势和不足,在实际生产中,都有不少的应用,你可以根据业务的情况来选择。那有没有兼顾这二者优势的方案呢?最好能做到,既有超高的吞吐能力,又能无限扩容,同时还能提供更好的查询能力,有这样的好事儿么?

目前已经有一些的开源项目,都致力于解决这方面的问题。

一类是 分布式流数据存储,比较活跃的项目有 Pravega 和 Pulsar 的存储引擎 Apache BookKeeper。这些分布式流数据存储系统,走的是类似 Kafka 这种流存储的路线,在高吞吐量的基础上,提供真正无限的扩容能力,更好的查询能力。

还有一类是 时序数据库(Time Series Databases),比较活跃的项目有 InfluxDB 和 OpenTSDB 等。这些时序数据库,不仅有非常好的读写性能,还提供很方便的查询和聚合数据的能力。但是,它们不是什么数据都可以存的,它们专注于类似监控数据这样,有时间特征并且数据内容都是数值的数据。如果你有存储海量监控数据的需求,可以关注一下这些项目。

在互联网行业,点击流、监控和日志这几类数据,是海量数据中的海量数据。对于这类数据,一般的处理方式都是 先存储再计算,计算结果保存到特定的数据库中,供业务系统查询。

所以,对于海量原始数据的存储系统,我们要求的是超高的写入和读取性能,和近乎无限的容量,对于数据的查询能力要求不高。生产上,可以选择 Kafka 或者是 HDFS,Kafka 的优点是读写性能更好,单节点能支持更高的吞吐量。而 HDFS 则能提供真正无限的存储容量,并且对查询更友好。

为什么 Kafka 能做到几倍于 HDFS 的吞吐能力,技术上的根本原因是什么?

这个问题的最根本原因是,对于磁盘来说,顺序读写的性能要远远高于随机读写,这个性能差距视不同的磁盘,大约在几十倍左右。Kafka 是为顺序读写设计的,而 HDFS 是为随机读写的设计的,所以在顺序写入的时候,Kafka 的性能会更好。

虽然 hdfs 和 kafka 都可以用来做存储, 但 kafka 在使用方面像磁带;hdfs 更像硬盘,总结一下针对海量数据的存储方案有如下几个要点:

  1. 采用批处理的方式提升吞吐量
  2. 利用了磁盘文件顺序读写性能高的特点设计存储
  3. 利用了操作系统的 PageCache 做缓存,减少 IO
  4. 采用零拷贝技术加速消费流程

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

互联网海量数据如何存储Kafka

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

互联网海量数据如何存储Kafka

Kafka的数据是如何存储、分片、复制的?它是如何保证高可用,如何保证数据一致性的?那你会发现它和分布式存储系统,并没有什么太大的区别。唯一的区别就是,它的查询语言(生产和消费消息)和存储引擎的数据结构(Commit Log)比一般的存储系

物联网海量时序数据存储有哪些挑战?

随着 5G/IoT 技术的发展,数据呈爆炸式增长,其中物联网 (IoT) 与应用性能监控 (APM) 等是时序数据最典型的应用领域,覆盖物联网、车联网、智能家居、工业互联网、应用性能监控等常见的应用场景,海量的设备持续产生运行时指标数据,对

海量数据存储方式如何优化

海量数据存储方式的优化可以从以下几个方面考虑:1. 数据分片:将海量数据分割成多个较小的数据块,可以将数据存储在多个服务器上,实现分布式存储,提高存储和读取的效率。2. 数据压缩:对海量数据进行压缩,减少存储空间的占用,同时降低传输数据的带
2023-09-09

互联网大数据时代下亚马逊是如何解决数据存储的

对于一个普通的消费者而言,亚马逊是世界最大的网络零售商,销售额占到了美国服装行业的1/3以上。对于跨境电商卖家来说,亚马逊是一个高端且有高利润的平台。
亚马逊2024-12-01

PHP中如何进行海量数据存储和查询

在PHP中实现海量数据存储和查询PHP中的海量数据存储和查询需要高效的策略。NoSQL数据库如MongoDB、Redis和Elasticsearch适用于非结构化或半结构化数据,提供高可伸缩性和低延迟。分页、索引和并行查询有助于优化查询性能。缓存、预加载数据和队列等技术进一步提高效率。选择合适的硬件、优化数据结构和监控性能是最佳实践。
PHP中如何进行海量数据存储和查询
2024-04-12

PHP中如何进行海量数据存储和查询

在 PHP 中,可以使用数据库来进行海量数据的存储和查询。以下是一些常见的数据库解决方案:1. MySQL:MySQL 是一种关系型数据库管理系统,广泛用于海量数据存储和查询。使用 PHP 的 MySQL 扩展,可以通过编写 SQL 查询语
2023-08-28

互联网中如何利用数据提升存量客户稳定度

这篇文章主要为大家展示了“互联网中如何利用数据提升存量客户稳定度”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“互联网中如何利用数据提升存量客户稳定度”这篇文章吧。一、保有哪些用户 用户保有的目标
2023-06-10

互联网30载,与NAS共筑数据存储新生态

在我国互联网蓬勃发展的30年间,我们的生活方式、工作模式乃至整个社会的运行逻辑都发生了翻天覆地的变化。在这个数据为王的时代,如何高效、安全地存储与管理这些数据,成为了每个人和企业不得不面对的重要课题。
NAS2024-11-28

Teradata如何应对海量数据存储和高速数据访问的需求

Teradata是一家专注于数据管理和分析的公司,提供了一系列解决方案来满足海量数据存储和高速数据访问的需求。以下是一些Teradata如何应对这些需求的方式:分布式数据存储:Teradata提供了一个分布式数据仓库系统,可以将数据存储在多
Teradata如何应对海量数据存储和高速数据访问的需求
2024-04-09

大数据和物联网如何互助

我们已经开始看到数据分析和物联网在使用专业技术和技术高效分析大量数据方面的巨大影响。在收集和分析数据方面,物联网和大数据集成似乎是前进的方向。

电脑存储数据量如何查看

您可以通过以下几种方法来查看电脑存储数据量:1. 文件资源管理器:打开文件资源管理器(Windows)或Finder(Mac),选择“此电脑”或“我的电脑”,然后右击主硬盘驱动器(通常是C:),选择“属性”。在“常规”选项卡中,您将看到总存
2023-09-07

融合互通,浪潮分布式融合存储AS13000加速海量数据处理

浪潮分布式融合存储平台AS13000通过多年的持续技术创新,以一份数据支持多种协议访问,实现了非结构化数据融合互通,在提升数据处理效率的同时降低了存储购置和运维成本,做到语义无损、数据零拷贝、权限联动、应用无感接入。全面加持数据保护策略,助
浪潮2024-11-30

大数据和物联网是如何相互关联的?

物联网(IoT)和大数据技术在组织和个人之间快速增长。据《福布斯》预测,到2025年,生成的数据量将增加到175 zettabytes。这将对收集、分析和报告数据的方式产生巨大影响。

redis如何存储大量的日志数据

Redis本身并不适合存储大量的日志数据,因为它是一个内存数据库,存储的数据量应该受到内存容量的限制。如果要存储大量的日志数据,建议将数据存储在其他的存储引擎中,如文件系统或其他数据库,然后在Redis中存储日志数据的索引信息或一些关键数据
redis如何存储大量的日志数据
2024-04-09

热门标签

编程热搜

编程资源站

目录