1、大数据基本概念

大数据的概念在互联网等领域经常看到,大数据从名字上看就是大量的数据集,但究竟大数据的具体概念或者特征是什么呢?哪些场景下的数据是大数据的概念?大数据领域还有哪些专有名词?这节介绍。

1.1 5V

IBM将大数据的特点归为5个V,如下:

  • Volume:数据量大,从TB(1,024 GB)、PB(1,024 TB)、EB(1,024 PB)、ZB(1,024 EB)甚至到YB(1,024 ZB)。纽约证交所每天产生的交易数据大约在TB级,瑞士日内瓦附近的大型强子对撞机每年产生的数据约为PB级,而目前全球数据总量已经在ZB级,相当于 1,000,000 PB,也就是大家更熟悉的10亿 TB。基于更大规模的数据,我们可以对某个研究对象的历史、现状和未来有更加全面的了解。
  • Velocity:数据产生速度快,所要求的处理速度和时效性高,因为时间就是金钱。金融市场的交易数据必须以秒级的速度进行处理,搜索和推荐引擎需要在分钟级将实时新闻推送给用户。更快的数据处理速度,让我们基于最新的数据上做更加实时的决策。
  • Variety:数据类型繁多,包括数字、文字、图片、视频等不同的数据形式,也包括来自社交网络、视频网站、可穿戴设备以及各类传感器的数据。数据可能是Excel里高度结构化的数据,也可能是图片和视频这种非结构化的数据。
  • Veracity:数据真实性。一方面,数据并非天然具有高价值,一些异常值会被掺杂进来,例如,统计偏差、人的情感影响、天气、经济因素甚至谎报数据等。另一方面,数据源类型不同,数据源多样,如何将这些多元异构数据连接、匹配、清洗和转化,形成具有高置信度的数据是一项非常有挑战的工作。
  • Value:数据价值。我们研究和利用大数据的最终目的是提供更有价值的决策支持,基于以上提到的四个V,挖掘大数据的深层价值。

    1.2 MapReduce

    MapReduce是一种并行计算框架,所谓的并行计算框架,是指可以将大型数据处理任务分解成很多单个的、彼此互不关联的、可以在服务器集群中不同节点并行执行任务,这些任务的计算结果可以合并在一起来聚合成最终的计算结果。
    MapReduce这个概念是两个阶段:map和reduce的组合。MapReduce处理并行计算时采用的是“分而治之,先分后合”的思想,即先将一个复杂的大的任务拆分成多个小的、彼此互不关联的子任务,再并行处理这些子任务,最后再将子任务计算得到的结果进行合并。具体分为两个阶段:
  1. map:map操作对应的“分”的概念,map阶段将复杂的任务进行拆分,MapReduce的输入一般是键值对,map阶段的输入是键值对,输出也是键值对。在Hadoop中map阶段的输出会持久化到磁盘文件中,作为后续reduce阶段的输入;
  2. reduce:reduce阶段的输入也是键值对,输出也是键值对,reduce阶段的目的是将值的集合转换成一个值(比如做求和或者求平均值处理),或者处理转换成另一个集合。

基于MapReduce编程模型,不同的团队分别实现了自己的大数据框架:Hadoop是最早的一种开源实现,如今已经成为大数据领域的业界标杆,之后又出现了Spark和Flink。这些框架提供了编程接口和API,辅助程序员存储、处理和分析大数据。

1.3 批处理和流处理

