Hadoop The Definitive Guide:Hadoop权威指南-PART 1
时间:2023-11-21 23:07:01
简介:
Hadoop起源于Nutch。当人们试图构建开源网络搜索引擎时,他们在管理少数计算机上运行的计算时遇到了麻烦。Google发表了GFS和MapReduce相关介绍,路线变得清晰。他们设计了一个系统来准确地解决使用中的问题Nutch是遇到的问题。
使用设置、配置和编写程序Hadoop是一门艺术。
Hadoop权威指南:Part 1. Funfamental components in Hadoop
目录
1 Meet Hadoop
2 Introduction to MapReduce
3 Hadoop filesystems
4 Hadoop's cluster resource management system
5 I/O building blocks in Hadoop
1 Meet Hadoop
对于庞大的数据,我们应该尝试更多的计算机系统,而不是使用更大的计算机。
1.1-数据:
当存储成本降低到足以存储连续音频和视频时,对数据存储的需求将是现在的几倍。同时,作为物联网的一部分,机器产生的数据量大于人们产生的数据量,如机器日志,RFID阅读器、传感器、车辆GPS跟踪、零售交易等,都促成了海量数据的不断增长。
此外。公共数据的数量正在逐年增加。组织不再需要管理自己的数据,未来的成功将在很大程度上取决于他们从其他组织的数据中提取价值的能力。
1.2-数据存储和分析:
虽然硬盘的存储容量多年来显著增加,但访问速度没有跟上硬盘读取数据的速度。一旦许多硬件开始使用,其中一个就很有可能出现故障。RAID避免数据丢失的数据丢失的方法是复制:系统保存数据冗余副本,以便在故障发生时使用副本。Hadoop分布式文件系统HDFS能够面对这一挑战。
大数据分析任务需要以某种方式组合数据。各种分布式系统允许从多个来源组合数据。这是有挑战性的。MapReduce它提供了从磁盘读写中抽象问题的编程模式,并将键和值。
简单来讲,Hadoop提供可靠、可扩展的存储和分析平台。
1.3-查询所有数据:
MapReduce它是一个屁处理查询处理器,能够在合理的时间内临时查询整个数据集并获得结果。它改变了人们对数据的看法,解锁了以前存档在磁盘或磁带上的数据。
1.4-超越批次:
MapReduce它本身是一个批处理,不适合交互式分析。结果不能在几秒钟或更短的时间内查询。
提供在线访问的第一个组件是HBase,是一个使用HDFS存储键作为其底层存储键。它提供单行在线读写访问和批量读写数据的批处理操作。
Hadoop中新处理模型的真正推广是Hadoop2中引入了YARN。它是一个允许任何分布式程序的集群资源管理系统(不仅仅是MapReduce)运行一个数据Hadoop集群。
1.5-Hadoop不同的处理方式:
交互式SQL
迭代处理
流处理
搜索
1.6-与其它系统相比:
关系数据库管理系统:
MapReduce可视为补充关系数据库的管理系统。MapReduce适用于需要分析整个数据集的问题(批处理)。特别是临时分析。RDBMS适用于查询或更新,其中数据集为索引提供相对较少的低延迟检索和更新数据。MapReduce一次编写适合数据的应用程序,多次阅读。RDBMS适合对数据不断更新。
随着Hive等Hadoop通过远离MapReduce)并添加索引和事务功能,使它们看起来越来越传统RDBMS。
2 MapReduce
它是一种数据处理编程模型。它的程序本质上是平行的,所以它可以向任何有足够机器的管理者提供非常大的数据分析。它为大型数据集提供了自己的解决方案。
2.1-数据格式:
数据使用面向行的ASCII格式存储。每一行都是记录。
2.2-Unix工具分析数据:
处理面向行数据的经典工具是awk。
2.3-Hadoop分析数据:
利用Hadoop提供的并行处理需要表示查询MapReduce操作。在当地小规模测试后,在机器集群上运行。
2.4-Java MapReduce:
三个要素:map函数,reduce函数和操作代码。
map函数由Mapper类表示,它表示抽象map()方法
类似于map定义reduce函数。reduce类的输入类型必须匹配map函数输出类型
Job对象形成操作规范,让编程者控制操作模式
2.5-试运行:
编写MapReduce为了消除代码中的任何直接问题,通常在小数据集上进行操作。
2.6-向外扩展:
要向外扩展,需要在分布式文件系统中存储数据。Hadoop使用Hadoop的资源管理系统,YARN将MapReduce计算转移到托管部分数据的每台机器上。
MapReduce操作是客户希望执行的工作单元:它通过输入数据,MapReduce由程序和配置信息组成。Hadoop将作业分为两类:map任务和reduce使用这些任务YARN安排并在集群中的节点上运行。如果任务失败,它将在不同的节点上自动重新安排。
2.7-数据流切分:
Hadoop将MapReduce操作输入分为固定大小的块,称为input splits。Hadoop为每个拆分创建一个映射任务,它是每个记录操作用户定义的映射函数。
每个split的大小约为128M。最佳split的大小与HDFS块的大小相同:它是保证存储在每个节点上的最大输入大小。
Map任务将数据写入本地磁盘,而不是HDFS:Map输出为中间输出:由reduce任务处理产生最终输出。完成一次工作,map可以扔掉输出。
写入reduce输出确实会消耗网络宽带,但与普通人相比HDFS管道一样多。
reduce任务的数量不受输入大小的控制,而是独立指定的。在默认MapReduce作业中。当有多个reducer时,map任务分区其输出(partition)。每一项任务都是每一项reduce创建任务分区。每个分区可以有多个分区key,但任何给定key记录在一个分区。分区可由用户定义的分区函数控制,但通常使用默认分区器。它使用散列函数对key进行分桶,工作很好。
2.8-合路器:
许多MapReduce操作受集群上可用宽带的限制,因此尽量减少map和reduce值得在任务之间传输数据。Hadoop允许用户指定map组合器函数在输出上运行,其输出形式是reduce输入函数。
2.9-Hadoop流式传输:
Hadoop为MapReduce提供了一个API,允许使用Java编程语言以外map和reduce函数。Hadoop Streaming使用Unix标准流作为Hadoop与程序之间的界面。因此,编程可以使用任何语言来读取标准输入并写入标准输出MapReduce程序
3 The Hadoop distributedfilesystems
当数据集的存储容量超过单个物理机器的存储容量时,有必要将其划分为多个单独的机器。跨机器网络管理存储的文件系统称为分布式文件系统。Hadoop中使用HDFS。
这络编程的所有复杂性都是基于网略的。
3.1-HDFS的设计:
p>是一种分布式文件系统,设计用于存储具有流式数据访问模式的非常大的文件,在商用硬件集群上运行。(目前运行的Hadoop集群可存储数PB的数据)3.2-流式数据访问:
是最有效的数据处理模式,一次写入多次读取模式。数据集通常是从源生或复制的,随着时间的推移对数据集执行各种分析。
3.3-低延迟数据访问:
HDFS已经针对提供高吞吐量数据进行了优化,但是可能会以延迟为代价。HBase目前是低延迟访问的最好选择。
3.4-很多小文件:
因为namenode在内存中保存文件系统元数据,所以文件系统中文件数量的限制由namenode上的内存量决定。根据经验,每个文件,目录和块占用大约150个字节。
3.5-Blocks:块
它是指读取或写入的最小数据量。默认128M。在HDFS中文件被分成块,这些块作为独立的单元存储。
块抽象,对于分布式系统的好处:
文件可以比网络中任何的单个磁盘都大
简化存储管理
适用于提供容错和可用性的复制
3.6-Namenode和datanode:
namenode管理文件系统命名空间。它维护系统树以及树中所有文件和目录的元数据。此信息以两个文件的形式永久存储在本地磁盘上:命名空间图像和编辑日志。它还知道给定文件的所有块所在的数据节点;但是它不会永久存储块位置,因此信息是在系统启动时从数据节点重建的。
datanode是文件系统的主力。当它们被告知时,它们存储和检索块,并且它们定期向名称节点报告它们正在存储的块列表。
3.7-块缓存:
通常datanode从磁盘读取块,但对于经常访问的文件,这些块可能会显式缓存在datanode的内存中,在堆外块缓存中。
3.8-HDFS federation:
在这之下,每个namenide管理一个name空间卷,该卷由name空间的元数据和一个包含name空间文件的所有块的快池组成。
3.9-HDFS高可用性:
在多个文件系统上复制namenode元数据和使用辅助namenode创建检查点的组合可以放置数据丢失,但它不能提供文件系统的高可用性。namenode仍然是单点故障。如果它确实失败了,所有客户端将无法读取,写入或者列出文件。
在HA实现的过程中,有一对namenode出于活动-备用配置中。如果活动namenode发生故障,备用namenode将接管其职责以继续为客户端请求提供服务。
3.10-故障转移和防护:
从活动namenode到备用namenode的转换,有系统中故障转移控制器管理。
3.11-命令行界面:
3.12-Hadoop文件系统:
Hadoop为其文件系统提供了许多接口,它通常使用URI方案。选择正确的文件系统实例进行通信。
3.13-HTTP访问:
第二种情况通过HTTP访问HDFS的方式依赖于一个或多个独立的代理服务器。(代理是无状态的,一次它们可以在标准负载均衡器后面运行)到集群的所有流量都通过代理,因此客户端永远无法直接访问namenode和datanode。这允许实施更严格的防火墙和贷款限制策略。在位于不同数据中心的Hadoop集群之间或从外部网络访问在云中运行的Hadoop集群时,通常使用代理进行传输。
3.14-Java接口:
从Hadoop URL读取数据
使用FileSystem API读取数据
查询文件系统
3.15-数据流:
数据读取:客户端通过在FileSystem对象上调用open()来打开系统读取的数据。对于HDFS,该对象是DistributedFileSystem的一个实例。DistributedFileSystem使用远程过程调用(RPC)namenode,以确定文件中前几个块的位置。对于每个块,namenode返回具有该块副本的数据。此外数据节点根据它们与客户端的接近程度排序。
DistributedFileSystem向客户端返回一个FSDataInoutStream,以便客户端从中读取数据。FSDataInoutStream反过来包装一个DFSDataInoutStream,它管理datanode和namenode的I/O。
下一个块的数据节点对于客户端时透明的。从它的角度来看,它只是在读取一个连续的流。块按顺序读取,FSDataInoutStream在客户端读取流式打开数据节点的新连接。它还将根据需要调用namenode来检索下一批块的数据节点位置。当用户端完成读取后,它调用FSDataInoutStream上的close().
写入文件:namenode执行检查以确保文件不存在并且客户端具有创建文件的正确权限。如果通过减产,namenode会记录新文件。
DFSOutputStream会将写入数据拆分成数据包,并将其写入一个称为数据队列的内部队列。数据队列由DataStream使用,它负责通过选择合适的数据节点列表来请求namenode节点分配新块以存储副本。
数据节点列表形成一个pipeline,DataStreamer将数据包流式传输给pipeline,pipeline中的datanode一次接受存储数据包中的内容。
3.16-使用distcp进行并行复制:
以上时HDFS访问模式的单线程访问。它还可以对文件集合进行操作。
4 YARN
YARN是Hadoop的集群资源管理系统。提供了用于请求和使用集群资源的API。这些API通常不被用户代码直接使用。
4.1-YARN应用程序解析:
YARN通过两种类型的长时间守护线程提供核心服务:一个资源管理器,用于管理整个资源使用,以及运行在集群中所有节点上的节点管理器,用于启动和监控容器。
在YARN上运行应用程序:
客户端联系资源管理器并要求它运行应用程序主进程。资源管理器找到节点管理器,它可以在容器中启动应用程序的主控制器。
4.2-YARN与MapReduce比较:
YARN可以在比MapReduce1更大的集群中运行。与jobtracker相比,应用程序的每个实例都有一个专用的程序主控制器,它在应用程序的持续时间内运行。
4.3-YARN中的调度:
在理想情况下,YARN应用程序发出的请求将立即获得批准。然而,在现实世界中,资源是涌现的,在繁忙的集群上,应用程序通常需要等到获得某些请求得到满足。YARN调度程序的工作是根据一些定义的策略为应用程序分配资源。
使用Fair Scheduler,无需预留一定数量的容量。因为它将动态平衡所有在运行的作业之间的资源。就在第一个大型作业开始后,它是唯一云心的作业,因此它获取了集群中的所有资源。当第二个小作业开始时,它被分配了一半的资源,以便每个作业都使用其公平份额的资源。
以下为三个调度器的基本操作:
5 Hadoop I/O
Hadoop带有一组用于数据I/O的原语。其中一些是比Hadop更通用的技术。例如数据完整性和压缩。
5.1-数据完整性:
Hadoop用户正确的期望在存储或处理期间不会丢失或损坏任何数据。但是由于磁盘或网络的每个I/O操作都带有将错误引入其正在读写的数据的概率。因此当流经系统的数据量与Hadoop能够处理的数据量一样大时,发生数据损坏的可能性很高。
检验损坏数据的检测代码为CRC-32:它为任意大小的输入计算32位整数校验和。它用于Hadoop的ChecksumFileSystem中的校验和,而HDFS使用更高效的变体称为CRC-32C。
5.2-压缩:
所有压缩算法都表现出空间/时间权衡:更快的压缩和戒烟速度同城时以节省空间的代价。
5.3-编码器:
编码器是压缩-解压算法的实现。在Hadoop中,编码器由CompressionCodec接口实现。
5.4-基于文件的数据结构:
序列文件: 想象一个日志文件,其中每一个日志记录都是一个新的文本行。如果记录二进制类型。纯文本不是合适的格式。Hadoop的SquenceFile类适合这种情况。为二进制键值提供持久化的数据结构。
相关阅读:
White, T., 2012. Hadoop: The definitive guide. " O'Reilly Media, Inc.".