认识Hadoop
2015-09-20 21:31:55 阿炯

-----------
hadoop框架


Hadoop使用主/从(Master/Slave)架构,主要角色有NameNode,DataNode,secondaryNameNode,JobTracker,TaskTracker组成。其中NameNode,secondaryNameNode,JobTracker运行在Master节点上,DataNode和TaskTracker运行在Slave节点上。

---------------
hadoop核心内容


Hadoop框架中最核心的设计就是:MapReduce和HDFS。

MapReduce的思想是由Google的一篇论文所提及而被广为流传的,简单的一句话解释MapReduce就是“任务的分解与结果的汇总”。

HDFS是Hadoop分布式文件系统(Hadoop Distributed File System)的缩写,为分布式计算存储提供了底层支持。

1、NameNode

NameNode是HDFS的守护程序,负责记录文件是如何分割成数据块的,以及这些数据块被存储到哪些数据节点上。它的功能是对内存及I/O进行集中管理。

2、DataNode

集群中每个从服务器都运行一个DataNode后台程序,后台程序负责把HDFS数据块读写到本地文件系统。需要读写数据时,由NameNode告诉客户端去哪个DataNode进行具体的读写操作。

3、SecondaryNameNode

SecondaryNameNode是一个用来监控HDFS状态的辅助后台程序,如果NameNode发生问题,可以使用SecondaryNameNode作为备用的NameNode。

4、JobTracker

JobTracker后台程序用来连接应用程序与Hadoop,用户应用提交到集群后,由JobTracker决定哪个文件处理哪个task执行,一旦某个task失败,JobTracker会自动开启这个task。

4、TaskTracker

TaskTracker负责存储数据的DataNode相结合,位于从节点,负责各自的task。

-------------
前提和设计目标


硬件错误
硬件错误是常态而不是异常。HDFS可能由成百上千的服务器所构成,每个服务器上存储着文件系统的部分数据。我们面对的现实是构成系统的组件数目是巨大的,而且任一组件都有可能失效,这意味着总是有一部分HDFS的组件是不工作的。因此错误检测和快速、自动的恢复是HDFS最核心的架构目标。

流式数据访问
运行在HDFS上的应用和普通的应用不同,需要流式访问它们的数据集。HDFS的设计中更多的考虑到了数据批处理,而不是用户交互处理。比之数据访问的低延迟问题,更关键的在于数据访问的高吞吐量。POSIX标准设置的很多硬性约束对HDFS应用系统不是必需的。为了提高数据的吞吐量,在一些关键方面对POSIX的语义做了一些修改。

大规模数据集
运行在HDFS上的应用具有很大的数据集。HDFS上的一个典型文件大小一般都在G字节至T字节。因此,HDFS被调节以支持大文件存储。它应该能提供整体上高的数据传输带宽,能在一个集群里扩展到数百个节点。一个单一的HDFS实例应该能支撑数以千万计的文件。

简单的一致性模型
HDFS应用需要一个“一次写入多次读取”的文件访问模型。一个文件经过创建、写入和关闭之后就不需要改变。这一假设简化了数据一致性问题,并且使高吞吐量的数据访问成为可能。Map/Reduce应用或者网络爬虫应用都非常适合这个模型。目前还有计划在将来扩充这个模型,使之支持文件的附加写操作。

“移动计算比移动数据更划算”
一个应用请求的计算,离它操作的数据越近就越高效,在数据达到海量级别的时候更是如此。因为这样就能降低网络阻塞的影响,提高系统数据的吞吐量。将计算移动到数据附近,比之将数据移动到应用所在显然更好。HDFS为应用提供了将它们自己移动到数据附近的接口。

异构软硬件平台间的可移植性
HDFS在设计的时候就考虑到平台的可移植性。这种特性方便了HDFS作为大规模数据应用平台的推广。

----------
hdfs的结构


既然 Hadoop 守护进程已经在运行了,现在看看每个守护进程在 Hadoop 框架中的作用。namenode 是 Hadoop 中的主服务器,它管理文件系统名称空间和对集群中存储的文件的访问。还有一个 secondary namenode,它不是 namenode 的冗余守护进程,而是提供周期检查点和清理任务。在每个 Hadoop 集群中可以找到一个 namenode 和一个 secondary namenode。

datanode 管理连接到节点的存储一个集群中可以有多个节点。每个存储数据的节点运行一个 datanode 守护进程。

