hadoop面试问题

1当前你们公司使用的Hadoop版本是什么

Hadoopcdh-5.7.6/hadoop-2.6.0

2HDFS常见的数据压缩格式有哪些,介绍其中一种详细的实现方式

  1.  

    Gzip 优点是压缩率高,速度快。Hadoop支持与直接处理文本一样。
    
    缺点不支持split,当文件压缩在128m内,都可以用gzip
    
    Izo  优点压缩速度快 合理的压缩率;支持split,是最流行的压缩格式。支持native库;
    
    缺点 比gzip压缩率低,hadoop本身不支持,需要安装;
    
    在应用中对lzo格式文件需要处理如 指定inputformat为lzo格式
    
    Snappy压缩 高速压缩率合理支持本地库。不支持split,hadoop不支持 要安装linux没有对应命令;当MR输出数据较大,作为到reduce数据压缩格式
    
    Bzip2 支持split,很高的压缩率,比gzip高,hadoop支持但不支持native,linux自带命令使用方便。缺点压缩解压速度慢

     

3,HDFS垃圾回收的时间模式是多久,如何修改该时间

们知道linux是没有垃圾回收站的,而hdfs同样默认是没有的,但是hdfs是可以开启垃圾回收站的。

1、我们可以登录官网,选2.8.5版本, https://hadoop.apache.org/docs/r2.8.5/  拉到页面最下面点击core-default.xml

2、然后在页面按ctrl + F 全局搜索"trash",找到fs.trash.interval和fs.trash.checkpoint.interval

可以看看在其右边的注释,英文不好的可以用google的网页翻译一下哈

fs.trash.interval 

0禁用。

该值一般设1440分钟,即1天,保留垃圾回收站的文件或文件夹1天 超过就自动删除

fs.trash.checkpoint.interval

0, the value is set to the value of fs.trash.interval

即,如果为0,就跟fs.trash.interval设的值一样。默认设为0。

比如上面的fs.trash.interval值设为1440时,那fs.trash.checkpoint.interval的值就等于1440。

3、开始在core-site.xml设置、添加参数。见下图

4、重启一下hdfs

(1) 先停止  [hadoop@hadoop001 hadoop-2.6.0-cdh5.7.0]$ sbin/stop-dfs.sh

(2) 再启动 [hadoop@hadoop001 hadoop-2.6.0-cdh5.7.0]$ sbin/start-dfs.sh

5、尝试删除hdfs的文件

[hadoop@hadoop001 hadoop-2.6.0-cdh5.7.0]$ hdfs dfs -rm -f /user/hadoop/input

注意看抛出的一句话:18/10/16 00:10:52 INFO fs.TrashPolicyDefault: Moved: 'hdfs://hadoop001:9000/user/hadoop/input' to trash at: hdfs://hadoop001:9000/user/hadoop/.Trash/Current/user/hadoop/input

意思是将input里面的文件移动到另一个路径hdfs://hadoop001:9000/user/hadoop/.Trash/Current/user/hadoop/input,等于mv了。

可以验证一下回收站那里看看是否有数据,即用cat命令查看一下是否有被删的数据

[hadoop@hadoop001 hadoop-2.6.0-cdh5.7.0]$ hdfs dfs -cat hdfs://hadoop001:9000/user/hadoop/.Trash/Current/user/hadoop/input 

数据还是有的。所以其实等于是mv到另一个路径了

最后,请注意:在生产上的hdfs垃圾回收必须开启,一般设7天或14天。

  1. HDFS如何生效机架感知,取消机架感知有什么问题

一、背景介绍

Hadoop的设计目的:解决海量大文件的处理问题,主要指大数据的存储和计算问题,其中,HDFS解决数据的存储问题;MapReduce解决数据的计算问题

Hadoop的设计考虑:设计分布式的存储和计算解决方案架构在廉价的集群之上,所以,服务器节点出现宕机的情况是常态。数据的安全是重要考虑点。HDFS的核心设计思路就是对用户存进HDFS里的所有数据都做冗余备份,以此保证数据的安全

那么Hadoop在设计时考虑到数据的安全,数据文件默认在HDFS上存放三份。显然,这三份副本肯定不能存储在同一个服务器节点。那怎么样的存储策略能保证数据既安全也能保证数据的存取高效呢?

