带着目的去阅读——Hadoop权威指南

参加了一个社团活动,小官让写一下感兴趣的知识点作为行业备注,但考虑到自己平时的工作环境和应用技能,好像并没有什么AI、IOT、区块链、大数据、算法等相关的知识储备,是时候要恶补一下了

提到大数据,让我想到的就是Hadoop、MapReduce,但只是知道名词,具体它们是什么呢,应用场景和作用是什么呢,带着问题开始了我的探索之路

MapReduce的应用

在Google,MapReduce用在非常广泛的应用程序中,包括“分布grep,分布排序,web连接图反转,每台机器的词矢量,web访问日志分析,反向索引构建,文档聚类,机器学习,基于统计的机器翻译...”值得注意的是,MapReduce实现以后,它被用来重新生成Google的整个索引,并取代老的ad hoc程序去更新索引。

MapReduce会生成大量的临时文件,为了提高效率,它利用Google文件系统来管理和访问这些文件。

在谷歌,超过一万个不同的项目已经采用MapReduce来实现,包括大规模的算法图形处理、文字处理、数据挖掘、机器学习、统计机器翻译以及众多其他领域。

其他实现

Nutch项目开发了一个实验性的MapReduce的实现,也即是后来大名鼎鼎的hadoop。

Phoenix是斯坦福大学开发的基于多核/多处理器、共享内存的MapReduce实现

Hadoop就什么

Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据

Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算

Hadoop的优点

Hadoop是一个能够让用户轻松架构和使用的分布式计算平台。用户可以轻松地在Hadoop上开发和运行处理海量数据的应用程序。它主要有以下几个优点:

高可靠性。Hadoop按位存储和处理数据的能力值得人们信赖。

高扩展性。Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中。

高效性。Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。

高容错性。Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。

低成本。与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比,hadoop是开源的,项目的软件成本因此会大大降低

笔者在不久前曾买过一本Hadoop的资料,但因为执行力不足,拖延症等问题导致自己没有及时去阅读,不能再因为工作中不需要,不涉及该领域就不去了解,不去认识,不去学习。

阅读Hadoop权威指南

请带着目的去阅读资料,因为笔者只是了解一下Hadoop是什么,如何应用、有何功能,带着这些目的我开始了学习之路,并总结了一下前几章的内容,做一下笔记

第1章 初识Hadoop

在古时候,人们用牛来拉生物。当一头牛拉不动一根圆木时,人们从来没有考虑过要培育更强壮的牛。同理,我们也不该想方设法打造超级计算机,而应该千方百计综合利用更多计算机来解决问题。——格蕾斯.霍珀(Grace Hopper)

1.1 数据!数据!

“大数据胜于好算法”,在这个数据大爆炸的时代,基于大数据的算法效果会更好,但我们必须想方设法好好存储和分析这些数据

1.2 数据的存储与分析

硬盘容量不断的上升,但读取速度却没有与时俱进。还要解决硬盘故障问题。避免数据丢失,最常见的做法就是冗余硬盘,保存复本。各种分布式系统,数据来源不统一,数据的正确性也是一个非常大的挑战。MapReduce具有很高的可靠性

1.3 相较于其他系统的优势

每个查询需要处理整个数据集或至少一个数据集的大部分。MapReduce是一个批量查询处理器,能在合理时间范围内处理整个数据集的动态查询

1.3.1 关系型数据库管理系统

计算机硬盘寻址时间的提升远远不敌于传输速率的提升,寻址是导致硬盘操作延迟的主要原因,而传输速率取决于硬盘的带宽。MapReduce比较适合以批处理方式处理需要分析整个数据集的问题,尤其是动态分析。适合一次写入,多次读取数据的应用,关系型数据库则更适合持续更新的数据集。MapReduce和关系型数据库的另一区别在于它们所操作的数据集的结构化程度。

MapReduce是一种线性可伸缩编程模型。如果处理的数据是原来的2倍,那处理时间也需要2倍。但如果集群是原来的2倍,作业的运行速度却仍然与原来一样快。SQL查询不具备该特性。

1.3.2网络计算