最后,每个集群有一个 jobtracker,它负责调度 datanode 上的工作。每个 datanode 有一个 tasktracker,它们执行实际工作。jobtracker 和 tasktracker 采用主-从形式,jobtracker 跨 datanode 分发工作,而 tasktracker 执行任务。jobtracker 还检查请求的工作,如果一个 datanode 由于某种原因失败,jobtracker 会重新调度以前的任务。


HDFS的体系结构与工作流程

下面简单看一下HDFS的结构。上图所示为HDFS的体系结构图,HDFS采用的是Master/Slave架构。

NameNode节点作为Master服务器,有三部分功能。第一:处理来自客户端的文件访问。第二:管理文件系统的命名空间操作,如'打开'、'关闭'、'重命名'等。第三:负责数据块到数据节点之间的映射。从这个意义上说,它扮演中心服务器的角色。

DataNode节点作为Slave服务器,同样有三部分功能。第一:管理挂载在节点上的存储设备。第二:响应客户端的读写请求。第三:从内部看,每个文件被分成一个或多个数据块,被存放到一组DataNode,在Namenode的统一调度下进行数据块的创建、删除和复制。

使用jps查看进程

要想检查守护进程是否正在运行,可以使用 jps 命令这是用于 JVM 进程的 ps 实用程序。这个命令列出 5 个守护进程及其进程标识符。

-------------
HDFS常用操作


hadoop dfs -ls 列出HDFS下的文件

hadoop dfs -ls in 列出HDFS下某个文档中的文件

hadoop dfs -put test1.txt test 上传文件到指定目录并且重新命名,只有所有的DataNode都接收完数据才算成功

hadoop dfs -get in getin 从HDFS获取文件并且重新命名为getin,同put一样可操作文件也可操作目录

hadoop dfs -rmr out 删除指定文件从HDFS上

