Hadoop常见面试题整理及解答

Hadoop常见面试题整理及解答

一、基础知识篇:

1.把数据仓库从传统关系型数据库转到hadoop有什么优势?
答:
(1)关系型数据库成本高,且存储空间有限。而Hadoop使用较为廉价的机器存储数据,且Hadoop可以将大量机器构建成一个集群,并在集群中使用HDFS文件系统统一管理数据,极大的提高了数据的存储及处理能力。
(2)关系型数据库仅支持标准结构化数据格式,Hadoop不仅支持标准结构化数据格式,还支持非结构化(images,PDF,doc)以及半结构化( log,XML)数据格式。
(3)可以通过批处理作业和近实时(延迟在200ms~2s之间)流(Flume 和 Kafka)来获取数据。
(4)可以使用诸如 Spark 和 Impala 之类的工具在低延迟(小于 100 毫秒)下查询数据。
(5)可以存储海量数据。

2.请列出正常工作的Hadoop集群中都启动了哪些进程,它们都有什么作用?
答:      一共有NameNode、Secondary Namenode、ResourceManager、 DataNode、NodeManager五个进程。

NameNode功能:HDFS守护进程,维护和存储与HDFS文件系统有关元数据。

      具体: 维护与文件系统相关元数据;管理用户对数据文件的访问;建立数据块与集群中节点的映射关系;执行对文件系统的操作;为集群中的DataNode成员提供注册服务并处理来自各个DataNode的周期性心跳;确定要复制的数据并删除超出的数据块;处理DataNode发送的块报告并维护数据块存储位置。

Secondary NameNode功能:一个冗余的守护进程,提供类似NameNode备份的功能。

      具体: 定期检查NameNode的edits日志,并利用这些日志更新自己的fsimage文件,最后将更新后的fsimage复制到NameNode。

ResourceManager功能: YARN平台的守护进程,负责资源调度和管理,监控NodeManager。

      具体:创建应用的第一个Container容器,该容器负责运行应用的ApplicationMaster;根据NodeManager发送的心跳信息管理DataNodes;运行调度器来决定集群间的资源分配;管理集群级的安全性;管理来自ApplicationMasters的资源请求;监控ApplicationMaster的状态,并在其发生故障时重新启动容器;在应用结束或过期后,解除分配的容器。
DataNode功能:工作节点,根据NameNode发送的指令,快速检索数据并提供读/写功能。

      具体:通过在本地文件系统上存储数据块来提供存储功能;完成客户端对DataNodes上存储数据的读/写请求;创建和删除数据块;在集群中复制数据;通过定期发送报告和心跳来与NameNode保持联系。

NodeManager功能:单个节点的资源管理,负责启动和管理容器。

      具体:通过健康心跳和容器的状态通知与全局ResourceManager进行通信;注册并启动应用程序;向ApplicationManager请求启动ApplicationMaster和剩下的应用程序资源容器(也就是容器中运行的map和reduce任务);监督应用程序的生命周期;监控、管理和提供容器消耗有关资源的信息(CPU/内存);跟踪DataNodes的健康状况;监控容器资源的使用情况,并杀死失去控制的程序;通过聚合作业日志并将其保存到HDFS进行日志管理;提供针对YARN应用程序的辅助服务。辅助服务是为应用程序提供服务并由MapReduce框架用来进行其shuffle和排序操作的应用程序;维护节点级别的安全性。

3.大数据解决方案的关键步骤是什么?
答:提取数据、存储数据和处理数据。

4、关于 SecondaryNameNode 哪项是正确的?(C)
  A.它是 NameNode 的热备   B.它对内存没有要求
  C.它的目的是帮助 NameNode 合并编辑日志,减少 NameNode 启动时间  D. SecondaryNameNode 应与 NameNode 部署到一个节点

解析:SecondaryNameNode功能:定期检查NameNode的edits日志,并利用这些日志更新自己的fsimage文件,最后将更新后的fsimage复制到NameNode,提高NameNode的启动速度,所以选项C正确。