主要使用类似于消息传递接口(Message Passing Computing,MPI)的API。MapReduce尽量在计算节点上存储数据,以实现数据的本地快速访问。数据本地化(data locality)是MapReduce的核心特性。网络带宽是数据中心环境最珍贵的资源,MapReduce通过显式网络拓扑结构来保留网络带宽

1.3.3 志愿计算

志愿计算项目将问题分成很多块,每一块称为一个工作单元,MapReduce有三大设计目标

(1)为只需要几分钟或几小时就可以完成的作业提供服务

(2)运行于同一个内部有高速网络连接的数据中心内

(3)数据中心内的计算机是可靠的、定制的硬件

第2章 善于MapReduce

2.1 气象数据集

分布在全球,需要收集大量的日志。这些数据是半结构化数据且按记录方式存储,因此非常适合MapReduce来分析

2.2 使用Unix工具来分析数据

传统处理按行存储数据的工具是awk

2.3 使用Hadoop来分析数据

2.3.1 map和reduce

MapReduce任务过程分为两个处理阶段:map阶段和reduce阶段。Map阶段输入的是NCDC原始数据。map函数是一个准备数据的阶段,reduce函数对数据进行处理。

2.4 横向扩展

我们需要把数据存储在分布式文件系统中,一般为HDFS

2.4.1 数据流

MapReduce作业(job)是客户端需要执行的一个工作单元:它包括输入数据、MapReduce程序和配置信息。Hadoop将作业分成若干个小任务(task)来执行,其中包括两类任务:map任务和reduce任务

2.4.2 combiner 函数

Hadoop允许用户针对map任务的输入指定一个combiner——combiner函数的输出作为reduce的输入

2.5 Hadoop Streaming

Streaming天生适合用于文本处理

第3章Hadoop分布式文件系统(HDFS)

HDFS以流式数据访问模式来存储超大文件,运行在商用硬件集群上

3.1 HDFS的设计

超大文件目前已有存储PB级数据的Hadoop集群了

流式数据访问一次写入,多次读取,数据通常由数据源生成或从数据源复制而来

商用硬件不需要高昂的商用设备

低时间延迟的数据访问HDFS是为高数据吞吐量应用优化的,这可能会提高时间延迟为代价

大量的小文件由于namenode将文件系统的元数据存储到内存中,因此文件系统的存储受限于namenode内存容量

多用户写入,任意修改文件

3.2 HDFS的概念

3.2.1 数据块

每个磁盘都有默认的数据块大小,HDFS同样也有块(block)的概念,默认64MB,为了最小化寻址开销。HDFS上的文件也被划分为块大小的多个分块(chunk),作为独立的存储单元。

3.2.2 namenode和datanode

HDFS集群有两类节点以管理者-工作者模式运行,即一个namenode(管理者)和多个datanode(工作者)。

namenode管理文件系统的命名空间,维护文件系统树及整棵树内所有文件和目录。这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件和编辑日志文件。

Datanode是文件系统的工作节点。并定期向namenode发送它们所存储的块的列表。

没有namenode,文件系统将无法使用。如果namenode运行的服务器毁坏,文件系统所有的文件将会丢失,因为我们不知道如何根据datanode的块重建文件,因此对namenode的容错非常重要,Hadoop提供两个机制

第一种备份那些组成文件系统元数据持久状态的文件,这些操作是实时同步的,是原子操作,一般配置是将持久状态写入本地磁盘的同时,写入一个远程挂载的网络文件系统(NFS)

另一种运行一个辅助namenode,但它不能被用作namenode。这个辅助namenode的重要作用是定期通过编辑日志合并命名空间镜像,以防止编辑日志过大。辅助的namenode要在另一台机器上运行,因为它占用大量cpu时间

3.2.3 联邦HDFS

namenode在内存保存文件系统中每个文件和每个数据块的引用关系,对于一个拥有大量文件的超大集群来说,内存将成为限制系统横向(采购新机器)扩展的瓶颈

3.2.4 HDFS的高可用性

namenode之间需要通过高可用的共享存储实现编辑日志的共享

