第5讲 MapReduce基础

第5讲 MapReduce基础

模块目标

学完本模块的内容,读者将能够:

解释MapReduce的基础概念以及它在Hadoop生态系统中的使用

本讲目标

学完本讲的内容,读者将能够:

解释在MapReduce中,map和reduce的角色

描述优化MapReduce任务的技术

讨论MapReduce的一些应用

讨论HBase和Hive在大数据处理中所扮演的角色

 

“数据太少,你将无法得出任何你确信的结论。随着数据的加载,你会发现虚假的关系……大数据与比特无关,而与人才相关。”

——Douglas Merrill

 

虽然大数据在过去一两年中才开始引起关注,但从计算机时代开始,大型计算问题就已经存在了。每当推出更新、更快、更高容量的计算机系统时,人们都发现对于这些系统来说,问题还是太大,令它们无法处理。随着局域网的出现,行业转而把网络上的系统计算和存储能力结合起来,以解决越来越大的问题。计算密集型和数据密集型应用的分布,是解决大数据挑战的核心。为了大规模实现可靠的分布,需要新的技术方法。MapReduce是这类新方法之一。它是一个支持并行计算的软件框架。开发人员可以利用这个平台编写程序,该程序通过同时使用许多个分布式处理器,可以处理大量非结构化数据。

在第4讲中,介绍了MapReduce和Hadoop生态系统的其他组件。在本讲中,你会学到更多关于MapReduce的知识,以及它在大数据分析中的使用。

5.1 MapReduce的起源

在21世纪初,Google工程师认定,由于网络用户越来越多,他们目前对于网络抓取以及查询频率的解决方案在未来将难堪重任。他们确定,如果工作可以分发到廉价的计算机上,然后通过网络连接形成集群,就可以解决这个问题了。

但是,仅仅分布并不是答案的全部。工作的分布必须并行执行:

  • 自动扩展和收缩进程;
  • 无论网络中还是单个系统中出现故障,进程都能继续工作;
  • 假设有多个使用场景,确保开发人员能够使用其他开发人员创建的服务。

正在开发中的分布式计算新方法必须独立于数据的位置和处理数据的应用程序的位置。为了实现这种方法,工程师将MapReduce设计成了一个通用的编程模型。MapReduce的名字来自于现有函数型计算机语言中两种能力(map和reduce)的有效组合。

技术材料

 

映射(map)和归约(reduce)函数是函数型语言上的运算,因此对大数据是一个很好的选择。它们不修改原始数据,而是创建新的数据结构作为其输出。所以映射函数不会影响存储的数据。

最初的一些MapReduce实现提供了并行计算、容错、负载均衡和数据操作的所有关键需求。多年来,其他的MapReduce实现也已经被创建出来,既有开源产品,也有商业化产品。

MapReduce的特性

在MapReduce中,所有的操作是独立的。MapReduce将一个非常大的问题分解为更小、更易于管理的块,在每个块上独立操作,然后把它们组合在一起。以下是MapReduce的基本行为。

  • 调度:MapReduce将作业分解成单独的任务,提供给程序的映射(map)和归约(reduce)部分。映射结束之后,归约才能开始;因此,任务根据集群中节点的数量排定优先级。如果任务数量多于节点数量,执行框架管理映射任务,直到所有任务都被完成。然后,归约任务以同样的方式运行。当所有的归约任务都成功运行完成后,整个过程才结束。
  • 同步:当多个进程同时在一个集群上执行时,需要同步机制。执行框架知道该程序正在进行映射和归约。它跟踪任务及其时间,当所有的映射完成后,归约就开始了。中间数据通过网络复制,它是用一种叫作“洗牌(shuffle)和排序(sort)”的机制生成的。这一机制收集所有映射后的数据,用于归约操作。
  • 代码/数据同处一地:当映射功能(代码)和该功能所需处理的数据位于同一台机器上时,数据处理的效率最高。换句话说,代码和数据同处一地。进程调度可以在执行之前,把代码和它相关的数据放置在同一个节点上。
  • 错误/故障处理:大多数MapReduce引擎具有非常强大的错误处理和容错机制,因为对于集群中的所有节点和节点的所有部件,其失效的可能性是很高的,引擎必须能识别问题并做出必要的修正。设计错误/故障处理的目的是识别未完成的任务并自动将它们分配给不同的节点。

知识检测点1

 

讨论如何创建业务数据分析任务,并应用MapReduce的概念。

a.描述你所创建的业务情况,所要分析的数据,以及想要回答的问题

b.描述map函数在处理过程中是如何工作的

c.描述reduce函数在处理过程中是如何工作的

d.与早期系统相比,解释MapReduce的优势

5.2 MapReduce是如何工作的

