HDFS原理简介及功能

HDFS

Hadoop分布式文件系统,是一个文件系统,用于存储文件,通过目录树来定位文件,其次他是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色

HDFS组成架构

NameNode:

  • NameNode是一个中心服务器,就是Master
  • 负责管理文件系统的名字空间以及客户端的访问 
  • 配置副本策略
  • 管理数据库

DataNode: 就是Slave,namenode下达命令,datanode执行实际操作

  • 负责存储实际的数据块 
  • 执行数据块的读/写操作

SecondaryNameNode:

  • 当namenode不行时并不能马上替换namenode并提供服务
  •  辅助namenode,分担工作量,比如定期Fsimage和Edits,并推送namenode
  •  在紧急情况下,可辅助恢复namenode

1.2 HDFS优缺点

优点:

  • 高容错性

数据自动保存多个副本,通过增加副本的形式提高高容错性

某一个副本丢失后可以自动恢复

  • 适合处理大数据

数据规模:能够处理数据规模达到GB TB 甚至PB级别

文件规模:能够处理百万规模以上的文件数量,数量相当之大

  • 可构建在廉价机器上,通过多副本机制提高可靠性

缺点:

  • 不适合低延时数据访问
  • 无法高效的对大量小文件进行存储

存储大量小文件会占用namenode大量的内存来存储文件目录和块信息,这样不可取,因为namenode内存是有限的

小文件存储的寻址时间会超过读取时间,违反了HDFS的设计目标

  • 不支持并发写入,文件修改

同一时间同一文件只能有一个用户执行写操作,不允许多个线程同时写

仅支持数据append(追加),不支持文件的随机修改

HDFS文件块大小

HDFS的文件是在物理上是分块数据(Block),块的大小可以通过配置参数(dfs.blocksize)来规定的

为什么块的大小不能太大也不能太小?

太小的会增加寻址时间,程序一直在找块的开始位置,太大的话,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间,导致程序在处理时会非常慢

HDFS块的大小设置主要取决于磁盘传输速率

 HDFS的shell命令

(1)-help:输出这个命令参数

(2)-ls: 显示目录信息

         hadoop fs -ls /   列出hdfs文件系统根目录下的目录和文件 

         -hadoop fs -ls -R /   列出hdfs文件系统所有的目录和文件

(3)-mkdir:在HDFS上创建目录

(4)-test    测试检查目录或者文件是否存在

 使用方法:hadoop fs -test -[ezd] URI  :

                  -e 检查文件是否存在。如果存在则返回0。
        -z 检查文件是否是0字节。如果是则返回。

                  -d 如果路径是个目录,则返回0,否则返回1。

(5)-moveFromLocal:从本地剪切粘贴到HDFS

用法:hadoop fs -moveFromLocal <local src> <hdfs dst>

与put相类似,命令执行后源文件 local src 被删除

 (6)-appendToFile:追加一个文件到已经存在的文件末尾

用法:hadoop fs -appendToFile <local src> <hdfs dst>

将一本地文件中的内容拼接在hdfs文件中

(7)-cat:显示文件内容

(8)-chmod、-chown:Linux文件系统中的用法一样,修改文件所属权限

(9)-copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去

 用法:hadoop fs -copyFromLocal <local src> <hdfs dst>

(10)-copyToLocal:从HDFS拷贝到本地

用法:hadoop fs -copyToLocal <local src> <hdfs dst>

(11)-cp :从HDFS的一个路径拷贝到HDFS的另一个路径

用法:hadoop fs -cp <hdfs file> <hdfs file>

(12)-mv:在HDFS目录中移动文件

用法:hadoop fs -mv <hdfs file> <hdfs file>

(13)-get:等同于copyToLocal,就是从HDFS下载文件到本地

(14)-getmerge:合并下载多个文件

(15)-put:等同于copyFromLocal

用法:hadoop fs -put <local file> <hdfs file>

