《Spark大数据分析:核心概念、技术及实践》一 第1章 大数据技术一览-阿里云开发者社区

开发者社区> 华章出版社> 正文

《Spark大数据分析:核心概念、技术及实践》一 第1章 大数据技术一览

简介:

 本节书摘来自华章出版社《Spark大数据分析:核心概念、技术及实践》一书中的第1章,第1.1节,作者[美] 穆罕默德·古勒(Mohammed Guller),更多章节内容可以访问云栖社区“华章计算机”公众号查看。


第1章

大数据技术一览

我们正处在大数据时代。数据不仅是任何组织的命脉,而且在指数级增长。今天所产生的数据比过去几年所产生的数据大好几个数量级。挑战在于如何从数据中获取商业价值。这就是大数据相关技术想要解决的问题。因此,大数据已成为过去几年最热门的技术趋势之一。一些非常活跃的开源项目都与大数据有关,而且这类项目的数量在迅速增长。聚焦在大数据方向的创业公司在近年来呈爆发式增长。很多知名公司在大数据技术方面投入了大笔资金。

尽管“大数据”这个词很火,但是它的定义是比较模糊的。人们从不同方面来定义“大数据”。一种定义与数据容量相关,另一种则与数据的丰富度有关。有些人把大数据定义为传统标准下“过于大”的数据,而另一些人则把大数据定义为捕捉了所描绘实体更多细节的数据。前者的例子之一就是超过数拍字节(PB)或太字节(TB)大小的数据集,如果这样的数据存储在传统的关系数据库(RDBMS)表中,将会有数十亿行。后者的一个例子是有极宽行的数据集,这样的数据存储在RDBMS中,将会有数千列。另一种流行的大数据定义是由3个V(volume、velocity和variety,即容量、速度和多样性)所表征的数据。我刚才讨论了容量。速度指的是数据以极快的速率产生,多样性则指的是数据可以是非结构化、半结构化或多结构的。

标准的关系数据库无法轻易处理大数据。这些数据库的核心技术在数十年前所设计,当时极少有组织拥有拍字节级甚至太字节级的数据。现在对一些组织来说,每天产生数太字节的数据也很正常。数据的容量和产生速度都呈爆发式增长。因此,迫切需要新的技术:能快速处理和分析大规模数据。

其他推动大数据技术的因素包括:可扩展性、高可用性和低成本下的容错性。长期以来,处理和分析大数据集的技术被广泛研究并以专有商业产品的形式被使用。例如,MPP(大规模并行处理)数据库已经诞生有段时间了。MPP数据库使用一种“无共享”架构,数据在集群的各个节点进行存储和处理。每一个节点有自己的CPU、内存和硬盘,节点之间通过网络互联来通信。数据分割在集群的各个节点,而节点之间不存在竞争,所以每个节点可以并行处理数据。这种数据库的例子包括Teradata、Netezza、Greenplum、ParAccel和Vertica。Teradata发明于20世纪70年代末,在20世纪90年代前,它就能够处理太字节级别的数据了。但是,专有的MPP数据库非常昂贵,不是所有人能负担得起的。

本章介绍一些开源的大数据相关技术。本章涉及的技术看起来好像随意挑选的,实际上它们由共同的主题而连接:它们和Spark一起使用,或者Spark可以取代其中一些技术。当你开始使用Spark时,你可能会涉及这些技术。而且,熟悉这些技术会帮你更好地理解Spark(这将在第3章介绍)。

1.1 Hadoop

Hadoop是最早流行的开源大数据技术之一。这是一个可扩展、可容错的系统,用来处理跨越集群(包含多台商用服务器)的大数据集。它利用跨集群的可用资源,为大规模数据处理提供了一个简单的编程框架。Hadoop受启发于Google发明的一个系统(用来给它的搜索产品创建反向索引)。Jeffrey Dean和Sanjay Ghemawat在2004年发表的论文中描述了这个他们为Google而创造的系统。第一篇的标题为“MapReduce:大集群上简化的数据处理”,参见research.google.com/archive/mapreduce.html;第二篇的标题为“Google文件系统”,参见research.google.com/archive/gfs.html。受启发于这些论文,Doug Cutting和Mike Cafarella开发了一个开源的实现,就是后来的Hadoop。