大数据的处理模式可以分为两类:批处理(Batching Processing)和流处理(Streaming Processing),在介绍批处理和流处理之前,先介绍一下有边界数据和无边界数据的概念。

  • 有边界数据(Bounded Data):有边界数据可以理解为规模有限的数据集,一般是按照一定时间窗口截取的数据,比如报表模块会按照时间粒度(年、月、日)出天报表、月报表、年报表,某一天的报表数据就是有边界数据。有边界数据一般对应的是批处理;
  • 无边界数据(UnBounded Data):无边界数据也叫流数据,一般对应流处理。无边界数据可以理解为每时每刻都在产生的,无限规模的数据集。比如传感器上采集的数据、股市产生的源源不断的交易数据都可以理解为无边界数据。

    1.3.1 批处理

    批处理是指对一定时间窗口的有边界数据进行批量处理,批处理的输入是在一段时间内收集好的数据,批处理的输出也可以作为下次批处理的输入。对不需要进行实时分析的场景下,批处理是一个很好的选择,特别是业务逻辑十分复杂,数据量大的时候,更容易从数据中挖掘到有用的信息。批处理的实际应用:比如支付宝的天账单、月度账单、年度账单等,网易云音乐的年度个人总结等。

    1.3.2 流处理

    流处理是对数据流(无边界数据)进行处理,对需要进行实时分析的场景,或者低延迟高吞吐的场景,流处理特别适合。流处理的实际应用:各自传感器实时收集数据需要分析整理、搜索引擎在用户输入关键字后以毫秒级的延迟返回搜索结果给用户。

    2、Hadoop

    2004年,Hadoop的创始人受MapReduce编程模型等一系列论文的启发,对论文中提及的思想进行了编程实现。Hadoop、Spark和Flink都是大数据领域的并行计算框架,时至今日,Hadoop不仅仅是整个大数据领域的先行者和领导者,更形成了一套围绕Hadoop的生态系统,Hadoop和它的生态是绝大多数企业首选的大数据解决方案。Hadoop生态如下图所示:
    image.png
    尽管Hadoop生态中的组件众多,其核心组件主要有三个:

  • Hadoop MapReduce:Hadoop版本的MapReduce编程模型,可以处理海量数据,主要面向批处理;

  • HDFS:HDFS全称为Hadoop Distributed File System,是Hadoop提供的分布式文件系统,有很好的扩展性和容错性;
  • YARN:YARN是Yet Another Resource Negotiator的缩写,是Hadoop生态系统中的资源调度器,可以管理一个Hadoop集群,并为各种类型的大数据任务分配计算资源。

这三大组件中,数据存储在HDFS上,由MapReduce负责计算,YARN负责集群的资源管理。除了三大核心组件,Hadoop生态圈还有很多其他著名的组件:

  • Hive:借助Hive,用户可以编写SQL语句来查询HDFS上的结构化数据,SQL会被转化成MapReduce执行;
  • HBase:HDFS上的数据量非常庞大,但访问和查询速度比较慢,HBase可以提供给用户毫秒级的实时查询服务,是一个基于HDFS的分布式NoSQL数据库;
  • Storm:Strom是一款实时计算框架,主要负责流处理;
  • Zookeeper:Hadoop生态圈很多组件使用动物来命名,形成了一个大型动物园,Zookeeper是这个动物园的管理者,主要负责分布式环境的协调。

    3、Spark

    Spark于2009年诞生于加州大学伯克利分校,2013年被捐献给Apache基金会。Spark是一款大数据计算框架,其初衷是改良Hadoop MapReduce的编程模型和执行速度。与Hadoop相比,Spark的改进主要有两点:

  • 易用性:比起MPI,MapReduce模型更友好,但仍然不够方便,因为并不是所有计算任务都可以简单拆分成map和reduce,有可能为了解决一个问题,要设计多个MapReduce任务,任务之间相互依赖,整个程序非常复杂,导致代码的可读性差。Spark提供更加方便易用的接口,提供Java、Scala、Python和R几种语言的API,支持SQL、机器学习和图计算,覆盖了绝大多数大数据计算的场景;

  • 速度快:Hadoop的map和reduce之间的中间结果都需要落地到磁盘上,而Spark尽量将大部分计算放在内存中,加上Spark的有向无环图优化,在官方的基准测试中,Spark比Hadoop快一百倍以上。但正因为如此,Spark对内存资源消耗很大,也容易出现OOM,稳定性不如传统的MapReduce计算框架。