有时候,生成一个输出列表就足够了。同样,有时候,在列表的每一个元素上执行操作就足够了。在大多数情况下,需要的是访问大量的输入数据,从数据中选择特定的元素,然后从数据的相关部分中进行一些有价值的计算。在这样做的时候,绝不能改变原始数据。用户并不总是能够控制输入数据,因此必须执行非破坏性的分析。绝不能改变原始列表,以便将其用于其他计算任务。     

软件开发人员设计了基于算法的应用。算法是实现目标所需的一系列步骤。需要一个算法,才能使映射和归约函数高效地工作,该算法可以:

(1)以大量的数据或者记录开始;

(2)遍历数据;

(3)使用映射函数,抽取感兴趣的东西,并创建输出列表;

(4)组织输出列表,为进一步的处理对其进行优化;

(5)使用归约函数,计算结果集;

(6)产生最终输出。

程序员可以使用MapReduce方法,实现各种应用。当输入的数据非常大时(比如说TB级别),可以使用相同的算法处理数据。

如前所述,MapReduce将数据分析划分为两部分——映射和归约。映射任务在数据分块上并行工作,每个任务返回一个输出。归约任务接收映射的输出作为自己的输入,并处理它以产生最终的结果。

MapReduce的工作流程如图1-5-1所示。

图1-5-1 MapReduce工作流程

在图1-5-1中可以看到,MapReduce框架由一个主节点和3个从节点组成。主节点指作业跟踪器(JobTracker),从节点指任务跟踪器(Task Tracker)。主节点(任务跟踪器)为从节点规划作业任务,监控处理,并重新执行失败的任务。从节点执行由主节点分配的任务作为配合。

客户端应用程序为作业跟踪器提供作业,以处理大量的信息。接着,作业跟踪器将作业分配和提交给不同的任务跟踪器。任务跟踪器接着处理数据。这些已经处理过的数据(映射输出)接着被转发给归约任务,它从不同的任务跟踪器中整合数据,并提供最终的输出。

在集群中,节点存储在商品化服务器上。HDFS和MapReduce工作在这些节点上处理数据。以下的步骤总结了MapReduce执行任务的方式。

(1)将输入分拆成多个数据块。

(2)创建主节点和工作者进程(worker),并远程执行工作者进程。

(3)不同映射任务同时工作,并读取分配给每个映射任务的数据块。映射工作者进程使用映射函数,仅提取相关的数据,并为提取的数据生成键/值对

(4)映射工作者进程使用分区功能将数据划分为R区域。

(5)当映射工作者进程完成它们的工作之后,主节点指令归约工作者进程开始它们的工作。归约工作者进程反过来联系映射工作者进程,获取分区的键/值数据。接收到的数据按各个键进行排序,这一过程也被称为洗牌(shuffle)过程

(6)在对数据进行排序之后,为每一个唯一键值调用归约函数。这个函数是用于将输出写入文件的。

(7)所有的归约工作者进程完成它们的工作之后,主节点把控制权转移给用户程序。

上述过程的直观描述如图1-5-2所示。

图1-5-2 MapReduce过程

下面的例子有助于理解MapReduce的工作。

例  子

 

假设某个项目有20TB的数据,以及20个MapReduce服务器节点。第一步是使用简单的文件复制过程,为20个节点中的每个节点分配1TB数据。注意,这些数据必须在MapReduce过程开始之前被分配好。此外要注意,文件的格式是由用户决定的,没有类似于关系型数据库中的标准格式。

接下来,程序员向调度程序提交两个程序:映射程序和归约程序。在这个两步骤过程中,映射程序在磁盘上找到数据,然后执行它包含的逻辑。在我们的例子中,这是在20台服务器中的每一台上独立发生的。然后,映射步骤的结果被传递到归约过程中,总结并汇总最终的答案。

你还可以将映射和归约工作者进程比作古罗马所进行的人口普查。负责人口普查的组织机构,向王国的不同地区派出志愿者。每个志愿者分配一个特定地区的人口普查任务,然后向组织机构报告。在从所有地方收集记录之后,人口普查的总部计算所有城市的人口总数。在不同城市同时进行的人口计算是并行处理,将其结合起来就是归约。与一个接一个地向所有城市派出普查人员相比,这个过程要有效地多。

 

例  子

 

现在,让我们再来看一个例子,其中现场数据从发生在一个组织机构网站上的在线客户服务聊天中流入。

一位分析专业人员创建一个映射步骤,解析聊天文字中出现的每一个单词。在这个例子中,映射函数将会很容易地找到每一个单词,从段落中将其解析出来,递增其计数。映射函数的最终结果是键值对的集合,如“<my,1>,”“<product,1>,”“<broke,1>,”。当每个工作节点结束映射时,就会通知调度程序。

一旦映射步骤完成,归约步骤就开始了。此时的目标是要找出每一个单词出现了多少次。接下来要进行的工作是洗牌(shuffling)。在洗牌过程中,来自于映射步骤的答案会通过散列进行分布,因此,相同的关键词最终会在同一个归约节点上;例如,在一个简单的情形下,有26个归约节点,所有以A开头的单词进入一个节点,所有以B开头的进入另一个节点,所有以C开头的进入第三个节点,以此类推。