Namenode需要同时向两个namenode发送数据块处理报告,因为数据块的映射信息存储在namenode的内存中,而非磁盘

客户端需要使用特定的机制处理namenode失效问题,这一机制对用户是透明的

3.3 命令行接口

HDFS有很多其他接口,但命令行是最简单的

3.4 Hadoop文件系统

Hadoop有一个抽象的文件系统概念,HDFS只是其中的一个实现

3.5 Java接口

3.5.1 从Hadoop URL读取数据

要从Hadoop文件系统读取文件,最简单的方法是使用java.net .URL对象打开数据流,从中读取数据

3.5.2 通过FileSystem API读取数据

有时根本不可能在应用中设置URLStreamHandlerFactory实例。这这种情况下,需要使用FileSystem API来打开一个文件的输入流

3.5.3 写入数据

FileSystem类有一系列新建文件的方法,最简单的方法是给准备建的文件指定一个Path对象

3.5.4 目录

FileSystem实例提供了创建目录的方法:

Public boolean mkdirs(path f) throws IOException

这个方法一次性新建所有必要但还没有的父目录

3.5.5 查询文件系统

文件元数据:FileStatus

列出文件FileSystem的listStatus()方法

3.5.6 删除数据

使用FileSystem的delete()方法可以永久删除文件或目录

3.6 数据流

3.6.1 剖析文件读取

客户端通过调用FileSyste对象的open()方法来打开希望读取的文件,对于HDFS来说,这个对象是分布式文件系统的一个实例。

3.6.2 剖析文件写入

在客户端写入数据时,DFSOutputStream将它分成一个个的数据包,并写入内部队列,称为”数据队列”

3.6.3 一致模型

文件系统的一致模型描述了文件读/写的数据可见性。HDFS为性能牺牲了一些POSIX(Portable Operating System Interface of UNIX,可移植操作系统接口)要求

3.7 通过Flume和Sqoop导入数据

Apache Flume是一个将大规模流数据导入HDFS的工具,Flume节点允许以任何拓扑方式进行组织。Flume提供了不同级别的数据投递可靠性。

Apache Sqoop是为了将数据从结构化存储设备批量导入HDFS中设计的

3.8通过distcp并行复制

Distcp可以从Hadoop文件系统间复制大量数据,也可以将大量的数据复制到Hadoop中

3.9 Hadoop存档

每个文件均按块方式存储,每个块的元数据存储在namenode的内存中,因此Hadoop存储小文件会非常低效,因为大量的小文件会耗尽namenode中的大量内存

3.9.1 使用Hadoop存档工具

Hadoop存档是通过archive工具根据一组文件创建而来的

3.9.2 不足

对于HAR文件,虽然存档文件中的源文件能被压缩,但目前还不支持存档文件的压缩

一旦创建,存档文件便不能再修改。要想从中增加或删除文件,必须重新创建存档文件。

如果已经尽量减少系统中小文件的数量,但仍然受制于namenode的内存容量,可以考虑使用联邦HDFS来提高命名空间的可扩展性

第4章 Hadoop的I/O操作

Hadoop自带一套原子操作用于数据I/O操作

4.1 数据完整性

检测数据是否损坏常见措施是,在数据第一次引入系统时计算校验和(checksum)并在数据通过一个不可靠的通道进行传输时再次计算校验和,这样就能发现数据是否损坏。

4.1.1 HDFS的数据完整性

HDFS会对写入的所有数据计算校验和,并在读取时验证校验和。Datanode负责在收到数据后存储数据及其验证校验和。客户端从datanode读取数据时,也会验证校验和,将他们与datanode中存储的校验和进行比较。每个datanode也会在一个后台线程中运行一个DataBlockScanner,从而定期验证存储在这个datanode上的所有数据。

4.1.2 LocalFileSystem

Hadoop的LocalFileSystem执行客户端的校验和验证

4.1.3 ChecksumFileSystem

LocalFileSystem通过ChecksumFileSystem来完成自己的任务,有这个类向其他文件系统(无校验和系统)加入校验和就非常简单,因为ChecksumFileSystem类继承自FileSystem