Spark并不能完全取代Hadoop,实际上,Spark融入到了Hadoop生态圈,成为其中的重要一元。一个Spark任务很可能依赖HDFS上的数据,向YARN来申请计算资源,将HBase作为输出结果的目的地。当然,Spark也可以不用依赖这些Hadoop组件,独立地完成计算。
Spark主要面向批处理需求,因其优异的性能和易用的接口,Spark已经是批处理界绝对的王者。Spark Streaming提供了流处理的功能,它的流处理主要基于mini-batch的思想,即将输入数据流拆分成多个批次,每个批次使用批处理的方式进行计算。因此,Spark也是一款批量和流式于一体的计算框架。

4、Flink

Flink是由德国几所大学发起的的学术项目,后来不断发展壮大,并于2014年末成为Apache顶级项目。Flink主要面向流处理,如果说Spark是批处理界的王者,那么Flink就是流处理领域的冉冉升起的新星。在Flink之前,不乏流式处理引擎,比较著名的有Storm、Spark Streaming,但某些特性远不如Flink。
Flink和Spark Streaming相比,前者是真正的流式计算,而后者是微批处理,虽然批次足够小,但其本质毕竟还是批处理,这就导致有些场景SparkStreaming注定无法满足,虽然Spark现在将重心转移到了Structured Streaming,它弥补了Spark Streaming很多的不足,但是在处理流程上仍然是微批处理。

5、HDFS

5.1 DFS

5.1.1 DFS简介

介绍HDFS之前,有必要了解一下DFS的概念。DFS全称是Distributed File System,翻译成中文就是分布式文件系统。在当今信息时代中,人们可以获取的数据成指数倍地增长,单纯通过增加硬盘个数来扩展计算机文件系统的存储容量的方式,在容量大小、容量增长速度、数据备份、数据安全等方面都不适用,对于数据量很大的应用系统来说尤其如此。分布式文件系统就是为了处理超大规模文件而提出的解决方案。
与单机的文件系统不同,分布式文件系统不是将数据放在一块磁盘上由上层操作系统来管理,而是存在放一个服务器集群上,由集群中的服务器通过各尽其责,通力合作的方式提供整个文件系统的服务。将固定于某个地点的某个文件系统,扩展到任意多个地点/文件系统,这些节点组成一个文件系统网络,每个节点可以分布在不同的地点,通过网络进行节点间的通信和数据传输。人们在使用分布式文件系统时,无需关心数据是存储在哪个节点上,或者从哪个节点获取,只需像使用本地文件系统一样管理和存储文件系统中的数据即可。
分布式文件系统中,按功能划分,比较重要的服务器包括:主控服务器(Master/NameNode)、数据服务器(ChunkServer/DataNode)和客户端服务器(Client),分布式文件系统的典型架构如下图所示:
大数据相关技术栈简介 - 图2

5.1.2 分布式文件系统特点

与传统的文件系统相比,分布式文件系统具有以下主要特点。
(1)可扩展性
扩展能力是一个分布式文件系统最重要的特点,基本上分布式文件系统都支持随时随地对数据服务器进行扩展,提供存储容量和访问带宽等。
(2)高性能
由于一个文件被分成多份,保存在不同的数据服务器上,访问时,可以同时读取,性能到达最优。
(3)高可用
会采用数据冗余技术、HA高可用技术、主控服务器双主、主从架构等保证系统的高可用性。
(4)弹性伸缩
可以根据业务需要灵活地增加或者缩减数据存储以及增删存储池中的资源,而不需要中断系统的运行。

5.1.3 常见的分布式文件系统

