Hadoop框架基础(一)

作者: Z尽际 | 来源:发表于2017-03-12 16:17 被阅读1444次

    ** Hadoop框架基础(一)

    学习一个新的东西,传统而言呢,总喜欢漫无目的的扯来扯去,比如扯扯发展史,扯扯作者是谁,而我认为这些东西对于刚开始接触,并以开发为目的学者是没有什么帮助的,反而让人分了心,比如你玩LOL的时候,去玩某个英雄的时候,一般你是不会先看英雄的故事背景介绍的,而是读读技能介绍(技能介绍类似于开发文档),直接上线就是干,扔几个技能,发现,嘿?这英雄有点意思,用的多了,才会有可能去看看英雄的背景故事。(不排除你是一个纯粹的完美情怀主义者)

    好,那么下面我就给大家简单的总结一下业内的开场内容。

    学习内容:Hadoop框架

    框架源码:Java

    框架之父:Doug Cutting

    目前维护:Apache基金会

    核心用途:HDFS和MapReduce。HDFS为海量的数据提供了存储,MapReduce为海量的数据提供了计算。

    (不够严谨的简单解释下:把大文件数据分布存储在多个电脑上(因为你一台电脑存不下),然后在多台电脑上进行数据分析(因为你一台电脑计算的慢),最终整合出结果)

    Hadoop产生源于Google的一些论文(大陆请使用VPN代理查阅):

    GoogleCluster: http://research.google.com/archive/googlecluster.html

    Chubby:http://labs.google.com/papers/chubby.html

    GFS:http://labs.google.com/papers/gfs.html

    BigTable:http://labs.google.com/papers/bigtable.html

    MapReduce:http://labs.google.com/papers/mapreduce.html

    随着发展,Apache上就出现了一个类似的解决方案,分别对应:

    Chubby-->ZooKeeper

    GFS-->HDFS

    BigTable-->Hbase

    MapReduce-->Hadoop

    以上内容基本就是介绍框架时扯来扯去的核心,作者是非常厉害的(这不废话么)。在学习过程中,如果你慢慢对这些发展历史,作者,故事背景感兴趣了,你可以再查阅相关资料,毕竟学无止境。

    ** 准备工作

    相关下载:

    JDK:链接:http://pan.baidu.com/s/1skOjRE9 密码:2s0p

    Hadoop:链接:http://pan.baidu.com/s/1mhB2Rv6 密码:6qxi

    Eclipse:链接:http://pan.baidu.com/s/1nvc5izR 密码:ezy8

    以上下载你也可以自行下载,通过产品所对应的官网。

    创建相关目录:

    在root用户下,进入/opt/目录,在该目录下创建两个文件夹

    mkdir softwares/:该目录用于存放各种软件安装包

    mkdir modules/:该目录用于存放软件的安装目录

    改变目录所属:

    因为softwares和modules这两个目录为root用户所创建,所以所有者/组均为root,而我们一般使用的操作用户是普通用户,所以此时我们需要修改该两个目录的所有者/组,使用命令:

    chown 所有者:所属组 /opt/modules/

    chown 所有者:所属组 /opt/softwares/

    例如,我这里:

    chown z:z /opt/modules/

    传递下载后的文件到虚拟机系统

    完成以上步骤后,使用FileZilla Client工具(如果忘记如何连接,请查看前几节知识),连接成功后,如图:

    此时双击红框部分,如上图所示,找到opt目录,之后你就可以看到两个你创建的目录:

    然后,把软件上传到softwares下,直接从windows中拖入即可上传,完成后如图:

    我这里上传的有其他软件,其实此时只需要框中部分的3个即可

    现在把这3个部分分别解压到modules中,如图(只需留意红框内的内容)

    解压命令:

    tar -zxf hadoop-2.5.0.tar.gz -C /opt/modules/

    tar -zxf hadoop-2.5.0.tar.gz -C /opt/modules/

    这3个目录已经解压

    配置环境变量

    配置JDK的环境变量,hadoop的环境变量暂时不需要配了

    编辑profile文件,使用命令:

    vi /etc/profile,添加如图所示内容:

    $意为引用,冒号为分隔符

    ** Hadoop宏观认知

    Hadoop项目主要包括以下四个模块

    Hadoop Common:

    为其他的Hadoop模块提供基础设施

    Hadoop HDFS:

    分布式文件系统

    Hadoop MapReduce:

    分布式离线并行计算框架

    Hadoop YARN:

    任务调度与资源管理框架

    这里因为篇幅问题,我们只能做一些基础理解,更深入的挖掘需要读者自行研究(因为往下深究所需篇幅,可以单独再开一个专题)

    ** HDFS架构

    总结:

    1、一个Namenode节点和多个Datanode节点组成

    2、Namenode是一个中心服务器,负责管理文件系统的namespace和客户端对文件的访问。Datanode在集群中一般是一个节点一个,负责管理节点上它们附带的存储。通俗来讲,datanode就是用来存储某个大文件被拆分后的一个一个的小文件。

    3、一个文件分成一个或多个block(数据块,数据块默认大小128M),这些block存储在Datanode集合里。

    4、一般而言,一台机器跑一个单独的Namenode节点,集群中的其它机器各跑一个Datanode实例(当然也有一个台机器跑多个Datanode)。

    5、Namenode中存放的有元数据(Metadata),比如:映射关系表(哪些数据块block存储在了哪些datanode节点中)

    ** YARN架构

    总结:

    yarn主要负责任务调度和资源管理的,比如,集群中,哪些机器还剩余多少CPU多少内存可用,集群中,还有哪些机器可以用来处理新的任务等等。

    1、ResourceManager(RM):主要接收客户端任务请求,接收和监控NodeManager(NM)的资源情况汇报,负责资源的分配与调度,启动和监控ApplicationMaster(AM)。

    2、NodeManager:主要是节点上的资源管理,启动Container运行task计算,上报资源、负责把container情况给ResourceManager,把任务处理情况给ApplicationMaster。

    3、ApplicationMaster:主要是单个Application(Job)的task管理和调度,向ResourceManager进行资源的申请,向NodeManager发出launch Container指令,接收NodeManager的task处理状态信息。

    yarn工作流程:

    1、client submit提交一个Job到ResourceManager,进入ResourceManager中的Scheduler队列供调度

    2、ResourceManager根据NodeManager汇报的资源情况(NodeManager会定时汇报资源和container使用情况),请求一个合适的NodeManager launch container,在该NodeManager所在机器启动运行ApplicationMaster

    3、ApplicationMaster启动后,注册到ResourceManager上,以便client可以查到ApplicationMaster的信息,便于client直接和ApplicationMaster通信

    4、ApplicationMaster启动后,根据Job相关情况,会和ResourceManager协商申请container资源

    5、ResourceManager分配给ApplicationMaster container资源后,根据container的信息,向对应的NodeManager请求launch container

    6、NodeManager启动container运行task,运行过程中向ApplicationMaster汇报进度状态信息,同时NodeManager也会定时的向ResourceManager汇报container的使用情况。

    7、在application(job)执行过程中,client可以和ApplicationMaster通信,获取application相关的进度和状态信息。

    8、在application(job)完成后,ApplicationMaster通知ResourceManager清除自己的相关信息(即AM自己关闭自己),并关闭,释放自己占用的container。

    尖叫提示:Container为何物?

    Container:

    1、Container是yarn框架中对于资源的抽象描述,它封装了某个节点上一定量的资源(CPU与内存),你可以理解为Container是一个Java类,里面封装了对于资源的一系列描述,还封装了当前Job任务运行的片段代码。

    2、Container由ApplicationMaster向ResourceManager申请的,由ResouceManager中的资源调度器异步分配给ApplicationMaster

    3、Container的运行是由ApplicationMaster向资源所在的NodeManager发起的(即运行任务)

    Container分类:

    1、运行用户指定任务(ApplicationMaster)的Container:

    这是由ResourceManager(向内部的资源调度器)申请和启动的,用户提交应用程序时,可指定唯一的ApplicationMaster所需的资源;

    2、运行各类任务的Container:

    这是由ApplicationMaster向ResourceManager申请的,并由ApplicationMaster与NodeManager通信以启用该Container

    以上两类Container可能在任意节点上,它们的位置通常而言是随机的,即ApplicationMaster可能与它管理的任务运行在一个节点上。

    相关术语知识点:

    (本地松弛:是指如果某台NodeManager所能提供的Container不足,则在本台机架寻找另一台机器是否可以提供,如果本台机架所有机器都不能提供所需Container,则换一台机架找寻)

    (机架感知:有兴趣的同学请查阅相关博客:http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2843015.html,此处不再赘述)

    ** Hadoop基础配置

    在进行Hadoop配置的时候,我们有时需要借助官方文档,毕竟那么多的配置属性,不是能全部记下来的

    官方文档链接:http://hadoop.apache.org/docs/r2.5.2/

    在我们的案例中,Hadoop的配置文档位于:

    /opt/modules/hadoop-2.5.0/etc/hadoop

    进入该目录,查看该目录文件结构如图:

    我们配置Hadoop就是配置这里面的xml文件和sh脚本文件,如果使用vi编辑器配置的话,可能不太习惯?那么接下来我们聊聊怎么使用Notepad++来配置(没有该软件的请自行下载)

    打开Notepad++,如图:

    如图所示3个地方需要注意:

    1、红框:是否开启NppFTP视图,即右边的视图

    2、蓝框:点击后,选择“Profile Settings”弹出绿框内容

    3、绿框:点击Add new,我这边添加了一个z01,hostname主机名为z01,port端口号为:22,Username登录系统的用户为z,Password密码为你设置的该用户的密码

    配置完成后,如下图,点击框内按钮,连接登录:

    登录成功如图:

    进入到/opt/modules/hadoop-2.5.0/etc/hadoop目录,即可使用Notepad++来编辑文本内容了,方便多了~

    配置正式开始

    1、首先修改3个.sh文件中的JDK路径

    该3个文件分别是:

    hadoop-env.sh

    mapred-env.sh

    yarn-env.sh

    修改内容为:

    export JAVA_HOME=/opt/modules/jdk1.8.0_111,如图:

    修改后记得保存

    2、hdfs配置

    * core-site.xml

    官方文档说明:http://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-common/core-default.xml

    修改后记得保存

    属性解释:

    fs.defaultFS:HDFS集群访问入口地址,其中z01也可以换成当前Linux的本机ip,如果此时你还没有在Linux中设置主机名映射,请参照之前Linux中的知识点进行设置即可。

    hadoop.tmp.dir:数据存放路径

    * hdfs-site.xml

    官方文档说明:http://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

    修改后记得保存

    属性解释:

    dfs.replication:数据块副本数,默认为3。

    * slaves

    声明哪些服务器是datanode,每行一个主机名即可。

    此案例我们只设置1个,即当前虚拟机机器

    3、yarn配置

    * yarn-site.xml

    官方文档:http://hadoop.apache.org/docs/r2.5.2/hadoop-yarn/hadoop-yarn-common/yarn-default.xml

    属性解释:

    yarn.nodemanager.aux-services:NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce程序

    yarn.resourcemanager.hostname:resourcemanager的主机名,即哪一台主机当做ResourceManager

    yarn.log-aggregation-enable:是否开启日志聚合功能

    yarn.log-aggregation.retain-seconds:在HDFS上聚集的日志最多保存多长时间,单位:秒,86400相当于24小时

    其他属性:

    yarn.nodemanager.resource.memory-mb:表示该节点上yarn可使用的物理内存总量,默认是8192MB,如果该节点机器的内存不足8G,则需要调小这个值,yarn不会智能的探测节点的物理内存总量。

    yarn.nodemanager.vmem-pmem-ratio:任务每使用1MB物理内存,最多可使用的虚拟内存量,默认为2.1。

    yarn.nodemanager.pmem-check-enabled:是否启动一个县城检查每个任务正在使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认值为true。

    yarn.nodemanager.vmem-check-enabled:是否启动一个线程检查每个任务正在使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认值为true。

    yarn.scheduler.minimum-allocation-mb:单个任务可申请的最少物理内存量,默认是1024MB,如果一个任务申请的物理内存量少于该值,则对应的值改为这个数。

    yarn.scheduler.maximum-allocation-mb:单个任务可申请的最多物理内存量,默认是8192MB。

    4、map-reduce配置

    * mapred-site.xml

    官方文档:http://hadoop.apache.org/docs/r2.5.2/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

    属性解释:

    mapreduce.framework.name:设置运行MapReduce任务的框架

    mapreduce.jobhistory.address:自带了一个历史服务器,可以通过历史服务器查看已经运行完的Mapreduce作业记录,比如用了多少个Map、用了多少个Reduce、作业提交时间、作业启动时间、作业完成时间等信息。默认情况下,Hadoop历史服务器是没有启动的。配置该地址后,启动服务就可以通过Web UI来查看具体使用详情了。

    mapreduce.jobhistory.webapp.address:web app客户端的访问入口

    ** 启动服务

    启动过程分为如下几个过程:

    * 格式化hdfs

    由于当前主机第一次使用hdfs系统,所以使用之前需要先格式化

    进入到/opt/modules/hadoop-2.5.0目录下

    使用命令(#代表root用户下输入,$代表普通用户下输入,输入命令时注意不要加#或$,此处写上只为注明)

    $ bin/hdfs namenode -format,成功格式化后如图:

    * 启动hdfs相关服务

    使用命令:

    $ sbin/hadoop-daemon.sh start namenode:开启nodenode节点服务

    $ sbin/hadoop-daemon.sh start datanode:开启datanode节点服务

    最后通过jps命令来查看进程是否启动成功

    如图:

    此时可以通过浏览器成功访问hdfs管理平台:http://z01:50070,如图:

    * 启动yarn相关服务

    使用命令:

    $ sbin/yarn-daemon.sh start resourcemanager:开启resourcemanager

    $ sbin/yarn-daemon.sh start nodemanager:开启nodemanager

    完成后使用jps检查是否启动成功,如图:

    此时可以通过浏览器成功访问yarn管理平台:http://z01:8088,如图:

    $ sbin/mr-jobhistory-daemon.sh start historyserver:开启historyserver服务,如图:

    OK,所有的服务都已经准备完成了,下面我们来做一个小测试。

    ** 测试

    经典案例:官方Demo单词统计

    我们下面要做的一个案例是官方的demo,用于统计单词出现的频率,首先我们需要创建一个文档,里面有若干英文单词,然后把这个文档上传到hdfs系统中,等待mapreduce计算,最后查看结果。

    1、创建包含若干单词的words.txt文档,注意单词用空格或者tab分割,创建位置为:/opt/modules/hadoop-2.5.0,如图:

    2、在hdfs系统中创建/input/目录

    使用命令:

    $ bin/hdfs dfs -mkdir /input,如图:

    3、上传words.txt文档到该目录下

    使用命令:

    $ bin/hdfs dfs -put words.txt /input,如图:

    4、查看已上传的文件内容

    使用命令:

    $ bin/hdfs dfs -cat /input/words.txt,如图:

    尖叫提示:当然bin/hdfs dfs中还有一些其他命令,读者可以通过输入$ bin/hdfs dfs来查看使用方式,如图:

    5、运行任务

    使用命令:

    $ bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount /input/ /output/

    解释:

    /input/:hdfs中的路径,表示输入路径

    /output/:hdfs中的路径,表示输出路径(统计结果会在这个目录下)

    运行后,会出现如下内容:

    注意红框中内容的变化

    此时,任务已经执行完毕,下面我们来看一看执行的结果

    使用命令:

    $ bin/hdfs dfs -cat /output/par* :查看output这个输出目录下的所有以par开头的文件内容(为何是par开头,稍后解释)

    如图:

    如图,单词出现频率已经出来了,下面我们来看一下web app中的变化。

    6、查看web app:

    hdfs(http://z01:50070):

    点击红框内容,选择“Browse the file system”,在搜索框中输入:/,点击GO,如图:

    在此你可以看到你的hdfs系统中的目录结构,分别点开input和output,我们来瞟一眼:

    注意此时output中红框内容,这就解释了为何我们刚才查看结果的时候,要查看的是par开头的文件,因为输出结果的默认文件名就是这个。

    yarn(http://z01:8088):

    下面我们再来看看yarn平台的内容变化,刷新yarn平台后,你会发现多了一条内容:

    点击history,我们进去瞟一眼?如图:

    里面展示了任务的一些特征,比如开始时间,map和reduce数量,耗时,状态等等。

    ** 总结

    这就是hadoop平台的基本搭建,望对你所有帮~掌声~(收!)

    IT全栈公众号:

    QQ大数据技术交流群(广告勿入):476966007

    下一节:Hadoop框架基础(二)

    相关文章

      网友评论

      • 6006d7eef6c2:很详细,第一天解除
      • 99648107d929:一个字nice!
      • 1c9ee9d425d6:Hi,感谢你为我们提供了这么好的教程,按照你的思路我已经能够启动所有的进程,包括NameNode,DataNode,ResourceManager等,但是我在浏览器中访问***:50070和***:8088均显示无法访问,我查看了两个端口都被相应的进程占用,请问我该如何解决呢?
        Z尽际:查看对应的log目录下的日志,看是否有异常,然后检查配置文件。

      本文标题:Hadoop框架基础(一)

      本文链接:https://www.haomeiwen.com/subject/kteggttx.html