zoukankan      html  css  js  c++  java
  • Hadoop 0.23.3版本

    1 Hadoop 0.23.3版本

    1.1 Hadoop 0.20.x版本局限性

    Hadooop 0.23.0以前版本的HDFS是单NameNode的,有非常大的局限性

    1)        扩展性问题。可以随着数据量进行水平扩展,而元数据服务器不能扩展。

    2)        随着文件数目的增长,元数据服务器的压力变大,淘宝有现在世界上最大的单点hadoop集群,2800个。

    3)        文件操作的吞吐率受到单个元数据服务器的限制。

    4)        隔离性的问题。0.23.0以前版本,一个NameNode对应着一个唯一的Namespace,所有文件、应用、用户公用同一的名字空间。存在访问权限控制的问题。

     

    Hadoop 0.20.0 HDFS架构

    1.2 Hadoop基本理念

    1)        HDFS分为NameNode,DataNode。NameNode维护了名字空间(Namespace),fileName与Block映射关系,以及DataNode交互信息。DataNode是存储Block的位置,为客户端提供读取block内容的接口。(在后面的hdfs-site.xml需要进行配置)

    2)        HDFS DataNode随着数据量的大小可以实现动态扩展,配合start-balance.sh可以自由地实现节点上线和下线。

    3)        Hadoop执行框架要遵循“计算向数据迁移”的要求。这也意味着节点上需要同时部署DataNode和任务执行节点。

    4)        工作节点通过RPC与中心节点交互。(hdfs-site.xml中配置)

    1.3 Hadoop 0.23的New Features

    HDFS存储包括两层:

    1)        Namespace管理directory, file and block,支持文件系统操作(也就是client端的文件系统操作,如create,delete,read,write等首先与Namespace打交道)。

    2)        Block Storage主要由两部分组成:Block Management负责维护集群中NameNode与众多DataNode的关系以及create chunk,delete chunk等数据块操作;Physical Storage负责chunk的存储。

     

    Hadoop 0.20.0存储结构

           Block Storage的两部分功能分别在NameNode和DataNode中完成。在原来的单NameNode架构中,一个NameNode对应一个Namespace,对应多个DataNode组成的存储池空间,实现和理解起来非常容易。

           Hadoop 0.23.0支持多个NameSpace,每个NameNode都对应一个NameSpace。配置人员可以根据应用的特点,选择合适的NameSpace划分的方式。所有的DataNode被全部的NameNode 共享,也就是每一个NameNode中NameSpace下的文件可以分散在任意的DataNode上。系统提供了一个公共的Block pools隔离了Namespace与Block交互。

     

    HDFS Federation Architecture

      在NameNode federation中,每个NameNode节点是一个nameservice ,负责管理一个Namespace和对应的Block pool。整个集群有一个公共的ClusterID。在我的部署方案中,共有两个Namespace: ns1和ns2。所以对应有两个block pool。相应的Block pool ID可以在format文件系统之后获取,这个后面会讲到。同时在每个DataNode节点的dfs.datanode.dir目录下会为每个block pool分配以block pool ID命名的文件夹来存储对应block pool的块数据。

      Federation中存在多个命名空间,如何划分和管理这些命名空间非常关键。例如查看某个目录下面的文件,如果采用文件名hash的方法存放文件,则这些文件可能被放到不同namespace中,HDFS需要访问所有namespace,代价过大。为了方便管理多个命名空间,HDFS NameNode Federation采用了经典的Client Side Mount Table。

     

      如上图所示,下面四个蓝色三角形代表一个独立的Namespace,上方灰色的三角形代表从客户角度去访问的逻辑Namespace。各个蓝色的Namespace mount到灰色的表中,客户可以通过访问不同的挂载点来访问不同的namespace,这就如同在Linux系统中访问不同挂载点的磁盘一样。这就是HDFS NameNode  Federation中命名空间管理的基本原理。但是这种方式容易造成不同Namespace下文件数量和存储量的不均衡,需要人工介入已达到理想的负载均衡。

      HDFS NameNode Federation并没有完全解决单点故障问题。虽然namenode/namespace存在多个,但是从单个namenode/namespace看,仍然存在单点故障:如果某个namenode挂掉了,其管理的相应的文件就不可以访问。所以对于其中的任何一个namenode依然存在SPOF问题,而这个问题的解决要依赖于HA的实现。就是给每个NameNode配备一个对应的BackupNode和CheckpointNode。

    2 Hadoop 0.23.3配置

      Hadoop集群结构如下所示:

       

      总共有3台机子211(由于中途IP发生了一次变化,21的电脑和211是同一台)和253的机子作为NameNode,同时他们也作为DataNode节点。

      所有的自己都使用相同的用户名,使用adduser命令添加。这里,我们所有的用户名都为hadoop,密码也为hadoop。

      #adduser hadoop 后面全都按enter便可

      同时,我们还需要设置/etc/hosts,将所有hadoop集群的机子与其IP地址相对应。

    2.1 JDK安装

      JDK的安装省略,建议使用Oracle的最新版JDK。

    2.2 SSH无密码登陆设置

      Namenode通过SSH管理DataNode,所以所有namenode的机器必须无密码。

      #apt-get install ssh 在ubuntu下安装SSH软件

      #ssh-keygen -t rsa 一直按enter,无密码设置。会在当前用户的用户目录下(/home/hadoop)生成.ssh文档。

      #cat .ssh/id_rsa.pub>>.ssh/authorized_keys 该命令是把id_rsa.pub的内容添加到authorized_keys的末尾。注:A要无密码访问B,只需要把B生成的id_rsa.pub添加到A的authorized_keys的末尾便可。

      #scp id_rsa.pub 10.82.58.211:/home/hadoop 这条命令可以把当前目录中的id_ras.pub拷贝至别的计算机的目录中。

    当所有计算机全部实现相互连接后,可以用下面的命令来检验:

      #ssh 10.82.58.140 不需要密码就能登陆到140的计算机。Namesever的计算机一定要实现对datanode的无密码访问。通过SSH远程访问,如果没有制定用户名的话,会使用当前电脑的用户名作为远程访问的那台电脑的用户名。所以,所有的电脑都使用相同的用户名,这里使用hadoop作为用户名。

     

    图1 无密码访问

    2.3 Hadoop配置

    2.3.1 下载解压

      下载hadoop-0.23.3.tar.gz,并放置在/home/hadoop。

      #tar -zvxf hadoop-0.23.3.tar.gz 解压hadoop压缩包

    2.3.2 配置环境变量

      #vim .bashrc

    #设置java环境变量

    复制代码
    export JAVA_HOME=/usr/lib/java/jdk1.7
    
    export JRE_HOME=${JAVA_HOME}/jre
    
    export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:
    
    $JAVA_HOME/lib:$CLASSPATH
    
    export PATH=${HADOOP_DEV_HOME}/bin:$JAVA_HOME/bin:$PATH
    复制代码

    # 设置hadoop环境变量

    复制代码
    export HADOOP_DEV_HOME=/home/hadoop/hadoop-0.23.3
    
    export HADOOP_MAPRED_HOME=${HADOOP_DEV_HOME}
    
    export HADOOP_COMMON_HOME=${HADOOP_DEV_HOME}
    
    export HADOOP_HDFS_HOME=${HADOOP_DEV_HOME}
    
    export HADOOP_CONF_DIR=${HADOOP_DEV_HOME}/etc/hadoop
    
    export YARN_HOME=${HADOOP_DEV_HOME}
    
    export HDFS_CONF_DIR=${HADOOP_DEV_HOME}/etc/hadoop
    
    export YARN_CONF_DIR=${HADOOP_DEV_HOME}/etc/hadoop
    
    export HADOOP_LOG_DIR=${HADOOP_DEV_HOME}/logs
    复制代码

      #source ./.bashrc 对当前配置立即生效。

          这种配置方式只对当前用户有效,即hadoop这个用户有效。

    2.3.3 配置hadoop-config.sh

      #vim libexec/hadoop-config.sh

      在配置文件中添加JAVA_HOME=/usr/lib/java/jdk1.7

    2.3.4 Hadoop参数配置

      然后就是按照我们的部署方案,配置hadoop的参数了。我们前面已经提到了,在0.23.1之后的版本中,hadoop的配置文件都是放到了etc/hadoop/目录里,而且所有节点的配置文件都是统一的,省得还去区分NameNode和DataNode,配置一份然后拷贝到所有节点就行了。我们首先修改core-site.xml,添加hadoop.tmp.dir属性。由于在core-default.xml中,hadoop.tmp.dir被默认设置在/tmp目录下,重启机器数据就会丢失,所以我们必须覆盖这个配置项。

      #vim /etc/hadoop/hdfs-site.xml

    复制代码
    <configuration>
    
      <property>
    
        <name>dfs.namenode.name.dir</name>
    
            <value>/home/hadoop/hadoop/dir</value>
    
      </property>
    
      <property>
    
        <name>dfs.federation.nameservices</name>
    
        <value>ns1,ns2</value>
    
      </property>
    
      <property>
    
        <name>dfs.namenode.rpc-address.ns1</name>
    
        <value>10.82.58.211:9000</value>
    
      </property>
    
      <property>
    
        <name>dfs.namenode.http-address.ns1</name>
    
        <value>10.82.58.211:23001</value>
    
      </property>
    
     <property>
    
        <name>dfs.namenode.secondary.http-address.ns1</name>
    
        <value>10.82.58.211:23002</value>
    
      </property>
    
      <property>
    
        <name>dfs.namenode.rpc-address.ns2</name>
    
        <value>10.82.58.253:9000</value>
    
      </property>
    
      <property>
    
        <name>dfs.namenode.http-address.ns2</name>
    
        <value>10.82.58.253:23001</value>
    
      </property>
    
      <property>
    
        <name>dfs.namenode.secondary.http-address.ns2</name>
    
        <value>10.82.58.253:23002</value>
    
      </property>
    
    </configuration>
    复制代码

      就像我的部署实例中描述的那样,dfs.federation.nameservices表示两个NameServiceID,在我的例子中分别是ns1和ns2。然后分别配置这两个nameservice的rpc-address。这个dfs.namenode.rpc-address.是非常重要的属性,因为在后续对NameService的访问中都是通过这个属性的值来完成的。dfs.namenode.http-address是通过web浏览器访问监控信息的端口,也就是默认50070的那个端口。dfs.namenode.name.dir和dfs.namenode.edits.dir表示的是NameNode节点的Namespace元数据存放的本地目录,默认是在hadoop.tmp.dir目录下的某一位置,我们可以修改。

    同时,这里面提到了两个RPC端口,分别是dfs.namenode.rpc-address和dfs.namenode.servicerpc-address。如果像我的例子中一样,只配置dfs.namenode.rpc-address,那么NameNode-Client和NameNode-DataNode之间的RPC都走的是这个端口。如果配置了后者与前者不同,那么dfs.namenode.rpc-address表示的是NameNode-Client之间的RPC,而dfs.namenode.servicerpc-address表示的是NameNode-DataNode之间的RPC。之所以要区别开来,我想主要是因为datanode和namenode通讯时不会影响client和namenode的通讯,因为同一个端口同时打开的句柄毕竟是预先设定的,缺省为10个。

    2.3.5 格式化文件系统

      配置好了这些之后,就可以格式化文件系统了。由于我们部署了2个NameNode,所以我们需要在211和253两台机器上分别执行${HADOOP_DEV_HOME}/bin/hdfs namenode -format -clusterid suc命令。注意两台机器上指定的clusterid是一样的,表示这两个namenode组成的是同一个集群。

      那么在执行了format之后,在10.82.58.211节点的dfs.namenode.name.dir目录下生成了current目录,在current目录里有个VERSION文件,内容如下:

      和以前的版本相比多了clusterID和blockpoolID这两项。clusterID就是我们刚才在format时指定的集群ID,在整个集群中是唯一的。而blockpoolID就是针对每一个Namespace所对应的blockpool的ID,上面的这个BP-1450194670-192.168.12.133-1334806145084就是在我的ns1的namespace下的存储块池的ID,这个ID包括了其对应的NameNode节点的ip地址。

    在format的同时也会生成fsimage和edits文件,及其对应的md5校验文件。Hadoop的NameNode要分别的格式化。

    2.3.6 启动hadoop集群

      #sbin/start-dfs.sh启动整个HDFS集群。

    2.3.7 Web查看

     

     

    2.3.8 FsShell使用

      #Bin/hadoop fs –put /home/test hdfs://10.82.58.211:9000/cloud/

      也就是说从FsShell中操作文件要指定HDFS的namespace,这也是我前面说的为什么dfs.namenode.rpc-address这个属性很重要的原因。而且在0.23.1以后的版本中,像bin/hdfs dfsadmin –report这样的命令执行是需要配置fs.default.name这个参数的。也就是说很多hdfs的命令需要指定相应的namespace,然后这个shell的操作都是对这个namespace的操作。

      当然大多数情况下还是利用client-api来进行hdfs的操作,从api的角度看,现在提供的接口除了DistributedFileSystem外,又提供了一个DFSAdmin接口,用于对文件系统的管理操作。hadoop在后续的版本中会发布hadoop-client这个工程模块,相信会把client的易用性有所提升。

    2.4 MapReduce的配置

    2.4.1 Mapred-site.xml配置

    复制代码
    <configuration>
    
        <property>
    
        <name>mapreduce.framework.name</name>
    
        <value>yarn</value>
    
        </property>
    
     
    
        <property>
    
        <name>mapreduce.jobhistory.address</name>
    
        <value>10.82.58.211:10020</value>
    
        </property>
    
     
    
        <property>
    
        <name>mapreduce.jobhistory.webapp.address</name>
    
        <value>10.82.58.211:19888</value>
    
        </property>
    
    </configuration>
    复制代码

      需要注意的是mapreduce.framework.name=yarn这个配置,如果没有配置这项,那么提交的yarn job只会运行在locale模式,而不是分布式模式。

    2.4.2 yarn-site.xml配置

    复制代码
    <property>
    
        <description>The address of the resource tracker interface.</description>
    
        <name>yarn.resourcemanager.resource-tracker.address</name>
    
        <value>10.82.58.211:8025</value>
    
      </property>
    
     
    
      <property>
    
        <description>The address of the applications manager interface in the RM.</description>
    
        <name>yarn.resourcemanager.address</name>
    
        <value>10.82.58.211:8040</value>
    
      </property>
    
     
    
      <property>
    
        <description>The address of the scheduler interface.</description>
    
        <name>yarn.resourcemanager.scheduler.address</name>
    
        <value>10.82.58.211:8030</value>
    
      </property>
    
     
    
      <property>
    
        <description>The address of the RM admin interface.</description>
    
        <name>yarn.resourcemanager.admin.address</name>
    
        <value>10.82.58.211:8141</value>
    
      </property>
    
     
    
      <property>
    
        <description>The address of the RM web application.</description>
    
        <name>yarn.resourcemanager.webapp.address</name>
    
        <value>10.82.58.211:8088</value>
    
      </property>
    
     
    
      <property>
    
        <name>yarn.nodemanager.aux-services</name>
    
        <value>mapreduce.shuffle</value>
    
      </property>
    
     
    
      <property>
    
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
    
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    
      </property>
    
     
    
      <property>
    
        <name>yarn.nodemanager.local-dirs</name>
    
        <value>/home/hadoop/hadoop_data/local</value>
    
      </property>
    
     
    
      <property>
    
        <name>yarn.nodemanager.log-dirs</name>
    
        <value>/home/hadoop/hadoop_data/logs</value>
    
      </property>
    
     
    
      <property>
    
        <name>yarn.app.mapreduce.am.staging-dir</name>
    
        <value>/user</value>
    
      </property>
    
    </configuration>
    复制代码

    2.4.3 启动MapReduce

      在10.82.58.211这台自己上启动ResourceManager,这样三台机子都会启动NodeManager。

      #sbin/start-yarn.sh

      #sbin/mr-jobhistory-daemon.sh start historyserver

      #JPS 来查看启动进程

    10.82.58.211左边进程,10.82.58.140右边进程

    2.4.4 运行自动wordcount程序

      在0.23版本以后,由于采用了分布式namenode,所以每次使用命令时必须指定namenode节点,如显示文件列表命令。(文件操作命令与linux相似,前面多hadoop fs,命令作为参数如-ls)

      #hadoop fs –ls hdfs://10.82.58.211:9000/ 在10.82.58.211:9000这个namenode下根目录的文件列表。

    我们可以通过设置core-site.xml来设置默认访问节点。

    复制代码
        <property>
    
            <name>fs.defaultFS</name>
    
            <value>hdfs:10.82.58.211:9000</value>
    
        </property>
    复制代码

      自带的wordcount程序是对文章中单词的统计,所以我们必须设置输入文件

    #mkdir input

    #cd input

    #echo “hello world”>>test1.txt

    #echo “hello hadoop”>>test2.txt

    #hadoop fs –put –r ../input /input 将本地的input文件拷贝至hadoop集群的目录中去。

    #hadoop fs –ls / 查看hadoop的根目录是否有/input文件,且无/output(结果输出文件)。

    #hadoop jar $HADOOP_DEV_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-0.23.1.jar wordcount /input /output

     

    执行成功

      注:任务每次提交到10.82.58.253这台机子上时,任务都会执行失败。可能是环境变量没有设置正确或者电脑本身存在问题(通信一直有问题)。

      #hadoop fs –cat /output/* 查看统计结果

      可以通过webUi界面来查看管理hadoop

    ResourceManager: http://10.82.58.211:8088/cluste

    NodeManager :http://10.82.58.211:9999/node   http://10.82.58.253:9999/node  http://10.82.58.140:9999/node

    NameNode:http://10.82.58.211:23001/dfshealth.jsp     SecondaryNameNodehttp://10.82.58.211:23002/status.jsp

    NameNode: http://10.82.58.253:23001/dfshealth.jsp     SecondaryNameNodehttp://10.82.58.253:23002/status.jsp

    JobHistory:http://10.82.58.211:19888/jobhistory

     

    3 其他

      本人也是刚刚学习hadoop,整片文章借鉴了引用了太多的文章,并没在这边列出,对那些作者说声抱歉。在配置过程中,因为IP发生了一次变化(如果允许,建议配成静态IP),所以可能文章中会有些混乱,但是对于每一部分应该是不会有大问题的。如果,有错误请指出,会及时改正。

  • 相关阅读:
    jQuery中deferred对象的使用(一)
    css中calc()的使用
    网络协议学习笔记1
    iOS: 类目里动态关联对象
    [转载] 2016 app 上线流程
    iOS:集成环信3.0循环掉坑。(学习笔记一)
    iOS 实现条件选择框
    iOS : 定义项目中接口文档
    iOS:消除项目中的警告⚠️
    iOS 一个简洁的条件筛选界面
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2880446.html
Copyright © 2011-2022 走看看