《Hive编程指南》一1.1 Hadoop和MapReduce综述

1.1 Hadoop和MapReduce综述

如果用户已经熟悉Hadoop和MapReduce计算模型的话,那么可以跳过本节。虽然用户无需精通MapReduce就可以使用Hive,但是理解MapReduce的基本原理将帮有助于用户了解Hive在底层是如何运作的,以及了解如何才能更高效地使用Hive。

我们在这里提供了一个关于Hadoop和MapReduce的简要描述。更多细节,请参考Tom White (O’Reilly)所著的《Hadoop权威指南》一书。

MapReduce
MapReduce是一种计算模型,该模型可将大型数据处理任务分解成很多单个的、可以在服务器集群中并行执行的任务。这些任务的计算结果可以合并在一起来计算最终的结果。

MapReduce编程模型是由谷歌(Google)开发的。Google通过一篇很有影响力的论文对这个计算模型进行了描述,本书附录部分可查看到该论文,名为《MapReduce:大数据之上的简化数据处理》。一年后,另一篇名为《Google文件系统》的论文介绍了Google文件系统。这两篇论文启发了道·卡丁(Doug Cutting)开发了Hadoop。

MapReduce这个术语来自于两个基本的数据转换操作:map过程和reduce过程。一个map操作会将集合中的元素从一种形式转换成另一种形式。在这种情况下,输入的键-值对会被转换成零到多个键-值对输出。其中,输入和输出的键必须完全不同,而输入和输出的值则可能完全不同。

在MapReduce计算框架中,某个键的所有键-值对都会被分发到同一个reduce操作中。确切地说,这个键和这个键所对应的所有值都会被传递给同一个Reducer。reduce过程的目的是将值的集合转换成一个值(例如对一组数值求和或求平均值),或者转换成另一个集合。这个Reducer最终会产生一个键-值对。再次说明一下,输入和输出的键和值可能是不同的。需要说明的是,如果job不需要reduce过程的话,那么也是可以无reduce过程的。

Hadoop提供了一套基础设施来处理大多数困难的工作以保证任务能够执行成功。例如,Hadoop决定如果将提交的job分解成多个独立的map和reduce任务(task)来执行,它就会对这些task进行调度并为其分配合适的资源,决定将某个task分配到集群中哪个位置(如果可能,通常是这个task所要处理的数据所在的位置,这样可以最小化网络开销)。它会监控每一个task以确保其成功完成,并重启一些失败的task。

Hadoop分布式文件系统(也就是HDFS),或者一个同类的分布式文件系统,管理着集群中的数据。每个数据块(block)都会被冗余多份(通常默认会冗余3份),这样可以保证不会因单个硬盘或服务器的损坏导致数据丢失。同时,因为其目标是优化处理非常大的数据集,所以HDFS以及类似的文件系统所使用的数据块都非常大,通常是64MB或是这个值的若干倍。这么大的数据块可以在硬盘上连续进行存储,这样可以保证以最少的磁盘寻址次数来进行写入和读取,从而最大化提高读写性能。

为了更清晰地介绍MapReduce,让我们来看一个简单的例子。Word Count算法已经被称为是MapReduce计算框架中的“Hello World”程序[7]了。Word Count会返回在语料库(单个或多个文件)中出现的所有单词以及单词出现的次数。输出内容会显示每个单词和它的频数,每行显示一条。按照通常的习惯,单词(输出的键)和频数(输出的值)通常使用制表符进行分割。

图1-1 显示了在MapReduce计算框架中Word Count程序是如何运作的。

这里有很多内容要讲,所以我们会从左到右来讲解这个图。

图1-1中左边的每个Input(输入)框内都表示一个单独的文件。例子中有4个文件,其中第3个文件是个空文件,为了便于简单描述,其他3个文件都仅仅包含有少量几个单词。