(hdfs file的父目录一定要存在,否则命令不会执行)

(16)-tail:显示一个文件的末尾

用法:hadoop fs -tail <hdfs file>

(17)-rm:删除文件或文件夹

hadoop fs -rm <hdfs file>    删除文件

hadoop fs -rm -r <hdfs dir>    删除目录

(18)-rmdir:删除空目录

(19)-du统计文件夹的大小信息

(20)-setrep:设置HDFS中文件的副本数量

 

简单描述Shuffle过程环形缓冲区的作用?

key,value从map()方法输出,被outputcollector收集通过getpartitioner()方法获取分区号,在进入环形缓冲区。默认情况下,环形缓冲区大小值为100MB。当map输入的数据进入环形缓冲区的量达到80MB以上时,那么开始执行溢写过程,溢写过程中如果有其他数据进入,那么由剩余的百分之20反向写入。溢写过程会根据key,value先进行分区,后进行排序,最终maptask溢写文件经过归并排序后落入本地磁盘,reduceTask将多个mapTask下相同分区的数据copy到不同的reduceTask中进行归并排序后一次读取一组数据给reduce()函数

简述Hdfs的默认副本策略?这样做有什么好处?

  • 第一个副本在客户端所处的节点上。如果客户端在集群外(意思就是执行上传的服务器不属于集群的节点),则随机再机架上选一个;
  • 第二个副本和第一个副本位于相同机架随机节点上
  • 第三个副本位于不同机架,随机节点。 优点:该策略减少了机架间的写流量,通常可以提高写性能。机架故障的机会远小于节点故障的机会。所以此策略不会影响数据的可靠性和可用性保证

简单描述你对Hadoop集群SafeMode模式的理解?

集群处于安全模式,不能执行重要操作(写操作),集群属于只读状态。但是严格来说,只是保证HDFS元数据信息的访问,而不保证文件的访问。集群启动完成后,自动退出安全模式, 如果集群处于安全模式,想要完成写操作,需要离开安全模式。 (1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式状态) (2)bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态) (3)bin/hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态) (4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态)。 对于全新创建的HDFS集群,NameNode启动后不会进入安全模式,因为没有Block信息

NodeManager主动向ResourceManager发送心跳,namenode也是主动向datanode发送心跳  (  错  )

 

hdfs的文件的上传、下载流程

MapReduce核心思想

序列化概述

MapReduce工作流程

hdfs的默认副本策略

·Hadoop2.7.2副本节点选择

第一个副本在Client所处的节点上。如果客户端在集群外,随机选一个

第二个副本和第一个副本位于相同机架,随机节点

第三个副本位于不同机架,随机节点

nn和2nn的工作机制?2nn有什么作用?集群的故障处理、集群的安全模式

 

集群的故障处理

NameNode故障后,可以采用如下两种方法恢复数据

  • 将SecondaryNameNode中数据拷贝到NameNode存储数据的目录
  • 使用-importCheckpoint选项启动NameNode守护进程,从而将SecondaryNameNode 中数据拷贝到NameNode目录中

集群的安全模式

·查看安全模式状态:bin/hdfs dfsadmin -safemode get

·进入安全模式状态:bin/hdfs dfsadmin -safemode enter

·离开安全模式状态:bin/hdfs dfsadmin -safemode leave

·等待安全模式状态:bin/hdfs dfsadmin -safemode wait
 

dn的工作机制

·一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本 身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳

·DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报 所有的块信息

·心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数 据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心 跳,则认为该节点不可用

·集群运行中可以安全加入和退出一些机器

判断dn的离线

1.DataNode进程死亡或者网络故障造成DataNode无法与NameNode通信

2.NameNode不会立即把该节点判定为死亡,要经过一段时间,这段时间暂称作超时时长

3.HDFS默认的超时时长为10分钟+30秒

4.如果定义超时时间为TimeOut

添加新节点

