Hadoop权威指南读书笔记


本书中提到的Hadoop项目简述

内容笔记


mapreduce数据本地化(核心特征)、无共享。    1  HDFS的设计
  • 为了存储超大文件
  • 流式访问(一次写入多次读取)
  • 商用硬件(不需要超豪华的机器)
   2  数据快(block)
  • 磁盘一般是512字节
  • HDFS默认是64M
  • 但与其他文件系统不同的是小于一个块大小的文件不会占用整个块的空间。
  • 块为什么设置这么大?(最小化寻址开销)
  • 块抽象带来的好处(一个文件的大小可以大于网络中任意磁盘的大小,因为文件的所有的块并不需要存储在同一个磁盘中)第二个好处,使用块抽象大大简化了存储子系统的设计。第三。非常适合数据备份,增加了数据容错能力。
     3  NameNode和DataNode
  • HDFS中有一个NN多个DN,NN管理文件系统的命名空间,它维护这文件系统树及整棵书内所有文件和目录。这写信息保存在命名空间镜像文件(fsimage)和编辑日志文件(edits)
  • DN是文件系统的工作节点,存储并检索数据块,并定期想NN发送他们所存储的块的列表。
  • NN非常重要,所以容错非常重要,hadoop提供了两中机制。第一种是备份那写组成文件系统元数据持久状态的文件。Hadoop可以配置使NN在多个文件系统上保存元数据的持久状态。这写操作是实时同步的,是原子操作。一般的配置是,将持久状态写入本地磁盘的同时,写入一个远程挂载的网络文件系统(NFS)。另一种是运行一个辅助NN,但它不能被用作NN,这个辅助NN的重要作用是定期通过编辑日志合并命名空间镜像,以防止编辑日志过大。这个SNN一般在另一台单独的无力计算机上运行,以为他需要占用大量的cpu和NN相同容量的内存来执行合并操作。它会保存合并后的命名空间镜像的副本,并在NN发生故障时启用。但是SNN滞后与NN,所以如果NN全部失效,难免会丢失部分数据。在这种情况下,一般把存储在NFS上的NN元数据复制到SNN并作为新的NN运行。

关于MapReduce

· Hadoopmapreduce的输入划分成等长的小数据快,成为输入切分(input split)或简称分片。对于大多数作业来说,一个合理的分片大小趋向于HDFS的一个块的大小,默认是64M

· 最核心的思想:数据本地最优化(data locality optimization),map任务将其输出写入到本地硬盘,而非HDFS

· 

 
 
reduce任务的数量并非由输入数据的大小决定,而是特别指定的。如果有多个reduce
 
 
任务,则每个map任务都会对其输出进行分区(partition),即为每个reduce任务建立一个分区。

上图显示就知道,mapreduce之间的数据流为什么被称为shuffle(混洗)

· 集群上的可用宽带限制了MR作业的数量,因此最重要的一点是尽量避免MR之间的数据传输。H允许用户针对M的输出指定一个合并函数,合并函数的输出作为R的输入。但是在MR中使用C是需要谨慎考虑的。有可能造成reduce输出的结果不正确。

Hadoop分布式文件系统

· HDFS以流式数据访问模式来存储超大文件,运行于商用硬件集群上。构建思路是这样的:一次写入、多次读取是最高效的访问模式。HDFS的块默认为64MB。与其他文件系统不同的是,HDFS中小于一个块大小的文件不会占据整个块的空间。为何HDFS中的块如此之大?(HDFS的块比磁盘块大,其目的是为了最小化寻址开销)

· HDFS集群有两类节点,并以管理者-工作者模式运行,即一个namenode和多个datanodenamenode管理文件系统的命名空间。它维护着文件系统树及整颗树内所有的文件和目录。这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件和编辑日志文件。namenode也记录着每个文件中各个块所在的数据节点信息。但他并不永久保存块的位置信息,因为这写信息会在系统启动时由数据节点重建。dataname是文件系统的工作节点,他们根据需要存储并检索数据块,并且定期向namenode发送他们所存储的块的列表。