4.2 压缩

文件压缩有两大好处:减少存储文件所需要的磁盘空间,并加速数据在网络和磁盘上的传输。

4.2.1 codec

Codec实现了一种压缩-解压缩算法

4.2.2 压缩和输入分片

gzip不支持切分,应用压缩格式按效率从高到低排列,1、使用容器文件格式2、使用支持切分的压缩格式3、在应用中将文件切分成块,并使用任意一种压缩格式为每个数据块建立压缩文件

对大文件来说,不要使用不支持切分整个文件的压缩格式,因为会失去数据的本地特性,进而造成MapReduce应用效率低下

4.2.3 在MapReduce中使用压缩

对map任务输出进行压缩,由于map任务的输出需要写到磁盘并通过网络传输到reducer节点,所以如果使用LZO、LZ4或Snappy这样的高速压缩方式,是可以提升性能的

4.3 序列化

是将结构化对象转化为字节流以便在网络上传输或写到磁盘进行永久存储的过程。反序列化是将字节流转回结构化对象的逆过程,Hadoop系统中多个节点上进程间的通信是通过rpc实现的,rpc序列化格式有:紧凑、快速、可扩展、支持到操作,Hadoop使用自己的序列化Writable,它绝对紧凑、速度快,但不太容易用Java以外的语言扩展

4.3.1 Writable接口

Writable定义了两个方法,一个将其状态写到DataOutput二进制流,另一个从DataInput二进制流读取状态

4.3.2 Writable类

Java基本类型的Writable封装器、Text类型

4.3.3 实现定制的Writable集合

Writable是MapReduce数据路径的核心,Hadoop有一套非常有用的Writable实现可以满足大部分需求,但有些情况,我们需要根据自己的需求构造一个新的实现。

4.3序列化框架

4.4 Avro

Apache Avro是一个独立于编程语言的数据序列化系统,旨在解决Hadoop中Writable类型的不足:缺乏语言的可移植性,Avro同时也更具生命力,该语言将使得数据具有更长的生命周期,Avro通常用JSON来写,并且具有丰富的模式解析能力

4.4.1 Avro数据类型和模式

Avro定义了少量数据基本类型,可用于以写模式的方式来构建应用特定的数据结构。

4.4.2 内存中的序列化和反序列化

Avro为序列化和反序列化提供API

4.4.3 Avro数据文件

Avro的对象容器文件格式主要用于存储Avro对象序列。与Hadoop顺序文件的设计非常相似,主要区别在于Avro数据文件主要是面向跨语言使用而设计的。所以可以用Python写入文件,而用C语言来读取文件

4.4.4 互操作性

Avro为了说明互操作性,可以使用Python来读取文件

4.4.5 模式的解析

在选择的时候,读加数据的模式(reader的模式)可以不同于我们用于写入数据的模式(writer的模式)

4.4.6 排列顺序

Avro定义了对象的排列顺序,例如,数值型按照数值的升序进行排序

4.4.7 关于Avro MapReduce

Avro提供了很多类,以便对Avro数据运行MapReduce程序。

4.4.8 使用Avro MapReduce进行排序

4.5 基于文件的数据结构

对于基于MapReduce的数据处理,将每个二进制数据大对象(blob)单独放在各自的文件中不能实现可扩展性,所以Hadoop为此开发了很多更高层次的容器

4.5.1 关于SequenceFile

考虑日志文件,其中每一行文本代表一条日志记录。纯文本不适合记录二进制类型的数据。Hadoop的SequenceFile非常适合为二进制健/值对提供一个持久数据结构

4.5.2 关于MapFile

MapFile是已经排过序的SequenceFile。它有索引,可以按健查找

后续还有很多章节,就不一一总结,了解Hadoop是什么,应用场景和具体功能是笔者此次阅读的目的,也是和大家分享一下阅读技巧。关心自己关心的,用到了随时来查是最方便的,利用有限的时间把有限的精力放到最需要关注的地方

参考文献

——MapReduce、Hadoop定义搞自百度百科

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180805G1B9JL00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励