归约步骤简单地按照单词计数。依据我们的例子,图1-5-3对此进行了说明。这个过程最终以“<my,10>,”“<product,25>,”“<broke,20>,”结束,其中的数字代表这个单词被找到了多少次。一共发送了26个包含排序后单词计数的文件(每一个归约节点有一个文件)。请注意,需要另外一个进程来组合这26个输出文件。

一旦计算出单词数,就可以将结果反馈到分析当中去。可以识别特定产品名称的频度,也可以确定像“broken”或“angry”这样的单词的频度。要点是,完全非结构化的文本流现在以一种简单的方式结构化,以便对其进行分析。

MapReduce的用法往往是一个起点,它的输出是另一个分析过程的输入。

可以在数千台机器上运行几千个映射和归约任务,这正是MapReduce的强大之处。当有大数据流时,可以将其分解——这就是MapReduce最有效的方面。如果工作者进程不需要知道另一个工作者进程的情况即可有效运行,就有可能实现全并行处理。在我们的例子中,每一个单词都可以独立解析,对于给定的映射工作者进程任务,其他单词的内容是不相关的。

预备知识 复习键值对的概念和它们的用法。

 

参考图1-5-3,理解MapReduce的详细过程。

图1-5-3 利用在线客服聊天的例子,阐明MapReduce的详细过程

总体情况

 

注意,前面的一个要点不能遗漏,因为它对于理解何时和如何应用MapReduce是至关重要的。当数据被移交给工作者进程时,每一个工作者进程只知道它所看到的数据。这可与人口普查类比:每个普查员只知道自己负责的人口数量。如果所需的处理包括了对其他工作者进程数据的认知,就需要用到MapReduce之外的其他框架。幸运的是,在很多情况下,数据都可以以这种方式处理。将一个博客或者一个RFID记录分解成片进行解析,不需要依赖任何其他东西。如果文本需要按照客户号进行解析,之后分发数据时,它就必须进行散列,使给定客户的所有记录最终在同一个工作者进程中被处理。

 

快速提示

 

MapReduce和数据库所能完成的工作中,有一些是重叠的。数据库甚至可以为MapReduce进程提供输入数据,正如MapReduce进程可以向数据库中提供输入。关键是要搞清楚对每个任务最适合的工具。其他工具集可能更加适合此类处理,数据库和MapReduce应该被用来干它们最适合做的事情。

在前面的例子中,将原始文本转换成了可以分析的单词数。该过程的结果可以输入数据库,以便将附加的信息与现有信息相结合。

从概念上讲,MapReduce像并行关系数据库一样将问题分解。但是MapReduce不是数据库,没有定义好的结构,每一个进程都不知道之前和之后所发生的任何事情。

更多关于映射和归约函数的知识

MapReduce框架使用键值对(KVP)作为输入和输出。无论数据是什么,映射函数提取其感兴趣的特征,并以KVP格式来呈现它们。归约函数接收KVP列表作为输入,并返回另一个KVP列表作为输出,但是归约函数的关键点往往与映射函数的关键点不同。

MapReduce与Hadoop一起工作,自然地使用相同的语言。映射和归约函数可以用Java编写,因为Hadoop是用Java编写的。它们也可以用其他语言编写。

管道库使得C++源代码可以作为映射和归约代码。被称作Streaming的通用API使大多数语言编写的程序可以作为Hadoop的映射和归约函数。Streaming用文本方式表示输入和输出。任何使用文本输入的程序都可以使用Streaming来创建MapReduce的实现。输入和输出都是键值对,其中键和值是通过制表符(tab)来分割的。

输入的KVP写入stdin(从文件读取的标准输入),输出的KVP写入stdout(写入文件的标准输出)。在映射输出转换为归约输入的过程中,组织该列表,将每一个键的所有值归拢到一起。

假设你想创建一个程序,计算美国人口大于5万的县的个数。(注意以下不是编程代码,仅仅是问题解决方案的简单英文表示。)完成该任务的方法之一是识别输入数据并创建一个列表:

mylist = ("all counties in the US that participated in the most recent general 
election")

利用映射函数,创建一个howManyPeople函数。该函数选择超过5万人口的县:

map howManyPeople (mylist) = [ howManyPeople "county 1";howManyPeople
"county 2"; howManyPeople "county 3"; howManyPeople "county 4"; . . . ]

现在,生成了一个表示人口超过5万的县的新输出列表:

(no, county 1; yes, county 2; no, county 3; yes, county 4; ?, county nnn)

该函数执行时,无需对原始列表进行任何更改。此外,你可以看到,输出列表的每一个元素映射到对应输入列表的元素中,并附加了“yes”或者“no”。如果该县满足了超过5万人口的要求,映射函数用“yes”标示它。如果不满足,则用“no”来标示它。

技术材料

 

映射函数多年来一直是许多函数型编程语言的一部分。它和被称为列表处理(LISP)的人工智能语言一起得到了普及,是今天处理数据元素(键和值)列表的核心技术。

由映射函数howManyPeople所创建的新列表被作为归约函数的输入。该函数处理列表中的每一个元素,并返回民主党获得多数票、人口超过5万县的列表。

reduceisDemocrat (countylist)

现在,假设你想知道在哪些人口超过5万的县中共和党得到多数票。你所需要做的就是再次调用归约函数,但要改变操作符:

reduceisRepublican (countylist)

这时将返回一个大多数选民支持共和党候选人的所有县的列表。

由于县列表的元素不会在处理过程中被改变,在其他结果的输入上,归约函数可以重复执行;例如,也可以使用其他函数,用以识别独立参选人获得多数票的县,或者对特定地理区域细化结果。

定  义

 

映射函数将一个函数应用于数据库的每个元素,并返回结果列表。归约函数处理多个这样的结果列表,并产生最终结果。

 

知识检测点2

 

1某卫生组织负责维护一个稀有血型人员的数据库。定期献血者和可能的受体都在数据库中标记。对于每一个人,该数据库包含其个人信息,如详细联络方式、教育程度、健康状况以及上次献血的日期。

  a.举出使用该数据库的一个例子,详述分析的目的或必要性。

  b.列出执行你的查询的MapReduce步骤。

2.某图书、电影和音乐在线零售商有一个字幕数据库,以及结构化和非结构化的客户数据。

  a.描述你想要做的分析,换句话说,就是你希望回答的问题。

  b.描述该数据的映射函数。

  c.描述用于映射函数的归约函数。

3.史密斯先生在5个不同文件中记录了4个城市为期5个月的温度,每一个文件包含了一个月的记录。每个文件有两列,代表了城市名称和它们对应的温度。就HDFS而言,这些列代表键值对,其中键代表城市名字,值代表对应的温度。你必须从收集到的数据里,找到每个城市的最高温度。在MapReduce框架的帮助下,你可以将整个任务划分成5个较小的映射任务。每个映射任务工作于单一文件,并提供该文件中每个城市的最高温度。其中一个映射任务产生的结果如下:

(City 1, 28), (City 2, 16), (City 3, 22), (City 4, 19)

由其他4个映射任务生成的结果如下:

(City 1, 25), (City 2, 18), (City 3, 23), (City 4, 25)
(City 1, 23), (City 2, 17), (City 3, 20), (City 4, 22)
(City 1, 26), (City 2, 19), (City 3, 20), (City 4, 23)
(City 1, 20), (City 2, 21), (City 3, 23), (City 4, 20)

现在,由5个映射任务生成的5个输出作为一项简单归约任务的输入,找出每个城市的最高温度。最终输出是什么?

 

附加知识

 

RDBMS和大数据

大数据技术使用MapReduce和SQL以及其他传统RDBMS特性一起工作,考虑到大数据和传统数据解决方案的差异,大数据技术和RDBMS的整合需要花费时间。在这种情况下,重要的是要了解关系型数据库是如何结合更新技术而发展的。

纵观关系型数据库的历史,曾经出现过许多专业的数据库技术,专门用以解决早期RDBMS产品中的缺点。

对象数据库、内容数据库、数据仓库、数据集市等技术不断涌现。需要这些新功能的组织机构创建了独立的解决方案,并将它们整合到了现有的RDBMS应用中。这些工作乏味、缺乏灵活性且昂贵。随着时间的推移,RDBMS整合了新技术,并将这些技术嵌入到核心产品中。类似地,新改进的技术也与大数据相整合,处理并深入了解大数据。

5.3 MapReduce作业的优化技术

观察MapReduce的流程便可知道,MapReduce作业分为不同阶段,其中每个阶段需要不同类型的资源。为了让MapReduce作业全速运行,必须确保没有资源瓶颈,从而最大限度地降低作业的响应时间。

在短作业的情况下,当用户需要快速的查询答案时,响应时间特别重要;例如,为实现监控和调试目的的日志数据查询。因此,优化MapReduce作业的性能是相当重要的。

作业调优的主要目标是确认作业及相关的所有资源(如CPU、网络、I/O和内存)都以平衡的方式使用。通常,当其中任意一个资源成为其他资源的瓶颈,从而导致其他资源等待时,作业运行速度就会下降。

某些技术可以优化实际的应用程序代码,以及MapReduce作业的可靠性和性能。这些优化技术分为3类:

  • 硬件或网络拓扑;
  • 同步;
  • 文件系统。

5.3.1 硬件/网络拓扑

无论是什么应用,最快的硬件和网络都有希望使任何软件以最快的速度运行。MapReduce的明显优势之一是能够在廉价的商品化硬件集群和标准网络上运行。服务器的物理位置影响支持大数据任务所必需的性能和容错能力。

商品化硬件通常存放在数据中心的机架上。与在机架间移动数据和/或代码相反,位于机架内的相邻硬件提供了性能优势。在执行过程中,可以配置MapReduce引擎,利用邻接性优势。将数据和代码放在一起,这是MapReduce性能优化最好的措施之一。从本质上说,硬件处理单元越是相互接近,延迟就越小。

5.3.2 同步

在进行处理的节点内保留所有映射结果是低效的。在计算任务完成后,立即将映射结果复制到归约节点,以便处理可以马上开始。所有来自同一个键的值被发送到同一个归约节点,以确保更好的性能和效率。归约的输出直接写入文件系统,因此文件系统必须做设计和调整以得到最好的结果。

5.3.3 文件系统

MapReduce的实现是通过一个分布式文件系统来支持的。本地和分布式文件系统的重要区别在于容量。在大数据世界中,文件系统需要跨多台机器或网络节点传播,以处理大量的信息。MapReduce的实现依赖于主从式分布模型,在这个模型中主节点存储所有的元数据、访问权限以及文件和块的映射和位置;从节点存储实际数据。所有的请求都进入主节点,然后由适当的从节点处理。

在设计一个文件以支持MapReduce实现时,考虑下列方面:

  • 保持“温度”:主节点会过载。如果主节点失效,整个文件系统在主节点恢复之前是无法访问的。优化的措施是建立一个“热备份”主节点,如果主节点发生问题,“热备份”主节点可以接管主节点工作。
  • 越大越好:应当避免小文件(小于100MB)。在被适当数量的大文件填充时,支持MapReduce引擎的分布式文件系统工作得最好。
  • 长远观点:工作负载按批管理;因此,持续的高网络带宽比映射组件或归约组件的快速执行更重要。对代码而言,最佳的方法是在读写文件系统时一次处理大量数据。
  • 合适的安全度:在分布式文件系统中添加安全层,会降低其性能。文件权限是为了防止意外后果,而不是恶意行为。最佳的方法是,确保只有授权的用户访问数据中心环境,保护分布式文件系统免受外部侵害。

5.4 MapReduce的应用

让我们回顾一下MapReduce的一些例子,理解它是如何工作的。

  • 网页访问:假设调查人员想知道某家特定报纸的网站被访问的次数。映射任务是读取网页请求的日志和制作一个完整列表。映射的输出可能看起来类似于如下的样子:
    <emailURL, 1>
    <newspaperURL, 1>
    <socialmediaURL, 1>
    <sportsnewsURL, 1>
    <newspaperURL, 1>
    <emailURL, 1>
    <newspaperURL, 1>
  • 归约函数将寻找newspaperURL的结果,并添加它们。它将返回如下结果:
    <newspaperURL, 3>
  • 网页访问者路径:假设一个宣传小组想知道访问者是如何到达它的网站的。包含链接的网页被称为“源”,链接所去往的网页称作“目标”。映射函数将扫描网页链接,以返回<目标、源>类型的结果。归约函数将扫描列表以找到结果,其中的“目标”是宣传小组的网页。它将汇编这些结果中的源。归约函数的输出是最终的输出,将是<宣传小组网页,列表(源)>的形式。
  • 单词频率:一位研究者想要找到关于地震的杂志文章;但是,他并不想要将地震作为次要话题的文章。他判断主要讨论地震的文章需提及“地壳构造板块”10次以上。映射函数将计算该术语在每一篇文档中出现的次数,并以<文档,频率>的形式返回结果。归约函数将计数并选择频次大于10的那些结果,并将选定结果中的文档列表作为结果返回。
  • 单词数:假设一位研究者想要找到社会名流谈及当前某个畅销商品的次数。数据包括名流的著作和谈话。映射函数制作所有单词的列表。该列表是键值对的形式,其中的键是每个单词,值是该单词每一次的出现数1。
  • 映射的输出可能类似于如下形式:
    <global warning, 1>
    <food, 1>
    <global warning, 1>
    <bestseller, 1>
    <Afghanistan, 1>
    <bestseller, 1>
  • 归约函数将其转换成如下形式:
    <global warning, 2>
    <food, 1>
    <bestseller, 2>
    <Afghanistan, 1>

尽管这个例子中的研究人员只对某一个特定单词或单词集合的出现感兴趣,但是函数还是索引了文档中的所有单词。例如,这样一个索引可以告诉我们感兴趣的话题或者词汇的相关情况。

知识检测点3

 

一个组织机构将分散的计算资源汇集到某个位置。

a.列出在这种情况下MapReduce优化的5个最重要考虑因素;

b.推荐组织结构为MapReduce优化所要做的事情。

MapReduce大数据处理得到了两个Hadoop生态环境关键组件的帮助——Hbase和Hive,下面我们来了解它们是如何提供帮助的。

5.5 HBase在大数据处理中的角色

大数据的庞大规模对存储和处理提出了挑战。在MapReduce改进大数据处理的同时,HBase为存储和访问提供了帮助。HBase是一个开源非关系型分布式数据库,是作为Apache软件基金会Hadoop项目的一部分而开发的。在需要频繁地存储、更新和处理大量数据且要求高速度时,HBase十分有用。

  • HBase存储大量数据的方式为处理和更新操作提供了快速的数据访问。它以基于列的压缩和存储为基础工作。在存储数据时,可在列级压缩和存储数据;这替代了整表压缩,可将特定的列压缩并存储在数据库中。当更新数据时,无论该操作是顺序或批量写入、更新或删除,HBase都能高效工作。
  • HBase在内存中存储数据,因此是低延迟的。这对于数据的查找和大规模扫描是很有用的。
  • HBase在单元格中以降序方式存储数据(使用时间戳),所以读操作总是能首先找到最近的值。
  • HBase的列属于列簇。列簇的名字用来做前缀,以识别列簇成员;例如,“水果:苹果”和“水果:香蕉”是列簇“水果”的成员。
  • HBase的实现可以在列簇层面进行调整,所以重要的是要注意访问数据的方式和预计的列有多大。
  • HBase表中的行也有一个与之相关的键。键结构是非常灵活的。它可以是一个计算值,一个字符串甚至是另一个数据结构。使用键来控制行中单元格的访问,并将它们从小到大按序存储。所有这些特性组成了模式。在任何数据可以被存储之前,定义并创建该模式。即便如此,在数据库启动和运行之后,仍然可以修改表和添加列簇。

技术材料

 

HBase运行在Hadoop分布式文件系统(HDFS)之上,并为Hadoop提供了类似于Google BigTable的功能。HBase也可以与Amazon EMR协同工作,将数据备份到Amazon简单存储服务(Amazon S3)上去。与Hive集成时,它启用类SQL查询。HBase还能与Java数据库连接(JDBC)协同工作。

 

预备知识

 

回顾图数据库与空间数据库。某些类型的参考数据,如城市或国家的地图和IP地址的地理位置,可能采用图数据库或空间数据格式。

在处理大数据时,扩展性很有用,因为你不会总是知道数据流的种类。关系型数据库是面向行的,因为在表中每一行的数据是被存储在一起的。在列式或者是面向列式的数据库中,数据是跨行存储的。虽然这看起来是细微的区别,但这是列式数据库最重要的基本特征。很容易添加列,并且可以逐行添加它们,这提供了很大的灵活性、性能和可扩展性。当你有大量和多样的数据时,可能应该使用列式数据库。

HBase可以处理两种类型的数据——缓慢变化的数据和快速变化的数据。

参考数据(如人口统计数据、IP地址地理位置查询表和产品尺寸数据)变化缓慢。HBase可以存储这类数据,用于Hadoop任务。无论数据存储在Hadoop任务集群上还是其他集群上,HBase都可以提供数据的快速访问。

应用程序日志(点击流数据以及游戏中的使用率数据)创建速度很快,用于日志实时摄取和批量日志分析。HBase可以接收这些数据并以足够快的速度更新数据库,允许在更新后立即处理。

附加知识 HBase集群先决条件

 

为了运行HBase,Amazon EMR集群应当满足一定的要求。

  • HBase只能运行在持久化集群上,该集群由Amazon EMR命令行接口(CLI)和Amazon EMR控制台自动创建。

  • Amazon密钥对必须在创建HBase集群的时候设定。HBase的Shell需要安全Shell(SSH)网络协议来连接主节点。

  • 目前只有AMI的Beta版本和Hadoop 20.205及更高版本支持HBase集群。命令行接口和Amazon EMR控制台自动在HBase集群上设定正确的AMI。

  • HBase仅在下列实例类型上受到支持:m1.large, m1.xlarge, c1.xlarge, m2.2xlarge, m2.4xlarge, cc1.4xlarge, cc2.8xlarge, hi1.4xlarge和hs1.8xlarge。

  • cc2.8xlarge实例类型仅在美国的北弗吉尼亚、美国西部(俄勒冈)和欧盟(爱尔兰)地区受到支持。cc1.4xlarge 和 hs1.8xlarge实例类型仅在美国东部(北弗吉尼亚)地区受到支持。hi1.4xlarge实例类型仅在美国东部(北弗吉尼亚)和欧盟(爱尔兰)地区受到支持。

虽然不是必要的,但是其他的一些考量能够改善性能。以下是这些可选的需求。

  • 集群的主节点运行在HBase的主服务器和Zookeeper之上,从节点运行在HBase区域服务器之上。虽然HBase可以在单个节点上进行评估,但为了获得最佳性能,HBase集群应该至少运行在两个EC2实例之上。

  • 为了监控HBase性能指标,当创建集群的时候,使用bootstrap action安装Ganglia。

  • 可以在主节点上获得HBase日志。为了将日志复制到Amazon S3,在创建集群时,指定一个Amazon S3 桶(bucket)接收日志文件。

  • Amazon EMR命令行接口版本2012-06-12及更新的版本支持HBase。或者,可以使用Amazon EMR控制台启动HBase集群。

5.6 利用Hive挖掘大数据

预备知识 回顾关系型数据库和非关系型数据库。

 

大数据有结构化和非结构化成分。拥有SQL查询能力的关系型数据库是处理结构化数据的最有效的方式,而MapReduce是处理非结构化部分的理想选择。Hive是建立在Hadoop元素上的数据仓库,可处理大数据的结构化部分。所以Hive和MapReduce的组合能够满足大数据分析的需求。

Hive使用称为HiveQL的类SQL查询处理数据。它将数据组织成类似RDBMS表那样的表,进一步组织了分区中和桶中的数据,这些数据与文件系统链接起来。Hive元数据或关系型数据库模式的详细描述——列、键值、表格统计等——都存储在元存储中,元存储本身就是一个关系型数据库。

HiveQL提供了SQL处理的大多数类型,如选择、聚合、单表联合以及多表联合。它为聚合提供了用户自定义的查询。HiveQL最适用于数据挖掘和深度分析,而不是设计用于快速查询或是实时分析的。和其他数据仓库不同,Hive具有可扩展性、可伸缩性以及弹性。

HiveQL可以执行下列操作:

  • 创建表和分区;
  • 支持运算符,如算术运算、逻辑和关系;
  • 评估函数;
  • 将查询结果下载到HDFS目录中或是将表内容下载到本地目录中。

下面是HiveQL查询的一个简单例子:

SELECT lower(productname), productprice 
FROM products;

细看这个查询就会发现,它与SQL查询非常相似。

知识检测点4

 

考虑一个全球企业的雇员数据。HBase和Hive将会如何处理这些数据呢?回答下列问题,对此做出解释。

a.描述该数据的元素。企业可能拥有每个员工的什么信息?

b.讨论HBase是如何存储数据的。

c.写一个查询的例子,考虑管理者可能问的问题。

d.讨论Hive将会如何处理你所创建的查询。

练习

基于图的问题

参考每个问题中所给出的图,回答下列问题。

1.一个制造商的质量控制部门跟踪了在其生产线上的停顿数量和持续时间。生产线如下图显示。原材料和半成品依次通过步骤一、步骤二和步骤三。

  a.编写经理发送的查询。

  b.编写映射函数,并描述其预期的结果。

  c.编写归约函数,并描述其预期的结果。

2.假设你想知道美国的关键基础设施是否位于或在地理断层线附近,这将使得基础设施处于地震事件的风险之中。研究映射功能,并假设你有一个图数据库。

  a.编写查询。

  b.编写映射函数和归约函数。

  c.解释为图形数据所编写的这些函数的不同之处。

根据上面的图中回答下列问题。

(1)映射节点映射了什么内容?

(2)哪个映射节点有名叫“broke”的键?

(3)列出任意一个键和值      。

(4)第二部分的归约连接到了哪个映射节点?

多项选择题

选择正确的答案。在下面给出的“标注你的答案”里将正确答案涂黑。

1.下列哪个选项是推动创立MapReduce的因素之一?选择所有的符合项。

  a.提高新硬件的处理能力

  b.对结构化数据进行复杂分析的业务需求

  c.越来越多的网络用户

  d.分布式计算的传播

2.在设计MapReduce框架时,工程师要考虑下列哪些需求?选择所有的符合项。

  a.它应该是廉价的或免费发行的

  b.处理应该自动扩张和收缩

  c.在网络失效的情况下,应停止处理

  d.开发者应该能够创造新的语言

3.下列哪个选项描述了映射(map)函数?选择所有的符合项。

  a.它处理数据,以建立一个键值对列表

  b.它索引数据,列出所有在其中出现的单词

  c.它将关系型数据库转换成键值对

  d.它跨多个表和多个Hadoop集群跟踪数据

4.下列哪一项描述了归约函数?选择所有的符合项。

  a.它分析映射函数的结果,显示最频繁出现的值

  b.它结合了映射函数的结果,为查询返回最佳匹配的列表

  c.它添加映射函数的结果,将KVP列表转换成列式数据库

  d.它处理映射函数的结果,并创建一个新的KVP列表来回复查询

5.在MapReduce框架中,映射和归约函数可以按任意顺序运行。你同意这个说法吗?为什么?

  a.同意,因为在函数式编程中,执行顺序并不重要

  b.同意,因为函数使用KVP作为输入和输出,顺序并不重要

  c.不同意,因为映射函数的输出是归约函数的输入

  d.不同意,因为归约函数的输出是映射函数的输入

6.MapReduce如何实现协同定位?选择所有的符合项。

  a.调度器将代码发送到相关数据所在的机器上

  b.进程调度器将同一类型的数据分配给位于同一集群中的机器

  c.主作业跟踪器将映射和归约函数发送到一个集群中的相同机器或节点上

  d.在处理失效的情况下,从任务跟踪器复制相关数据和代码至相邻的集群中

7.当主节点失效时,为什么用户不能直接去往从节点?选择所有的符合项。

  a.主节点具有运行查询所需的元数据

  b.主节点具有包含数据的文件的位置

  c.主节点运行代码,从节点只有数据

  d.主节点有从节点访问数据的权限

8.HBase对实时分析有何帮助?选择所有的符合项。

  a.它采用基于列的存储和适合于非结构化数据的压缩

  b.它以足够快的速度来更新数据,可以处理最新的数据

  c.作为一个非关系型数据库,它是灵活的,可用Hive进行类SQL的查询

  d.可以顺序处理或者批处理写入和更新请求

9.为什么Hive适合于大数据?选择所有的符合项。

  a.它有效地处理大数据的结构化部分

  b.它有效地处理大数据的非结构化部分

  c.它可以在Google的BigTable中快速处理大数据

  d.它将大数据转换为一个RDBMS数据库后启用SQL查询

10.在使用MapReduce的单词字数统计查询里,映射函数做了什么?选择所有的符合项。

  a.它按字母顺序排序,并返回最常用单词的列表

  b.它创建了一个列表,每个单词作为键,出现的次数作为值

  c.它创建了一个列表,每个单词作为键,每一次的出现作为值1

  d.它返回一个列表,每一个文档作为键,单词在文档中的数量作为值

标注你的答案(把正确答案涂黑)

测试你的能力

为下面的场景编写映射和归约函数。如果了解代码可以编写代码。如果不了解,你可以简单地描述每个函数对于数据做了什么,以及它将产生什么结果。

1.某企业想要了解在过去一年中售出的不同类型体育用品的各种统计数字。

2.一位研究员想要知道不同年龄组的国内航空旅行的频率。

3.呼叫中心想要知道在C-SAT调查中,“满意”或者“好”这两个单词的出现次数。

备忘单

  • MapReduce是一个软件框架,使开发人员可以编写能够在一组分布式处理器上并行处理大量非结构化数据的程序。
  • MapReduce将数据分析任务划分为两个部分;映射任务和归约任务。
    • 映射任务并行处理数据的不同部分,每一个任务返回一个输出。
    • 归约任务接收这些映射输出作为它们的输入,并处理它们产生最终的结果。
  • MapReduce框架使用键值对(KVP)作为输入和输出。
    • 映射函数处理数据并以KVP格式呈现感兴趣的特征。
    • 归约函数接收KVP列表作为输入,并返回另一个KVP列表,通常携带有不同的键或值。
  • 某种算法(或一系列步骤),定义了映射和归约函数如何协调工作,以有效地完成处理任务。
  • MapReduce框架组织所有的跨节点工作。
    • 它将代码发送到数据所在的节点,换句话说,就是使数据和代码位于一处。
    • 主作业跟踪器将过程作为一个整体进行跟踪,并将工作分配至从任务跟踪器。
    • 每一个节点的从任务跟踪器跟踪分配给该节点的工作。
    • 该框架跨所有集群同步工作。
    • 它识别一个不完整的或失败的作业,并将其分配给一个不同的节点。
  • 可以通过适当的硬件/网络拓扑、同步和文件系统优化MapReduce的性能。
  • MapReduce的应用实例是:
    • 计算网站或网页的访问者数量;
    • 列出到达一个网站或网页的路径;
    • 识别文档中经常使用的单词。
  • MapReduce原生使用Java作为其编程语言,但是几乎可以使用任何程序来编写。
    • 管道库使得可用C++编写映射和归约代码。
    • 通用的Streaming API可以将用大多数语言编写的程序转换成为映射和归约代码。
  • HBase是一个开源非关系型分布式数据库,它高速地存储、更新和处理大量的数据。
    • 它具有基于列的存储,并为处理和更新提供快速的数据访问。
    • 它将数据存储于内存中,具有低延迟。
    • 由于快速的更新,更新过的数据库可以立即用于处理。
    • 它可以处理缓慢变化的参考数据和快速变化的日志数据。
  • Hive是一个处理结构化数据的数据仓库。
    • Hive组织RDBMS表类型的数据,并使用称作HiveQL的类SQL查询。
    • HiveQL提供大多数的SQL处理类型,如选择、聚合、单表或多表的联合。
    • Hive最适用于数据挖掘和深度分析;它不是为快速响应或实时分析而设计的。

目录

相关技术

推荐用户