大数据(HDFS)面试题及答案

声明:此文档由本人学习整理所做,答案由个人整理,所引部分已经标出出处,牛友们按需查看,文章难免有纰漏错误之处,望交流指正。
题目摘自牛客网:大数据面试题V3.0,约870篇牛客大数据面经480道面试题 发布者:蓦_然 ,在此表达感谢。

HDFS部分

  1. HDFS文件写入和读取流程

● 4.1 HDFS写数据流程

○ 1、首先由客户端向NameNode服务发起写数据请求,NameNode接收到请求后会进行基本验证,验证内容包括对请求上传的路径进行合法验证,其次还要对请求的用户进行权限验证。验证没有问题后,NameNode会响应客户端允许上传。

○ 2、接下来客户端会对文件按照blocksize大小进行切块,切完块后依次以块为单位进行上传。此时客户端会请求上传第一个块信息,服务端接收到上传请求后会依据HDFS默认的机架感知原理,默认情况下返回三台存放数据块副本的DataNode机器。客户端接收到机器列表后会依据网络拓扑的原理找到其中一台机器进行传输通道的建立,然后依次和三台机器进行串行连接,这样的连接方式主要的为了减轻客户端本地的IO的压力。

○ 3、当通道建立成功后,客户端会通过HDFS的FSOutputStream流对象进行数据传输,数据传输的最小单位为packet。传输过程中每台DataNode服务器是串行连接,依次将数据传递。最后一个数据块被传输完成后相当于一次写入结束,如果还有数据块需要传输,那就接着传输第二个数据块。

● 4.2 HDFS读数据流程

○ 1、首先和写数据一样,由客户端向NameNode发出请求,NameNode接收到请求后会进行文件下载路径的合法性校验以及权限验证。如果验证没有问题,就会给客户端返回目标文件的元数据信息,信息中包含目标文件数据块对应的DataNode的位置信息。

○ 2、然后客户端根据具体DataNode位置信息结合网络拓扑原理和就近原则,找到离自己最近的一台服务器对数据进行访问下载。

○ 3、最后通过HDFS提供的FSInputStream对象将数据读取到本地。如果有多个数据块信息就会请求多次DataNode直到目标文件的全部数据被下载。

  1. HDFS组成架构

● 1.3 HDFS组成架构

○ 1.NameNode(NN):存储文件的元数据,如:文件名,文件目录结构,文件属性,以及每个文件的块列表和块所在的DataNode等

○ 2.DataNode(DN):在本地文件系统存储文件的块数据,以及块数据的校验和。

○ 3.Secondary NameNode(2NN):每隔一段时间对NameNode进行元数据的备份。

○ 4.Client:就是客户端,负责文件的切分,将文件切分为大小相同的物理块(Block)分布式存储在DataNode中。与NameNode进行交互,获取文件的位置信息,与DataNode进行交互,读取或者写入文件。

○ HDFS是Hadoop架构中的负责完成数据的分布式存储管理的文件系统。非高可用HDFS集群工作的时候会启动三个服务,分别是NameNode 和 DataNode以及SecondaryNameNode 。其中NameNode是HDFS的中心服务,主要维护管理文件系统中的文件的元数据信息,DataNode主要负责存储文件的真实数据块信息,当然在DataNode的数据块信息中也包含一下关于当前数据块的元数据信息 例如 检验值 数据长度 时间戳等。在非高可用HDFS集群中NameNode和DataNode可以理解为是一对多的关系。二者在集群工作中也要保持通信,通常默认3秒钟会检测一下心跳。最后SecondaryNameNode的工作很单一,就是为了给NameNode的元数据印象文件和编辑日志进行合并,并自己也保留一份元数据信息 以防NameNode元数据丢失后有恢复的保障。

  1. 介绍下HDFS,说下HDFS优缺点,以及使用场景

● 1.2 HDFS优缺点

○ 优点

■ 1.高容错性

  ● 数据自动保存多个副本,通过增加副本的机制,提高容错性。

  ● 某个副本丢失以后,可以实现自动恢复。

■ 2.适合处理大数据

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

  ● 文件规模:能够处理百万规模以上的文件数量。

■ 3.可构建在廉价的机器上,通过副本机制,提高可靠性

