Hadoop详解-HDFS-01

目录

1、Hadoop集群搭建

1.1、为什么在安装Hadoop集群之前需要重新编译?

由于Apache给出的Hadoop的安装包没有提供带C程序访问的接口,所以我们在使用本地库(本地库可以用来做压缩,以及支持C程序等等)的时候就会出问题,需要对Hadoop源码包进行重新编译。

1.2、Hadoop 2.X版本的架构模型

架构一(单节点架构):

NameNode与ResourceManager单节点架构模型.png

文件系统核心模块

这里仅仅是简单的说明一下Hadoop2.X架构下的各个模块,其中模块具体的相关功能,会在后序部分解释。

Hadoop 2.X版本的架构中,主要分为HDFS文件存储系统模块和Yarn资源调度系统模块。其中:

1、HDSF文件存储系统中核心组件:

NameNode:集群当中的主节点,主要用于管理集群当中的各种数据。
SecondaryNameNode:主要能用于Hadoop当中元数据信息的辅助管理。
DataNode:集群当中的从节点,主要用于存储集群当中的各种数据。

2、Yarn资源调度系统(也叫做数据计算核心模块)中:

ResourceManager:接收用户的计算请求任务,并负责集群的资源分配。
NodeManager:Yarn平台的从节点,主要用于处理ResourceManager分配的任务。

架构二(高可用架构):

高可用架构.png

文件系统核心模块
1、HDSF文件存储系统中核心组件:

NameNode:集群当中的主节点,主要用于管理集群当中的各种数据,一般都是使用两个,实
现HA高可用。
JournalNode:用于元数据信息同步的管理进程,一般都是奇数个。(这是架构高可用新出现的进程)
SecondaryNameNode:(和上面单节点架构的一样)主要能用于Hadoop当中元数据信息的辅助管理。
DataNode:(和上面单节点架构的一样)集群当中的从节点,主要用于存储集群当中的各种数据。
#####2、Yarn资源调度系统(也叫做数据计算核心模块)中:
ResourceManager:接收用户的计算请求任务,并负责集群的资源分配,高可用架构下,会有两个,通过Zookeeper进行主节点和备份节点之间的交换。
NodeManager:Yarn平台的从节点,主要用于处理ResourceManager分配的任务。

1.3、Hadoop集群搭建

主要修改七个文件:

1、core-site.xml
2、hdfs-site.xml
3、hadoop-env.sh
4、mapred.site.xml
5、yarn-site.xml
6、mapred-env.sh
7、slaves

1.4、配置环境变量

export HADOOP_HOME=/export/servers/hadoop-2.7.5
export PATH=:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

2、Hadoop 核心—HDFS

2.1、HDFS文件系统架构

HDFS是一个主从体系结构,由四部分组成:HDFS Client、NameNode、DataNode以及Secondary NameNode。

1、HDFS Client:客户端

功能:
(1)文件切分:文件上传 HDFS 的时候,Client 将文件切分成 一个一个的Block,然后进行存
储,一般一个Block是128M。
(2)与 NameNode 交互,获取文件的位置信息。
(3)与 DataNode 交互,读取或者写入数据。
(4)Client 提供一些命令来管理 和访问HDFS,比如启动或者关闭HDFS。
(总之一句话,HDFS就像是一个服务端,Client是一个客户端;用户所有的HDFS操作都必须通过Client。)

2、NameNode

功能:
(1)管理 HDFS 的命名空间。文件系统命名空间
(2)管理数据块(Block)映射信息。数据块映射信息
(3)配置副本策略
(4)处理客户端读写请求。

3、DataNode:NameNode下达命令,DataNode执行实际的操作。

功能:
(1)Data Node以数据块的形式存储HDFS文件。
(2)Data Node 响应HDFS 客户端读写请求
(3)Data Node 周期性向NameNode汇报心跳信息(10分钟一次)
(4)Data Node 周期性向NameNode汇报数据块信息(1小时一次)
(5)Data Node 周期性向NameNode汇报缓存数据块信息