· namenode实现容错非常用药,有两种机制:一、备份那写组成文件系统元数据持久状态的文件。二、运行一个辅助namenode,但它不能被用作namenode。这个辅助namenode的重要作用是定期通过编辑日志合并命名空间镜像,以防止编辑日志过大。

· Hadoop URL中读取数据

· 通过FileSystemAPI读取数据,关键代码FileSystem fs=FileSytem.get(URI,conf),FileSystem对象的open方法返回的是FSDataInputStream对象,它继承了DataInputStream。他支持随机访问,可以从流的任意位置读取数据。

· 创建目录:FileSystemmkdirs方法

· 查询文件系统:FileSystemFileStatus,列出文件:listStatus,通配符查询:globStatus,可以配合PathFilter对象使用正则表达式,精确定位文件。

· 删除文件:FileSystemdelete方法。

 

文件读取剖析

 
 
 
 
 

 

文件写入剖析

 
 


副本的布局

 
 
 

· 文件系统的一致模型描述了对文件读/写的数据可见性。需要调用flushsync方法后,才能同步数据。这个一致模型和你设计应用程序的具体方法息息相关。需要找到一个合适的使用sync方法的频率。

· distcp并行复制。在两个HDFS集群之间传输数据。例如相同版本的HDFS%hadoop distcp hdfs://namenode1/foo hdfs://namenode2/bar。不同版本的HDFS%hadoop distcp hftp://namenode1:50070/foo hdfs://namenode2/bar这里注意:源路径必须是绝对路径。

· Hadoop存档工具。%hadoop archive -archiveName files.har /my/files /myHAR文件一旦创建,存档文件便不能修改,要想从中增减文件,必须吃哦够耐心创建存档文件。


Hadoop I/O

· 数据完整性。检测数据是否损坏的常见措施是,在数据第一次引入系统时计算校验和(checksum),并在数据通过一个不可靠的通道进行栓书时再次计算校验和,这样就能发现数据是否损坏。常用的错误检测码是CRC-32(循环冗余校验),任何大小的数据输入均计算得到一个32位证书校验和。datanode负责在验证收到的数据后存储数据及其校验和。每个datanode会在后台线程中运行一个DataBlockScanner,从而定期验证存储在这个datanode上的所有数据快。

· 压缩:文件压缩两个好处,可以较少存储文件所需要的磁盘空间;可以加速数据在网络和磁盘上的传输。压缩格式:DEFLATE(不可切分),Gzip(不可切分),bzip2(可切分),LZO(不可切分)。选项-1为优化压缩速度,-9为优化压缩空间。可切分压缩格式bzip2尤其适合MapReducecodec实现了一种压缩-解压算法。MR会在读取文件时自动解压缩文件

· 序列化。在进程间通信和永久存储中使用。Hadoop使用writable序列化。Writable有两个方法:writereadFields.

 
 
 

· AVRO。是一个独立与编程语言的序列化系统。通常是用JSON编写,而数据通常是二进制编码。Avro文件支持压缩。并且是可切分的。Avro还可以用于RPC