HDFS分布式文件系统的内部有一个副本存放策略:以默认的副本数=3为例:

1、第一个副本块存本机

2、第二个副本块存跟本机同机架内的其他服务器节点

3、第三个副本块存不同机架的一个服务器节点上

好处:

1、如果本机数据损坏或者丢失,那么客户端可以从同机架的相邻节点获取数据,速度肯定要比跨机架获取数据要快。

2、如果本机所在的机架出现问题,那么之前在存储的时候没有把所有副本都放在一个机架内,这就能保证数据的安全性,此种情况出现,就能保证客户端也能取到数据

HDFS为了降低整体的网络带宽消耗和数据读取延时,HDFS集群一定会让客户端尽量去读取近的副本,那么按照以上头解释的副本存放策略的结果:

1、如果在本机有数据,那么直接读取

2、如果在跟本机同机架的服务器节点中有该数据块,则直接读取

3、如果该HDFS集群跨多个数据中心,那么客户端也一定会优先读取本数据中心的数据

但是HDFS是如何确定两个节点是否是统一节点,如何确定的不同服务器跟客户端的远近呢?答案就是机架感知。!!!!

在默认情况下,HDFS集群是没有机架感知的,也就是说所有服务器节点在同一个默认机架中。那也就意味着客户端在上传数据的时候,HDFS集群是随机挑选服务器节点来存储数据块的三个副本的。

那么假如,datanode1和datanode3在同一个机架rack1,而datanode2在第二个机架rack2,那么客户端上传一个数据块block_001,HDFS将第一个副本存放在dfatanode1,第二个副本存放在datanode2,那么数据的传输已经跨机架一次(从rack1到rack2),然后HDFS把第三个副本存datanode3,此时数据的传输再跨机架一次(从rack2到rack1)。显然,当HDFS需要处理的数据量比较大的时候,那么没有配置机架感知就会造成整个集群的网络带宽的消耗非常严重。

下图是没有配置机架感知的HDFS集群拓扑:

二、配置机架感知

1、修改配置文件core-site.xml

 

给NameNode节点的core-site.xml配置文件增加一项配置:

#!/bin/bash  

HADOOP_CONF=/home/hadoop/apps/hadoop-2.6.5/etc/hadoop  