1.在hadoop01主机上再克隆一台hadoop04主机

2.修改IP地址和主机名称

3.删除原来HDFS文件系统留存的文件(data和logs)

4.source一下配置文件

5.直接启动DataNode,即可关联到集群

6.在hadoop04上上传文件

7.如果数据不均衡,可以用命令实现集群的再平衡


什么是黑名单?什么是白名单?如何退役旧节点?如何设置白名单?

1.在黑名单上面的主机都会被强制退出

2.添加到白名单的主机节点,都允许访问NameNode,不在白名单的主机节点,都会被 退出

3.添加白名单,黑名单退役;不允许白名单和黑名单中同时出现一个主机名称

  ·在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目录下创建dfs.hosts文件

    添加主机名称(不添加hadoop04)

    hadoop01

    hadoop02

    hadoop03

  ·在NameNode的hdfs-site.xml配置文件中增加dfs.hosts属性   

    <property>

           <name>dfs.hosts</name>

           <value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts</value>

    </property>

  ·配置文件分发:myrsync hdfs-site.xml

  ·刷新NameNode:hdfs dfsadmin -refreshNodes

  ·更新ResourceManager节点:yarn rmadmin -refreshNodes

通过代码验证集群的配置文件的优先级

@Test

public void testCopyFromLocalFile() throws IOException, InterruptedException, URISyntaxException {

// 1 获取文件系统
       Configuration configuration = new Configuration();
       configuration.set("dfs.replication", "2");
       FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "jinghang");
// 2 上传文件
       fs.copyFromLocalFile(new Path("e:/banzhang.txt"), new Path("/banzhang.txt"));
// 3 关闭资源
       fs.close();
       System.out.println("over");
}

将hdfs-site.xml拷贝到项目的根目录下

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
   <property>
       <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>

参数优先级排序:客户端代码中设置的值 >ClassPath下的用户自定义配置文件 >然后是服务器的默认配置

通过代码验证seek指定位置下载

(1)下载第一块

@Test

public void readFileSeek1() throws IOException, InterruptedException, URISyntaxException{
 // 1 获取文件系统
    Configuration configuration = new Configuration();
    FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "jinghang");
    // 2 获取输入流
    FSDataInputStream fis = fs.open(new Path("/hadoop-2.7.2.tar.gz"));
    // 3 创建输出流
    FileOutputStream fos = new FileOutputStream(new File("e:/hadoop-2.7.2.tar.gz.part1"));
   // 4 流的拷贝
    byte[] buf = new byte[1024];
    for(int i =0 ; i < 1024 * 128; i++){
       fis.read(buf);
       fos.write(buf);
    }
   // 5关闭资源
    IOUtils.closeStream(fis);
    IOUtils.closeStream(fos);
    fs.close();
}
(2)下载第二块
@Test
public void readFileSeek2() throws IOException, InterruptedException, URISyntaxException{
    // 1 获取文件系统
    Configuration configuration = new Configuration();
    FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "jinghang"));
    // 2 打开输入流
    FSDataInputStream fis = fs.open(new Path("/hadoop-2.7.2.tar.gz"));   
    // 3 定位输入数据位置
    fis.seek(1024*1024*128);
    // 4 创建输出流
    FileOutputStream fos = new FileOutputStream(new File("e:/hadoop-2.7.2.tar.gz.part2"));
    // 5 流的对拷
    IOUtils.copyBytes(fis, fos, configuration); 
    // 6关闭资源
    IOUtils.closeStream(fis);
    IOUtils.closeStream(fos);

}
(3)合并文件

在Window命令窗口中进入到目录E:\,然后执行如下命令,对数据进行合并

type hadoop-2.7.2.tar.gz.part2 >> hadoop-2.7.2.tar.gz.part1

合并完成后,将hadoop-2.7.2.tar.gz.part1重新命名为hadoop-2.7.2.tar.gz。解压发现该tar包非常完整。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值