(1)Lustre
Lustre最早是由HP、Cluster File System联合美国能源部共同开发的Linux平台下的分布式集群文件系统,后期由于Cluster File System公司被Sun收购,而Sun又被Oracle收购,因此,Lustre官方网站目前挂靠在Oracle公司。Lustre采用GPL许可协议,属于开放源代码的分布式集群文件系统,开发语言采用C/C++,使用平台为Linux;当前,除了Oracle公司外,有新成立的名为Whamcloud的公司专注于Lustre平台的开源研发。
(2)Google FS
Google FS(Google File System)是谷歌公司开发的一个分布式可扩展的文件系统,它主要用于大型、分布式、大数据量的互联网应用平台。Google FS最早是由Google工程师于2003年发表的一篇学术文章The Google File System而为世人所熟知的,Google FS提供了相似的访问接口,如read、write、create、delete、close等,使得开发者可以非常方便地使用。Google FS运行于Linux平台上,开发语言是C/C++,本身并不开源,上面提到的Hadoop平台,是在受到Google FS启发后,采用其理念重新用Java语言实现的一个开源平台。
(3)Fast DFS
Fast DFS是一个类Google FS的开源分布式文件系统,它由C/C++语言开发,可运行于Linux、Unix、AIX平台。Fast DFS提供专用文件存取访问方式,不支持POSIX接口方式,在系统中也不能使用mount方式挂接。FastDFS在架构上充分考虑了冗余备份、负载均衡、可扩展等问题,平台本身具有高可用、高性能等优点。Fast DFS支持文件的高效存储、同步、上传、下载等,比较适合于互联网视频网站、文档分享网站、图片分享网站等应用。

5.2 HDFS简介

HDFS全称是Hadoop Distributed File System,HDFS是Hadoop的核心子项目,是整个Hadoop平台数据存储与访问的基础,在此之上,承载其他如MapReduce、HBase等子项目的运转。
从架构上看,HDFS采用主从结构模型,一个HDFS集群由一个NameNode和若干个DataNode组成,在最新的Hadoop2.2版本中已经实现了NameNode的高可用(双主)。NameNode作为主服务器,管理文件系统命名空间、文件块在DataNode上的分布以及客户端对文件系统的访问操作。DataNode存储具体的文件块,即存储具体的数据。有关HDFS的组成部分在4.3节详细介绍。
从数据结构上看,HDFS中的文件在物理空间上是分块存储(block),块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,老版本中是64M。文件的block的存储在DataNode上,每一个block都可以在多个DataNode上存储多个副本,副本数量可以通过参数dfs.replication来控制。此外,HDFS会给客户端提供一个统一的抽象目录树,客户端通过这个目录树来访问文件,目录树和block的元数据(block的id、block所在的DataNode服务器)由NameNode管理。
虽然HDFS是可以存储海量的数据,但它也有明显的缺点:不支持随机修改,查询效率低,对小文件支持不友好。

5.3 HDFS组成

image.png
上图的DataNode中,颜色相同的文件块互为冗余副本。

5.3.1 HDFS Client

业务代码想使用HDFS系统,是直接与HDFS Client交互的,HDFS Client负责与NameNode和DataNode交互并传输数据。

5.3.2 NameNode

业务代码通过HDFS Client向HDFS读写文件时,所有读写请求都是先由HDFS Client转发给NameNode的,当我们从NameNode得知应该向那些DataNode读写之后,HDFS Client就直接和DataNode交互而不再通过NameNode了。在HDFS的主从架构中,NameNode担当的是“主”的角色,具体有以下功能:
(1)提供文件系统常用操作
NameNode管理文件系统的命名空间,维护一个目录树供调用方可以像操作本地文件系统一样操作HDFS。NameNode管理文件系统的常用操作,比如创建一个文件、重命名一个文件、创建一个文件夹、重命名一个文件夹等。
(2)管理文件系统的操作日志
任何对文件系统元数据产生修改的操作,NameNode都会使用事务日志记录(EditLog)来表示;同样地,修改文件的副本系数也将往EditLog中插入一条记录,NameNode将EditLog存储在本地操作系统的文件系统中。这一点跟MySQL的redo log很像。
(3)管理元数据信息
元数据信息包括:命名空间、文件到文件块(block)的映射、文件块到数据节点(DataNode)的映射。文件系统的命名空间被存储在一个称为映像文件(FsImage)的文件中,包括文件的属性、文件到文件块的映射以及文件块到数据节点的映射等内容,FsImage文件也是存放在NameNode所在的本地文件系统中。
(4)心跳检测
DataNode会定期将自己的负载情况通过心跳向NameNode汇报。NameNode全权管理数据块的复制,它周期性地从集群中的每个DataNode接收心跳信号和块状态报告(Block Report),接收到心跳信号意味着该DataNode节点工作正常,块状态报告包含了一个该DataNode上所有数据块的列表。如果NameNode在规定时间内(比如10分钟)没有收到DataNode的心跳,则认为该DataNode已经lost,会复制该DataNode上的block到其他的健康的DataNode上,这越是高可用的一种体现。