5.讲一下Client读取HDFS文件的顺序流

  1. Client向NameNode发起文件读取的请求。
  2. NameNode返回文件存储的DataNode的信息。
  3. Client读取文件信息。

6.讲一下Client写入HDFS文件的顺序流

  1. Client向NameNode发起文件写入的请求。
  2. NameNode根据文件大小和文件块配置情况,返回给Client它所管理部分DataNode的信息。
  3. Client将文件划分为多个Block,根据DataNode的地址信息,按顺序写入到每一个DataNode块中。

7.hadoop的主要端口都有哪些?

  1. 50070:NameNode的http服务端口;
  2. 8020:NameNode用于获取文件系统metadata信息,接收Client连接的RPC端口;
  3. 50010:datanode服务端口,用于数据传输;
  4. 8032:ResourceManager的applications manager(ASM)端口;
  5. 8088:ResourceManage的http服务端口;
  6. 19888:JobHistoryServer的http服务端口;
  7. 50075:DataNode的http服务端口。

8.请列出Hadoop全部三种调度器并说明其工作方法。

  1. FIFO调度器:先进先出调度器,是Hadoop的默认调度器,按照先到先得的策略来调度作业。
  2. 容量调度器:支持多队列,每个队列按照预估资源利用率预先设置一定的容量,作业到来时会先进入一个剩余资源(该队列授权资源 - 该队列已用资源)最多的队列,然后这个队列会根据作业的优先级及提交顺序来执行这些作业。同时,容量调度器使用了预留和抢占的概念(这意味着如果需要,可能会杀死其他应用程序的容器,为新应用程序腾出空间)将资源返还给队列。
  3. 公平调度器:公平调度是一种赋予作业(job)资源的方法,它的目的是让所有的作业随着时间的推移,都能平均的获取等同的共享资源。所有的 job 具有相同的资源,当单独一个作业在运行时,它将使用整个集群。当有其它作业被提交上来时,系统会将任务(task)空闲资源(container)赋给这些新的作业,以使得每一个作业都大概获取到等量的CPU时间。与Hadoop默认调度器维护一个作业队列不同,这个特性让小作业在合理的时间内完成的同时又不"饿"到消耗较长时间的大作业。公平调度可以和作业优先权搭配使用——优先权像权重一样用作为决定每个作业所能获取的整体计算时间的比例。同容量调度器类似,支持多队列多用户,每个队列中的资源量可以配置, 同一队列中的作业公平共享队列中所有资源。

9.简单介绍一下MapReduce

  1. MapReduce是一个分布式计算框架。
  2. 适用于大规模数据处理场景。
  3. 每个job包含Map和Reduce两部分。
  4. 优点:易于编程,可扩展性好,高容错性,高吞吐量。
  5. 缺点:难以实时计算,不适合流式计算。
  6. MapReduce执行过程:map→reduce
    map部分:Mapper→Combiner→Partitioner
    reduce部分:Shuffle and Sort→Reducer
  7. 数据定义格式:
    map: (K1,V1) → list (K2,V2)
    reduce: (K2,list(V2)) → list (K3,V3)

