zoukankan      html  css  js  c++  java
  • 网易大数据之数据存储:HDFS

    一、HDFS基础架构

    1、HDFS特点:水平扩展、高容错性、廉价硬件、开源生态系统

    2、Hadoop生态圈

    1)、分布式存储系统(HDFS),2)、资源管理框架(YARN),3)、批处理框架(MapReduce、Pig),4)、数据仓库(Hive),5)、NoSQL系统(HBase、Drill),6)、OLAP系统(Impala、Presto、Spark(SQL)),7)、实时流计算框架(Storm、Spark(Streaming)、Flink),8)、机器学习框架(Mahout、Spark(MLlib)),9)、消息队列(Kafka),10)、分布式协同服务(Zookeeper),11)、作业调度系统(Oozie),12)、全文检索系统Solr

    3、HDFS架构

    相关概念:Rack 机架:存储节点放在不同机架上,这与数据备份放置策略有关

         Block 数据块:数据切分成特定大小的数据块,分发到不同存储节点

         Replication 副本:数据块在不同存储节点之间,通过复制方式来拷贝

    1)、NameNode(管理节点):负责名称空间管理,管理元数据;负责文件到数据块的映射,以及数据块和存储节点对应关系

    2)、DataNode(数据存储节点):向管理节点汇报数据块信息;存储节点之间通过复制操作来实现数据均衡和备份;与客户端交互,执行数据读写请求

    3)、Client(客户端):向NN/DN发起读写请求

    4、HDFS读写

    1)、HDFS Read

      a、客户端向NN发起读请求

      b、NN返回请求文件的数据块所在的存储节点列表,如果有多个块,会返回多个存储列表,因为一个数据块对应一个存储节点

      c、客户端根据返回的节点列表,优先选择最近的节点访问

      d、选完节点后,客户端直接与DN节点连接读取相应的Block数据,读完这个Block后关闭连接

      e、如果文件有多个数据块,客户端再次选择下一个Block所在节点,进行连接,重复上述过程

       f、已经读完最后一个数据块后,关闭与NN连接

    2)、HDFS Write

      a、客户端向NN发起写请求

      b、NN返回需要写入文件的数据块所在的存储节点列表

      c、客户端根据返回的节点列表,优先选择最近的节点创建链接;如果该客户端在DN节点上,则优先写本地节点

      d、客户端与第一个DN节点建立TCP链接,然后该DN节点会根据客户端传递过来的节点信息,依次创建下一个DN节点的链接。以及第二个DN节点到第三个DN节点的链接。这个过程称为创建DataNode管道

      e、客户端先写第一个数据包,待第一个节点收到该数据包后,由其向下一个节点发送这个数据包,直至到第三个节点

      f、在最后一个节点完成数据包的接收后,向第二个节点发送确认信息;第二个节点收到确认信息后,将自己的确认信息发送给第一个节点,然后第一个节点将确认信息发送给客户端。客户端收到这个数据包的确认信息后,才会发送下一个数据包,如此反复

      g、当第一个数据块写完后,客户端关闭这个DataNode管道。如果还有数据块,则创建一个新的数据管道开始写入数据

      h、数据写完后,客户端关闭

    5、副本放置策略  下图,n1234 ode为节点即服务器,r123 ack为机架,d12data center为数据中心;黄块为数据块;蓝块为客户端;

    d=0246为客户端到存储块节点距离,local为d=0,同rack为d=2,同数据中不同rack为d=4,不同数据中心为d=6

    定义节点访问距离,可以降低网络访问流量开销,提高访问性能

      NN来选择数据块的放置节点,它按照机架配置来选择节点。如果是3副本放置策略,优先放入到离写入客户端最近的DN节点;然后是该节点同机架上的一个节点;最后是与该节点不在同一机架上的节点。

      选择节点辅助策略:随机选择一个节点,随机选择两次,返回磁盘使用率较低的一个节点

    二、部署配置

    1、部署安装

    一般参数列表

      fs.defaultFS          HDFS的名称空间地址

      dfs.blocksize           块大小,默认是64M或128M,文件存储的时候,如果大于指定块大小,则切分,如果小于,则按照文件大小存储,并不会占用指定块大小

      dfs.replication         备份数,默认为3

      dfs.reservedsize        磁盘保留空间,默认未开启

      dfs.namenode.edit.dir       NN的edit日志存放路径,edit日志文件编号前后连接,如果中间有断链,那么说明文件缺失

      dfs.namenode.name.dir       NN的image文件(元数据)存放路径

      dfs.datanode.data.dir        DN的数据存储目录,可以选择存储在多个目录下,多个目录用逗号隔开

      dfs.namenode.rpc-address    NN的RPC服务端口号

      dfs.namenode.http-address   NN的HTTP服务端口号

      dfs.datanode.address       DN的RPC服务端口号,数据传输用

      dfs.datanode.http.address     DN的HTTP服务端口号

      dfs.datanode.ipc.address    DN的IPC端口号,与NN通信

      fs.trash.interval          开起回收站,如果通过hdfs的shell命令删除的数据会放到回收站,回收站默认清除时间为1小时,也可以自定义

     2、部署实操

    1)、配置javahome环境变量、可以使用scp命令(需要安装SSH)上传Hadoop软件包

    2)、使用tar -zxvf命令解压hadoop软件包;使用ln命令创建软连接,如ln -s hadoop-2.7.7 hadoop-current

    3)、配置Hadoop Home环境变量

      a、cd ~

      b、vi .bashrc  配置文件写入如下图

      c、source .bashrc

      d、hadoop命令查看配置是否正确,如下图

    4)、如果没有配置全局Javahome环境变量,可以在Hadoop配置文件/root/dev/hadoop-2.7.7/etc/hadoop/hadoop-env.sh中配置,此文件也可以配置HadoopJVM相关参数

     此处默认取环境变量JAVA_HOME

    5)、配置HDFS的核心配置文件core-site.xml(/root/dev/hadoop-current/etc/hadoop/core-site.xml),NN、DN和YARN都会加载这个文件, vi core-site.xml 配置fs.defaultFS指向NN地址,其他用默认值(注意下面地址不能用localhost,否则只有本机才能访问)

    6)、配置hdfs-site.xml  vi hdfs-site.xml 

     

    7)、格式化HDFS命令  hdfs namenode -format

    原本dev文件夹下没有hadoopnamedir,执行完命令后就有了

    8)、启动namenode服务  hdfs namenode

    (一般端口会被防火墙限制,关闭或者放开端口,参考···········

    启动服务后就可以通过WebUI访问namenode了,地址:http://192.168.1.6:50070

    9)、启动datanode服务  hdfs datanode

    原本dev文件夹下没有hadoopdata/data/0,hadoopdata/data/1,hadoopdata/data/2,启动服务后就有了(教程中使用 mkdir -p hadoopdata/data/{0..2}命令创建,Hadoop有权限创建情况下会自动创建,否则要自己创建)

    在namenode的WebUI下就可以看到启动的datanode了

    10)、启动另一个节点的datanode,方式类似以上

       a、解压Hadoop,创建软连接

       b、从上一个节点拷贝core-site.xml到本机  先切换到Hadoop配置文件目录,后(注意命令最后的点,拷贝到当前文件夹,$PWD表示本机的Hadoop配置文件目录和上一个节点Hadoop配置文件目录一样)scp root@192.168.1.6:$PWD/core-site.xml .   同样的方式再拷贝hdfs-site.xml(教程中拷贝了hadoop-env.xml,由于我本地配置了javahome,所以就不用拷贝了)

      c、由于我们使用上一个节点的namenode,所以我们只修改本机Hadoop配置文件hdfs-site.xml中datanode相关配置

     改为

      d、由于本机没有配置HadoopHome环境变量,所以使用带路径方式或到bin下使用hdfs datanode命令启动datanode服务

      哎呀,不好,报错了,此错是由于解析hostname出错,因为配置中使用的是IP

      

      两种解决办法;第一种、使用hostname,在hosts文件中做好映射(没测)

          第二种、在hdfs-site.xml中添加配置如下 (namenode和datanode都配置)       

          <property>
            <name>dfs.namenode.datanode.registration.ip-hostname-check</name>
            <value>false</value>
          </property>

      添加了配置后,重新启动datanode服务,刷新namenode节点对应的WebUI,看到datanode节点数为2

     

    如果其中一个DataNode宕机,namenode要等很久才知道,如果查询或获取数据,正好访问宕机节点,要达到最大尝试次数

    注意,如果出现类似异常java.io.IOException: Incompatible clusterIDs、java.io.IOException: All specified directories are failed to load需要将datanode存放数据的目录删掉,使用命令如 rm -rf hadoopdata

     11)、测试hadoop fs命令

      查看根目录命令:hadoop fs -ls /

      创建文件夹命令:hadoop fs -mkdir /tmp  hadoop fs -mkdir -p /user/hjp  hadoop fs -mkdir /user/hjp/input

      上传txt格式文件:hadoop fs -put *.txt /user/hjp/input

      删除指定文件:hadoop fs -rm /user/hjp/input/1.txt

      查看文件内容命令:hadoop fs -text /user/hjp/input/1.txt

      下载文件到本地并重命名:hadoop fs -get /user/hjp/input/1.txt 123.txt  (比较两个文件内容是否一样,可以使用md5sum命令获取md5值对比,如下图)

     

    12)、守护进程启动datanode服务:dev/hadoop-current/sbin/hadoop-daemon.sh start datanode,其他DataNode和NameNode也类似此守护进程方式启动

    使用tail -f命令查看日志信息:tail -f /root/dev/hadoop-2.7.7/logs/hadoop-root-datanode-192.168.1.8.log

    13)、YARN部署(master上启动resourcemanager服务,slaves上启动nodemanager服务)

      a、YARN共用Hadoop的core-site.xml和hdfs-site.xml,只需配置YARN的yarn-site.xml和mapred-site即可

      yarn-site.xml配置如下

    <configuration>

      <!-- Site specific YARN configuration properties -->

      <!--RM WebUI地址-->
      <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>192.168.1.6:8088</value>
      </property>

      <!--RM域名-->
      <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>192.168.1.6</value>
      </property>

      <!--NM logs存放作业的日志输出-->
      <property>
        <name>yarn.nodemanager.log-dirs</name>
        <value>/root/dev/yarn/0/logs,/root/dev/yarn/1/logs,/root/dev/yarn/2/logs</value>
      </property>

      <!--NM工作目录-->
      <property>
        <name>yarn.nodemanager.local-dirs</name>
        <value>/root/dev/yarn/0/local,/root/dev/yarn/1/local,/root/dev/yarn/2/local</value>
      </property>

      <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
      </property>

    </configuration>

      mapred-site.xml配置如下(Hadoop配置目录下没有mapred-site.xml,而又mapred-site.xml.template。配置目录下使用cp mapred-site.xml.template mapred-site.xml命令复制一下):

    <configuration>

      <!--MR的资源调度框架-->
      <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
      </property>

      <!--作业历史RPC地址-->
      <property>
        <name>mapreduce.jobhistory.address</name>
        <value>192.168.1.6:10020</value>
      </property>

      <!--MR作业历史WebUI-->
      <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>192.168.1.6:19888</value>
      </property>
    </configuration>

      b、如果没有权限创建yarn日志输出和工作目录文件夹权限,就使用mkdir -p /root/dev/yarn/{0..2}/local和mkdir -p /root/dev/yarn/{0..2}/logs命令创建对应文件夹;如果当前用户有权限,Hadoop会自动创建;下面其他节点启动nodemanager服务也是如此

      c、启动yarn resourcemanager,直接使用命令yarn resourcemanager,启动成功后,看到WebUI端口为8088

      d、在其他节点Hadoop配置文件目录下,使用scp root@192.168.1.6:$PWD/yarn-site.xml . scp root@192.168.1.6:$PWD/yarn-site.xml .   命令拷贝yarn-site.xml和mapred-site.xml文件到其他节点。无需改动配置

      e、其他节点因为没有配置Hadoop环境变量,到bin目录下启动nodemanager服务: bin/yarn nodemanager

      f、到ResourceManager WebUI上查看nodes,1.6为ResourceManager,1.7和1.8为NodeManager,如下图(我本机配置没有这样高,下面的配置数据估计是来自配置文件)

    注意:如果本地没有配置hosts,那么yarn的node节点需要在yarn-site.xml配置文件中配置yarn.nodemanager.address,对应本节点的IP,IP后面的0表示端口号随机分配。resourcemanager节点不需要配置。nodemanager中yarn-site.xml添加配置如下,可参考······

      教程中会看到老师的ResourceManager WebUI下对应NodeManager RPC或Http地址如下,使用的是主机名

      g、在Hadoop home文件下可以通过命令hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar,获取example Jar包命令参数解释,如下

      h、使用example Jar包的pi命令测试yarn 和 mapreduce:在resourcemanager节点上的Hadoop home文件夹下输入命令 hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar pi 5 10  哎呀报错了,如下,需要设置resourcemanager和nodemanager节点时间一致,方法参考··············

      修改好再次执行就OK了

      i、再写一个获取文件字数的命令: hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /user/hjp/input /user/hjp/output

      在ResourceManager上查看历史任务,如下

      点击上面ID列中一个,进入下面界面,点击History,无法访问网页,说明MapReduce JobHistory服务还没有启动;ResourceManager节点上命令mapred historyserver启动

    启动historyserver后----》

      j、守护进程启动resourcemanager服务和nodemanager服务:dev/hadoop-current/sbin/yarn-daemon.sh start resourcemanagerdev/hadoop-current/sbin/yarn-daemon.sh start nodemanager;守护进程启动historyserver:dev/hadoop-current/sbin/mr-jobhistory-daemon.sh start historyserver

     三、HDFS管理与使用

    注意要配置hdfs-site.xml打开ACL权限控制,默认不打开

    <property>
    <name>dfs.namenode.acls.enabled</name>
    <value>true</value>
    </property>

    1、HDFS默认使用POSIX风格的权限管理方式,权限分为用户、用户组、其他等角色。使用方式类似Linux系统修改权限。

    如hadoop fs -chmod <PERM> <PATH> 修改文件权限;hadoop fs -chown <USER:GROUP> <PATH>修改文件所属用户、用户组

     例,改变用户目录所属用户组:haddop fs -chown :groupa /user/hjp/foo  或  hadoop fs -chgrp groupa /user/hjp/foo

    2、ACL权限变更,修改ACL权限后立即生效,无需刷新用户用户组

    1)、普通文件的权限,会延续到此文件下子文件,所以使用ACL来细粒度控制权限,HDFS提供了类似POSIX ACL特性

    2)、一条ACL规则由若干ACL条目组成,每个条目指定一个用户或用户组的权限位。ACL条目由类型名,可选名称和权限字符串组成,以英文冒号为分隔符

    3)、目录或文件的ACL规则示例如下(逗号分隔,第一个表示类型名,第二个表示可选名,第三个是权限位),当设置了ACL规则后,hdfs目录或文件权限位后面会多一个加号(+):

      user::rw-      所属用户,读写权限;类型名表示设置的是用户权限,可选名省略表示目录或文件所属的用户

      user:bruce:rwx    bruce用户,读写可执行权限;类型名表示设置的是用户权限,可选名是bruce用户,但是写了可选名,就要经过下面mask的过滤,最终该用户对目录或文件是读权限

      group::r-x       所属用户组可读可执行权限;类型名表示设置的是用户组权限,可选名省略表示目录或文件所属的用户组,但是类型名为用户组的要经过下面的mask过滤,最终目录或文件所属用户组是读权限

      group:sales:rwx   sales用户组,读写可执行权限;类型名表示设置的是用户组权限,可选名是sales用户组,但是类型名为用户组的要经过下面的mask过滤,最终目录或文件对sales用户是读权限

      mask::r--      对group条目和指定用户的user条目起作用,进行过滤

      other::r--      其他用户,即非目录或文件所属用户及用户组,读权限;

      default:上面权限设置形式;default只应用于目录上,权限会被子目录及文件所继承,所以慎用

      具体示例如下:

    3、 配额管理

    4、数据均衡

    5、滚动升级(可以不用停服)

    1)、NN升级,注意下面的NN1表示当前使用的NN节点,NN2表示备用的NN节点;当前使用的NN节点简称ANN(ActiveNameNode),备用的NN节点简称SNN(StandbyNameNode)

    2)、DN升级,注意rollingUpgrade finalize命令会删除NN和DN备份的数据,所以在确保升级成功后再执行该命令

    6、版本回滚(要停服)

    7、其他

    四、高级内容

    1、HDFS高可用

  • 相关阅读:
    JavaScript二进制数据序列化和反序列化
    三维变换矩阵推导笔记
    如何制作一款“有毒”的游戏
    如何使用visual studio将你的程序打包成安装包
    游戏设计模式系列(三)—— 策划变心太快?也许可以使用组合
    使用LayaAir解析xml文件
    游戏设计模式系列(二)—— 适时使用观察者模式,解耦你的代码
    游戏设计模式系列(一)—— 单线逻辑&&数据驱动,搞定最容易卡死的结算界面
    vs2010 win32程序中 sqlserver 2008 express的简单使用 (C++)
    UVALive 6529
  • 原文地址:https://www.cnblogs.com/hujiapeng/p/9420860.html
Copyright © 2011-2022 走看看