while [ $# -gt 0 ] ;

do  

        nodeArg=$1  

        exec<${HADOOP_CONF}/topology.data  

        result=""  

        while read line

        do  

                ar=( $line )  

                if [ "${ar[0]}" = "$nodeArg" ]||[ "${ar[1]}" = "$nodeArg" ]

                then  

                        result="${ar[2]}"  

                fi  

        done  

        shift  

        if [ -z "$result" ]

        then  

                echo -n "/default-rack"  

        else  

                echo -n "$result"  

        fi  

done

那么通过阅读脚本内容知道,我们需要准备一个topology.data的文件。topology.data的内容如下:

192.168.123.102  hadoop02        /switch1/rack1

192.168.123.103  hadoop03        /switch1/rack1

192.168.123.104  hadoop04        /switch2/rack2

192.168.123.105  hadoop05        /switch2/rack2

其中switch表示交换机,rack表示机架

需要注意的是,在Namenode上,该文件中的节点必须使用IP,使用主机名无效,而ResourceManager上,该文件中的节点必须使用主机名,使用IP无效,所以,最好IP和主机名都配上。

 

2、验证

以上配置做好之后,启动集群,启动完集群之后,在使用命令:

hdfs  dfsadmin  -printTopology 

查看整个集群的拓扑图:

三、补充

1、增加datanode节点

增加datanode节点,不需要重启namenode

非常简单的做法:在topology.data文件中加入新加datanode的信息,然后启动起来就OK

2、节点间距离计算

 

有了机架感知,NameNode就可以画出下图所示的datanode网络拓扑图。D1,R1都是交换机,最底层是datanode。则H1的rackid=/D1/R1/H1,H1的parent是R1,R1的是D1。这些rackid信息可以通过topology.script.file.name配置。有了这些rackid信息就可以计算出任意两台datanode之间的距离,得到最优的存放策略,优化整个集群的网络带宽均衡以及数据最优分配。

distance(/D1/R1/H1,/D1/R1/H1)=0  相同的datanode  

distance(/D1/R1/H1,/D1/R1/H2)=2  同一rack下的不同datanode  

distance(/D1/R1/H1,/D1/R2/H4)=4  同一IDC下的不同datanode  

distance(/D1/R1/H1,/D2/R3/H7)=6  不同IDC下的datanode

 

  1. HDFS常见的运维操作有哪些,哪些操作是高危的,如果高危操作出现问题,如何解决

 

6.HDFS常见的故障是什么,如何处理,是否可以给出三种预案来防范大部分常见故障

1、hadoop-root-datanode-master.log 中有如下错误:

ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs in
导致datanode启动不了。
原因:每次namenode format会重新创建一个namenodeId,而dfs.data.dir参数配置的目录中包含的是上次format创建的id,和dfs.name.dir参数配置的目录中的id不一致。namenode format清空了namenode下的数据,但是没有清空datanode下的数据,导致启动时失败,所要做的就是每次fotmat前,清空dfs.data.dir参数配置的目录.
格式化hdfs的命令

Shell代码  

hadoop namenode -format  
2、如果datanode连接不上namenode,导致datanode无法启动。
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Call to ... failed on local exception: java.net.NoRouteToHostException: No route to host
关闭防火墙

Shell代码  

service iptables stop  
机器重启后,防火墙还会开启。
3、从本地往hdfs文件系统上传文件,出现如下错误:
INFO hdfs.DFSClient: Exception in createBlockOutputStream java.io.IOException: Bad connect ack with firstBadLink
INFO hdfs.DFSClient: Abandoning block blk_-1300529705803292651_37023
WARN hdfs.DFSClient: DataStreamer Exception: java.io.IOException: Unable to create new block.
解决方法:
关闭防火墙:

Shell代码  

service iptables stop  
禁用selinux:
编辑 /etc/selinux/config文件,设置“SELINUX=disabled”
4、安全模式导致的错误
org.apache.hadoop.dfs.SafeModeException: Cannot delete ..., Name node is in safe mode
在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。

Java代码  

hadoop dfsadmin -safemode leave  

  关闭安全模式
5、以本地模式运行hadoop时,抛异常
ERROR security.UserGroupInformation: PriviledgedActionException as:hadoop cause:java.net.UnknownHostException: hadoop: hadoop: Name or service not known
Exception in thread "main" java.net.UnknownHostException: hadoop: hadoop: Name or service not known
把/etc/hostname文件中的主机名加入到/etc/hosts文件中,问题解决。
6、格式化hdfs文件系统时,出错:
Format aborted in /home/hadoop/dfs/name
/home/hadoop/dfs/name 是 dfs.name.dir 配置的本地路径,把这个目录删除,
再格式化就可以了。
7、datanode无法启动,datanode的日志中有error:
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: All directories in dfs.data.dir are invalid
发现日志前一行有warn:WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Invalid directory in dfs.data.dir: Incorrect permissi    on for /home/hadoop/dfs/data, expected: rwxr-xr-x, while actual: rwxrwxr-x

按照日志修改了目录的访问权限,问题解决。

7.你经历过哪些严重的Hadoop故障

8.HDFS常用的IO压力测试工具有哪些

LoadRunnerLoadRunner是一种预测系统行为和性能的负载测试工具,通过模拟实际用户的操作行为进行实时性能监测,来帮助测试人员更快的查找和发现问题。LoadRunner适用于各种体系架构,能支持广泛的协议和技术,为测试提供特殊的解决方案。企业通过LoadRunner能最大限度地缩短测试时间,优化性能并加速应用系统的发布周期。

LoadRunner提供了3大主要功能模块:VirtualUser Generator(用于录制性能测试脚本),LoadRunner Controller(用于创建、运行和监控场景),LoadRunner Analysis(用于分析性能测试结果)既可以作为独立的工具完成各自的功能,又可以作为LoadRunner的一部分彼此衔接,与其他模块共同完成软件性能的整体测试。

Apache JMeter

JMeter作为一款广为流传的开源压测产品,最初被设计用于Web应用测试,如今JMeter可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP服务器等等,还能对服务器、网络或对象模拟巨大的负载,通过不同压力类别测试它们的强度和分析整体性能。另外,JMeter能够对应用程序做功能测试和回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性,JMeter允许使用正则表达式创建断言。

JMeter的特点包括对HTTP、FTP服务器、数据库进行压力测试和性能测试;完全的可移植性;完全 Swing和轻量组件支持包;完全多线程;缓存和离线分析/回放测试结果;可链接的取样器;具有提供动态输入到测试的功能;支持脚本编程的取样器等。在设计阶段,JMeter能够充当HTTP PROXY(代理)来记录浏览器的HTTP请求,也可以记录Apache等WebServer的log文件来重现HTTP流量,并在测试运行时以此为依据设置重复次数和并发度(线程数)来进行压测。

NeoLoad

NeoLoad是Neotys出品的一种负载和性能测试工具,可真实地模拟用户活动并监视基础架构运行状态,从而消除所有Web和移动应用程序中的瓶颈。NeoLoad通过使用无脚本GUI和一系列自动化功能,可让测试设计速度提高5-10倍,并将维护的脚本维持在原始设计时间的10%,同时帮助用户使用持续集成系统自动进行测试。

NeoLoad支持WebSocket、HTTP1/ 2、GWT、HTML5、AngularJS、Oracle Forms等技术协议,能够监控包括操作系统,应用服务器,Web服务器,数据库和网络设备在内的各种IT基础设施,同时可以通过Neotys云平台发起外部压力。

 

  1. Hadoop哪些地方依赖于主机名,是否可以全部替换为IP呢(HDFS/YARN/SPARK)

NameNode、DataNode和SecondaryNameNode都是以hostname启动的了

 Hadoop 最底部是HDFS文件系统,它存储Hadoop集群中所有存储节点上的文件。HDFS的上一层是MapReduce引擎,该引擎由JobTrackers和TaskTrackers组成。HDFS默认的最基本的存储单位是64M的数据块。 在最上层有 4 个独立的实体,即客户端、JobTracker、TaskTracker 和分布式文件系统。客户端提交 MapReduce 作业;JobTracker 协调作业的运行;JobTracker 是一个 Java 应用程序,它的主类是 JobTracker;TaskTracker 运行作业划分后的任务,TaskTracker 也是一个 Java 应用程序,它的主类是 TaskTracker。Hadoop 运行 MapReduce 作业的步骤主要包括提交作业、初始化作业、分配任务、执行任务、更新进度和状态、完成作业等 6 个步骤。 1.对于一个整体的分布式系统来说,HDFS包含两个重要角色,一个是中心节点Namenode,一个是数据节点Datanode。其中Namenode用来记录文件目录结构树,即元数据fsimag,和各种修改操作信息,即editlog。而Datanode则是数据真正存放的地方,Namenode获得RPC请求后会将这些请求根据特定算法分发到一些Datanode上。 2. 由于存在单点结构,因此Namenode机器的性能必须远超Datanode机器,因为其负载了所有RPC访问请求,每个RPC请求引起的查询、IO、audit等动作都会消耗系统资源,Namenode的性能将会极大影响HDFS文件系统的整体性能。而相对来说Datanode的性能就不是那么重要了,当然这也区分具体的应用,例如对于HBase来说,由于Regionserver和Datanode同处于一台机器,彼此之间存在数据的交换,因此与Datanode的IO性能是有关联的,性能好坏成正比关系。 (二)HDFS性能测试常用工具 例如Terasort,Slive,DFSIO从文件系统角度出发的性能测试工具,大多不离吞吐率这个指标。转化到HDFS这边,则是rpc次数、opt次数、sync时长这样的指标信息,然而Terasort是个异类。这个工具不仅考验文件系统的性能,更是对MR自动排序能力的一种检测。

10HDFS有哪些核心的指标需要采集和监控,最重要的三个指标是什么

  1. HDFS节点下线,如何提升其下线速度

在运行中的ambari hadoop集中中动态添加或删除节点

1. 下线节点
1) namenode节点上dfs.exclude文件,看配置文件怎么配置的,里每行添加一个服务器名,如我要下线server7,server8,server9,则如下:
server7
server8