10.请简述mapreduce中,combiner,partition作用
     在MapReduce整个过程中,combiner是可有可无的,需要是自己的情况而定,如果只是单纯的对map输出的key-value进行一个统计,则不需要进行combiner,combiner相当于提前做了一个reduce的工作,减轻了reduce端的压力,Combiner只应该适用于那种Reduce的输入(key:value与输出(key:value)类型完全一致,且不影响最终结果的场景。比如累加,最大值等,也可以用于过滤数据,在map端将无效的数据过滤掉。
     在这些需求场景下,输出的数据是可以根据key值来作合并的,合并的目的是减少输出的数据量,减少IO的读写,减少网络传输,以提高MR的作业效率。
     Combiner相当于本地化的Reduce操作,在shuffle之前进行本地聚合,其输入和输出类型一致。

     Partitioner用于在Map端对key进行分区,默认使用的是HashPartitioner,HashPartitioner先获取key的哈希值 ,然后使用key的哈希值对Reduce任务数求模,从而决定每条记录应该送到哪个Reducer处理,此外还可以自定义Partitioner

11.用 mapreduce 怎么处理数据倾斜问题
a.在加个combiner函数,加上combiner相当于提前进行reduce,就会把一个mapper中的相同key进行了聚合,减少shuffle过程中数据量,以及reduce端的计算量。这种方法可以有效的缓解数据倾斜问题,但是如果导致数据倾斜的key 大量分布在不同的mapper的时候,这种方法就不是很有效了。
b.局部聚合加全局聚合。第二种方法进行两次mapreduce,第一次在map阶段对那些导致了数据倾斜的key 加上1-n的随机前缀,这样之前相同的key 也会被分到不同的reduce中,进行聚合,这样的话就有那些倾斜的key进行局部聚合,数量就会大大降低。然后再进行第二次mapreduce这样的话就去掉随机前缀,进行全局聚合。这样就可以有效地降低mapreduce了。

12.datanode 在什么情况下不会备份
答:设置副本数只有1时。

13.简单谈谈hdfs数据压缩算法
答:Hadoop中常用的压缩算法有bzip2、gzip、lzo、snappy,其中lzo、snappy需要操作系统安装native库才可以支持下面这张表,是比较官方一点的统计,不同的场合用不同的压缩算法。bzip2和GZIP是比较消耗CPU的,压缩比最高,GZIP不能被分块并行的处理;Snappy和LZO差不多,稍微胜出一点,cpu消耗的比GZIP少。

二、操作改错篇:

1.简要描述如何安装配置一个apache开源版hadoop,描述即可,列出步骤更好

  1. 解压hadoop包,到指定安装文件夹。
  2. 配置linux基本网络环境、jdk环境、防火墙环境。
  3. 修改主机名,方便后面UI的访问。
  4. 修改hadoop/etc/hadoop/conf下的配置文件,根据部署的模式和需要进行配置(如hadoop-env.sh,core-site.xml , mapred-site.xml , hdfs-site.xml,slaves等)。
  5. 配置hadoop环境变量(如HADOOP_HOME,HADOOP_CONF_DIR,HADOOP_USER_NAME)
  6. 格式化 hadoop namenode-format
  7. 启动节点start-all.sh

2.启动hadoop报如下错误,该如何解决?
(1)error org.apache.hadoop.hdfs.server.namenode.NameNode
解决办法:找不到主类,应该是配置文件的hadoop的安装位置配置错误,对hadoop-env.sh文件进行检查修改。
(2)org.apache.hadoop.hdfs.server.common.inconsistentFSStateException
解决办法:存储目录不存在,或者被删除,对namenode进行格式化,或重新格式化,对tmp.dir进行自己的设置。
(3)Directory /tmp/hadoop-root/dfs/name is in an inconsistent
解决办法:重新设置core-site.xml中hadoop.tmp.dir的值,对namenode进行格式化。
(4)tate storage direction does not exist or is not accessible?
解决办法:之前默认保存在tmp目录,每次重启都会清除这个数据,所以找不到整个文件系统的信息,重新设置core-site.xml中hadoop.tmp.dir的值,对namenode进行格式化。

3、hadoop节点的动态上线下线的大概操作
(1)节点上线:

  • 关闭新增节点的防火墙。
  • 在 NameNode节点的hosts文件中加入新增数据节点的hostname。
  • 在每个新增数据节点的hosts文件中加入NameNode的hostname。
  • 在NameNode节点上增加新增节点的SSH免密码登录的操作。
  • 在NameNode节点上的dfs.hosts中追加上新增节点的hostname。
  • 在其他节点上执行刷新操作:hdfs dfsadmin -refreshNodes。
  • 在 NameNode 节点上,更改slaves文件,将要上线的数据节点hostname追加到slaves文件中。
  • 启动DataNode节点。
  • 查看NameNode的监控页面看是否有新增加的节点 。

(2)节点下线:

  • 修改/conf/hdfs-site.xml文件。
  • 确定需要下线的机器,dfs.osts.exclude文件中配置好需要下架的机器,这个是阻止下架的机器去连接NameNode。
  • 配置完成之后进行配置的刷新操作./bin/hadoop dfsadmin -refreshNodes,这个操作的作用是在后台进行block块的移动。
  • 当执行三的命令完成之后,需要下架的机器就可以关闭了,可以查看现在集
    群上连接的节点,正在执行 Decommission,会显示:
    Decommission Status : Decommission in progress 执行完毕后,会显示:
    Decommission Status : Decommissioned
  • 机器下线完毕,将他们从 excludes 文件中移除。

三、代码类:

1.请简述hadoop怎么样实现二级排序
     有两种方法进行二次排序,分别为:buffer and in memory sort和 value-to-key conversion。
     a.buffer and in memory sort:
     主要思想是:在reduce()函数中,将某个key对应的所有value保存下来,然后进行排序。这种方法最大的缺点是:可能会造成out of memory。
     b.value-to-key conversion:
     主要思想是:将key和部分value拼接成一个组合key(实现WritableComparable接口或者调setSortComparatorClass函数),这样reduce获取的结果便是先按key排序,后按value排序的结果,需要注意的是,用户需要自己实现Paritioner,以便只按照key进行数据划分。Hadoop显式的支持二次排序,在Configuration类中有个setGroupingComparatorClass()方法,可用于设置排序group的key值。

2、当前的日志采样格式为:
a,b,c,d
b,b,f,e
a,a,c,f
请用你最熟悉的语言编写一个map/reduce程序,计算第四列每个元素出现的个数。

public classWordCount1 {

public static final String INPUT_PATH ="hdfs://hadoop0:9000/in";

public static final String OUT_PATH ="hdfs://hadoop0:9000/out";

public static void main(String[] args)throws Exception {

Configuration conf = newConfiguration();

FileSystem fileSystem =FileSystem.get(conf);

if(fileSystem.exists(newPath(OUT_PATH))){}

fileSystem.delete(newPath(OUT_PATH),true);

Job job = newJob(conf,WordCount1.class.getSimpleName());

//读取文件,解析成key,value对

FileInputFormat.setInputPaths(job,newPath(INPUT_PATH));

//对输入的key,value进行处理,转换成新的key,value对进行输出

job.setMapperClass(MyMapper.class);

job.setMapOutputKeyClass(Text.class);

job.setMapOutputValueClass(LongWritable.class);

//对输出后的数据进行分区

//对分区后的数据进行排序,分组,相同key的value放到一个集合中

//对通过网络将map输出的数据拷贝到reduce节点

//对map输出的数据进行处理

job.setReducerClass(MyReducer.class);

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(LongWritable.class);

FileOutputFormat.setOutputPath(job,new Path(OUT_PATH));

job.waitForCompletion(true);

}

static class MyMapper extendsMapper<LongWritable, Text, Text, LongWritable>{

@Override

protected void map(LongWritablek1, Text v1,

org.apache.hadoop.mapreduce.Mapper.Contextcontext)

throws IOException,InterruptedException {

String[] split =v1.toString().split("\t");

for(String words :split){

context.write(split[3],1);

}

}

}

static class MyReducer extends Reducer<Text,LongWritable, Text, LongWritable>{

protected void reduce(Text k2,Iterable<LongWritable> v2,

org.apache.hadoop.mapreduce.Reducer.Contextcontext)

throws IOException,InterruptedException {

Long count = 0L;

for(LongWritable time :v2){

count += time.get();

}

context.write(v2, newLongWritable(count));

}

}

}

你可能感兴趣的:(Linux,hdfs,大数据,hadoop,linux)