很多组织都用Hadoop替换掉昂贵的商业产品来处理大数据集。一个原因就是成本。Hadoop是开源的,并可以运行在商用硬件的集群上。可以通过增加廉价的服务器来轻松地扩展。Hadoop提供了高可用性和容错性,所以你不需要购买昂贵的硬件。另外,它对于特定类型的数据处理任务非常合适,比如对于大规模数据的批处理和ETL(Extract、transform、load,提取、转换、加载)。

Hadoop基于几个重要的概念。第一,使用商用服务器集群来同时存储和处理大量数据比使用高端的强劲服务器更便宜。换句话说,Hadoop使用横向扩展(scale-out)架构,而不是纵向扩展(scale-up)架构。

第二,以软件形式来实现容错比通过硬件实现更便宜。容错服务器很贵,而Hadoop不依赖于容错服务器,它假设服务器会出错,并透明地处理服务器错误。应用开发者不需要操心处理硬件错误,那些繁杂的细节可以交给Hadoop来处理。

第三,通过网络把代码从一台计算机转到另一台比通过相同的网络移动大数据集更有效、更快速。举个例子,假设你有一个100台计算机组成的集群,每台计算机上有1TB的数据。要处理这些数据,一个选择是:把数据转移到一台能够处理100TB数据的超级计算机。然而,转移100TB的数据将花费极长时间,即使是在高速网络上。另外,通过这种方式处理数据将需要非常昂贵的硬件。另一个选择是:把处理数据的代码转移到具有100个节点的集群中的每台计算机。这比第一种选择更快、更高效。而且,你不需要高端、昂贵的服务器。

第四,把核心数据处理逻辑和分布式计算逻辑分开的方式,使得编写一个分布式应用更加简单。开发一个利用计算机集群中资源的应用比开发一个运行在单台计算机上的应用更加困难。能写出运行在单台机器上的应用的开发者数量比能写分布式应用的开发者多好几个数量级。Hadoop提供了一个框架,隐藏了编写分布式应用的复杂性,使得各个组织有更多可用的应用开发者。

尽管人们以一个单一产品来讨论Hadoop,但是实际上它并不是一个单一产品。它由三个关键组件组成:集群管理器、分布式计算引擎和分布式文件系统(见图1-1)。

2.0版本以前,Hadoop的架构一直是单一整体的,所有组件紧密耦合并绑定在一起。从2.0版本开始,Hadoop应用了一个模块化的架构,可以混合Hadoop组件和非Hadoop技术。

图1-1中所示的三个概念组件具体实现为:HDFS、MapReduce和YARN(见图1-2)。

0563ca4d15b7f5d118d00852be1cc1f135a0578e

HDFS和MapReduce在本章讨论,YARN将在第11章介绍。

1.1.1 HDFS

正如其名,HDFS(Hadoop Distributed File System)是一个分布式文件系统,它在商用服务器集群中存储文件,用来存储和快速访问大文件与大数据集。这是一个可扩展、可容错的系统。

HDFS是一个块结构的文件系统。正像Linux文件系统那样,HDFS把文件分成固定大小的块,通常叫作分块或分片。默认的块大小为128MB,但是可以配置。从这个块的大小可清楚地看到,HDFS不是用来存储小文件的。如果可能,HDFS会把一个文件的各个块分布在不同机器上。因此,应用可以并行文件级别的读和写操作,使得读写跨越不同计算机、分布在大量硬盘中的大HDFS文件比读写存储在单一硬盘上的大文件更迅速。

把一个文件分布到多台机器上会增加集群中某台机器宕机时文件不可用的风险。HDFS通过复制每个文件块到多台机器来降低这个风险。默认的复制因子是3。这样一来,即使一两台机器宕机,文件也照样可读。HDFS基于通常机器可能宕机这个假设而设计,所以可以处理集群中一台或多台机器的宕机问题。

一个HDFS集群包含两种类型的节点:NameNode和DataNode(见图1-3)。Name-Node管理文件系统的命名空间,存储一个文件的所有元数据。比如,它追踪文件名、权限和文件块位置。为了更快地访问元数据,NameNode把所有元数据都存储在内存中。一个DataNode以文件块的形式存储实际的文件内容。

