分布式系统计算框架
分布式系统计算框架
分布式计算技术(上):经典计算框架MapReduce、Spark 解析 - 知乎 (zhihu.com)
定义和关系
Extract-Transform-Load — ETL
MapReduce、Hadoop、Spark和Flink均是分布式计算框架,也可称为分布式计算平台。
MapReduce是Google公司于2004年提出的一种分布式计算模型,它主要用于大规模数据集的并行处理。MapReduce基于“map”(映射)和“reduce”(归约)两个操作,可以自动将输入数据切分成多份,交由多个计算节点并行处理,最后再合并输出结果,从而提高计算速度。
Hadoop是基于MapReduce模型的一个分布式计算平台,它包括了分布式文件系统HDFS和分布式计算模型MapReduce。Hadoop可以在廉价的硬件设备上搭建大规模的分布式计算集群,同时也支持一些其他计算框架,如Pig、Hive、HBase等。
Spark是另一种分布式计算框架,它不仅支持基于MapReduce的批量计算,还支持流式计算和机器学习等多种任务类型。Spark采用基于内存的计算方式,相比Hadoop更加高效。
Flink则是一种实时流式计算引擎,支持基于事件的有状态计算和窗口计算等特性。Flink的设计目标是使得流式计算能够和批量计算一样容易和高效,同时也支持在分布式集群上进行计算。
总体而言,Hadoop和Spark都是较为综合的分布式计算平台,可以支持多种计算框架,而Flink则是专注于流式计算的分布式计算框架。
· Hadoop用于离线复杂大数据处理
·Spark 用于离线快速的大数据处理
·Flink 用于在线实时的大数据处理。
实现批处理的开源方案
- MapReduce
- Tez
- Crunch
- Spark
实现流处理的开源方案
- Samza
- Storm
Hive SQL:::Hive SQL的编译过程 - 美团技术团队 (meituan.com)
介绍
1、Hadoop
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
Hadoop 以一种可靠、高效、可伸缩的方式进行数据处理。
Hadoop实现了一个分布式文件系统( Distributed File System),其中一个组件是HDFS(Hadoop Distributed File System)。
2、Flask
Flask是一个用Python编写的Web应用程序框架。
基于Werkzeug WSGI工具和Jinja2模板引擎。
Flask通常被称为微框架, 它旨在保持应用程序的核心简单且可扩展。Flask没有用于数据库处理的内置抽象层,也没有形成验证支持。相反,Flask支持扩展以向应用程序添加此类功能。
3、Flink
Flink是一个框架和分布式的处理引擎,用于对无界和有界数据流进行状态计算。
有界的数据流就是有限量的静态数据,比如数据库里现在存好的数据,它就是有界的。
无界数据流就是有一个数据源给你不断的发送数据,比如一个传感器不断的向服务器发送状态信息,比如服务器的实时监控程序。
Flink框架可以说是实现真正意义上的实时流处理,大大降低了流计算的延迟,更能满足当下的大数据处理需求。
4、Hive
hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。
hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转变成MapReduce任务来执行。
5、Flume
Flume 日志收集系统
Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
6、kafka
Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。
kafka是一个分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时处理领域。
Kafka是一个分布式消息队列。Kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接受者称为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)称为broker。
关系
Flume、Flink、Hadoop、MapReduce、Spark、HDFS、GFS、YARN等都属于大数据和分布式系统中的技术工具或框架,它们之间有联系也有区别,具体如下:
Flume:Apache Flume是一个分布式、可靠和高可用性的日志聚合工具,设计用于将大量日志数据从不同的源头转移至不同的存储位置。Flume本身是一个Java语言编写的分布式系统,具有良好的复杂性和扩展性。
Flink:Flink是一个分布式流处理框架,提供了数据流和批处理之间的紧密耦合,能够高效地处理大量实时事件,支持window算子、状态管理和恰好一次处理机制等特性。
Hadoop:Hadoop是一个开源的分布式计算平台,包含Hadoop分布式文件系统HDFS和Hadoop分布式计算框架MapReduce,通常用于在分布式平台上分析和处理超大规模数据集。
MapReduce:MapReduce是由Google提出的一种分布式计算编程模型,在Hadoop中得到了广泛应用。MapReduce将一个复杂的大数据问题分解成多个小问题进行并行处理,并将结果合并到一起,实现高效计算。
Spark:Apache Spark是一个快速、通用、可扩展的大数据处理框架,支持分布式数据处理、数据密集型计算和大规模数据处理。Spark提供了多种API(Scala、Java、Python和R等),可以用于批处理和流处理。
HDFS:HDFS是Hadoop分布式文件系统(Hadoop Distributed File System)的缩写,是一个分布式文件系统,适合在数据集超出单台计算机存储和处理能力范围时使用。
GFS:GFS是谷歌的分布式文件系统Google File System的缩写,已经是一个过时的技术。它是谷歌用于存储大量数据的分布式文件系统,具有高性能和可靠性等特点。
YARN:YARN是Hadoop的一个重要组件,它是一个集群管理器,负责任务分配、资源管理和调度等工作,可以管理不同Hadoop或Apache Hadoop生态系统应用程序的资源和任务。
分布式数据库:分布式数据库是一种跨多个地理位置或计算节点的分布式计算环境中的数据库管理系统,主要解决了分布式数据存储和查询的问题。常见的分布式数据库包括MongoDB、Cassandra、HBase等。
综上所述,这些技术工具是很多分布式系统共有的基础构成部分。它们通常在不同层面,如存储、计算和管理等领域提供分布式处理和管理能力。它们之间有相互依存和互补的关系,同时也有各自的特点和应用场景。在实现大规模数据处理和分布式存储时,这些技术工具往往需要相互配合和协同工作,以实现更高效、可靠和可扩展的计算和数据管理。
例如,Hadoop平台中的HDFS可以存储大规模的数据,而通过MapReduce和Spark等计算框架可以对这些数据进行处理;通过YARN进行任务管理和资源调度,而Flume等日志聚合工具可以将原始数据从不同源头采集并传输至HDFS中;Flink等流处理框架提供实时可视化面板来查看实时数据流,为企业提供智能的数据展示等等。
在实际应用中,这些技术工具通常作为一个整体被使用,企业开发团队可以根据需求进行选择和组合,并根据实际情况进行优化和扩展。因此,这些技术工具之间形成了紧密的联系和协同,一起实现了海量数据的处理和分析,为企业带来了更好的商业价值和战略优势。
组合
这些技术工具之间存在着紧密的组合关系,主要是因为它们相互之间存在一些依赖关系,同时各自又具有不同的优势和应用场景。下面是一些技术工具之间的常见组合关系:
Hadoop+MapReduce:Hadoop和MapReduce是一对不可分割的技术工具。MapReduce基于Hadoop集群对大数据集进行批量处理,将大数据处理程序分解为多个子任务,分配到不同的计算节点上,并通过网络进行通信和协作,最后将结果进行合并。
Hadoop+Spark:Spark是Hadoop的一个高级别的基于内存的分布式计算框架,通常用于批处理和流处理。Spark可以很好地和Hadoop相关组件如HDFS、YARN深度集成,将数据读入内存并通过集群计算实现快速计算。
Hadoop+Hive:Hive是基于Hadoop的数据仓库工具,能够将数据存储到HDFS中,并使用类似SQL的语言进行数据查询和处理。Hive可以很好地与Hadoop其他组件集成,例如HDFS、YARN、MapReduce,这使得Hive可以非常高效地实现数据查询、ETL和分析。
Flink+Hadoop:Flink是另一个流式处理框架,可以处理流数据、批数据等。它能够与Hadoop的HDFS和YARN完美集成,HDFS作为数据存储位置,YARN作为集群计算环境,利用Flink提供的流式处理能力,能够高效地处理和分析实时数据和批量数据。
分布式数据库+Hadoop:分布式数据库如HBase,Cassandra等也很常常和Hadoop生态系统进行结合,Hadoop可以与分布式数据库一起存储和处理大量结构化和非结构化数据,扩展数据处理和查询能力,提高数据查询和处理的效率和性能。
综上所述,这些技术工具之间展现出了非常丰富的组合关系,能够适应不同的场景和需求,并实现大规模数据的处理和分析。企业可根据自身的业务需求,灵活选择和组合这些技术工具,并不断进行技术架构升级和调整,以实现高质量、高效和可靠的大数据分析和处理。
Hadoop – 分布式计算平台
Hadoop由来 ::: 深入浅出大数据:到底什么是Hadoop? - 知乎 (zhihu.com)
Hive数据库架构 、MapReduce引擎、Terz引擎、Spark引擎 :Hive计算引擎大PK,万字长文解析MapRuce、Tez、Spark三大引擎 - 知乎 (zhihu.com)
Hadoop的核心架构
Hadoop的核心,说白了,就是HDFS和MapReduce。HDFS为海量数据提供了存储,而MapReduce为海量数据提供了计算框架。
Hadoop核心架构
HBase分布式数据库
MapReduce引擎
让我们来仔细看看,它们分别是怎么工作的。
HDFS分布式文件系统
首先看看HDFS。
整个HDFS有三个重要角色:NameNode(名称节点)、DataNode(数据节点)和Client(客户机)。
典型的主从架构,用TCP/IP通信
NameNode:是Master节点(主节点),可以看作是分布式文件系统中的管理者,主要负责管理文件系统的命名空间、集群配置信息和存储块的复制等。NameNode会将文件系统的Meta-data存储在内存中,这些信息主要包括了文件信息、每一个文件对应的文件块的信息和每一个文件块在DataNode的信息等。
DataNode:是Slave节点(从节点),是文件存储的基本单元,它将Block存储在本地文件系统中,保存了Block的Meta-data,同时周期性地将所有存在的Block信息发送给NameNode。
Client:切分文件;访问HDFS;与NameNode交互,获得文件位置信息;与DataNode交互,读取和写入数据。
还有一个Block(块)的概念:Block是HDFS中的基本读写单元;HDFS中的文件都是被切割为block(块)进行存储的;这些块被复制到多个DataNode中;块的大小(通常为64MB)和复制的块数量在创建文件时由Client决定。
HDFS流程
我们来简单看看的读写流程。
首先是写入流程:
1 用户向Client(客户机)提出请求。例如,需要写入200MB的数据。
2 Client制定计划:将数据按照64MB为块,进行切割;所有的块都保存三份。
3 Client将大文件切分成块(block)。
4 针对第一个块,Client告诉NameNode(主控节点),请帮助我,将64MB的块复制三份。
5 NameNode告诉Client三个DataNode(数据节点)的地址,并且将它们根据到Client的距离,进行了排序。
6 Client把数据和清单发给第一个DataNode。
7 第一个DataNode将数据复制给第二个DataNode。
8 第二个DataNode将数据复制给第三个DataNode。
9 如果某一个块的所有数据都已写入,就会向NameNode反馈已完成。
10 对第二个Block,也进行相同的操作。
11 所有Block都完成后,关闭文件。NameNode会将数据持久化到磁盘上。
读取流程:
1 用户向Client提出读取请求。
2 Client向NameNode请求这个文件的所有信息。
3 NameNode将给Client这个文件的块列表,以及存储各个块的数据节点清单(按照和客户端的距离排序)。
4 Client从距离最近的数据节点下载所需的块。
(注意:以上只是简化的描述,实际过程会更加复杂。)
再来看MapReduce。
MapReduce其实是一种编程模型。这个模型的核心步骤主要分两部分:Map(映射)和Reduce(归约)。
当你向MapReduce框架提交一个计算作业时,它会首先把计算作业拆分成若干个Map任务,然后分配到不同的节点上去执行,每一个Map任务处理输入数据中的一部分,当Map任务完成后,它会生成一些中间文件,这些中间文件将会作为Reduce任务的输入数据。Reduce任务的主要目标就是把前面若干个Map的输出汇总到一起并输出。
是不是有点晕?我们来举个例子。
上图是一个统计词频的任务。
1 Hadoop将输入数据切成若干个分片,并将每个split(分割)交给一个map task(Map任务)处理。
2 Mapping之后,相当于得出这个task里面,每个词以及它出现的次数。
3 shuffle(拖移)将相同的词放在一起,并对它们进行排序,分成若干个分片。
4 根据这些分片,进行reduce(归约)。
5 统计出reduce task的结果,输出到文件。
如果还是没明白的吧,再举一个例子。
一个老师有100份试卷要阅卷。他找来5个帮手,扔给每个帮手20份试卷。帮手各自阅卷。最后,帮手们将成绩汇总给老师。很简单了吧?
MapReduce这个框架模型,极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。
哦,差点忘了,在MapReduce里,为了完成上面这些过程,需要两个角色:JobTracker和TaskTracker。
JobTracker用于调度和管理其它的TaskTracker。JobTracker可以运行于集群中任一台计算机上。TaskTracker 负责执行任务,必须运行于 DataNode 上。
1.0版本与2.0版本
2011年11月,Hadoop 1.0.0版本正式发布,意味着可以用于商业化。
但是,1.0版本中,存在一些问题:
1 扩展性差,JobTracker负载较重,成为性能瓶颈。
2 可靠性差,NameNode只有一个,万一挂掉,整个系统就会崩溃。
3 仅适用MapReduce一种计算方式。
4 资源管理的效率比较低。
所以,2012年5月,Hadoop推出了 2.0版本 。
2.0版本中,在HDFS之上,增加了YARN(资源管理框架)层。它是一个资源管理模块,为各类应用程序提供资源管理和调度。
此外,2.0版本还提升了系统的安全稳定性。
所以,后来行业里基本上都是使用2.0版本。目前Hadoop又进一步发展到3.X版本。
Hadoop的生态圈
经过时间的累积,Hadoop已经从最开始的两三个组件,发展成一个拥有20多个部件的生态系统。
在整个Hadoop架构中,计算框架起到承上启下的作用,一方面可以操作HDFS中的数据,另一方面可以被封装,提供Hive、Pig这样的上层组件的调用。
我们简单介绍一下其中几个比较重要的组件。
HBase
HBase:来源于Google的BigTable;是一个高可靠性、高性能、面向列、可伸缩的分布式数据库。
Hive:是一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
Hive
Hive是一个数据仓库工具,它允许用户使用SQL语言来处理Hadoop中的大数据集。Hive允许用户定义SQL查询以及将查询转化为MapReduce程序,使得非开发人员也可以使用Hadoop集群进行数据处理。Hive的应用场景包括:
数据存储和查询:Hive支持将结构化数据存储在Hadoop的分布式文件系统中,并且支持高效的并行查询。它提供了类似于SQL的查询语言,使得用户可以使用熟悉的语法进行数据查询和处理。
数据管理和建模:Hive可用于数据管理和建模,它允许用户使用元数据来管理存储在Hadoop中的大量数据,并且支持数据仓库和ETL(Extract,Transform,Load)过程。
数据分析和报告:Hive可以被用于数据分析和报告,允许用户运行复杂的分析查询并生成报告。它还可以支持将分析结果导出到其他应用程序中
Pig
Pig:是一个基于Hadoop的大规模数据分析工具,它提供的SQL-LIKE语言叫Pig Latin,该语言的编译器会把类SQL的数据分析请求转换为一系列经过优化处理的MapReduce运算。
ZooKeeper:来源于Google的Chubby;它主要是用来解决分布式应用中经常遇到的一些数据管理问题,简化分布式应用协调及其管理的难度。
Ambari:Hadoop管理工具,可以快捷地监控、部署、管理集群。
Sqoop:用于在Hadoop与传统的数据库间进行数据的传递。
Mahout:一个可扩展的机器学习和数据挖掘库。
再上一张图,可能看得更直观一点:
Hadoop的优点和应用
总的来看,Hadoop有以下优点:
高可靠性:这个是由它的基因决定的。它的基因来自Google。Google最擅长的事情,就是“垃圾利用”。Google起家的时候就是穷,买不起高端服务器,所以,特别喜欢在普通电脑上部署这种大型系统。虽然硬件不可靠,但是系统非常可靠。
高扩展性:Hadoop是在可用的计算机集群间分配数据并完成计算任务的,这些集群可以方便地进行扩展。说白了,想变大很容易。
高效性:Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。
高容错性:Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。这个其实也算是高可靠性。
低成本:Hadoop是开源的,依赖于社区服务,使用成本比较低。
基于这些优点,Hadoop适合应用于大数据存储和大数据分析的应用,适合于服务器几千台到几万台的集群运行,支持PB级的存储容量。
Hadoop的应用非常广泛,包括:搜索、日志处理、推荐系统、数据分析、视频图像分析、数据保存等,都可以使用它进行部署。
目前,包括Yahoo、IBM、Facebook、亚马逊、阿里巴巴、华为、百度、腾讯等公司,都采用Hadoop构建自己的大数据系统。
除了上述大型企业将Hadoop技术运用在自身的服务中外,一些提供Hadoop解决方案的商业型公司也纷纷跟进,利用自身技术对Hadoop进行优化、改进、二次开发等,然后对外提供商业服务。
比较知名的,是Cloudera公司。
它创办于2008年,专业从事基于Hadoop的数据管理软件销售和服务,还提供Hadoop相关的支持、咨询、培训等服务,有点类似于RedHat在Linux世界中的角色。前面我们提到的Hadoop之父,Doug Cutting,都被这家公司聘请为首席架构师。
Hadoop和Spark
最后,我再介绍一下大家关心的Spark。
Spark同样是Apache软件基金会的顶级项目。它可以理解为在Hadoop基础上的一种改进。
它是加州大学伯克利分校AMP实验室所开源的类Hadoop MapReduce的通用并行框架。相对比Hadoop,它可以说是青出于蓝而胜于蓝。
前面我们说了,MapReduce是面向磁盘的。因此,受限于磁盘读写性能的约束,MapReduce在处理迭代计算、实时计算、交互式数据查询等方面并不高效。但是,这些计算却在图计算、数据挖掘和机器学习等相关应用领域中非常常见。
而Spark是面向内存的。这使得Spark能够为多个不同数据源的数据提供近乎实时的处理性能,适用于需要多次操作特定数据集的应用场景。
在相同的实验环境下处理相同的数据,若在内存中运行,那么Spark要比MapReduce快100倍。其它方面,例如处理迭代运算、计算数据分析类报表、排序等,Spark都比MapReduce快很多。
此外,Spark在易用性、通用性等方面,也比Hadoop更强。
所以,Spark的风头,已经盖过了Hadoop。
结语
以上,就是小枣君关于大数据相关技术的介绍。
小枣君个人觉得,相比于云计算技术来说,大数据的应用范围比较有限,并不是所有的公司都适用,也不是所有的业务场景都适用,没有必要跟风追捧,更不能盲目上马。
対于个人来说,大数据系统的架构非常庞大,内容也非常复杂,入门起来会比较吃力(实践练习倒是门槛很低,几台电脑足矣)。所以,如果不是特别渴望朝这个方向发展,可以不必急于学习它。或者说,可以先进行初步的了解,后续如果真的要从事相关的工作,再进行深入学习也不迟。
分布式计算框架
MapReduce
MapReduce批处理引擎—MapReduce是第一个比较成功的计算引擎,主要用于数据批处理。由于企业的大数据业务多是围绕结构化数据等价值密度更高的数据展开,所有的大数据公司开始在大数据平台上打造SQL引擎或分布数据库。2012年开始到随后两年中出现20多个基于Hadoop的SQL引擎,以解决结构化数据问题。MapReduce框架是Hadoop技术的核心,它的出现是计算模式历史上的一个重大事件,在此之前行业内大多是通过MPP(Massive Parallel Programming)的方式来增强系统的计算能力,一般都是通过复杂而昂贵的硬件来加速计算,如高性能计算机和数据库一体机等。而MapReduce则是通过分布式计算,只需要廉价的硬件就可以实现可扩展的、高并行的计算能力。一个MapReduce程序会包含一个Map过程和一个Reduce过程。在Map过程中,输入为(Key, Value)数据对,主要做过滤、转换、排序等数据操作,并将所有Key值相同的Value值组合起来;而在Reduce过程中,解析Map阶段生成的(Key, list(value))数据,并对数据做聚合、关联等操作,生成最后的数据结果。每个worker只处理一个file split,而Map和Reduce过程之间通过硬盘进行数据交换,如果出现任何错误,worker会从上个阶段的磁盘数据开始重新执行相关的任务,保证系统的容错性和鲁棒性。
Spark
离线处理大数据计算框架 – 内存计算机的先河
Flink
Flink(一)-基本概念 - 知乎 (zhihu.com)
Flink(三)-Time-&-Watermark - 知乎 (zhihu.com)
在线实时处理的大数据计算框架
分布式文件系统
GFS
HDFS
常见
常见的分布式文件系统有以下几种:
Hadoop分布式文件系统(HDFS):HDFS是Hadoop生态系统的一部分,用于存储大规模数据,提供高伸缩性、高可用性和数据可靠性,并通过MapReduce实现分布式数据处理。
Ceph:Ceph是一种开源的分布式文件系统和对象存储,支持可扩展性和高可用性。它提供了块、对象和文件存储接口,可在不同的客户端和云环境中进行应用。
GlusterFS:GlusterFS是一种分布式文件系统,具有可扩展性、高可用性和备份功能。它将多个服务器上的存储空间合并到一个全局命名空间中,从而提供数据共享和数据存储的功能。
Lustre:Lustre是一个高性能的、可扩展的分布式文件系统,被广泛应用于高性能计算领域。它具有高可用性、高度可扩展性、高设置灵活性和广泛的文件系统特性,允许在多个主机之间共享文件和数据。
使用场景
这些分布式文件系统主要用于存储大规模数据,支持并行计算和数据存储的能力,以及可扩展性和高可用性等特性。下面是常见的使用场景:
数据存储:由于分布式文件系统能够支持高度可扩展性,使得企业可以存储任何规模的数据。分布式文件系统能够将数据存储在多个计算机上,实现分布式存储,提高数据的容错性与可靠性。
数据分析:分布式文件系统不仅能够存储大规模数据,而且支持高度可扩展的数据处理和分析。通过分布式计算功能,可以在一个计算集群中进行大规模数据分析和处理,有助于企业做出更精确的业务决策。
多媒体流处理:由于媒体数据是非常大的,因此需要这样一种分布式文件系统,能够在多个节点上处理大规模流媒体数据。分布式文件系统能够在这种情况下进行高效的读写操作,并且能够将这些文件数据快速存储和检测到文件服务器。
云存储:云存储要求的可扩展性和可用性非常高,分布式文件系统能够满足这些要求,并且能够高效地存储和处理大规模数据。所以分布式文件系统非常适合云存储应用场景。
科研领域:高性能计算领域是使用分布式文件系统的典型场景。分布式文件系统是高性能运算和数据共享的关键技术,可以帮助科学家有效地利用大规模数据和 storage-centric 网络上的计算资源,提高计算效率。
综上所述,分布式文件系统具有支持高并发、可扩展性和存储容量大等优势,并且广泛应用于大规模数据存储、分析和处理。
分布式数据库
主要数据库
目前常见的分布式数据库包括:
HBase:HBase是一个开源的NoSQL数据库,主要设计用于大规模数据集的存储和访问,主要应用于分布式计算环境中(如Hadoop),提供高可用性、高并发发和可扩展性的数据访问。
Cassandra:Cassandra是一个高可用、可扩展的分布式数据库,适合于需要大规模的读写吞吐量的应用程序,尤其适合于数据复制和可用性方面的需求高的应用程序。
MongoDB:MongoDB是一个面向文档的开源的分布式数据库,具有出色的性能和扩展性,适合于存储大量动态和不规则的数据,如Web应用程序、实时数据处理等。
Apache CouchDB:Apache CouchDB是一个基于文档的分布式数据库系统,易于安装和使用,具有出色的可扩展性、复制性和稳定性。
Riak:Riak是一个可扩展的分布式键值存储,能够存储大量的非结构化数据,具有高可靠性、容错性和可扩展性,适用于多节点数据存储和分析场景。
Amazon DynamoDB:DynamoDB是一种全管理的NoSQL数据库服务,提供高可用性、可扩展性和自动扩容,适合于云基础架构下的数据存储和处理。
应用
常见的分布式数据库在不同的场景中有着各自的应用,例如:
互联网网站:网站通常需要处理大量的访问请求,而且数据规模也相对较大。分布式数据库可以根据应用程序的实际需求,分布存储数据、实现高可用、高并发的特性等。
物联网设备:现今物联网设备数量众多,但数据分散,如何准确、快速地所有数据是物联网设备数据处理的难点。分布式数据库能够有效地解决这一问题,通过分布式存储和处理,提高数据查询效率和可靠性。
大数据处理:大数据场景下,数据量巨大、处理速度快是必要的。分布式数据库提供水平扩展,允许服务器上进行数据储和数据处理,以实现高速数据处理。
金融交易领域:金融交易需要实时读取存储数据和更新数据,并保证数据的一致性和完整性,因此,分布式数据库能够更好地处理这一领域的应用场景。
优势
分布式数据库往往在大规模数据场景下具有很好的优势和应用价值。在分布式环境中使用时,主要体现在以下几个方面:
数据存储:分布式数据库可以在多台计算机上进行分布式存储,提高数据的可靠性和可用性,减缓单台计算机存储处理压力,提高了整体计算机系统的数据容量。
数据查询:分布式数据库能够将数据分散存储在多个节点上,以实现快速数据查找,提高数据查询效率。
扩展性:分布式数据库可以容易地以水平扩展的方式处理不断增长的数据量,而不必增加单节点计算机的处理能力。只需要增加更多的节点存储即可。
可靠性和容错性:分布式数据库能够容错和故障转移,以提高系统的可靠性,通过备份实现数据中断的积极恢复和容错。
数据结构
SST
(Sorted String Table)
SSTable 介绍(一) - 生栋 - 博客园 (cnblogs.com)
kafka,Rocket MQ使用的方式
LSM 树
(Log-Structured-Merge-Tree)
B(+) 树
HashTree
LSM树详解
LSM树(Log-Structured-Merge-Tree)的名字往往会给初识者一个错误的印象,事实上,LSM树并不像B+树、红黑树一样是一颗严格的树状数据结构,它其实是一种存储结构,目前HBase,LevelDB,RocksDB这些NoSQL存储都是采用的LSM树。
LSM树的核心特点是利用顺序写来提高写性能,但因为分层(此处分层是指的分为内存和文件两部分)的设计会稍微降低读性能,但是通过牺牲小部分读性能换来高性能写,使得LSM树成为非常流行的存储结构。
1、LSM树的核心思想
如上图所示,LSM树有以下三个重要组成部分:
1) MemTable
MemTable是在***内存***中的数据结构,用于保存最近更新的数据,会按照Key有序地组织这些数据,LSM树对于具体如何组织有序地组织数据并没有明确的数据结构定义,例如Hbase使跳跃表来保证内存中key的有序。
因为数据暂时保存在内存中,内存并不是可靠存储,如果断电会丢失数据,因此通常会通过WAL(Write-ahead logging,预写式日志)的方式来保证数据的可靠性。
2) Immutable MemTable
当 MemTable达到一定大小后,会转化成Immutable MemTable。Immutable MemTable是将转MemTable变为SSTable的一种中间状态。写操作由新的MemTable处理,在转存过程中不阻塞数据更新操作。
3) SSTable(Sorted String Table)
**有序键值对*集合,是LSM树组在磁盘***中的数据结构。为了加快SSTable的读取,可以通过建立key的索引以及布隆过滤器来加快key的查找。
这里需要关注一个重点,LSM树(Log-Structured-Merge-Tree)正如它的名字一样,LSM树会将所有的数据插入、修改、删除等操作记录(注意是操作记录)保存在内存之中,当此类操作达到一定的数据量后,再批量地顺序写入到磁盘当中。这与B+树不同,B+树数据的更新会直接在原数据所在处修改对应的值,但是LSM数的数据更新是日志式的,当一条数据更新是直接append一条更新记录完成的。这样设计的目的就是为了顺序写,不断地将Immutable MemTable flush到持久化存储即可,而不用去修改之前的SSTable中的key,保证了顺序写。
因此当MemTable达到一定大小flush到持久化存储变成SSTable后,在不同的SSTable中,可能存在相同Key的记录,当然最新的那条记录才是准确的。这样设计的虽然大大提高了写性能,但同时也会带来一些问题:
1)冗余存储,对于某个key,实际上除了最新的那条记录外,其他的记录都是冗余无用的,但是仍然占用了存储空间。因此需要进行Compact操作(合并多个SSTable)来清除冗余的记录。
2)读取时需要从最新的倒着查询,直到找到某个key的记录。最坏情况需要查询完所有的SSTable,这里可以通过前面提到的索引/布隆过滤器来优化查找速度。
2、LSM树的Compact策略
从上面可以看出,Compact操作是十分关键的操作,否则SSTable数量会不断膨胀。在Compact策略上,主要介绍两种基本策略:size-tiered和leveled。
不过在介绍这两种策略之前,先介绍三个比较重要的概念,事实上不同的策略就是围绕这三个概念之间做出权衡和取舍。
1)读放大:读取数据时实际读取的数据量大于真正的数据量。例如在LSM树中需要先在MemTable查看当前key是否存在,不存在继续从SSTable中寻找。
2)写放大:写入数据时实际写入的数据量大于真正的数据量。例如在LSM树中写入时可能触发Compact操作,导致实际写入的数据量远大于该key的数据量。
3)空间放大:数据实际占用的磁盘空间比数据的真正大小更多。上面提到的冗余存储,对于一个key来说,只有最新的那条记录是有效的,而之前的记录都是可以被清理回收的。
1) size-tiered 策略
size-tiered策略保证每层SSTable的大小相近,同时限制每一层SSTable的数量。如上图,每层限制SSTable为N,当每层SSTable达到N后,则触发Compact操作合并这些SSTable,并将合并后的结果写入到下一层成为一个更大的sstable。
由此可以看出,当层数达到一定数量时,最底层的单个SSTable的大小会变得非常大。并且size-tiered策略会导致空间放大比较严重。即使对于同一层的SSTable,每个key的记录是可能存在多份的,只有当该层的SSTable执行compact操作才会消除这些key的冗余记录。
2) leveled策略
每一层的总大小固定,从上到下逐渐变大
leveled策略也是采用分层的思想,每一层限制总文件的大小。
但是跟size-tiered策略不同的是,leveled会将每一层切分成多个大小相近的SSTable。这些SSTable是这一层是全局有序的,意味着一个key在每一层至多只有1条记录,不存在冗余记录。之所以可以保证全局有序,是因为合并策略和size-tiered不同,接下来会详细提到。
每一层的SSTable是全局有序的
假设存在以下这样的场景:
\1) L1的总大小超过L1本身大小限制:
此时L1超过了最大阈值限制
\2) 此时会从L1中选择至少一个文件,然后把它跟L2***有交集的部分(非常关键)***进行合并。生成的文件会放在L2:
如上图所示,此时L1第二SSTable的key的范围覆盖了L2中前三个SSTable,那么就需要将L1中第二个SSTable与L2中前三个SSTable执行Compact操作。
\3) 如果L2合并后的结果仍旧超出L5的阈值大小,需要重复之前的操作 —— 选至少一个文件然后把它合并到下一层:
需要注意的是,***多个不相干的合并是可以并发进行的***:
leveled策略相较于size-tiered策略来说,每层内key是不会重复的,即使是最坏的情况,除开最底层外,其余层都是重复key,按照相邻层大小比例为10来算,冗余占比也很小。因此空间放大问题得到缓解。但是写放大问题会更加突出。举一个最坏场景,如果LevelN层某个SSTable的key的范围跨度非常大,覆盖了LevelN+1层所有key的范围,那么进行Compact时将涉及LevelN+1层的全部数据。
3、总结
LSM树是非常值得了解的知识,理解了LSM树可以很自然地理解Hbase,LevelDb等存储组件的架构设计。ClickHouse中的MergeTree也是LSM树的思想,Log-Structured还可以联想到Kafka的存储方式。
虽然介绍了上面两种策略,但是各个存储都在自己的Compact策略上面做了很多特定的优化,例如Hbase分为Major和Minor两种Compact,这里不再做过多介绍,推荐阅读文末的RocksDb合并策略介绍。
扩展
组件选择
随着大数据和云计算技术的不断发展,数据处理和分析平台也在不断涌现,并且应用范围也越来越广泛。常见的数据处理和分析平台有以下几种:
Hadoop:Hadoop是一种分布式计算框架,由Apache基金会开发,提供了大规模数据的存储和处理能力,被广泛应用于海量数据处理和分析。
Spark:Spark是一种开源的、高性能的分布式计算框架,由Apache基金会开发。Spark的出现提升了大数据处理的效率和速度,和Hadoop一起被广泛应用于大数据分析和挖掘。
Storm:Storm是一个实时计算系统,主要用于实时流数据处理。其最大的特点是实时性,能够实现对大规模流数据的处理、过滤和聚合等操作。
Flink:Flink是一种新兴的分布式计算引擎,被广泛应用于实时数据处理、批量数据分析以及离线数据挖掘等场景。与其他框架相比,Flink具有低延迟、高准确性和高吞吐量等优点。
HPCC:HPCC是一个大数据处理和分析平台,由美国LexisNexis Risk Solutions公司开发。通过ECL高级查询语言和Thor并行计算引擎,实现了大规模数据的高效处理和分析。
以上是常见的数据处理和分析平台。数据处理和分析平台各有其特点和优缺点,需要根据具体业务需求以及数据处理场景进行识别和选择。
场景分析
Hadoop:Hadoop通常被用于处理非结构化数据,例如日志、文本、音频和视频等。Hadoop拥有快速处理海量数据的能力和可扩展性,但对于实时性要求高的场景效率并不是非常高。
Spark:Spark通用于迭代式计算、机器学习和实时流处理任务。Spark非常快,并且可以在单个集群上处理批处理(batch)和实时(stream)数据,对实时性要求较高的场景效率非常高。
Storm:Storm主要用于实时数据流分析场景,例如实时监控、实时带宽计算等。Storm响应速度非常快,对实时性要求高的场景效率高,但不适合处理大规模批量数据。
Flink:Flink支持批处理、流数据处理和迭代式计算任务,适合于具有实时处理要求的场景。Flink响应速度很快,对灵活性和可扩展性有很高的要求。
HPCC:HPCC主要用于大数据分析和处理,可处理非结构化和结构化数据。HPCC可以通过对大量数据的存储和管理,帮助用户发现新的、有价值的信息和洞见,其中ECL语言相对容易学习。
Hive:Hive主要用于大规模数据分析和处理,支持高并发查询和基于SQL的数据操作等。Hive的优点是易于学习和使用,但由于是基于Hadoop的map-reduce计算模型,其效率和速度没有Spark高。
Cassandra:Cassandra主要用于大规模分布式数据存储和处理,支持数据复制和高可靠性等特点。Cassandra的优点包括易于扩展、查询速度快和数据安全性差,因其数据模型的复杂性,学习曲线相对较高。
MongoDB:MongoDB主要用于处理大规模非结构化数据,例如日志、文档和图像等。MongoDB在海量存储和无模式设计方面具有优势,但不擅长处理复杂的事务和数据关系。
总的来说,不同的数据处理和分析平台在不同的场景下都有其优点和劣势,需要根据具体业务需求进行权衡和选择。建议学习一定量的基础编程知识和数据处理理论知识后再学习对平台和框架。针对不同平台,可以选择相关的在线文档、教程和视频资源等进行系统学习。