4、Secondary NameNode:并非 NameNode 的热备。当NameNode 挂掉的时候,它并不能马上替换 NameNode 并提供服务。

功能:
(1)辅助 NameNode,分担其工作量。
(2)定期合并 fsimagefsedits,并推送给NameNode。
(3)在紧急情况下,可辅助恢复 NameNode。恢复过程

2.2、NameNode和DataNode详解

image.png

      在上面解释HDFS架构的时候,简单的说明了NameNode的功能,下面就针对于上面的罗列的几点功能进行详细的说明:

2.2.1、NameNode
1、NameNode元数据信息

      元数据信息包括:文件名,文件目录结构,文件属性(生成时间-副本-权限),每个文件的块信息,以及每一个块的Datanode的位置;每个文件和数据块之间的引用关系(文件、block、DataNode之间的映射关系)会定期的保存到本地磁盘(这部分主要是FsImage文件和Edits文件完成)

2、NameNode文件操作

      NameNode负责文件元数据的操作,DataNode负责实际处理文件内容的读写请求;其中数据流不用经过NameNode,但会询问它跟那个DataNode建立联系。

3、NameNode副本

      文件数据块到底存放到哪些DataNode上,是由NameNode决定的(NameNode文件操作中最后一句话),NN会根据全局情况做出放置副本的决定;而副本创建的数量用户自己决定的。