○ 缺点

■ 1.不适合低延时数据访问,比如毫秒级的数据存储,是做不到的。

■ 2.无法高效的对大量小文件进行存储

■ 3.不适合并发写入、不适合文件的随机修改

○ 适合做大数据方面的存储工作,不适合做网盘应用

  1. HDFS作用

● (Hadoop Distributed File System) , 它是一个分布式的文件系统,用于存储文件,通过目录树来定位文件;

  1. HDFS的容错机制
    HDFS 容错指的是集群部分机器宕机了,集群依然可以正常提供服务的能力。HDFS 是具有很好的容错性的分布式存储系统,它利用复制技术实现数据容错能力,数据会被复制多份并存储在集群的不同节点。这样,集群中的某些机器宕机了,数据还可以从其他正常运行的机器获取。如果有一个机器宕机了,HDFS 会在其他可用的机器创建数据的副本,来保证该数据的副本数与集群的副本因子是一致的。

  2. HDFS 如何实现容错
    HDFS 通过复制进程来保证容错机制。在文件写入 HDFS 时,HDFS 会首先把文件分割成块,并把这些数据块存储在集群不同机器上,然后在其他机器创建各个块的副本,默认情况下,HDFS 会在其他机器创建3个文件的副本。所以,HDFS 集群任意机器挂了,我们依然能从其他保存数据副本的机器上读取数据,由于这种独特的分布式存储特性,HDFS 给我们提供了更快的文件读写机制。

  3. HDFS 的存储机制

● 4.4 HDFS的存储机制

○ 1. HDFS开创性地设计出一套文件存储方式。即对文件切割后分别存放;

○ 2. HDFS将要存储的大文件进行切割,切割后存放在既定的存储块(Block)中,并通过预先设定的优化处理,模式对存储的数据进行预处理,从而攻克了大文件储存与计算的需求。

  1. HDFS的副本机制

● 4.5 HDFS的副本机制

○ HDFS上的文件对应的 Block保存多个副本,且提供容错机制,副本丢失或宕机自动恢复。默认存3份副本。

○ 副本放置策略

■ 第一副本:放置在上传文件的 DataNode上;如果是集群外提交,则随机挑选一台磁盘不太慢、CPU不太忙的节点

■ 第二副本:放置在与第一个副本不同的机架的节点上

■ 第三副本:与第二个副本相同机架的不同节点上。

■ 如果还有更多的副本:随机放在节点中。
  1. HDFS的常见数据格式,列式存储格式和行存储格式异同点,列式存储优点有哪些?
    列式存储(column-based)是相对于传统关系型数据库的行式存储(Row-basedstorage)来说的。简单来说两者的区别就是如何组织表:

在数据写入上的对比:
1)行存储的写入是一次完成。如果这种写入建立在操作系统的文件系统上,可以保证写入过程的成功或者失败,数据的完整性因此可以确定。

2)列存储由于需要把一行记录拆分成单列保存,写入次数明显比行存储多(意味着磁头调度次数多,而磁头调度是需要时间的,一般在1ms~10ms),再加上磁头需要在盘片上移动和定位花费的时间,实际时间消耗会更大。所以,行存储在写入上占有很大的优势。

3)还有数据修改,这实际也是一次写入过程。不同的是,数据修改是对磁盘上的记录做删除标记。行存储是在指定位置写入一次,列存储是将磁盘定位到多个列上分别写入,这个过程仍是行存储的列数倍。所以,数据修改也是以行存储占优。

在数据读取上的对比:
1)数据读取时,行存储通常将一行数据完全读出,如果只需要其中几列数据的情况,就会存在冗余列,出于缩短处理时间的考量,消除冗余列的过程通常是在内存中进行的。

2)列存储每次读取的数据是集合的一段或者全部,不存在冗余性问题。

3) 两种存储的数据分布。由于列存储的每一列数据类型是同质的,不存在二义性问题。比如说某列数据类型为整型(int),那么它的数据集合一定是整型数据。这种情况使数据解析变得十分容易。
相比之下,行存储则要复杂得多,因为在一行记录中保存了多种类型的数据,数据解析需要在多种数据类型之间频繁转换,这个操作很消耗CPU,增加了解析的时间。所以,列存储的解析过程更有利于分析大数据。