默认情况下,每个文档都会触发一个Mapper进程进行处理。而在实际场景下,大文件可能会被划分成多个部分,而每个部分都会被发送给一个Mapper进行处理。同时,也有将多个小文件合并成一个部分供某个Mapper进行处理的方法。不过,我们当前不必深究这些细节性问题。

MapReduce计算框架中的输入和输出的基本数据结构是键-值对。当Mapper进程启动后,其将会被频繁调用来处理文件中的每行文本。每次调用中,传递给Mapper的键是文档中这行的起始位置的字符偏移量。对应的值是这行对应的文本。

在WordCount程序中,没有使用字符偏移量(也就是没有使用键)。值(也就是这行文本)可以使用很多种方式进行分割(例如,按照空格分隔是最简单的方式,但是这样会遗留下不需要的标点符号),最终这行文本会被分解成多个单词。我们同时假定Mapper会将每个单词转换成小写,因此对于“FUN”和“fun”会被认为是同一个单词。

最后,对于这行文本中的每个单词,Mapper都会输出一个键-值对,以单词作为键并以数字1作为值(这里1表示“出现1次”)。需要注意的是键和值的输出数据类型和输入数据类型是不同的。

Hadoop神奇的地方一部分在于后面要进行的Sort(排序)和Shuffle(重新分发)过程。Hadoop会按照键来对键-值对进行排序,然后“重新洗牌”,将所有具有相同键的键-值对分发到同一个Reducer中。这里有多种方式可以用于决定哪个Reducer获取哪个范围内的键对应的数据。这里我们先不必考虑这些问题。但是出于说明性目的,我们假设图中使用了一个特殊的按字母数字划分的过程(在实际执行中,会有所不同)。

对于Mapper而言如果只是简单地对每个单词输出计数1这样的处理的话,那么会在Sort和Shuffle过程中产生一定的网络和磁盘I/O浪费(不过,这样并不会减少Mapper的内存使用)。有一个优化就是跟踪每个单词的频数,然后在Mapper结束后只输出每个单词在这个Mapper中的总频数。对于这个优化有好几种实现方式,但是,最简单的方式应该是逻辑是正确的,而且对于这个讨论,理由是充足的。

每个Reducer的输入同样是键-值对,但是这次,每个键将是Mapper所发现的单词中的某一个单词,而这个键对应的值将是所有Mapper对于这个单词计算出的频数的一个集合。需要注意的是键的数据类型和值的集合中元素的数据类型和Mapper的输出是一致的。也就是说,键的类型是一个字符串,而集合中的元素的数据类型是整型。

为了完成这个算法,所有的Reducer需要做的事情就是将值集合中的频数进行求和然后写入每个单词和这个单词最终的频数组成的键-值对。

Word Count不是一个虚构的例子。这个程序所产生的数据可用于拼写检查程序、计算机语言检测和翻译系统,以及其他应用程序。

时间: 2024-10-28 18:51:10

《Hive编程指南》一1.1 Hadoop和MapReduce综述的相关文章

《Hive编程指南》一导读

前 言 Hive编程指南本书是一本Hive的编程指南.Hive是Hadoop生态系统中必不可少的一个工具,它提供了一种SQL(结构化查询语言)方言,可以查询存储在Hadoop分布式文件系统(HDFS)中的数据或其他和Hadoop集成的文件系统,如MapR-FS.Amazon的S3和像HBase(Hadoop数据库)和Cassandra这样的数据库中的数据. 大多数数据仓库应用程序都是使用关系数据库进行实现的,并使用SQL作为查询语言.Hive降低了将这些应用程序转移到Hadoop系统上的难度.凡

《Hive编程指南》一第1章 基础知识