4、NameNode心跳机制

      NamoNode会全权管理数据块的复制,周期性的接受心跳和块的状态报告信息(块的状态报告信息包含该DataNode上所有数据块的列表;若接受到心跳信息(这个心跳信息是DataNode发送的),NameNode认为DataNode工作正常,如果在10分钟后还接受到不到DN的心跳,那么NameNode认为DataNode已经宕机 ,这时候NN准备要把DN上的数据块进行重新的复制;而块的状态报告包含了一个DN上所有数据块的列表,blocks report(块的状态报告信息) 每个1小时发送一次。

2.2.2、DataNode

DataNode提供真实文件数据的存储服务。

2.3、HDFS副本机制

2.3.1、HDFS使用数据块作为存储的逻辑单元的原因

      所有的文件都是一Block块的方式存放在HDFS文件系统当中,作用如下:
(1)一个文件有可能大于集群中任意一个磁盘,引入块机制,可以很好的解决这个问题。
(2)使用块作为文件存储的逻辑单位可以简化存储子系统
(3)块非常适合用于数据备份进而提供数据容错能力。

2.3.2、副本存放策略

      HDFS文件系统中的副本存放策略:以默认的副本数==3为例子:
1、第一个副本块存本机
2、第二个副本块存跟本机同机架内的其他服务器节点
3、第三个副本块存不同机架的一个服务器节点上

2.4、HDFS的命令行

2.4.1、HDFS基本命令
2.4.2、HDFS高级命令

2.5、HDFS文件写入和读取过程

2.5.1、写过程

image.png
过程说明:
1、Client 发起文件上传请求,通过 RPC 与 NameNode 建立通讯,NameNode 检查目标文件是否已存在, 父目录是否存在,返回是否可以上传。
2、Client 请求NameNode第一个 block 该传输到哪些 DataNode 服务器上。
3、NameNode 根据配置文件中指定的备份数量及副本存放策略进行文件分配,返回可用的DataNode 的地址如:A,B,C
4、Client 请求 3 台 DataNode 中的一台 A 上传数据(本质上是一个 RPC 调用,建立 pipeline,A 收到请求会继续调用 B, 然后 B 调用 C,将整个 pipeline 建立完成,后逐级返回 client
5、Client 开始往 A 上传第一个 block(先从磁盘读取数据放到一个本地内存缓存),以packet 为单位(默认64K),A 收到一个 packet 就会传给 B,B 传给 C。A 每传一个 packet 会放入一个应答队列等待应答
6、数据被分割成一个个 packet 数据包在 pipeline 上依次传输,在 pipeline 反方向上,逐个发送 ack(命令正确应答),最终由 pipeline 中第一个 DataNode 节点 A 将 pipeline ack 发送给 Client
7、当一个 block 传输完成之后,Client 再次请求 NameNode 上传第二个 block 到过程1。

2.5.2、读过程

image.png

  1. Client向NameNode发起RPC请求,来确定请求文件block所在的位置;
  2. NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode 都会返回含有该 block 副本的 DataNode 地址; 这些返回的 DN 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后;
  3. Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是DataNode,那么将从本地直接获取数据(短路读取特性);
  4. 底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类DataInputStream 的 read 方法,直到这个块上的数据读取完毕;
  5. 当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表;
  6. 读取完一个 block 都会进行 checksum 验证,如果读取 DataNode 时出现错误,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的DataNode 继续读。
  7. read 方法是并行的读取 block 信息,不是一块一块的读取;NameNode 只是返回Client请求包含块的DataNode地址,并不是返回请求块的数据;
  8. 最终读取来所有的 block 会合并成一个完整的最终文件。

2.6、HDFS的元数据辅助管理

在Hadoop集群中,NameNode的所有元数据信息都保存在了FsImage与Eidts文件当中。

2.6.1、FsImage和Edits详解
Edits

1、edits 存放了客户端最近一段时间的操作日志
2、客户端对 HDFS 进行写文件时会首先被记录在 edits 文件中
3、edits 修改时元数据也会更新

Fsimage

1、NameNode 中关于元数据的镜像, 一般称为检查点, fsimage 存放了一份比较完整的元数据信息
2、因为 fsimage 是 NameNode 的完整的镜像, 如果每次都加载到内存生成树状拓扑结构,这是非常耗内存和CPU, 所以一般开始时对 NameNode 的操作都放在 edits 中
3、fsimage 内容包含了 NameNode 管理下的所有 DataNode 文件及文件 block 及 block所在的 DataNode 的元数据信息
4、随着 edits 内容增大, 就需要在一定时间点和 fsimage 合并。

2.6.2、FsImage和Edits相关操作
2.6.3、SecondaryNameNode 如何辅助管理 fsimage 与 edits 文件?

SecondaryNameNode 定期合并Fsimage和edits,把edits大小控制在一个范围内;

合并步骤.png

合并步骤:

  1. SecondaryNameNode 通知 NameNode 切换成editlog.new
  2. SecondaryNameNode 从 NameNode 中获得 fsimage 和 旧editlog(通过http方式)
  3. SecondaryNameNode 将 fsimage 载入内存, 然后开始合并 editlog, 合并之后成为新的fsimage
  4. SecondaryNameNode 将新的 fsimage 发回给 NameNode
  5. NameNode 用新的 fsimage 替换旧的 fsimage,Edits替换edits.new。

特点:
1、完成合并的是 SecondaryNameNode, 会请求 NameNode 停止使用 edits, 暂时将新写操作放入一个新的文件中 edits.new;
2、SecondaryNameNode 从 NameNode 中通过 Http GET 获得 edits, 因为要和 fsimage 合并, 所以也是通过 Http Get 的方式把 fsimage 加载到内存, 然后逐一执行具体对文件系统的操作,与 fsimage 合并, 生成新的 fsimage, 然后通过 Http POST 的方式把 fsimage 发送给NameNode;NameNode 从 SecondaryNameNode 获得了 fsimage 后会把原有的 fsimage 替换为新的 fsimage, 把 edits.new 变成 edits. 同时会更新 fstime;
3、Hadoop 进入安全模式时需要管理员使用 dfsadmin 的 save namespace 来创建新的检查点;
4、SecondaryNameNode 在合并 edits 和 fsimage 时需要消耗的内存和 NameNode 差不多, 所
以一般把 NameNode 和 SecondaryNameNode 放在不同的机器上。

2.7、HDFS的API操作

2.7.1、Windows系统下的常见错误
1、缺少winutils.exe
2、缺少Hadoop.dll

上面两个问题都是在Window系统下缺少Hadoop运行环境导致的。解决方案:配置Hadoop环境变量,并重启Windows。

2.7.2、使用文件系统方式访问HDFS数据
1、获取FileSystem的四种方式(四种方式差不多):
@Test
    public void getFileSystem1(){
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://master");
        try {
            FileSystem fileSystem = FileSystem.get(conf);

            System.out.println(fileSystem.toString());

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Test
    public void getFileSystem2(){
        FileSystem fileSystem = null;
        try {
            fileSystem = FileSystem.get(new URI("hdfs://master:8020"), new Configuration());
            System.out.println(fileSystem.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }

    }
    @Test
    public void getFileSystem3(){
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://master");
        try {
            FileSystem fileSystem = FileSystem.newInstance(conf);

            System.out.println(fileSystem.toString());

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Test
    public void getFileSystem4(){
        FileSystem fileSystem = null;
        try {
            fileSystem = FileSystem.newInstance(new URI("hdfs://master:8020"), new Configuration());
            System.out.println(fileSystem.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }

    }

2、遍历HDFS中所有文件:
@Test
    public void listMyFile() throws Exception {
        FileSystem fileSystem = FileSystem.newInstance(new URI("hdfs://master:8020"), new Configuration());
        RemoteIterator<LocatedFileStatus> locatedFileStatusRemoteIterator = fileSystem.listFiles(new Path("/"), false);
        while (locatedFileStatusRemoteIterator.hasNext()){
            LocatedFileStatus next = locatedFileStatusRemoteIterator.next();
            System.out.println(next.getPath().toString());
        }
    }
3、创建文件夹:
public void mkdirs() throws Exception {
        FileSystem fileSystem = FileSystem.newInstance(new URI("hdfs://master:8020"), new Configuration());
        boolean mkdirs = fileSystem.mkdirs(new Path("/hello/mydir/test"));
        System.out.println(mkdirs);
        fileSystem.close();
    }

4、从HDFS上面下载文件到本地:
public void getFileToLocal() throws Exception {
        FileSystem fileSystem = FileSystem.newInstance(new URI("hdfs://master:8020"), new Configuration());
        FSDataInputStream fsDataInputStream = fileSystem.open(new Path("/a.txt"));
        FileOutputStream fileOutputStream = new FileOutputStream(new File("d:\\timer.txt"));
        IOUtils.copy(fsDataInputStream,fileOutputStream);

        IOUtils.closeQuietly(fileOutputStream);
        IOUtils.closeQuietly(fsDataInputStream);
        fileSystem.close();
    }
5、HDFS文件上传:
@Test
    public void putData() throws Exception {
        FileSystem fileSystem = FileSystem.newInstance(new URI("hdfs://master:8020"), new Configuration());
        fileSystem.copyFromLocalFile(new Path("file:///d:\\timer.txt"),new Path("/hello/mydir/test"));
        fileSystem.close();
    }

7、小文件合并:
@Test
    public void mergeFile() throws Exception {
        FileSystem fileSystem = FileSystem.newInstance(new URI("hdfs://master:8020"), new Configuration());
        FSDataOutputStream outputStream = fileSystem.create(new Path("/bigFile.txt"));


        LocalFileSystem localFileSystem = FileSystem.getLocal(new Configuration());
                FileStatus[] fileStatuses = localFileSystem.listStatus(new Path("file:///D:\\input\\hdfsMerge"));
        for (FileStatus fileStatus : fileStatuses) {
            FSDataInputStream inputStream = localFileSystem.open(fileStatus.getPath());
            IOUtils.copy(inputStream,outputStream);

            IOUtils.closeQuietly(inputStream);
        }
        IOUtils.closeQuietly(outputStream);
        localFileSystem.close();
        fileSystem.close();
    }
8、HDFS访问权限控制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值