4)从数据的压缩以及更性能的读取来对比

优缺点
显而易见,两种存储格式都有各自的优缺点:

1)行存储的写入是一次性完成,消耗的时间比列存储少,并且能够保证数据的完整性,缺点是数据读取过程中会产生冗余数据,如果只有少量数据,此影响可以忽略;数量大可能会影响到数据的处理效率。

2)列存储在写入效率、保证数据完整性上都不如行存储,它的优势是在读取过程,不会产生冗余数据,这对数据完整性要求不高的大数据处理领域,比如互联网,犹为重要。

 传统行式数据库的特性如下:

①数据是按行存储的。

②没有索引的查询使用大量I/O。比如一般的数据库表都会建立索引,通过索引加快查询效率。

③建立索引和物化视图需要花费大量的时间和资源。

④面对查询需求,数据库必须被大量膨胀才能满足需求。

列式数据库的特性如下:

①数据按列存储,即每一列单独存放。

②数据即索引。

③只访问查询涉及的列,可以大量降低系统I/O。

④每一列由一个线程来处理,即查询的并发处理性能高。

⑤数据类型一致,数据特征相似,可以高效压缩。比如有增量压缩、前缀压缩算法都是基于列存储的类型定制的,所以可以大幅度提高压缩比,有利于存储和网络输出数据带宽的消耗。
————————————————
版权声明:本文为CSDN博主「^果然好^」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/allensandy/article/details/107683827

  1. HDFS如何保证数据不丢失?
    一、文件的完整
    1、在文件刚刚开始建立的时候,文件中的每个数据块都会产生一个校验和(checksum),这个校验和会保存在.meta文件内部。
    2、客户端获取数据的时候会和这个校验和进行对比,检查是否相同,从而发现数据块是否损坏。
    2、如果说正在读取的数据块损坏,则可以读取其他副本。接着NameNode会标记该block块已经损坏,然后复制该block达到预期设置的文件备份数。
    4、DataNode在其文件创建后三周验证其校验和(checksum)

补充:
  校验和–checksum是对一组数据(通常是一个文件)进行算法-加密哈希函数运算得到的结果。通过比较你手头文件和原始文件的校验和,能够确保你对原始文件的拷贝是真的并且不存在错误。
  校验和通常也被称之为哈希值、哈希和、哈希码,或简称为哈希–hash。

二、DataNode挂掉
1、副本冗余策略
  可以指定数据文件的副本数量,默认是3;
  保证所有的数据块都有副本,不至于在一个datanode宕机后,数据出现丢失现象。
2、机架感知策略
  集群的机器一般处于不同机架上,机架间带宽要比机架内带宽要小;
  HDFS具有“机架感知”能力,它能自动实现在本机架上存放一个副本,然后在其它机架再存放另一副本,这样可以防止机架失效时数据丢失,也可以提高带宽利用率。
3、心跳策略
  NameNode周期性从DataNode接收心跳信号和块报告,Namenode根据块报告验证元数据;
  NameNode对没有按时发送心跳的DataNode会被标记为宕机,不会再给它任何I/O请求;
  DataNode失效造成副本数量下降,并且低于预先设置的阈值;NameNode会检测出这些数据块,并在合适的时机迕行重新复制;
  引发重新复制的原因还包括数据副本本身损坏、磁盘错误,复制因子被增大等。

三、NameNode挂掉
1、主备切换
  集群一般会有俩个NameNode,一个处于active状态,一个处于睡眠状态,当第一个Name Node挂掉,集群中睡眠状态的NameNode就会启动。
2、镜像文件和操作日志磁盘存储
  当集群启动的时候,在NameNode启动的时候,如果是集群格式化后,或者说是第一次启动,会创建一个空的(fsimage)镜像空间和(edits)日志文件;否则的话会产生一个新的fsimage和edits,并加载上一次的fsimage和edits到这次的fsimage中。
3、镜像文件和操作日志可以存储多分,多磁盘存储

四、其他保障可靠性机制
1、快照
  支持存储某个时间点的映像,需要时可以使数据重返这个时间点的状态;
