本书中提到的Hadoop项目简述
Common:一组分布式文件系统和通用I/O的组件与接口(序列化、javaRPC和持久化数据结构)。
Avro:一种支持高效、跨语言的RPC以及永久存储数据的序列化系统。
MapReduce:分布式数据处理模型和执行环境,运行于大型商业集群。
HDFS:分布式文件系统,运行于大型商用机集群。
Pig:一种数据流语言和运行环境,用以检索非常大的数据集。Pig运行在MapReduce和HDFS的集群上。
Hive:一个分布式、按列存储的数据仓库。Hive管理HDFS中存储的数据,并提供基于SQL的查询语言(由运行时引擎翻译成MapReduce作业)用以查询数据。
HBase:一个分布式、按列存储数据库。HBase使用HDFS作为底层存储,同时支持MapReduce的批量式计算和点查询(随机读取)。
ZooKeeper:一个分布式、可用性高的协调服务。ZooKeeper提供分布式锁之类的基本服务,用于构建分布式应用。
Sqoop:在数据库和HDFS之间高效传输数据的工具。
内容笔记
本书中提到的Hadoop项目简述
· Common:一组分布式文件系统和通用I/O的组件与接口(序列化、java RPC和持久化数据结构)。
· Avro:一种支持高效、跨语言的RPC以及永久存储数据的序列化系统。
· MapReduce:分布式数据处理模型和执行环境,运行于大型商业集群。
· HDFS:分布式我呢间系统,运行于大型商用机集群。
· Pig:一种数据流语言和运行环境,用以检索非常大的数据集。Pig运行在MapReduce和HDFS的集群上。
· Hive:一个分布式、按列存储的数据仓库。Hive管理HDFS中存储的数据,并提供基于SQL的查询语言(由运行时引擎翻译成MapReduce作业)用以查询数据。
· HBase:一个分布式、按列存储数据库。HBase使用HDFS作为底层存储,同时支持MapReduce的批量式计算和点查询(随机读取)。
· ZooKeeper:一个分布式、可用性高的协调服务。ZooKeeper提供分布式锁之类的基本服务,用于构建分布式应用。
· Sqoop:在数据库和HDFS之间高效传输数据的工具。
关于MapReduce
· Hadoop将mapreduce的输入划分成等长的小数据快,成为输入切分(input split)或简称分片。对于大多数作业来说,一个合理的分片大小趋向于HDFS的一个块的大小,默认是64M。
· 最核心的思想:数据本地最优化(data locality optimization),map任务将其输出写入到本地硬盘,而非HDFS。
·
上图显示就知道,map和reduce之间的数据流为什么被称为shuffle(混洗)
· 集群上的可用宽带限制了MR作业的数量,因此最重要的一点是尽量避免M和R之间的数据传输。H允许用户针对M的输出指定一个合并函数,合并函数的输出作为R的输入。但是在MR中使用C是需要谨慎考虑的。有可能造成reduce输出的结果不正确。Hadoop分布式文件系统
· HDFS以流式数据访问模式来存储超大文件,运行于商用硬件集群上。构建思路是这样的:一次写入、多次读取是最高效的访问模式。HDFS的块默认为64MB。与其他文件系统不同的是,HDFS中小于一个块大小的文件不会占据整个块的空间。为何HDFS中的块如此之大?(HDFS的块比磁盘块大,其目的是为了最小化寻址开销)
· HDFS集群有两类节点,并以管理者-工作者模式运行,即一个namenode和多个datanode。namenode管理文件系统的命名空间。它维护着文件系统树及整颗树内所有的文件和目录。这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件和编辑日志文件。namenode也记录着每个文件中各个块所在的数据节点信息。但他并不永久保存块的位置信息,因为这写信息会在系统启动时由数据节点重建。dataname是文件系统的工作节点,他们根据需要存储并检索数据块,并且定期向namenode发送他们所存储的块的列表。
· namenode实现容错非常用药,有两种机制:一、备份那写组成文件系统元数据持久状态的文件。二、运行一个辅助namenode,但它不能被用作namenode。这个辅助namenode的重要作用是定期通过编辑日志合并命名空间镜像,以防止编辑日志过大。
· 从Hadoop URL中读取数据
· 通过FileSystemAPI读取数据,关键代码FileSystem fs=FileSytem.get(URI,conf),FileSystem对象的open方法返回的是FSDataInputStream对象,它继承了DataInputStream。他支持随机访问,可以从流的任意位置读取数据。
· 创建目录:FileSystem的mkdirs方法
· 查询文件系统:FileSystem的FileStatus,列出文件:listStatus,通配符查询:globStatus,可以配合PathFilter对象使用正则表达式,精确定位文件。
· 删除文件:FileSystem的delete方法。
文件读取剖析
文件写入剖析
副本的布局
· 文件系统的一致模型描述了对文件读/写的数据可见性。需要调用flush和sync方法后,才能同步数据。这个一致模型和你设计应用程序的具体方法息息相关。需要找到一个合适的使用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 /my。HAR文件一旦创建,存档文件便不能修改,要想从中增减文件,必须吃哦够耐心创建存档文件。
Hadoop I/O
· 数据完整性。检测数据是否损坏的常见措施是,在数据第一次引入系统时计算校验和(checksum),并在数据通过一个不可靠的通道进行栓书时再次计算校验和,这样就能发现数据是否损坏。常用的错误检测码是CRC-32(循环冗余校验),任何大小的数据输入均计算得到一个32位证书校验和。datanode负责在验证收到的数据后存储数据及其校验和。每个datanode会在后台线程中运行一个DataBlockScanner,从而定期验证存储在这个datanode上的所有数据快。
· 压缩:文件压缩两个好处,可以较少存储文件所需要的磁盘空间;可以加速数据在网络和磁盘上的传输。压缩格式:DEFLATE(不可切分),Gzip(不可切分),bzip2(可切分),LZO(不可切分)。选项-1为优化压缩速度,-9为优化压缩空间。可切分压缩格式bzip2尤其适合MapReduce。codec实现了一种压缩-解压算法。MR会在读取文件时自动解压缩文件
· 序列化。在进程间通信和永久存储中使用。Hadoop使用writable序列化。Writable有两个方法:write,readFields.
· AVRO。是一个独立与编程语言的序列化系统。通常是用JSON编写,而数据通常是二进制编码。Avro文件支持压缩。并且是可切分的。Avro还可以用于RPC。
· Sequence file(写入sequencefile。读取sequencefile)
MapReduce应用开发
· Mr有一个特定的流程。首先写map函数和reduce函数,最好使用单元测试来确保函数的运行符合预期。然后,写一个驱动程序来运行作业,要看这个驱动程序是否可以运行,可以从本地IDE用一个小的数据集来运行它。如果驱动程序不能正确运行,就用本地IDE调试。一旦程序通过了小的数据集测试,就可以准备运行在集群上了。
· 配置API。在H中通过Configuration实例代表配置属性及其取值的一个集合。可以把多个配置文件合并在一起,但是后面的配置文件中的属性会覆盖前面的相同属性值,如果属性指定为final则不会覆盖。
· MapReduce的Web界面。http://jobtracker-host:50030。
· 察看MR输出结果。1、合并MR输出结果hadoop fs -getmerge …....。2、hadoop fs -cat output/*
· 使用远程调试器。首先配置属性keep.failed.task.files的值为true,以便在任务失败时,tasktracker能保留足够的信息让人物在相同的输入数据上重新运行。然后再次运行作业,并使用WebUI察看故障节点和task attempt ID,接着,需要使用前面保留的文件作为输入,运行一个特殊的作业运行器,即IsolationRunner。
· 作业调优。mapper的数量。reducer数量,combiner。中间值的压缩。自定义序列。调整shuffle。
· 分析任务。HPROF分析工具(是JDK自带的分析工具)。
MapReduce的工作机制
·
·
·
· Streaming和Pipes
·
·
· 作业的调度。1、FIFO。2、优先队列。3、Fair Scheduler。4、Capacity Scheduler.
· shuffle和排序。MR确保每个reducer的输入都按键排序。系统执行排序的过程——将map输出作为输入传给reducer,称为shuffle。shuffle是MR的心脏,是奇迹发生的地方。
·
MapReduce的类型与格式
· MR的类型。1、Map:(k1,v1)——list(k2,v2).reduce:(k2,list(v2))——list(k3,v3)。2、map:(k1,v1)——list(k2,v2).combine:(k2,listk2))——list(k2,v2).reduce:(k2,list(v2))——list(k3,v3)。combine与reduce函数通常是一样的,在这种情况下,k3与k2类型相同,v3与v2类型相同。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
·
· 计数器。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)本地模式(2)MapReduce模式。运行Pig程序:(1)脚本(2)Grunt(3)嵌入式方法。
· 与数据库比较: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)加载和存储:LOAD、STORE、DUMP(2)过滤:FILTER、DISTINGCT、FOREACH...GENERATE、STREAM、SAMPLE(3)分组和连接JOIN、COGROUP、GROUP、CROSS(4)排序:ORDER、LIMIT(5)合并与分割UNION、SPLIT(6)UDF:REGISTER、DEFINE。(7) HADOOP和MapReduce相关命令。
HIVE
· Hive是一个构建在Hadoop上的数据仓库框架。Hive是应Facebook每天产生的海量新兴社会网络数据进行管理和(机器)学习的需求而产生和发展的。Hive的设计目的是让精通SQL技能(但Java编程技能相对较弱)的分析师能够在Facebook存放在HDFS的大规模数据集上运行查询。当然,SQL并不是所有的“大数据”问题的理想工具,但是他对很多分析任务非常有用,Hive有条件和这些产品进行集成。
· Hive外壳环境。外壳环境是我们和Hive进行交互,发出HiveQL命令的主要方式。命令语法非常像MySQL。
· Hive的体系结构
·
·
· HiveQL:可以勉强看作是对MySQL方言的模仿。
· 托管表和外部表。在Hive中创建表时,默认情况下Hive负责管理数据。这意味着Hive把数据移入它的“仓库目录”。另一种选择是创建一个“外部表”。这会在Hive到仓库目录以外的位置访问数据。这两种表的区别表现在LOAD和DROP命令的语义上。托管表:DROP这个表(包括他的元数据和数据)会被一起删除。外部表(EXTERNAL关键字):DROP时,Hive不会碰数据,而只会删除元数据。最为一个经验法则,如果所有处理都有Hive完成,应该使用托管表。但如果要用Hive和其他工具来处理同一个数据集,应该使用外部表。普遍的用法是把存放在HDFS(由其他进程创建)的初始数据集用作外部表使,然后用Hive的变换功能把数据移动到托管的Hive表。这一方法反之也成立——外部表(未必在HDFS中)可以用于从Hive到处数据供其应用程序使用。需要使用外部表的另一个原因是你想为同一个数据集关联不同的模式。
· 分区和桶。Hive把表组织成“分区”,这是一种根据“分区列”的值对表进行粗略划分的机制。使用分区可以加快数据分片的查询速度。表或分区可以进一步分为”桶“。他会为数据提供额外的结构以获得更高效的查询处理。
HBase
· Hbase是一个HDFS上开发的面向列的分布式数据库。如果需要实时的随机读/写超大规模数据集,就可以使用HBase。HBase从另一个方向解决了可伸缩性的问题。它自底向上的进行构建,能够简单的通过增加节点来达到线性扩展。HBase并不关系型数据库,不支持SQL。但是在特定的问题空间里,他能够做RDBMS不能做的问题:在廉价的硬件构成的集群上管理超大规模的稀疏表。
· 区域。HBase自动把表水平划分成”区域“。每个区域由表中行的子集构成。每个区域由它所属的表、他所包含的第一行以及最后一行来表示。区域是在HBase集群分布数据的最小单位。
· Hbase采用一个Master节点协调管理一个或多个Regionserver从属机。HBase的master负责启动和全新的安装、把区域分配给注册的Regionserver,回复Regionserver的故障。Master的负载很轻。Regionserver负责零个或多个区域的管理以及响应客户端的读写请求。Regionserver还负责区域的划分,并通知Master有了新的子区域,这样master就可以把父区域设为离线,并用子区域替换父区域。
·
· Hbase和RDBMS的比较。HBase是一个分布式的、面向列的数据存储系统。它通过在HDFS上提供随机读写来解决Haoop不能处理的问题。HBase自底向上设计即聚焦于各种可伸缩行问题。
ZooKeeper
· ZooKeepers和Hadoop的分布式协调应用,它提供一组工具,使得在构建分布式应用时能够对部分失败进行正确处理。
· ZooKeeper可以看作是一个具有高可用性的文件系统。但是这个文件系统中没有文件和目录,而是统一使用“节点”(node)的概念,称为znode。znode既可以作为保存数据的容器(如同文件),也可以作为保存其他znode的容器(如同目录)。所有的znode构成一个层次化的命名空间。
·
· ZooKeeper命令行工具,zkCli.sh -server localhost cmd args
· zooKeeper维护一个树形层次结构,树中的节点被称为znode。znode可以用于存储数据,并且有一个与之相关联的ACL。ZooKeeper被设计用来实现协调服务,而不是用于存储大数据,一次一个znode能存储的数据被限制在1MB以内。ZooKeeper的数据访问具有原子性。znode有两中类型:短暂的和持久的。对于那写需要知道特定时刻有哪些分布式资源可用的应用来说,使用短暂znode是一种理想的选择。ZooKeeper服务的操作:create、delete、exists、getACL、setACL、getChildren、getData、setData、sync(将客户端的znode视图与ZooKeeper同步。
· Zookeeper服务有两种不同的运行模式。一种是“独立模式”,即只有一个ZooKeeper服务器。在生产环境中通常以“复制模式”运行与一个计算机集群上,这个计算机集群被称为一个“集合体”。ZooKeeper通过复制来实现高可用性,只要集合体中半数以上的及其处于可用状态,他就能够提供服务。从概念上来说,ZooKeeper是非常简单的:它所做的就是确保对znode树的每一个修改都会被复制到集合体中超过半数的机器上。
Sqoop
· sqoop是一个开源工具,他允许用户将数据从关系型数据库抽取到Haoop中,用于进一步的处理。抽取出的数据可以被MapReduce程序使用,也可以被其他类似鱼Hive的工具使用。一旦形成分析结果,Sqoop便可以将这些结果导回数据库,使其他客户端使用。
· 数据导入:
·
·
原文地址:http://blog.csdn.net/xia_yu_mao_fa/article/details/25135647