· Sequence file(写入sequencefile。读取sequencefile

 
 
MapFile。(写入Mapfile,读取MapfileMapFile是已经排序的SequenceFile,它已加入用于搜索键的索引。可以将MapFile视为java.util.Map的持久化形式。
 
 
SequenceFile转换为MapFile。对SequenceFile排序和建立索引。MapFilefix()静态方法能够为MapFile重建索引。

MapReduce应用开发

· Mr有一个特定的流程。首先写map函数和reduce函数,最好使用单元测试来确保函数的运行符合预期。然后,写一个驱动程序来运行作业,要看这个驱动程序是否可以运行,可以从本地IDE用一个小的数据集来运行它。如果驱动程序不能正确运行,就用本地IDE调试。一旦程序通过了小的数据集测试,就可以准备运行在集群上了。

· 配置API。在H中通过Configuration实例代表配置属性及其取值的一个集合。可以把多个配置文件合并在一起,但是后面的配置文件中的属性会覆盖前面的相同属性值,如果属性指定为final则不会覆盖。

· MapReduceWeb界面。http://jobtracker-host:50030

· 察看MR输出结果。1、合并MR输出结果hadoop fs -getmerge …....2hadoop fs -cat output/*

· 使用远程调试器。首先配置属性keep.failed.task.files的值为true,以便在任务失败时,tasktracker能保留足够的信息让人物在相同的输入数据上重新运行。然后再次运行作业,并使用WebUI察看故障节点和task attempt ID,接着,需要使用前面保留的文件作为输入,运行一个特殊的作业运行器,即IsolationRunner

· 作业调优。mapper的数量。reducer数量,combiner。中间值的压缩。自定义序列。调整shuffle

· 分析任务。HPROF分析工具(是JDK自带的分析工具)。


MapReduce的工作机制

· 

 
 
上图包含4个独立的实体。1、客户端:提交MR作业。2jobtracker:协调作业的运行。jobtracker是一个java应用程序,他的主类是JobTracker3tasktracker:运行作业划分后的人物。tasktrackerjava应用程序,主类为TaskTracker4、分布式文件系统(HDFS)。用来在其他实体间共享作业文件。

 

· 

 
 
告知jobtracker作业准备执行。

 

 
 
 

 

 

 

· 

 
 
 
 

· StreamingPipes

· 

 
 
状态更新

· 

 
 
任务失败。1MR任务中用户代码一场。子任务进程会在退出之前向其父tasktracker发送错误报告。最后被计入用户日志。Tasktracker会将此次task attempt标记为failed,释放一个任务槽运行另外一个任务。2、一旦tasktracker注意到JVM有一段时间没有更新(默认是10分钟),则JVM子进程将被自动杀死。3jobtracker知一个task attempt失败后,将重新调度该任务的执行。一般超过4此,将不会再重试。

· 作业的调度。1FIFO2、优先队列。3Fair Scheduler4Capacity Scheduler.

· shuffle和排序。MR确保每个reducer的输入都按键排序。系统执行排序的过程——map输出作为输入传给reducer,称为shuffleshuffleMR的心脏,是奇迹发生的地方。

· 

 
 
配置的调优。总的原则是给shuffle过程尽量多提供内存空间。在map端,要便面多次溢出写磁盘来获得最佳性能。在Reduce端,中间数据全部驻留在内存时,获得最佳性能。H使用默认为4kb的缓冲区,这是很低的,因此应该在集群上增加这个值。尝试JVM重用。跳过坏记录。

MapReduce的类型与格式

· MR的类型。1Map:(k1,v1)——list(k2,v2).reduce(k2list(v2))——list(k3v3)2map:(k1,v1)——list(k2,v2).combine:(k2,listk2))——list(k2,v2).reduce:(k2,list(v2))——list(k3,v3)combinereduce函数通常是一样的,在这种情况下,k3k2类型相同,v3v2类型相同。Partition函数将中间的key/value(k2,v2)进行处理,并且返回一个分区索引。实际上是单独由key决定(value被忽略)。Partition:(k2,v2)——integer.

· 输入分片与记录。一个输入分片是由一个map处理的输入块。每个map操作只处理一个输入分片。每个分片被划分为若干个记录,每个记录就是一个key/value对,map一个接一个的处理每条记录。注意,灭个分片并不包含数据本身,而是指向数据的引用(reference)

· FileInputFormat类。FileInputFormat提供四种静态方法来设定JobConf的输入路径,addInputPath,addInputPaths,setInputPaths,setInputPaths,一条路径可以表示一个文件,一个目录或是一个glob,即一个文件和目录的集合。

· 文本输入:Hadoop非常擅长处理非结构化文本数据。TextInputFormat:是默认的InputFormat,每条记录是一行输入。键是LongWritable类型,存储该行在整个文件中的字节偏移量。值是这行的内容,是Text类型。KeyValueTextInputFormat:文件中的每一行是一个键/值对,使用某个分界符进行分割,分隔符前面是key,后面是value。分隔符可以通过key.value.separator.in.input.line属性指定分隔符。默认是制表符。NLineInputFormat:控制mapper收到固定行数的输入,键是文件中行的字节偏移量,值是行本身。N是每个mapper受到的输入行数。N通过mapred.ine.input.format.linespermap控制。

 
 

· 二进制输入:SequenceFileInputFormat:以顺序文件格式存储二进制的键/值对的序列。SequenceFileAsTextInputFormat将顺序文件的键和值转换为Text对象。SequenceFileAsBinaryInputFormat获取顺序文件的键和值作为二进制对象。(BytesWritable)

· FileInputFormat类的输入分片。给定一组文件,FileInputFormat是如何把他们转换为输入分片?FileInputFormat只分割大文件。这里的指的是超过HDFS快的大小。分片统称与HDFS块大小一样。这个值也可以通过设置不同的Hadoop属性改变。分片的大小由公式max(minimumSize,min(maximumSize,blockSize))计算。

· 小文件与CombineFileInputFormat

· 避免切分。1、增加最小分片大小,大于要处理的最大文件大小。2、使用FileInputFormat具体子类,并且重载isSplitable()方法,把返回值设置为false

· 输出格式FileOutputFormat

· 

 
 
有时可能需要对输出的文件名进行控制,或让每个reducer输出多个文件,MR为此提供了两个库:MultipleOutputFormatMultipleOutput类。

· 计数器。Hadoop为每个作业维护若干内置计数器,以描述该作业的各项指标。例如,记录已处理的字节数和记录数。计数器由其关联人物维护,并定期传到tasktracker,再由tasktracker传给jobtracker。因此,计数器能够被全局的聚集。与其他计数器不同,内置的作业计数器实际上由jobtracker维护,不必在整个网络中传送。

· 排序。

· 连接。map端连接,在两个大规模输入数据集之间的map端连接会在数据到达map函数之间就执行连接操作。为达到这个目的,各map的输入数据必须先区分并且以特定方式排序。各个输入数据集被划分成相同数量的分区,并且均按相同的健排序(连接健)。同一健的所有记录均会放在同一分区之中。利用org.apache.hadoop.mapred.join包中的CompositeInputFormat类来运行一个map端连接。reduce端连接,reduce端连接并不要求输入数据集符合特定结构,因而reduce连接比map端连接更为常用。

· 分布式缓存。

· 构建Hadoop集群

· 管理Hadoop


PIG

· Pig为大型数据集的处理提供了更高层次的抽象。是一种探索大规模数据集的脚本语言。Pig被设计为可扩展的。处理路径中的每个部分,载入、存储、过滤、分组、连接,都是可以定制的。Pig并不适合所有的数据处理任务,它是为数据批处理而设计的。

· 执行类型(1)本地模式(2MapReduce模式。运行Pig程序:(1)脚本(2Grunt3)嵌入式方法。

· 与数据库比较:Pig Latin是一种数据留编程语言,而SQL是一种描述型编程语言。换句话说,一个Pig Latin程序是相对于输入的一步步操作。其中每一歩都是对数据的一个简单的变换。相反,SQL语句是一个约束的集合。这些约束在一起,定义了输出。RDBMS把数据存储在严格定了模式的表内。Pig对他处理的数据要求则宽松了很多:可以在运行时定义模式,而且这是可选的。几个支持在线和低延迟查询的特性是RDBMS有但Pig没有的,例如事务和索引。Hive介于Pig和传统的RDBMS之间。和Pig一样,Hive也被设计为用HDFS作为存储。但是他们之间有着显著的区别。Hive的查询语言HiveQL,是基于SQL的。和RDBMS相同,Hive要求所有数据必须存储在表中,表必须有模式,而模式有Hive进行管理。但是Hive允许在预先存在于HDFS的数据关联一个模式。所以数据的加载步骤是可选的。

· PIG的关系操作(1)加载和存储:LOADSTOREDUMP2)过滤:FILTERDISTINGCTFOREACH...GENERATESTREAMSAMPLE3)分组和连接JOINCOGROUPGROUPCROSS4)排序:ORDERLIMIT5)合并与分割UNIONSPLIT6UDFREGISTERDEFINE。(7 HADOOPMapReduce相关命令。


HIVE

· Hive是一个构建在Hadoop上的数据仓库框架。Hive是应Facebook每天产生的海量新兴社会网络数据进行管理和(机器)学习的需求而产生和发展的。Hive的设计目的是让精通SQL技能(但Java编程技能相对较弱)的分析师能够在Facebook存放在HDFS的大规模数据集上运行查询。当然,SQL并不是所有的大数据问题的理想工具,但是他对很多分析任务非常有用,Hive有条件和这些产品进行集成。

· Hive外壳环境。外壳环境是我们和Hive进行交互,发出HiveQL命令的主要方式。命令语法非常像MySQL

· Hive的体系结构

· 

 
 
metastore。是Hive云数据的集中存放地。包括两部分:服务和后台数据的存储。默认情况下,metastore服务和Hive服务运行在同一个JVM中。metastore的配置如下图。如果要支持多绘画(以及多用户),需要使用一个独立的数据库。这种配置称本地metastore”,因为metastore服务仍然和Hive服务运行在同一个进程中,但连接的却是在另一个进程中运行的数据库,在同一台机器上或在远程机器上。MySQL是一种很受欢迎的独立metastore的选择。

· 

 
 
RDBMS比较。Hive在很多方面和传统数据库类似,但是它底层对HDFSMapReduce的依赖意味着他的体系结构有别于传统数据库。在传统数据库里,表的模式是在数据加载时强制确定的。这一设计有时被成为写时模式Hive对数据的验证并不再加载数据时进行,而在查询时进行。这称为读时模式。读时模式可以使数据加载非常迅速。写时模式有利于提升查询性能。更新、事务和索引都是传统数据库最重要的特性,但是Hive也还没有考虑支持这些特性。

· HiveQL:可以勉强看作是对MySQL方言的模仿。

· 托管表和外部表。在Hive中创建表时,默认情况下Hive负责管理数据。这意味着Hive把数据移入它的仓库目录。另一种选择是创建一个外部表。这会在Hive到仓库目录以外的位置访问数据。这两种表的区别表现在LOADDROP命令的语义上。托管表:DROP这个表(包括他的元数据和数据)会被一起删除。外部表(EXTERNAL关键字):DROP时,Hive不会碰数据,而只会删除元数据。最为一个经验法则,如果所有处理都有Hive完成,应该使用托管表。但如果要用Hive和其他工具来处理同一个数据集,应该使用外部表。普遍的用法是把存放在HDFS(由其他进程创建)的初始数据集用作外部表使,然后用Hive的变换功能把数据移动到托管的Hive表。这一方法反之也成立——外部表(未必在HDFS中)可以用于从Hive到处数据供其应用程序使用。需要使用外部表的另一个原因是你想为同一个数据集关联不同的模式。

· 分区和桶。Hive把表组织成分区,这是一种根据分区列的值对表进行粗略划分的机制。使用分区可以加快数据分片的查询速度。表或分区可以进一步分为。他会为数据提供额外的结构以获得更高效的查询处理。


HBase

· Hbase是一个HDFS上开发的面向列的分布式数据库。如果需要实时的随机读/写超大规模数据集,就可以使用HBaseHBase从另一个方向解决了可伸缩性的问题。它自底向上的进行构建,能够简单的通过增加节点来达到线性扩展。HBase并不关系型数据库,不支持SQL。但是在特定的问题空间里,他能够做RDBMS不能做的问题:在廉价的硬件构成的集群上管理超大规模的稀疏表。

· 区域。HBase自动把表水平划分成区域。每个区域由表中行的子集构成。每个区域由它所属的表、他所包含的第一行以及最后一行来表示。区域是在HBase集群分布数据的最小单位。

· Hbase采用一个Master节点协调管理一个或多个Regionserver从属机。HBasemaster负责启动和全新的安装、把区域分配给注册的Regionserver,回复Regionserver的故障。Master的负载很轻。Regionserver负责零个或多个区域的管理以及响应客户端的读写请求。Regionserver还负责区域的划分,并通知Master有了新的子区域,这样master就可以把父区域设为离线,并用子区域替换父区域。

· 

 
 
HBase依赖于ZooKeeper。默认情况下,它管理一个ZooKeeper实例。

· HbaseRDBMS的比较。HBase是一个分布式的、面向列的数据存储系统。它通过在HDFS上提供随机读写来解决Haoop不能处理的问题。HBase自底向上设计即聚焦于各种可伸缩行问题。


ZooKeeper

· ZooKeepersHadoop的分布式协调应用,它提供一组工具,使得在构建分布式应用时能够对部分失败进行正确处理。

· ZooKeeper可以看作是一个具有高可用性的文件系统。但是这个文件系统中没有文件和目录,而是统一使用节点node)的概念,称为znodeznode既可以作为保存数据的容器(如同文件),也可以作为保存其他znode的容器(如同目录)。所有的znode构成一个层次化的命名空间。

· 

 
 
创建组、加入组、列出组成员、删除组(不支持递归删除操作)

· ZooKeeper命令行工具,zkCli.sh -server localhost cmd args 

· zooKeeper维护一个树形层次结构,树中的节点被称为znodeznode可以用于存储数据,并且有一个与之相关联的ACLZooKeeper被设计用来实现协调服务,而不是用于存储大数据,一次一个znode能存储的数据被限制在1MB以内。ZooKeeper的数据访问具有原子性。znode有两中类型:短暂的和持久的。对于那写需要知道特定时刻有哪些分布式资源可用的应用来说,使用短暂znode是一种理想的选择。ZooKeeper服务的操作:createdeleteexistsgetACLsetACLgetChildrengetDatasetDatasync(将客户端的znode视图与ZooKeeper同步。

· Zookeeper服务有两种不同的运行模式。一种是独立模式,即只有一个ZooKeeper服务器。在生产环境中通常以复制模式运行与一个计算机集群上,这个计算机集群被称为一个集合体ZooKeeper通过复制来实现高可用性,只要集合体中半数以上的及其处于可用状态,他就能够提供服务。从概念上来说,ZooKeeper是非常简单的:它所做的就是确保对znode树的每一个修改都会被复制到集合体中超过半数的机器上。


Sqoop

· sqoop是一个开源工具,他允许用户将数据从关系型数据库抽取到Haoop中,用于进一步的处理。抽取出的数据可以被MapReduce程序使用,也可以被其他类似鱼Hive的工具使用。一旦形成分析结果,Sqoop便可以将这些结果导回数据库,使其他客户端使用。

· 数据导入:

· 

 
 
数据导出:

· 

 
 
进程的并行特性,导致导出操作往往不是原子操作。Sqoop会生成多个并行执行的任务,分别导出数据的一部分。数据库系统经常使用固定大小的缓冲区来存储事务数据,这使一个任务中的所有操作不可能在一个事务中完成。Sqoop每导入几千条记录便执行一次提交,以确保不会出现内存不足的情况。如果任务失败,他们会从头开始重新导入自己负责的那部分数据,因此可能会插入重复的记录。

相关内容