2、回收站机制
  删除文件时,其实是放入回收站/trash,回收站里的文件可以快速恢复;
  可以设置一个时间阈值,当回收站里文件的存放时间超过这个阈值,就被彻底删除,并且释放占用的数据块。
3、安全模式
  Namenode启动时会先经过一个“安全模式”阶段,安全模式阶段不会产生数据写入;
  在安全模式阶段Namenode收集各个datanode的报告,当数据块达到最小副本数以上时,会被认为是“安全”的;
  在一定比例(可设置)的数据块被确定为“安全”后,再过若干时间,安全模式结束;
  当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数。
————————————————
版权声明:本文为CSDN博主「达文西不息」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Brucexyao/article/details/120467451
10. HDFS NameNode高可用如何实现? 需要哪些角色?

● 3.2.1 多NN的HA架构

○ Hadoop3.x 允许用户运行多个备用 NameNode。

■ 例如,通过配置三个 NameNode 和五个 JournalNode,群集能够容忍两个节点而不是一个节点的故障。

○ HDFS HA 功能通过配置 多个 Active/Standby 状态的 NameNodes 实现在集群中对 NameNode的热备来解决单点故障问题。

  1. HDFS的文件结构?
    非高可用HDFS集群工作的时候会启动三个服务,分别是NameNode 和 DataNode以及SecondaryNameNode 。
    其中NameNode是HDFS的中心服务,主要维护管理文件系统中的文件的元数据信息,DataNode主要负责存储文件的真实数据块信息,当然在DataNode的数据块信息中也包含一下关于当前数据块的元数据信息 例如 检验值 数据长度 时间戳等。
    在非高可用HDFS集群中NameNode和DataNode可以理解为是一对多的关系。二者在集群工作中也要保持通信,通常默认3秒钟会检测一下心跳。最后SecondaryNameNode的工作很单一,就是为了给NameNode的元数据印象文件和编辑日志进行合并,并自己也保留一份元数据信息 以防NameNode元数据丢失后有恢复的保障。

  2. HDFS的默认副本数?为什么是这个数量?如果想修改副本数怎么修改?
    3;
    既保证了数据的相对高的可靠性又避免了数据的大量冗余。
    修改步骤:
    第一步:将HDFS上已有文件副本数修改为2;
    hdfs dfs -setrep 2 -R -w /
    第二步:修改dfs.replication值为2(页面上操作),然后重启HDFS
    hdfs-site.xml文件:
    <property>   
    <name>dfs.replication</name>   
    <value>2</value> </property>

    第三步:修改副本数之后进行核对 hdfs fsck / -files -blocks 第四步、手动创建一个文件,上传至HDFS,观察其副本数
  3. 介绍下HDFS的Block

● 1.4 HDFS文件块大小(面试重点)

○ HDFS文件块大小

■ HDFS中的文件在物理上是分块存储(Block),块的大小可以通过配置参数(dfs.blocksize)来规定,默认的大小是128M。

■ HDFS块大小设置与磁盘的传输速度紧密相关。寻址时间为传输时间的百分之一时,为最佳的状态。一般的寻址时间约为10ms,则传输时间约为1s,而目前磁盘的传输速度普遍为100MB/s,所以将Block的大小设置为128M最为合理,当然,随着磁盘的传输速度的提升,可以适当调整Block的大小。

○ 为什么块的大小不能设置太小,也不能设置太大?

■ HDFS的块设置太小,寻址时间的比例增加,程序花费大量的时间用来进行寻址操作

■ HDFS的块设置太大,磁盘传输数据的时间明显大于定位时间(传输的块中的数据不一定全部都需要),导致程序在处理这块数据时,会变得非常慢。

■ 总结:HDFS块的大小设置主要取决于磁盘的传输速率。
  1. HDFS的块默认大小,64M和128M是在哪个版本更换的?怎么修改默认块大小?
    从2.7.3版本开始block size的默认大小为128M,之前版本的默认值是64M.

可以通过修改hdfs-site.xml文件中的dfs.blocksize对应的值。

注意:在修改HDFS的数据块大小时,首先停掉集群hadoop的运行进程,修改完毕后重新启动。

  1. HDFS HA怎么实现? 是个什么架构?

● 3.2.1 多NN的HA架构

○ Hadoop3.x 允许用户运行多个备用 NameNode。