hadoop dfs -cat in/* 查看HDFS上in目录的内容

hadoop dfsadmin -report 查看HDFS的基本统计信息,结果如下

hadoop dfsadmin -safemode leave 退出安全模式

hadoop dfsadmin -safemode enter 进入安全模式

添加节点

可扩展性是HDFS的一个重要特性,首先在新加的节点上安装hadoop,然后修改$HADOOP_HOME/conf/master文件,加入NameNode主机名,然后在NameNode节点上修改$HADOOP_HOME/conf/slaves文件,加入新加节点主机名,再建立到新加节点无密码的SSH连接

运行启动命令:
start-all.sh

然后可以通过http://(Master node的主机名):50070查看新添加的DataNode

负载均衡
start-balancer.sh,可以使DataNode节点上选择策略重新平衡DataNode上的数据块的分布


Hadoop包括HDFS非常适合在商用硬件commodity hardware上做分布式存储和计算,因为它不仅具有容错性和可扩展性,而且非常易于扩展。Map-Reduce框架以其在大型分布式系统应用上的简单性和可用性而著称,这个框架已经被集成进Hadoop中。

HDFS的可配置性极高,同时它的默认配置能够满足很多的安装环境。多数情况下,这些参数只在非常大规模的集群环境下才需要调整。用Java语言开发,支持所有的主流平台。支持类Shell命令,可直接和HDFS进行交互。

NameNode和DataNode有内置的Web服务器,方便用户检查集群的当前状态。新特性和改进会定期加入HDFS的实现中。下面列出的是HDFS中常用特性的一部分:

文件权限和授权。
机架感知Rack awareness:在调度任务和分配存储空间时考虑节点的物理位置。
安全模式:一种维护需要的管理模式。
fsck:一个诊断文件系统健康状况的工具,能够发现丢失的文件或数据块。
Rebalancer:当datanode之间数据不均衡时,平衡集群上的数据负载。
升级和回滚:在软件更新后有异常发生的情形下,能够回滚到HDFS升级之前的状态。
Secondary Namenode:对文件系统名字空间执行周期性的检查点,将Namenode上HDFS改动日志文件的大小控制在某个特定的限度下。


Hadoop与Google一样,都是小孩命名的虚构名字,没有特别的含义。从计算机专业的角度看,Hadoop是一个分布式系统基础架构,由 Apache基金会开发。Hadoop的主要目标是对分布式环境下的“大数据”以一种可靠、高效、可伸缩的方式处理。设想一个场景,假如您需要grep一个100TB的大数据文件,按照传统的方式,会花费很长时间,而这正是Hadoop所需要考虑的效率问题。关于Hadoop的结构,有各种不同的说法。我们这里简单的理解为Hadoop主要由三部分组成:HDFS(Hadoop Distributed File System),MapReduce与Hbase。

Hadoop组件之一:HDFS分布式文件系统具有哪些优点?

HDFS作为一种分布式文件系统,它和现有的分布式文件系统有很多共同点。比如,Hadoop文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。对于Client端而言,HDFS就像一个传统的分级文件系统,可以创建、删除、移动或重命名文件等等。与此同 时,HDFS与其他的分布式文件系统的区别也是显而易见的。

首先,HDFS设计目标之一是适合运行在通用硬件(commodity hardware)上的分布式文件系统。HDFS假设的硬件错误不是异常,而是常态。因为HDFS面向的是成百上千的服务器集群,每台服务器上存储着文件系统的部分数据,并且这些机器的价格都很低廉。这就意味着总是有一部分硬件因各种原因而无法工作。因此,错误检测和快速、自动的恢复是HDFS最核心的架 构目标。从这个角度说,HDFS具有高度的容错性。

第二,HDFS的另一个设计目标是支持大文件存储。与普通的应用不同,HDFS应用具有很大的数据集,一个典型HDFS文件大小一般都在G字节至T字节。这就意味着HDFS应该能提供比较高的数据传输带宽与数据访问吞吐量。相应的,HDFS开放了一些POSIX的必须接口,容许流式访问文件系统 的数据。

第三,HDFS还要解决的一个问题是高数据吞吐量。HDFS采用的是“一次性写,多次读”这种简单的数据一致性模型。换句话说,文件一旦建立后写入,就不需要再更改了。网络爬虫程序就很适合使用这样的模型。

第四,移动计算环境比移动数据划算。HDFS提供了API,以便把计算环境移动到数据存储的地方,而不是把数据传输到计算环境运行的地方。这对于数据大文件尤其适用,可以有效减少网络的拥塞、提高系统的吞吐量。

Hadoop组件之二:什么是MapReduce编程模型, MapReduce的工作流程是什么?

MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。MapReduce的设计目标是方便编程人员在不熟悉分布式并行编程的情况下将自己的程序运行在分布式系统上。MapReduce的命名规则由两个术语组成,分别是Map(映射)与Reduce(化简)。这些术语来自于列表处理语言, 如:LISP,Scheme,或ML。从概念上来讲,MapReduce将输入元素列表(Input List)转换成输出元素列表(Output List),按照Map与Reduce规则各一次。

MapReduce的工作原理大致分为如下几个阶段:


客户端:提交MapReduce作业。
Jobtracker:协调作业程序。Jobtracker是一个Java程序,他的主类是JobTracker。
Tasktracker:运行作业分配后的任务,他也是一个Java应用程序,他的主类是TaskTracker。
分布式文件系统:一般为HDFS,用来实现实体间的共享作业文件。

作业提交
JobClient的RunJob()方法用于创建JobClient实例,并调用submitJob()方法的便捷方式,调用runJob()方法对作业进行轮询,如果发现作业有变化,他自动将作业提交到控制台。如果提交成功他会把作业计数提交到控制台,如果失败的话他会将错误记录提交到控制台。

作业初始化
当JobTracker通过调用其submitJob()得到作业后,会放进内部的作业队列当中,交由作业调度器(job scheduler)进行调度,并对其进行初始化。初始化包括,创建一个正在运行的业务对象,任务和记录,这样就方便程序跟踪任务的运行状态和进程。

作业的分配
tasktarcker运行一个简单的循环,定期发送‘心跳’给JobTracker,他会告诉JobTracker,tasktracker是否还活着,同时也充当两者之间沟通的桥梁。

任务执行
tasktracker已经被分配了一个任务,下一步就是运行了,首先,他会通过共享文件系统把作业Jar文件复制到tasktracker所在的文件系统,从而实现作业的JAR文件的本地化,tasktracker,将应用程序,从分布式缓存复制到本地磁盘中并进行解压,然后创建任务实例,并运行。

进度和状态
MapReduce作业是常时间批量作业,运行时间从几秒到几小时甚至更长,这么长的时间用户肯定需要掌握作业的进展情况,一个作业和他的每个任务都有一个状态,包括作业或任务的状态如:运行状态,成功状态,失败状态,map和reduce的进度,作业计数器的值,状态消息,或描述等等。这些状态都是随着作业时间的改变而不断变化。

作业完成
当JobTracker收到作业最后一个任务已经完成的通知后,便把作业状态改为成功,然后JobClient查询状态时,便知道执行的任务已经执行成功了。于是JobClient端会打印给客户消息告知客户,然后从runJob()方法返回。


从MapReduce框架的实现角度看,MapReduce程序有着两个组件:一个实现了 Mapper,另一个实现了Reducer。

第一次叫Mapping,如图2所示。MapReduce将Input List作为Mapping函数的输入参数,经过处理,把结果返回给Output List。举例来说,有一个函数toUpper(str),用来返回输入字符串的大写版本。那么这里的Input List指的是转换前的常规字符串列表,Mapping Function指的是toUpper函数,而Output List指的是转换后的大写字符串列表。值得注意的是,在这里Mapping并没有改变输入字符串列表,而是返回一个新的字符串列表。


图2 Map函数处理

第二次叫Reducing,如图3所示。MapReduce将Input List作为Reducing函数的输入参数,经过迭代处理,把这些数据汇集,返回一个输出值给Output Value。从这个意义上来说,Reducing一般用来生成”总结“数据,把大规模的数据转变成更小的总结数据。例如,"+"可以用来作一个 reducing函数,去返回输入数据列表的值的总和。


图3 Reduce函数处理

从工作流程来讲,MapReduce对应的作业Job首先把输入的数据集切分为若干独立的数据块,并由Map组件以Task的方式并行处理。处理结果经过排序后,依次输入给Reduce组件,并且以Task的形式并行处理。MapReduce对应的输入输出数据由HDFS的DataNode存 储。MapReduce对应的Job部署在Master服务器,由Master JobTracker负责Task的调度,监控,重新执行失败的任务等等。MapReduce对应的Job部署在若干不同的Slave服务器,每个集群节 点含一个slave TaskTracker,负责执行由master指派的任务。

Hadoop框架由Java实现的,它提供了两种主要工具。Hadoop Streaming是一种运行作业的实用工具,它允许用户创建和运行任何可执行程序(例如:Shell工具)来做为mapper和reducer。 Hadoop Pipes是一个与SWIG兼容的C++ API (没有基于JNITM技术),它也可用于实现Map/Reduce应用程序。这样,开发人员就可以利用MapReduce框架,开发分布式应用程序,运行在由上千个商用机器组成的大型集群上,并以一种可靠容错的方式并行处理上T级别的数据集。

--------------------------------------------------------------------------
Hadoop 2.0 后新MapReduce框架 Yarn 的原理及运作机制


YARN产生背景

MRv1的局限

YARN是在MRv1基础上演化而来的,它克服了MRv1中的各种局限性。在正式介绍YARN之前,先了解下MRv1的一些局限性,主要有以下几个方面:

    扩展性差。在MRv1中,JobTracker同时兼备了资源管理和作业控制两个功能,这成为系统的一个最大瓶颈,严重制约了Hadoop集群扩展性。
    可靠性差。MRv1采用了master/slave结构,其中,master存在单点故障问题,一旦它出现故障将导致整个集群不可用。
    资源利用率低。MRv1采用了基于槽位的资源分配模型,槽位是一种粗粒度的资源划分单位,通常一个任务不会用完槽位对应的资源,且其他任务也无法使用这些空闲资源。此外,Hadoop将槽位分为Map Slot和Reduce Slot两种,且不允许它们之间共享,常常会导致一种槽位资源紧张而另外一种闲置(比如一个作业刚刚提交时,只会运行Map Task,此时Reduce Slot闲置)。
    无法支持多种计算框架。随着互联网高速发展,MapReduce这种基于磁盘的离线计算框架已经不能满足应用要求,从而出现了一些新的计算框架,包括内存计算框架、流式计算框架和迭代式计算框架等,而MRv1不能支持多种计算框架并存。

为了克服以上几个缺点,Apache开始尝试对Hadoop进行升级改造,进而诞生了更加先进的下一代MapReduce计算框架MRv2。正是由于MRv2将资源管理功能抽象成了一个独立的通用系统YARN,直接导致下一代MapReduce的核心从单一的计算框架MapReduce转移为通用的资源管理系统YARN。

集群资源统一管理

随着互联网的高速发展,新的计算框架不断出现,从支持离线处理的MapReduce,到支持在线处理的Storm,从迭代式计算框架Spark到流式处理框架S4,各种框架各有所长,各自解决了某一类应用问题。这时候就需要一个组件对同一个集群上的不同计算框架进行资源的统一管理。


YARN

相比于“一种计算框架一个集群”的模式,共享集群的模式存在多种好处:
    资源利用率高。如果每个框架一个集群,可能在某段时间内,有些计算框架的集群资源紧张,而另外一些集群资源空闲。共享集群模式则通过多种框架共享资源,使得集群中的资源得到更加充分的利用。
    运维成本低。如果采用“一个框架一个集群”的模式,则可能需要多个管理员管理这些集群,进而增加运维成本,而共享模式通常需要少数管理员即可完成多个框架的统一管理。
    数据共享。随着数据量的暴增,跨集群间的数据移动不仅需花费更长的时间,且硬件成本也会大大增加,而共享集群模式可让多种框架共享数据和硬件资源,将大大减小数据移动带来的成本。

YARN基本设计思想

MRv1主要由编程模型、数据处理引擎(由Map Task和Reduce Task组成)和运行时环境三部分组成。为了保证编程模型的向后兼容性,MRv2重用了MRv1中的编程模型和数据处理引擎,但运行时环境被完全重写。

MRv1的运行时环境主要由两类服务组成,分别是JobTracker和TaskTracker。其中,JobTracker负责资源管理和作业控制。TaskTracker负责单个节点的资源管理和任务执行。

MRv1将资源管理和应用程序管理两部分混杂在一起,使得它在扩展性、容错性和多框架支持等方面存在明显缺陷。

而MRv2则通过将资源管理和应用程序管理两部分剥离开,分别由ResourceManager和ApplicationMaster负责,其中ResourceManager专管资源管理和调度,而ApplicationMaster则负责与具体应用程序相关的任务切分、任务调度和容错等,具体如下图所示。



YARN 基本架构


YARN是Hadoop 2.0中的资源管理系统,它的基本设计思想是将MRv1中的JobTracker拆分成了两个独立的服务:一个全局的资源管理器ResourceManager和每个应用程序特有的ApplicationMaster。其中ResourceManager负责整个系统的资源管理和分配,而ApplicationMaster负责单个应用程序的管理。

YARN基本组成结构

YARN总体上仍然是Master/Slave结构,在整个资源管理框架中,ResourceManager为Master,NodeManager为Slave,ResourceManager负责对各个NodeManager上的资源进行统一管理和调度。当用户提交一个应用程序时,需要提供一个用以跟踪和管理这个程序的ApplicationMaster,它负责向ResourceManager申请资源,并要求NodeManger启动可以占用一定资源的任务。由于不同的ApplicationMaster被分布到不同的节点上,因此它们之间不会相互影响。在本小节中,我们将对YARN的基本组成结构进行介绍。

下图描述了YARN的基本组成结构,YARN主要由ResourceManager、NodeManager、ApplicationMaster(图中给出了MapReduce和MPI两种计算框架的ApplicationMaster,分别为MR AppMstr和MPI AppMstr)和Container等几个组件构成。


1).ResourceManager(RM)

RM是一个全局的资源管理器,负责整个系统的资源管理和分配。它主要由两个组件构成:调度器(Scheduler)和应用程序管理器(Applications Manager,ASM)。

(1)调度器

调度器根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。

需要注意的是,该调度器是一个“纯调度器”,它不再从事任何与具体应用程序相关的工作,比如不负责监控或者跟踪应用的执行状态等,也不负责重新启动因应用执行失败或者硬件故障而产生的失败任务,这些均交由应用程序相关的ApplicationMaster完成。调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位用一个抽象概念“资源容器”(Resource Container,简称Container)表示,Container是一个动态资源分配单位,它将内存、CPU、磁盘、网络等资源封装在一起,从而限定每个任务使用的资源量。此外,该调度器是一个可插拔的组件,用户可根据自己的需要设计新的调度器,YARN提供了多种直接可用的调度器,比如Fair Scheduler和Capacity Scheduler等。

(2) 应用程序管理器

应用程序管理器负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重新启动它等。

2). ApplicationMaster(AM)

用户提交的每个应用程序均包含1个AM,主要功能包括:

与RM调度器协商以获取资源(用Container表示);

将得到的任务进一步分配给内部的任务;

与NM通信以启动/停止任务;

监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。

当前YARN自带了两个AM实现,一个是用于演示AM编写方法的实例程序distributedshell,它可以申请一定数目的Container以并行运行一个Shell命令或者Shell脚本;另一个是运行MapReduce应用程序的AM—MRAppMaster,我们将在第8章对其进行介绍。此外,一些其他的计算框架对应的AM正在开发中,比如Open MPI、Spark等。

3). NodeManager(NM)

NM是每个节点上的资源和任务管理器,一方面,它会定时地向RM汇报本节点上的资源使用情况和各个Container的运行状态;另一方面,它接收并处理来自AM的Container启动/停止等各种请求。

4). Container

Container是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,RM为AM返回的资源便是用Container表示的。YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源。

需要注意的是,Container不同于MRv1中的slot,它是一个动态资源划分单位,是根据应用程序的需求动态生成的。截至本书完成时,YARN仅支持CPU和内存两种资源,且使用了轻量级资源隔离机制Cgroups进行资源隔离。

YARN工作流程

当用户向YARN中提交一个应用程序后,YARN将分两个阶段运行该应用程序:

第一个阶段是启动ApplicationMaster;

第二个阶段是由ApplicationMaster创建应用程序,为它申请资源,并监控它的整个运行过程,直到运行完成。

如下图所示,YARN的工作流程分为以下几个步骤:


步骤1:用户向YARN中提交应用程序,其中包括ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。

步骤2:ResourceManager为该应用程序分配第一个Container,并与对应的Node-Manager通信,要求它在这个Container中启动应用程序的ApplicationMaster。

步骤3:ApplicationMaster首先向ResourceManager注册,这样用户可以直接通过ResourceManager查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7。

步骤4:ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源。

步骤5:一旦ApplicationMaster申请到资源后,便与对应的NodeManager通信,要求它启动任务。

步骤6:NodeManager为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。

步骤7:各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC向ApplicationMaster查询应用程序的当前运行状态。

步骤8:应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭自己。

多角度理解YARN


可将YARN看做一个云操作系统,它负责为应用程序启动ApplicationMaster(相当于主线程),然后再由ApplicationMaster负责数据切分、任务分配、启动和监控等工作,而由ApplicationMaster启动的各个Task(相当于子线程)仅负责自己的计算任务。当所有任务计算完成后,ApplicationMaster认为应用程序运行完成,然后退出。


Hadoop组件之三:什么是面向列开源分布式数据库Hbase?

HBase是一个分布式的、面向列的开源数据库,由Apache基金会开发。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。它基于列的而不是基于行的模式。用户存储数据行在一个表里。一个数据行拥有一个可选择的键和任意数量的列。用户可根据键访问行,以及对于一系列的行进行扫描和过滤。HBase一个可以横向扩张的表存储系统,能够为大规模数据提供速度极快的低等级更新。主要用于需要随机访问,实时读写大数据 (Big Data)。这正是信息系统所需要的功能。
 

下面的例子演示的是将原来存放在MySQL中Blog中的数据迁移到HBase中的过程:

图4为MySQL中现有的表结构:表Blogtable表示博客本身,包括5个字段,BlogId为每位用户对应的博客ID号,类型为Int,作为主键字段;Author为该用户的博客名称,类型为Varchar;Title为该用户的博客签名,类型为Varchar;URL为博客网址链接,类型为Varchar;Text为博客的内容,类型为Varchar。Comment表示博客评论,包括5个字段。ID为发表评论的用户ID,类型为Int,作为主键字段;BlogId为博客的原文ID,类型为Varchar。其中,BlogId作为Comment表的外键,指向表Blogtable的主键。Title为评论标题,类型为Varchar;Author为发表该评论的用户名称,类型为Varchar;Text字段为评论内容,类型为 Varchar。


图4 MySQL表结构

图5 为迁移HBase中的表结构:HBase以表的形式存储数据。表有行和列组成。列划分为若干个列族(row family)。表Blogtable表示博客本身。ID为Row Key,即Table的主键,用来检索记录。Table在水平方向有一个或者多个Column Family组成。表BlogTable包含5个Column Family, Info的数据结构分为Info:Author,Info:Title,Info:URL。如果想添加其它属性X,则对应的结构为Info:X。需要说明 的是,Column Family支持动态扩展,无需预先定义Column的数量以及类型,但是所有Column均以二进制格式存储,用户需要自行进行类型转换。


图5 HBase表结构

总之,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。简单的理解,Hbase介于nosql和 RDBMS之间。Hbase仅能通过主键(row key)和主键的range来检索数据,不支持条件查询以及排序等,仅支持单行事务。Habase主要用来存储非结构化和半结构化的松散数据。针对Hbase的不足,Hadoop的一个数据仓库工具Hive对此做出了弥补。Hive可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,并将SQL语句转换为MapReduce任务运行。针对Hbase单行事务的限制,Hive也提供了扩展。据说Facebook之所以选择了Hbase,是因为他们HBase适用于处理以下两种类型的数据模式:1.一小组经常变化的临时数据;2.一组不断增加但很少访问的数据。

Hadoop为企业来带了什么?
如今,“大数据”这一术语在IT经理人中变得越来越流行。美国国家海洋与大气管理局NOAA利用“大数据”进行气象、生态系统、天气和商务研究。《纽约时报》使用“大数据”工具进行文本分析和Web信息挖掘。迪斯尼则利用它们关联和了解跨不同商店、主题公园和Web资产的客户行为。

“大数据”不仅适用于大型企业,而是适用于各种不同规模的企业。例如,通过评估某位客户在网站上的行为,来更好地了解他们需要什么支持或寻找什么产品,或者弄清当前天气和其他条件对于送货路线和时间安排的影响。
 
面对“大数据”,Hadoop为揭示深奥的企业与外部数据的关键内幕提供了基础。从技术上看,Hadoop分布式文件系统(HDFS)保证了大 数据的可靠存储,而另一Hadoop核心组件MapReduce则提供高性能并行数据处理服务。这两项服务提供了一个使对结构化和复杂“大数据”的快速、 可靠分析变为现实的基础。

Hadoop已经迅速成长为首选的、适用于非结构化数据的大数据分析解决方案。基于Hadoop、利用商品化硬件对海量的结构化和非结构化数据 进行批处理,给数据分析领域带来了深刻的变化。通过挖掘机器产生的非结构化数据中蕴藏的知识,企业可以做出更好的决策,促进收入增长,改善服务,降低成本。

Google与Hadoop有着千丝万缕的联系。如前所述,Hadoop主要是由HDFS、MapReduce和Hbase组成。而HDFS是 Google File System(GFS)的开源实现,MapReduce是Google MapReduce的开源实现,HBase是Google BigTable的开源实现。Hadoop分布式框架很有创造性,而且有极大的扩展性,使得Google在系统吞吐量上有很大的竞争力。因此Apache 基金会用Java实现了一个开源版本,支持Fedora、Ubuntu等Linux平台。Hadoop作为一种分布式基础架构,可以使用户在不了解分布式底层细节的情况下,开发分布式程序。


--------------
hadoop基本命令


直接输入hadoop得到的语法文档如下:

namenode -format:format the DFS filesystem 格式化DFS文件系统

namenode -format:format the DFS filesystem 运行第2个namenode

datanode:run a DFS datanode 运行DFS的namenode

dfsadmin:run a DFS admin client 运行一个DFS的admin客户端

mradmin: run a Map-Reduce admin client 运行一个map-reduce文件系统的检查工具

fsck:run a DFS filesystem checking utility 运行一个DFS文件系统的检查工具

fs: run a generic filesystem user client  运行一个普通的文件系统用户客户端

balancer:run a cluster balancing utility 运行MapReduce的jobTracker节点

fetchdt: fetch a delegation token from the NameNode 运行一个代理的namenode

jobtracker:run the MapReduce job Tracker node 运行一个MapReduce的taskTracker节点

pipes:run a Pipes job 运行一个pipes作业

tasktracker:run a MapReduce task Tracker node 运行一个MapReduce的taskTracker节点

historyserver:run job history servers as a standalone daemon 运行历史服务作为一个单独的线程

job:manipulate MapReduce jobs 处理mapReduce作业

queue:get information regarding JobQueues

version:print the version 版本

jar <jar>: run a jar file 运行一个jar

distcp <srcurl> <desturl> copy file or directories recursively 递归地复制文件或者目录

archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive

生成一个hadoop档案

daemonlog: get/set the log level for each daemon 获取或设置每个daemon的log级别

-----------------
为什么选择hadoop


下面列举hadoop主要的一些特点:

1)扩容能力(Scalable):能可靠地(reliably)存储和处理千兆字节(PB)数据。

2)成本低(Economical):可以通过普通机器组成的服务器群来分发以及处理数据。这些服务器群总计可达数千个节点。

3)高效率(Efficient):通过分发数据,hadoop可以在数据所在的节点上并行地(parallel)处理它们,这使得处理非常的快速。

4)可靠性(Reliable):hadoop能自动地维护数据的多份复制,并且在任务失败后能自动地重新部署(redeploy)计算任务。

-------------
HDFS设计特点


下面说说HDFS的几个设计特点(对于框架设计值得借鉴):

1. Block的放置
默认不配置。一个Block会有三份备份,一份放在NameNode指定的DataNode,另一份放在与指定DataNode非同一Rack上的DataNode,最后一份放在与指定DataNode同一Rack上的DataNode上。备份无非就是为了数据安全,考虑同一Rack的失败情况以及不同Rack之间数据拷贝性能问题就采用这种配置方式。

2. 心跳检测
心跳检测DataNode的健康状况,如果发现问题就采取数据备份的方式来保证数据的安全性。

3. 数据复制
数据复制(场景为DataNode失败、需要平衡DataNode的存储利用率和需要平衡DataNode数据交互压力等情况) 这里先说一下,:使用HDFS的balancer命令,可以配置一个Threshold来平衡每一个DataNode磁盘利用率。例如设置了Threshold为10%,那么执行balancer命令的时候,

首先统计所有DataNode的磁盘利用率的均值,然后判断如果某一个DataNode的磁盘利用率超过这个均值Threshold以上,那么将会把这个DataNode的block转移到磁盘利用率低的DataNode,这对于新节点的加入来说十分有用。

4. 数据校验:
采用CRC32作数据交验。在文件Block写入的时候除了写入数据还会写入交验信息,在读取的时候需要交验后再读入。

5. NameNode是单点
如果失败的话,任务处理信息将会记录在本地文件系统和远端的文件系统中。

6. 数据管道性的写入
当客户端要写入文件到DataNode上,首先客户端读取一个Block然后写到第一个DataNode上,然后由第一个DataNode传递到备份的DataNode上,一直到所有需要写入这个Block的DataNode都成功写入,客户端才会继续开始写下一个Block。

7. 安全模式
安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。运行期通过命令也可以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。

----------------
hadoop结构示意图



MapReduce从它名字上在Hadoop的系统中,会有一台Master,主要负责NameNode的工作以及JobTracker的工作。

JobTracker的主要职责就是启动、跟踪和调度各个Slave的任务执行。还会有多台Slave,每一台Slave通常具有DataNode的功能并负责TaskTracker的工作。TaskTracker根据应用要求来结合本地数据执行Map任务以及Reduce任务。

--------------
FSShell 命令指南


调用文件系统(FS)Shell 命令应使用 bin/hadoop fs<args>的形式。所有的的 FSshell命令使用 URI 路径作为参数。URI 格式是 scheme://authority/path。对 HDFS 文件系统,scheme 是 hdfs,对本地文件系统,scheme 是 file。其中 scheme 和 authority 参数都是可选的,如果未加指定,就会使用配置中指定的默认 scheme。一个 HDFS 文件或目录比如/parent/child可以表示成 hdfs://namenode:namenodeport/parent/child,或者更简单的/parent/child(假设你配置文件中的默认值是 namenode:namenodeport)。大多数 FSShell命令的行为和对应的 Unix Shell 命令类似,不同之处会在下面介绍各命令使用详情时指出。

出错信息会输出到 stderr,其他信息输出到 stdout。

1) cat
使用方法:hadoop fs -catURI[URI...]
将路径指定文件的内容输出到 stdout。

示例:
hadoop fs-cat hdfs://host1:port1/file1hdfs://host2:port2/file2
hadoop fs-cat file:///file3/user/hadoop/file4

返回值:
成功返回 0,失败返回-1。

2) copyFromLocal
使用方法:hadoop fs -copyFromLocal<localsrc>URI 除了限定源路径是一个本地文件外,和 put 命令相似。

3) copyToLocal
使用方法:hadoop fs -copyToLocal[-ignorecrc][-crc]URI<localdst>

除了限定目标路径是一个本地文件外,和 get 命令类似。

4) cp
使用方法:hadoopfs-cpURI[URI...]<dest>
将文件从源路径复制到目标路径。这个 Hadoop Shell 命令允许有多个源路径,此时目标路径必须是一个目录。

示例:
Hadoopfs –cp /user/hadoop/file1/user/hadoop/file2
hadoopfs –cp /user/hadoop/file1/user/hadoop/file2/user/hadoop/dir

返回值:
成功返回 0,失败返回-1。

5) du
使用方法:hadoop fs –du URI[URI...]
此 Hadoop Shell 命令显示目录中所有文件的大小,或者当只指定一个文件时,显示此文件的大小。

示例:
Hadoop fs –du
/user/hadoop/dir1/user/hadoop/file1hdfs://host:port/user/hadoop/dir1

返回值:
成功返回 0,失败返回-1。

6) dus
使用方法:hadoop fs -dus<args>

显示文件的大小。

7) expunge
使用方法:hadoop fs -expunge

清空回收站。请参考 HDFS 设计文档以获取更多关于回收站特性的信息。

8) get
使用方法:hadoop fs -get[-ignorecrc][-crc]<src><localdst>

复制文件到本地文件系统。可用-ignorecrc 选项复制 CRC 校验失败的文件。使用-crc选项复制文件以及CRC信息。

示例:
hadoop fs –get /user/hadoop/filelocalfile
hadoop fs –get hdfs://host:port/user/hadoop/filelocalfile

返回值:
成功返回 0,失败返回-1。Hadoop Shell 命令还有很多,这里只介绍了其中的一部分。

本文源自:互联网