resourcemanager节点上yarn.exclude文件里每行添加一个服务器名,如我要下线server7,server8,server9,则如下:
server7
server8
2) 选择任意一台节点执行:
hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes
yarn node -list

3) 这时可以通过hdfs dfsadmin -report或者web界面查看该datanode状态转为Decommission In Progress。
如果节点上数据比较多,下线会比较慢,等待。
当datanode完成数据迁移时,姿态会变为Decommissioned,继续下面操作

4) 删除dfs.exclude中下线节点的hosts,重新刷新:
hdfs dfsadmin -refreshNodes

5) 删除slaves中下线节点的hosts
2. 上线节点
上线节点基本与下线相同
1) slaves文件里每行添加一个上线服务器名,同时保证dfs.exclude文件为空。
2) ./hdfs dfsadmin -refreshNodes

3) 在要上线的节点上启动datanode:
./hadoop-daemon.sh start datanode

4) 如需要启动nodemanager,则执行:
./yarn-daemon.sh start nodemanager

5) 修改slaves,添加上线节点的hosts

12.HDFS常见的误删除数据场景,以及如何防止数据被误删除

 

  1. HDFS集群对外提供的访问方式有几种,哪种最为常见,每种方式各自的优缺点和使用场景

 

14HDFS你做过哪些性能调优,哪些是通用的,哪些是针对特定场景的

 