■ 例如,通过配置三个 NameNode 和五个 JournalNode,群集能够容忍两个节点而不是一个节点的故障。

○ HDFS HA 功能通过配置 多个 Active/ Standby 状态的 NameNodes 实现在集群中对 NameNode的热备来解决单点故障问题。

  1. 导入大文件到HDFS时如何自定义分片?
    hadoop 的作业在提交过程中,需要把具体的输入进行分片。具体的分片细节由InputSplitFormat 指定。分片的规则为 FileInputFormat.class 中的getSplits()方法指定:
    long splitSize = computeSplitSize(goalSi***Size, blockSize);
    computeSplitSize:
    Math.max(minSize, Math.min(goalSize, blockSize));
    其中 goalSize 为“InputFile 大小”/“我们在配置文件中定义的 mapred.map.tasks”值,minsize 为 mapred.min.split.size,blockSize 为 64,所以,这个算式为取分片大小不大于 block,并且不小于在 mapred.min.split.size 配置中定义的最小 Size。
    当某个分块分成均等的若干分片时,会有最后一个分片大小小于定义的分片大小,则该分片独立成为一个分片。

  2. HDFS的mapper和reducer的个数如何确定? reducer的个数依据是什么?

● Mapper数量确定:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。数据切片是 MapReduce 程序计算输入数据的单位,一个切片会对应启动一个MapTask,所以只能通过设定分片的大小间接调整mapper的个数。

● Reducer的个数可以由用户独立设置的,在默认情况下只有一个Reducer。 它的个数既可以使用命令行参数设置(mapreduce.job.reduces=number),也可以在程序中制定(job.setNumReduceTasks(number))。
○ 需要特别注意的是:

■ 如果ReduceTask的数量 > getPartition的结果数

  ● 则会多产生几个空的输出文件

■ 如果ReduceTask的数量 < getPartition的结果数

  ● 会有一部分分区数据无处安放,会报错Exception

■ 如果ReduceTask的数量 = 1 

  ● 不管MapTask端输出多少个分区文件,最终结果都交给这一个ReduceTask,最终也只会产生一个结果文件

■ 分区号是从0开始,逐一累加。
  1. HDSF通过哪个中间组件去存储数据 ?

● Client:就是客户端,负责文件的切分,将文件切分为大小相同的物理块(Block)分布式存储在DataNode中。与NameNode进行交互,获取文件的位置信息,与DataNode进行交互,读取或者写入文件。

  1. HDFS跨节点怎么进行数据迁移

● 3.1.1 集群间数据拷贝

○ 1)scp 实现两个远程主机之间的文件复制

■ scp -r hello.txt root@hadoop103:/user/atguigu/hello.txt        // 推 push

■ scp -r root@hadoop103:/user/atguigu/hello.txt hello.txt        // 拉 pull

■ scp -r root@hadoop103:/user/atguigu/hello.txt root@hadoop104:/user/atguigu //是通过本地主机中转实现两个远程主机的文件复制;

○ 2)采用 distcp 命令实现两个 Hadoop 集群之间的递归数据复制

■ [atguigu@hadoop102 hadoop-3.1.3]$ bin/hadoop distcp hdfs://hadoop102:9820/user/atguigu/hello.txt hdfs://hadoop105:9820/user/atguigu/hello.txt
  1. HDFS的数据一致性靠什么保证?
    一、文件的完整
    1、在文件刚刚开始建立的时候,文件中的每个数据块都会产生一个校验和(checksum),这个校验和会保存在.meta文件内部。
    2、客户端获取数据的时候会和这个校验和进行对比,检查是否相同,从而发现数据块是否损坏。
    2、如果说正在读取的数据块损坏,则可以读取其他副本。接着NameNode会标记该block块已经损坏,然后复制该block达到预期设置的文件备份数。
    4、DataNode在其文件创建后三周验证其校验和(checksum)

补充:
  校验和–checksum是对一组数据(通常是一个文件)进行算法-加密哈希函数运算得到的结果。通过比较你手头文件和原始文件的校验和,能够确保你对原始文件的拷贝是真的并且不存在错误。
  校验和通常也被称之为哈希值、哈希和、哈希码,或简称为哈希–hash。

