导读:大数据计算发展至今,已经形成了一个百花齐放的大数据生态,通用计算、定制开发,批量处理、实时计算,关系查询、图遍历以及机器学习等等,我们都可以找到各种对应的计算引擎来协助我们处理这些任务。本系列文章拟以大数据平台从低到高的层次为主线,梳理整个大数据计算生态组件及其功能。
大数据计算生态的系列文章,拟包含的系列文章有:《大数据计算生态之数据存储》《大数据计算生态之数据计算》《大数据计算生态之数据交互》《大数据计算生态之计算调度》以及《大数据计算生态之数据工具》,该系列文章将从底层存储到顶层交互的各个组件进行讲解,帮助大家厘清大数据体系,丰富大数据知识。
本文经授权转自公众号DLab数据实验室
作者 | 小舰
出品 | DLab数据实验室(ID:rucdlab)
大数据计算生态(如上图)最上层为应用层,也就是实际与开发人员交互的层,例如分析人员只需要在应用层的Hive中写SQL即可,具体的任务分配和运行交给Hive来调用中间层的MapReduce引擎来进行处理。Spark的GraphX、MLlib等组件可以用来进行图分析和机器学习等。中间层的Spark、Flink等作为核心计算引擎提供批计算和流计算支持。左边ZK和Oozie是任务配置协调,右边的是日志采集、迁移或者获取数据相关的组件,再向下是资源调度管理系统,最底层是数据存储,一个大数据平台就要提供能进行多模型数据存储的能力,比如除了最常见的关系数据,还有时序、文档、键值和图等数据。
有些组件所处的层次其实还值得继续讨论,例如ElasticSearch其实也是一个存储组件,Hbase在作为存储组件的时候其实也作为查询计算组件使用,Flink也可以放到最上层,作为开发人员直接交互的组件。但整体来讲,整个大数据生态大概就是如此,大数据生态组件之间本就是相互拼接来完成特定功能。本文来具体介绍最底层的数据存储。
存储层
存储层负责进行大数据平台的数据存储。过去的几十年,数据大部分以结构化的形式存储在关系数据库中,常见的如Oracle和MySQL两种。随着数据越来越多样,出现了各种类型的数据库,如图数据库、键值数据库、时序数据库、文档数据库等,以及除了传统的行存数据库外,也出现了列存数据库或者文件格式。
1.HDFS(分布式文件系统)
HDFS 是 Hadoop Distribute File System,Hadoop分布式文件系统的简称。这个文件系统是一个适用于大的数据集的支持高吞吐和高容错的运行在通用(廉价)机上的分布式文件系统。
HDFS 是一个主从架构的服务。一个 HDFS 集群包括一个 NameNode 节点、一个 SecondaryNameNode 节点(非必须)和多个 DataNode 节点。
图中的几个要点:
- NameNode管理着Metadata(元数据)
- 客户端Client对元数据的操作是指向NameNode,对用户数据的读写是通过DataNode;
- NameNode向DataNode发送Block的操作命令
- 一块的副本被存储在不同的机架中
2.关系数据存储(行存储)
传统的数据库例如MySQL,Oracle等关系数据库,都采用的是行存储引擎,在基于行式存储的数据库中, 数据是按照行数据为基础逻辑存储单元进行存储的, 一行中的数据在存储介质中以连续存储形式存在。
3.列存储
列式存储(Column-based)是相对于行式存储来说的,新兴的 Hbase、HP Vertica、EMC Greenplum 等分布式数据库均采用列式存储。在基于列式存储的数据库中, 数据是按照列为基础的逻辑存储单元进行存储的,一列中的数据在存储介质中以连续存储形式存在。
从上图可以很清楚地看到,行式存储下一张表的数据都是放在一起的,但列式存储下都被分开保存了。所以它们就有了如下这些优缺点:
对于传统的数据存储来讲,无论是行存还是列存,它们的存取策略都基本是一致的,整体分为两大类操作(读操作和写操作),如上图所示,读写策略可以大概总结为如下的步骤:
针对这样的读写逻辑,就有了针对存储层在不同存取阶段的优化方案。
4.多模型存储
随着数据多样性的发展,多种类型的数据大量涌出,相对应的NoSQL系统也出现了。例如Neo4j图存储,用来存储社交网络、知识图谱等图数据;再入近两年Iot智能制造的兴起,大量工业生产生活中的时序数据,也对应出现了InfluxDB这种存储时序数据的系统;还有生产中常用的键值数据库Redis等。
(1)图存储
图存储分为原生图存储和非原生图存储(利用图模型加已有的存储引擎),不同的存储方案在读写图数据的时候也有不一样的策略,如下所列:
原生图存储虽然是针对图数据自身特点而定制化开发的图存储策略,但是对于分布式的支持较差。在大数据时代,很难有一个数据管理系统能够做到存储查询双高效,因此,在现实的应用中,图相关的计算存储往往是分离的,采用一些比较成熟的存储引擎。
(2)键值对存储
另一种比较流行的存储就是键值对存储,键值数据库因其在不涉及过多数据关联的数据上的高效读写能力得到了广泛的应用。我们以最基本的LevelDB存储模型为例,来探索键值存储一角。
以上就是LevelDB的读写策略,当然这只是简单的总结,其中还涉及到很多有意思的细节,大家可以继续深入探索。
除了上面讲的行存储、列存储、键值存储以及图存储,还有文档存储,时序数据存储等,在数据规模日益扩大、数据类型日益丰富的时代,可能还会有新的存储出现,但是,只要我们掌握了现有存储的基本套路,就能够快速应对和掌握新的存储形式的出现。
5.内存存储
内存存储也可以简单理解为缓存,缓存其实已经不是什么新概念了,无论是在操作系统还是传统的数据管理系统,都有缓冲区或者缓存的概念,主要是为了平衡CPU和磁盘之间的速度的差异,提高效率。在大数据的应用场景中,由于数据量比较大,数据的处理逻辑也比较复杂,因此一些中间过程结果可以复用的数据就可以通过分布式缓存来进行临时存储,其他的任务就可以避免数据的二次加工从而提高效率。
(1)Alluxio
Alluxio(之前名为Tachyon)是世界上第一个以内存为中心的虚拟的分布式存储系统。它统一了数据访问的方式,为上层计算框架和底层存储系统构建了桥梁。应用只需要连接Alluxio即可访问存储在底层任意存储系统中的数据。此外,Alluxio的以内存为中心的架构使得数据的访问速度能比现有方案快几个数量级。
Alluxio的特点是数据存储与计算分离,两部分引擎可以进行独立的扩展。上层的计算引擎(如Hadoop, Spark)可以通过Alluxio访问不同数据源(Amazon S3, HDFS)中的数据,通过Alluxio屏蔽底层不同的数据源,做到数据的无感获取。
6.总结
随着新硬件的出现和发展,基于磁盘、新硬件、缓存以及内存的多级存储体系得到了越来越多的研究,随着多级存储的发展,必将迎来新的技术进步。
●Spark训练营(一)-- 开发环境搭建及wordCount实战
●Spark训练营(二)-- SparkStreaming流计算组件wordCount实战
●Spark训练营(三)-- GraphX图计算组件最短路算法实战
●一文纵览大数据计算生态
●原创|带你厘清分布式、数据库的那些一致性
●深入浅出大数据组件之Kafka消息队列
●一个故事让你理解什么是区块链
●实时数据流计算引擎Flink和Spark剖析
●自定义Hadoop的输入格式