5da419e7473fed94d05c58ecf1b55430871a1d04

NameNode周期性接收来自HDFS集群中DataNode的两种类型的消息,分别叫作心跳消息和块报告消息。DataNode发送一个心跳消息来告知NameNode工作正常。块报告消息包含一个DataNode上所有数据块的列表。

当一个客户端应用想要读取一个文件时,它首先应该访问NameNode。NameNode以组成文件的所有文件块的位置来响应。块的位置标识了持有对应文件块数据的DataNode。客户端紧接着直接向DataNode发送读请求,以获取每个文件块。NameNode不参与从Data-Node到客户端的实际数据传输过程。

同样地,当客户端应用想要写数据到HDFS文件时,它首先访问NameNode并要求它在HDFS命名空间中创建一个新的条目。NameNode会检查同名文件是否已存在以及客户端是否有权限来创建新文件。接下来,客户端应用请求NameNode为文件的第一个块选择DataNode。它会在所有持有块的复制节点之间创建一个管道,并把数据块发送到管道中的第一个DataNode。第一个DataNode在本地存储数据块,然后把它转发给第二个Data-Node。第二个DataNode也本地存储相应数据块,并把它转发给第三个DataNode。在所有委派的DataNode上都存储第一个文件块之后,客户端请求NameNode为第二个块来分配DataNode。这个过程持续进行,直到所有文件块都已在DataNode上存储。最后,客户端告知NameNode文件写操作已完成。

1.1.2 MapReduce

MapReduce是Hadoop提供的分布式计算引擎。HDFS提供的是存储大数据集的分布式文件系统,MapReduce则提供集群中并行处理大数据集的计算框架。它抽象了集群计算,提供了编写分布式数据处理应用的高级结构,使得没有编写分布式或并行应用的程序员也可以编写运行在商用计算机集群上的应用。

MapReduce框架自动在集群中各计算机上调度应用的执行。它会处理负载均衡、节点宕机和复杂的节点内通信。它处理分布式计算的繁杂细节,使得程序员可以关注于数据处理的逻辑本身。

MapReduce应用的基本组成块是两个函数:map和reduce,名称借鉴于函数式编程。MapReduce中所有的数据处理作业都用这两个函数来表达。map函数以键值对作为输入,输出中间产物键值对。MapReduce框架对输入数据集中每一个键值对调用map函数。接下来,对map函数的输出进行排序,并根据值进行分组,作为输入传给reduce函数。reduce函数聚合这些值,输出最终的聚合值。

第3章将介绍的Spark被视为MapReduce的继承者,相比MapReduce,它有诸多优势。这将在第3章详细讨论。

1.1.3 Hive

Hive是一个数据仓库软件,它提供了类SQL语言来处理和分析存储在HDFS或其他兼容Hadoop的存储系统(如Cassandra和Amazon S3)中的数据。尽管Hadoop使得编写可利用集群中计算机资源的数据处理应用更加简单,但是能写出这样应用的程序员相对于了解SQL的人来说依然少得多。

SQL是广泛使用的数据处理语言,是一种描述性语言。它看似简单,实则功能强大。SQL比Java和其他用来编写MapReduce应用的编程语言更易学易用。Hive把SQL的简洁性引入到Hadoop中,让更多人可用。

Hive提供一种类SQL的查询语言,叫作Hive查询语言(HiveQL),来处理和分析存储在任何兼容Hadoop的存储系统中的数据。它提供了一种机制把对应结构映射到存储在HDFS中的数据上,并用HiveQL来查询。在底层,它会把HiveQL查询转换成MapReduce作业。它也支持UDF(用户定义函数)和UDAF(用户定义聚合函数),二者用来进行无法用HiveQL有效表达的复杂数据处理。

第7章讨论的Spark SQL被视为Hive的继承者。然而,Spark SQL提供的不仅是SQL接口,它还做了更多工作。这将在第7章详细讲述。

版权声明:如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:developerteam@list.alibaba-inc.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

华章出版社

官方博客
官网链接