二、DataNode挂掉
1、副本冗余策略
  可以指定数据文件的副本数量,默认是3;
  保证所有的数据块都有副本,不至于在一个datanode宕机后,数据出现丢失现象。
2、机架感知策略
  集群的机器一般处于不同机架上,机架间带宽要比机架内带宽要小;
  HDFS具有“机架感知”能力,它能自动实现在本机架上存放一个副本,然后在其它机架再存放另一副本,这样可以防止机架失效时数据丢失,也可以提高带宽利用率。
3、心跳策略
  NameNode周期性从DataNode接收心跳信号和块报告,Namenode根据块报告验证元数据;
  NameNode对没有按时发送心跳的DataNode会被标记为宕机,不会再给它任何I/O请求;
  DataNode失效造成副本数量下降,并且低于预先设置的阈值;NameNode会检测出这些数据块,并在合适的时机迕行重新复制;
  引发重新复制的原因还包括数据副本本身损坏、磁盘错误,复制因子被增大等。

三、NameNode挂掉
1、主备切换
  集群一般会有俩个NameNode,一个处于active状态,一个处于睡眠状态,当第一个Name Node挂掉,集群中睡眠状态的NameNode就会启动。
2、镜像文件和操作日志磁盘存储
  当集群启动的时候,在NameNode启动的时候,如果是集群格式化后,或者说是第一次启动,会创建一个空的(fsimage)镜像空间和(edits)日志文件;否则的话会产生一个新的fsimage和edits,并加载上一次的fsimage和edits到这次的fsimage中。
3、镜像文件和操作日志可以存储多分,多磁盘存储

四、其他保障可靠性机制
1、快照
  支持存储某个时间点的映像,需要时可以使数据重返这个时间点的状态;
2、回收站机制
  删除文件时,其实是放入回收站/trash,回收站里的文件可以快速恢复;
  可以设置一个时间阈值,当回收站里文件的存放时间超过这个阈值,就被彻底删除,并且释放占用的数据块。
3、安全模式
  Namenode启动时会先经过一个“安全模式”阶段,安全模式阶段不会产生数据写入;
  在安全模式阶段Namenode收集各个datanode的报告,当数据块达到最小副本数以上时,会被认为是“安全”的;
  在一定比例(可设置)的数据块被确定为“安全”后,再过若干时间,安全模式结束;
  当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数。
————————————————
版权声明:本文为CSDN博主「达文西不息」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Brucexyao/article/details/120467451

  1. HDFS怎么保证数据安全

● HDFS怎么保证数据安全

○ 认证(authentication)

■ 认证指的是向一个系统或是用户提出怀疑,让其证明自己的身份。只有经过认证的身份才被允许进入到数据系统。

○ 授权(authorization)

■ 授权是指授予一个通过认证的用户访问数据资源的权限。

○ 审计(auditing)

■ 所有的访问和操作都需要被记录在审计日志中,以便在稍后的时间点进行审计。
  1. HDFS中向DataNode写数据失败了怎么办
    如果向DataNode写入数据失败了怎么办?
    Client 在写入过程中,有 DataNode 挂了
    当 Client 在写入过程中,有 DataNode 挂了。写入过程不会立刻终止(如果立刻终止,易用性和可用性都太不友好),取而代之 HDFS 尝试从流水线中摘除挂了的 DataNode 并恢复写入,这个过程称为 pipeline recovery。

如果这种情况发生,那么就会执行一些操作:

① Pipeline数据流管道会被关闭,ACK queue中的packets会被添加到data queue的前面以确保不会发生packets数据包的丢失

② 在正常的DataNode节点上的以保存好的block的ID版本会升级——这样发生故障的DataNode节点上的block数据会在节点恢复正常后被删除,失效节点也会被从Pipeline中删除
③ 剩下的数据会被写入到Pipeline数据流管道中的其他两个节点中