5.3.3 DataNode

文件在HDFS中是切分成了多个块来存储的,而DataNode是真正存储文件块的节点,DataNode的本地磁盘以文件形式存储着block信息,同时还存储着block的元数据信息。在HDFS的主从架构中,DataNode是“从”的角色,DataNode的功能有以下几点:
(1)数据块读写
一般是文件系统客户端需要请求对指定的DataNode进行读写操作,DataNode通过DataNode的服务进程与文件系统客户端打交道。同时,DataNode进程与NameNode统一结合,对是否需要对文件块的创建、删除、复制等操作进行指挥与调度,当与NameNode交互过程中收到了可以执行文件块的创建、删除或复制操作的命令后,才开始让文件系统客户端执行指定的操作。具体文件的操作并不是DataNode来实际完成的,而是经过DataNode许可后,由文件系统客户端进程来执行实际操作。
(2)向NameNode报告状态
每个DataNode节点会周期性地向NameNode发送心跳信号和文件块状态报告,以便NameNode获取到工作集群中DataNode节点状态的全局视图,从而掌握它们的状态。如果存在DataNode节点失效的情况,NameNode会调度其他DataNode执行失效节点上文件块的复制处理,保证文件块的副本数达到规定数量。
(3)执行数据的流水线复制
当文件系统客户端从NameNode服务器进程中获取到要进行复制的数据块列表(列表中包含指定副本的存放位置,亦即某个DataNode节点)后,会首先将客户端缓存的文件块复制到第一个DataNode节点上,此时,并非整个块都复制到第一个DataNode完成以后才复制到第二个DataNode节点上,而是由第一个DataNode向第二个DataNode节点复制,如此反复进行下去,直到完成文件块及其块副本的流水线复制。

5.3.4 Rack

Rack可以理解为数据中心中的机架。数据中心一般将多台服务器垂直进行叠加,放在一个机架中。通常,一个 rack 共享一个电源,一条网线,一个交换机;据统计,很多数据中心里的故障都是一整个rack出问题。出于这个原因,HDFS 备份数据的时候(假设还是3份),通常在同一个rack上储存一份,然后在另一个rack上储存另两份。这样就保证数据有更高的安全性。数据中心的机架如下图:
大数据相关技术栈简介 - 图4

5.4 HDFS读写数据过程

当我们读写一个文件时:

  • HDFS Client联系NameNode,获取文件的文件块组成,以及每个文件块所在的机器以及具体存放位置;
  • HDFS Client联系DataNode,进行具体的读写操作;
  • 当HDFS Client从NameNode知晓了文件对应的DataNode后,HDFS Client就直接和DataNode打交道,不再通过NameNode了。

    5.4.1 HDFS读取过程

    image.png

    5.4.2 HDFS写入过程

    image.png

    6、Hive

    6.1 Hive简介

    Hive是Hadoop生态中的开源的大数据分析统计工具,它的存储基于HDFS,计算基于MapReduce或者Spark,Hive提供类SQL语句的功能来对存储在HDFS中的结构化的数据进行查询,这个过程其实是Hive将类SQL语句转换成MapReduce进行计算。
    Hive有如下特点:

  • 提供类SQL查询,容易上手,开发方便;

  • 封装了很多方法,尽量避免了开发MapReduce程序,减少成本;
  • 支持自定义函数,可以根据需求实现函数;
  • 适用于处理大规模数据,小数据的处理没有优势;
  • 执行延迟较高,适合用于数据分析,不适合对时效性要求较高的场景。