15Hadoop日常的运维操作有什么管理工具,已经搭建的集群如何使用ambari

 

16Hadoop各类角色如何进行扩容,缩容,节点迁移(IP变更)

 

  1. Hadoop各类角色的JVM参数配置如何设定

 

18.HDFS的block大小如何设置,取决于哪些因素

 HDFS中块(block)的大小为什么设置为128M?

二、 HDFS中块(block)的大小为什么设置为128M?
1. HDFS中平均寻址时间大概为10ms;

2. 经过前人的大量测试发现,寻址时间为传输时间的1%时,为最佳状态;

    所以最佳传输时间为10ms/0.01=1000ms=1s

3. 目前磁盘的传输速率普遍为100MB/s;

    计算出最佳block大小:100MB/s x 1s = 100MB

    所以我们设定block大小为128MB。

我们在HDFS中存储数据是以块(block)的形式存放在DataNode中的,块(block)的大小可以通过设置dfs.blocksize来实现;

在Hadoop2.x的版本中,文件块的默认大小是128M,老版本中默认是64M;

目录

一、为什么HDFS中块(block)不能设置太大,也不能设置太小?

二、 HDFS中块(block)的大小为什么设置为128M?

寻址时间:HDFS中找到目标文件块(block)所需要的时间。

原理:

文件块越大,寻址时间越短,但磁盘传输时间越长;

文件块越小,寻址时间越长,但磁盘传输时间越短。



一、为什么HDFS中块(block)不能设置太大,也不能设置太小?
1. 如果块设置过大,

    一方面,从磁盘传输数据的时间会明显大于寻址时间,导致程序在处理这块数据时,变得非常慢;

    另一方面,mapreduce中的map任务通常一次只处理一个块中的数据,如果块过大运行速度也会很慢。

2. 如果块设置过小,

    一方面存放大量小文件会占用NameNode中大量内存来存储元数据,而NameNode的内存是有限的,不可取;

   另一方面文件块过小,寻址时间增大,导致程序一直在找block的开始位置。

因而,块适当设置大一些,减少寻址时间,那么传输一个由多个块组成的文件的时间主要取决于磁盘的传输速率。

ps:实际在工业生产中,磁盘传输速率为200MB/s时,一般设定block大小为256MB

       磁盘传输速率为400MB/s时,一般设定block大小为512MB
--------------------- 
作者:攻城狮Kevin 
原文:https://blog.csdn.net/wx1528159409/article/details/84260023 

19.YARN的nodemanager上跑任务的时候,有时候会将磁盘全部打满,如何解

今天在集群和调试之前开发的spark算法时,我提交的算法一直处于accpected状态,而且无法一直没有分配到nodemanager,怀疑是集群上的资源都被占用了 一直无法分配到资源导致的。查看了下historyserver,看见同事的一个算法正在running,他分配了5g的内存来执行。可是每台集群都又24g内存,不能他的任务用了5g我的就跑不了啊。。应该是yarn设置的内存太小,随后就查了相关配置,确实都是用的默认值,下面给出具体的配置信息,在yarn-site.xml 中 :


yarn.nodemanager.resource.memory-mb
18432
每个节点可用内存,单位MB,默认是8g,spark需要大量内存,这里调整为18g

 
yarn.scheduler.minimum-allocation-mb
1500
单个任务可申请最少内存,默认1024MB,稍微大一点,避免小的计算浪费资源



 yarn.scheduler.maximum-allocation-mb