————————————————
版权声明:本文为CSDN博主「六mo神剑」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wj1298250240/article/details/104301289

  1. Hadoop2.xHDFS快照

  2. 1 快照介绍和作用
    HDFS snapshot是HDFS整个文件系统,或者某个目录在某个时刻的镜像。该镜像并不会随着源目录的改变而进行动态的更新。可以将快照理解为拍照片时的那一瞬间的投影,过了那个时间之后,又会有新的一个投影。

  3. 2 HDFS快照的实现
      在了解 HDFS 快照功能如何实现之前,首先有一个根本的原则需要记住:快照不是数据的简单拷贝,快照只做差异的记录。这一原则在其他很多系统的快照概念中都是适用的,比如磁盘快照,也是不保存真实数据的。因为不保存实际的数据,所以快照的生成往往非常迅速。
      在 HDFS 中,如果在其中一个目录比如/A下创建一个快照,则快照文件中将会存在与/A目录下完全一致的子目录文件结构以及相应的属性信息,通过命令也能看到快照里面具体的文件内容。但是这并不意味着快照已经对此数据进行完全的拷贝 。这里遵循一个原则:对于大多不变的数据,你所看到的数据其实是当前物理路径所指的内容,而发生变更的inode数据才会被快照额外拷贝,也就是所说的差异拷贝。
      inode 译成中文就是索引节点,它用来存放文件及目录的基本信息,包含时间、名称、拥有者、所在组等信息。
      HDFS 快照不会复制 datanode 中的块,只记录了块列表和文件大小。
      HDFS 快照不会对常规 HDFS 操作产生不利影响,修改记录按逆时针顺序进行,因此可以直接访问当前数据。通过从当前数据中减去修改来计算快照数据。
    ————————————————
    版权声明:本文为CSDN博主「一位木带感情的码农」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/weixin_44758876/article/details/122669464

  4. HDFS文件存储的方式?
    HDFS数据存储单元(block)
    一、文件被切分成固定大小的文件块
    1、默认数据大小为64MB,可配置
    2、若文件大小不到64MB,则单独存储为一个block
    简述:
    客户端向namenode请求上传文件,namenode检查目标路径的环境是否已存在。
    namenode返回上传应答。
    block上传到哪几个DN节点。
    namenode返回3个节点,分别为dn1、dn2、dn3。
    客户端请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
    dn1、dn2、dn3逐级应答
    客户端开始往dn1上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,dn1收到一个packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待。当一个block传输完成之后,客户端再次请求namenode上传第二个block的服务器。

第三步。
简单的源码分析:
客户端通过调用DistributedFileSystem的create方法创建新文件。
DistributedFileSystem通过RPC调用namenode去创建一个新文件,创建前, namenode检查环境。如果通过, namenode就会记录下新文件,否则就会抛出IO异常。

前两步结束后,会返回FSDataOutputStream的对象,与读文件的时候相似, FSDataOutputStream被封装成DFSOutputStream。DFSOutputStream可以协调namenode和 datanode。客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切成一个个小的packet,然后排成队 列data quene(数据队列)。

DataStreamer会去处理接受data quene,它先询问namenode这个新的block最适合存储的在哪几个datanode里(比如重复数是3,那么就找到3个最适合的 datanode),把他们排成一个pipeline。DataStreamer把packet按队列输出到管道的第一个datanode中,第一个 datanode又把packet输出到第二个datanode中,以此类推。

DFSOutputStream还有一个对列叫ack quene,也是由packet组成,等待datanode的收到响应,当pipeline中的所有datanode都表示已经收到的时候,这时ack quene才会把对应的packet包移除掉。
如果在写的过程中某个datanode发生错误,会采取以下几步:
1)pipeline被关闭掉;
2)为了防止防止丢包ack quene里的packet会同步到data quene里;
3)把产生错误的datanode上当前在写但未完成的block删掉;
4)block剩下的部分被写到剩下的两个正常的datanode中;
5)namenode找到另外的datanode去创建这个块的复制。当然,这些操作对客户端来说是无感知的。

客户端完成写数据后调用close方法关闭写入流。