比如一个系统一天能产生1TB的数据,这些数据一般不会直接存在MySQL中,而是先写到Kafka(解耦异步削峰),再落到Hive中。

6.2 Hive和RDBMS的区别

Hive经常与RDBMS(关系型数据库的统称,场景的比如MySQL、Oracle)进行对比,其实Hive除了提供了类SQL的查询功能外,其他和数据库并没有多少共性。二者的主要区别如下:

  • Hive延迟较高,对需要实时处理的请求Hive并不适用,但是当需要查询处理的数据量比较大时,Hive并行计算的优势就体现出来了,此时数据库的效率就不如Hive了;
  • Hive不支持事务,而数据库支持事务;
  • Hive无法像关系型数据库那样做行级别的变更操作(增删改),因为数据存储在HDFS上,HDFS的文件不支持修改,因此Hive适合读多写少的场景。

    7、HBase

    HBase是Hadoop dataBase的简称,HBase跟MySQL一样,是一款DBMS(数据库管理工具),HBase是Nosql数据库的一种,特点是使用列式存储结构,HDFS是文件系统,而HBase是在这个文件系统上提供的数据库管理工具,这一点可以类比文件系统和MySQL的关系。HBase在HDFS之上提供了高并发的随机写和支持实时查询,这是HDFS不具备的。
    上面区分了HDFS和HBase的概念,这里再区分一下Hive和HBase的概念:

  • Hive:Hive是Hadoop的数据仓库,并不是数据库,Hive主要是让开发人员能够通过SQL来计算和处理HDFS上的结构化数据,适用于离线的批量数据计算;

  • HBase:HBase是基于HDFS文件系统之上的数据库管理工具,就是数据库,数据真实还是存储在HDFS(硬盘)上,只是通过HBase可以在大数据的场景下达到随机实时查询这些数据的目的。

HDFS、Hive、HBase都是Hadoop生态系统中的重要组成部分,三者关系如下图所示:
image.png

8、OLTP && OLAP

8.1 OLTP

全称是On-Line Transaction Processing,联机事务处理。OLTP主要用来记录具体某类业务事件的发生,如交易行为,当行为产生后,数据库会记录这个事件是谁在什么时候什么地方做了什么事,这样的一行(或多行)数据会以(增删改)的方式在数据库中进行数据的更新处理操作,要求实时性高、稳定性强、确保数据及时更新成功,常见的业务系统如商场系统,ERP,客服系统,OA等系统都是基于OLTP开发的系统。

8.2 OLAP

全称是On-Line Analytical Processing,联机分析处理。当业务发展到一定程度,积累了一些数据的时候,对过去发生的事情做一个总结分析的需求就会产生,这类需求往往需要把过去一段时间内产生的数据拿出来进行统计分析,从中获取我们想要的信息,为公司做决策提供支持,我们管这类场景就叫做OLAP。

8.3 二者对比

大数据相关技术栈简介 - 图8

参考

从Hadoop到Spark、Flink,大数据处理框架十年激荡发展史
什么是MapReduce(入门篇)
有哪些大数据处理工具?
Apache Hadoop
Apache Spark
Apache Flink
HDFS Architecture Guide
HDFS文件系统
大数据基础教程:HDFS基本概念
5分钟深入浅出 HDFS
聊聊Hadoop:图解HDFS是个啥
Apache Hbase
我终于看懂了HBase,太不容易了…