16384
单个任务可申请最大内存,默认8192MB,改为16g,大任务充分利用资源


20.HDFS集群多个业务方使用时如何提前做好运维规划,如权限,配额,流量突增,数据安全,目录结构

 

21.HDFS中,小文件的定义是什么,如何对小文件进行统计分析,如何优化该问题

 

22.HDFS的namenode如何进行主备切换

 

23.YARN的nodemanager导致机器死机,如何解决

 

24.如何下线YARN的nodemanager节点,假如该节点持续在运行计算任务

 

25.YARN的nodemanager节点,从Active Nodes转为Lost Nodes,有哪些原因,在哪里设置

 

26.YARN的nodemanager节点如果转为Lost Nodes后,该节点上的计算任务是否还会正常继续

 

27.HDFS的快照原理简要介绍一下,为什么可以确保数据的安全性

 Hdfs的快照(snapshot)是在某一时间点对指定文件系统拷贝,快照采用只读模式,可以对重要数据进行恢复、防止用户错误性的操作。

      快照分两种:一种是建立文件系统的索引,每次更新文件不会真正的改变文件,而是新开辟一个空间用来保存更改的文件,一种是拷贝所有的文件系统。Hdfs属于前者。

Hdfs的快照的特征如下:

1.      快照的创建是瞬间的,代价为O(1),取决于子节点扫描文件目录的时间。

2.      当且仅当做快照的文件目录下有文件更新时才会占用小部分内存,占用内存的大小为O(M),其中M为更改文件或者目录的数量;

3.      新建快照的时候,Datanode中的block不会被复制,快照中只是记录了文件块的列表和大小信息。

  1.       快照不会影响正常的hdfs的操作。对做快照之后的数据进行的更改将会按照时间顺序逆序的记录下来,用户访问的还是当前最新的数据,快照里的内容为快照创建的时间点时文件的内容减去当前文件的内容。
  1. YARN的yarn.nodemanager.local-dirs和yarn.nodemanager.log-dirs参数应该如何设置,有哪些常见的问题

 

29.distcp拷贝数据的时候,出现了java.lang.outofmemoryerror:java heap space,如何处理

有两个hadoop集群,机器相同,磁盘占用相同,一个集群磁盘的使用率比较均匀,另一个集群磁盘使用率起伏较大(很多写满的,很多使用率很低的),那么第二个集群会有哪些问题

  1. hdfs namenode启动慢,常见的原因有哪些?如何优化?

对于生产集群,含有上千万文件,每次启动时间将会长达几十分钟,缩小启动时间将大大提高生产力。所以对启动时的各个环节进行分析并提出相应的解决方案用于减少启动时间。 
1. NameNode启动中对fsimage加载过程解析 
Hadoop在对NameNode进行启动时,首先会从映像文件(fsimage)中读取HDFS的状态,即系统目录树,同时将日志文件(edits)与fsimage进行合并,这样保证了内存中目录树是最新的,随后系统会将最新的目录树持久化到映像文件(fsimage)中,并使用一个空的edits文件开始正常操作。 
    因为NameNode只有在启动阶段才会合并fsimage和edits,所以久而久之edits文件将会十分庞大,尤其是对于大型的集群,这样将导致下一次NameNode启动会花很长时间。为此,secondary NameNode根据相应条件来合并fsimage和edits,在合并结束后也将最新的目录树持久化写入到fsimage。 
    对NameNode进行持久化存储的路径是由dfs.name.dir参数控制的。 
l dfs.name.dir, NameNode持久存储映像文件(fsimage)及日志文件(edits)的本地文件系统路径,当这个值是一个逗号分隔的目录列表时,系统实时目录树会被复制到所有目录中做冗余备份。 
    在Hadoop的版本中,持久化fsimage调用的函数为FSImage类中的saveFSImage()函数, 在函数内部首先读取dfs.name.dir中设置的多个目录列表,随后按照目录列表按顺序存储。 
以下是NameNode加载fsimage过程的流程图: 
 
2. 加载过程优化 
    如果NameSpace 存在大量文件,那么fsimage文件将会十分巨大,fsimage会达到上百兆甚至上G,如果在dfs.name.dir中定义了多个目录,那么采用按顺序存储势必会消耗一定时间。 