DataStreamer把剩余得包都刷到pipeline里,然后等待ack信息,收到最后一个ack后,通知datanode把文件标视为已完成。

  1. HDFS写数据过程,写的过程中有哪些故障,分别会怎么处理?
    【NN异常】
    由于NN有HA机制,当Active NN出现异常后,standby的NN会自动提升为新的Active接管提供服务,因此只要不是两个NN同时出现异常,就都可以正常读写。
    【DN异常】
    首先,客户端分两种情况感知DN的异常。这个异常包括DN进程异常,DN所在节点网络异常,或者DN节点存储数据的磁盘异常。
    一种是直接与客户端连接的DN异常,客户端通过socket的读写失败,从而感知到该DN的异常。
    另一种是非直接与客户端连接的DN异常,与客户端直接连接的DN在给客户端的ack包中会携带异常DN的序号,客户端在处理ack包的时候就能感知哪个DN异常了。
    尽管感知DN异常的方式不一样,但异常的处理逻辑都是一样的。

如上图所示,异常处理的流程为:

首先客户端会关闭当前与DN的连接。
接着将待确认的数据重新放回到待发送列表中。
接着从DN列表中移除异常DN。
然后进行替换DN的处理
具体包括先判断是否满足替换DN的条件,如果满足条件,则向NN请求增加一个DN,NN分配一个合适的DN并返回给客户端,客户端将新的DN放到DN列表末尾,并以当前DN列表中的第一个DN为源,向其他DN进行block数据的同步,也就是保证传输之前的数据一致性。
最后向DN列表中的首个DN发起连接重新进行数据传输的动作(为了解决packet重传问题,每个dn执行写入动作前都会进行判断)。
————————————————
版权声明:本文为CSDN博主「hncscwc」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hncscwc/article/details/119583898

  1. NameNode存数据吗?
    1、主服务器管理文件的 命名空间信息
    凡是对文件系统命名或其他属性的修改信息都会保存到这里。
    比如,有个名为Eva的文件放在目录/usr下,现在要将他改名为zuo,移动到/usr/local目录下,这些修改日志都会被 NameNode的edit log文件记录。
    2、存放HDFS的 元数据信息
    即文件系统的目录树以及追踪集群文件,简单来说就是NameNode不实际存储数据,但是他知道数据的存放位置。这些信息不是长久固定的,每次启动系统后需要重新从数据节点获取这些信息。
    比如,向上篇中的3号block放到从节点003,008,010这个节点上,在NaemNode中就会有一个信息:“3号数据块放在003,008,010这三个节点上”。
    3、数据块位置分配信息
    每个数据文件被切分成128MB的大小的数据块之后,主节点会查看各个从节点的内存情况,选取内存较合适的从节点存放数据块。

  2. 使用NameNode的好处
    NameNode:就是 master,它是一个主管、管理者。
    1、管理 HDFS 的名称空间。
    2、管理数据块(Block)映射信息
    3、配置副本策略
    4、处理客户端读写请求。

如:数据复制
每个DataNode需要定期向NameNode汇报他的“心跳”,也就是说NameNode需要定期接收这些“心跳”信息,一旦某个DataNode没有向NameNode证明它还“活着”,NameNode就会标记为“死亡”,不再向它请求IO, 这个DataNode上的数据就不能被HDFS使用,那么,NameNode就会启动数据复制,将这个死掉的节点上的数据复制到一个新的节点上。

  1. 直接将数据文件上传到HDFS的表目录中,如何在Hive表中查询到该数据?
    提示:这里如果直接将新的分区文件上传到hdfs上,因为hive没有对应的元数据所以是无法査询到数据的,所以我们要进行表修复或者添加分区。
    方案一:上传数据后修复表
    hdfs dfs -mkdir -p 分区目录
    hdfs dfs -put 分区目录
    hive> msck repair table 表名

方案二: 上传数据后添加分区
hdfs dfs -mkdir -p 分区目录
hdfs dfs -put 分区目录
hive> alter table 表名 add partition();

#大数据开发实习##实习##面经##笔试题目#
全部评论
期待MapReduce和YARN部分
点赞 回复 分享
发布于 2022-05-10 16:23
很快发布😆
点赞 回复 分享
发布于 2022-05-10 16:24
楼主楼主 期待spark的部分
点赞 回复 分享
发布于 2022-06-22 19:39
有好多重复的地方
点赞 回复 分享
发布于 2022-08-07 10:35

相关推荐

11-05 11:05
已编辑
东北大学 C++
美团 到店搜索推荐后端开发 25*15.5
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-13 12:50
浪潮 开发 14k x 15 硕士985
点赞 评论 收藏
分享
12 74 评论
分享
牛客网
牛客企业服务