第1章 基础知识 Hive编程指南从早期的互联网主流大爆发开始,主要的搜索引擎公司和电子商务公司就一直在和不断增长的数据进行较量.最近,社交网站也遇到了同样的问题.如今,许多组织已经意识到他们所收集的数据是让他们了解他们的用户,提高业务在市场上的表现以及提高基础架构效率的一个宝贵的资源. Hadoop生态系统就是为处理如此大数据集而产生的一个合乎成本效益的解决方案.Hadoop实现了一个特别的计算模型,也就是MapReduce,其可以将计算任务分割成多个处理单元然后分散到一群家用的或服务器级别的

《Hive编程指南》—— 读后总结

知识图谱 本文转自博客园xingoo的博客,原文链接:<Hive编程指南>-- 读后总结,如需转载请自行联系原博主.

《Hive编程指南》一1.2 Hadoop生态系统中的Hive

1.2 Hadoop生态系统中的Hive WordCount算法,和基于Hadoop实现的大多数算法一样,有那么点复杂.当用户真正使用Hadoop的API来实现这种算法时,甚至有更多的底层细节需要用户自己来控制.这是一个只适用于有经验的Java开发人员的工作,因此也就将Hadoop潜在地放在了一个非程序员用户无法触及的位置,即使这些用户了解他们想使用的算法. 事实上,许多这些底层细节实际上进行的是从一个任务(job)到下一个任务(job)的重复性工作,例如,将Mapper和Reducer一同写入

《Hive编程指南》一1.4 后续事情

[1]不过,因为Hive是被设计用来处理的大数据集的,这个启动所消耗的时间和实际数据处理时间相比是微乎其微的. [2]请访问Apache HBase的官方网站,http://hbase.apache.org,以及Lars George(O'Reilly)所著的<HBase权威指南>一书. [3]请参考Cassandra的官方网站,http://cassandra.apache.org/,以及参考Edward Capriolo (Packt)所著的<High Performance Cas

《Hive编程指南》一1.3 Java和Hive:词频统计算法

1.3 Java和Hive:词频统计算法 如果用户不是Java工程师,那么可以直接跳到下一节. 如果用户是名Java工程师,那么可能需要阅读本节,因为用户需要为其所在组织的Hive用户提供技术支持.你可能会质疑如何使用Hive解决自己的工作.如果是这样的话,那么可以先看看下面这个实现了之前我们所讨论的Word Count算法的例子,我们先学会使用Java MapReduce API,然后再学习如何使用Hive. 通常都会使用Word Count作为用户学习使用Java编写MapReduce程序的

Spark编程指南笔记

本文是参考Spark官方编程指南(Spark 版本为1.2)整理出来的学习笔记,主要是用于加深对 Spark 的理解,并记录一些知识点. 1. Spark介绍 Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce 框架,都是基于map reduce算法所实现的分布式计算框架,拥有Hadoop MapReduce所具有的优点:不同于MapReduce的是Job中间输出和结果可以保存在内存中,而不需要读写HDFS,因此Spark能更好地适用于machine l

《Spark 官方文档》Spark SQL, DataFrames 以及 Datasets 编程指南(一)

Spark SQL, DataFrames 以及 Datasets 编程指南 概要 Spark SQL是Spark中处理结构化数据的模块.与基础的Spark RDD API不同,Spark SQL的接口提供了更多关于数据的结构信息和计算任务的运行时信息.在Spark内部,Spark SQL会能够用于做优化的信息比RDD API更多一些.Spark SQL如今有了三种不同的API:SQL语句.DataFrame API和最新的Dataset API.不过真正运行计算的时候,无论你使用哪种API或语

《Spark官方文档》Spark Streaming编程指南(一)

Spark Streaming编程指南 概览   Spark Streaming是对核心Spark API的一个扩展,它能够实现对实时数据流的流式处理,并具有很好的可扩展性.高吞吐量和容错性.Spark Streaming支持从多种数据源提取数据,如:Kafka.Flume.Twitter.ZeroMQ.Kinesis以及TCP套接字,并且可以提供一些高级API来表达复杂的处理算法,如:map.reduce.join和window等.最后,Spark Streaming支持将处理完的数据推送到文