为解决这一问题,对fsimage的持久化操作采用多线程技术,为目录列表中的每个目录存储开辟一个线程,用来存储fsimage文件。主线程等待所有存储的子线程完毕后完成对fsimage加载。这样,存储时间将取决于存储最慢的那个线程,达到了提高fsimage加载速度的目的,从而在一定程度上提升了NameNode启动速度。 
    其流程图如下: 
 
3. 测试结果 
    测试采用利用hadoop 自带的nnbench,向NameNode写入大量小文件,写入文件总数为 200万 ;相关的命令为 hadoop jar hadoop-test.jar nnbench –operation create_write –maps 24 –bytesToWrite 1 –numberOfFiles 2000000 –baseDir /test/nnbench1。 
目前测试集群有12个节点,总共200万文件,约200万块,dfs.name.dir设置了3个本地路径,其中两个本地路径用来模拟远程文件路径,fsimage大小为240M。 
测试结果如下: 
FSImage存储时间 顺序存储 多线程存储 
第一次测试 22142msec 12709msec 
第二次测试 17043msec 15813msec 
第三次测试 20587msec 12286msec 
平均时间 19924msec 13602msec 
改动后时间缩短了1-13602/19924=32% 
4. 结论 
    采用多线程写入fsimage,能够有效的提升fsimage加载速度,从而缩短NameNode启动速度。如果NameSpace存在大量文件,使得fsimage文件巨大,则这种时间缩短会更加明显

31.hadoop的hdfs、yarn配置的zookeeper,是否可以分开

Zookeeper帮助Hadoop解决的问题

在Hadoop中,无论是HDFS,还是YARN,都存在一个问题,因为HDFS使用NameNode管理众多的DataNode节点,YARN使用ResourceManager管理系统的资源分配。所以假设NN节点或者是RM节点出现故障,都会导致整个集群不能正常使用,为了解决问题Hadoop针对NN以及RM引入了 支持Active/StandBy 模式的HA架构。

 

正常情况下对于NN以及RM,分别仅仅会有一个Active节点,其它节点为Standby,Active节点负责对外提供服务,当Active的节点因为异常不能对外提供服务时,standby节点会转化为Active节点,继续提供服务

创建锁节点
全部的ResourceManager在启动的时候会竞争写一个/yarn-leader-election/pseudo-yarn-rm-cluster节点(暂时节点)。创建成功的ResourceManager节点变成Active节点,其它的切换为StandBy

注冊Watcher节点
全部的standby的ResourceManager节点会向/yarn-leader-election/pseudo-yarn-rm-cluster节点注冊一个Watcher

主备切换
当Active的ResourceManager节点出现异常或挂掉时。起在zookeeper上创建的暂时节点也会被删除。standy的ResourceManager节点检測到该节点发生变化时,会又一次发起竞争,直到产生一个Active节点

假设集群中存在两个ResourceManager节点RM1,RM2,在通过竞争操作后。RM1变成了Active后。假设某个时间段RM1因为资源损耗比較严重。产生了假死的现象。此时的zookeeper会以为RM1这台机器出现了故障。于是发起新一轮的竞选,选了RM2作为Active,在RM2变成Active后,RM1恢复了服务可是它任然以为自己是Active的,此时就出现了两个Active的情况。这样的情况又称为“脑裂”,为了解决这样的问题能够在创建根节点的时候引入ACL控制,这样的话当RM1恢复后尝试更新数据时,会发现相应的节点必须提供RM2的ACL信息才干够更新相应的数据

在Hadoop中负责解决该问题的组件是Hadoop-common 中的ActiveStandElector组件

  1. yarn执行流程

1.client向yarn提交job,首先找ResourceManager分配资源,

2.ResourceManager开启一个Container,在Container中运行一个Application manager

3.Application manager找一台nodemanager启动Application master,计算任务所需的计算

4.Application master向Application manager(Yarn)申请运行任务所需的资源

5.Resource scheduler将资源封装发给Application master

6.Application master将获取到的资源分配给各个nodemanager

7.各个nodemanager得到任务和资源开始执行map task

8.map task执行结束后,开始执行reduce task

9.map task和 reduce task将执行结果反馈给Application master

10.Application master将任务执行的结果反馈pplication manager

 

你可能感兴趣的:(hadoop面试问题)