程哥精品hadoop面试题.docx
《程哥精品hadoop面试题.docx》由会员分享,可在线阅读,更多相关《程哥精品hadoop面试题.docx(32页珍藏版)》请在冰豆网上搜索。
![程哥精品hadoop面试题.docx](https://file1.bdocx.com/fileroot1/2023-7/26/f9b687f1-6186-454f-b481-1349fd419b24/f9b687f1-6186-454f-b481-1349fd419b241.gif)
程哥精品hadoop面试题
Hadoop就业面试宝典
1.0简要描述如何安装配置apache的一个开源hadoop,只描述即可,无需列出具体步骤,列出具体步骤更好。
答:
第一题:
1使用root账户登录
2修改IP
3修改host主机名
4配置SSH免密码登录
5关闭防火墙
6安装JDK
6解压hadoop安装包
7配置hadoop的核心文件hadoop-env.sh,core-site.xml,mapred-site.xml,hdfs-site.xml
8配置hadoop环境变量
9格式化hadoopnamenode-format
10启动节点start-all.sh
2.0请列出正常的hadoop集群中hadoop都分别需要启动哪些进程,他们的作用分别都是什么,请尽量列的详细一些。
答:
namenode:
负责管理hdfs中文件块的元数据,响应客户端请求,管理datanode上文件block的均衡,维持副本数量
Secondname:
主要负责做checkpoint操作;也可以做冷备,对一定范围内数据做快照性备份。
Datanode:
存储数据块,负责客户端对数据块的io请求
Jobtracker:
管理任务,并将任务分配给tasktracker。
Tasktracker:
执行JobTracker分配的任务。
Resourcemanager
Nodemanager
Journalnode
Zookeeper
Zkfc
3.0请写出以下的shell命令
(1)杀死一个job
(2)删除hdfs上的/tmp/aaa目录
(3)加入一个新的存储节点和删除一个节点需要执行的命令
答:
(1)hadoopjob–list得到job的id,然后执行hadoopjob-killjobId就可以杀死一个指定jobId的job工作了。
(2)hadoopfs-rmr/tmp/aaa
(3)增加一个新的节点在新的几点上执行
Hadoopdaemon.shstartdatanode
Hadooopdaemon.shstarttasktracker/nodemanager
下线时,要在conf目录下的excludes文件中列出要下线的datanode机器主机名
然后在主节点中执行hadoopdfsadmin-refreshnodesà下线一个datanode
删除一个节点的时候,只需要在主节点执行
hadoopmradmin-refreshnodes---à下线一个tasktracker/nodemanager
4.0请列出你所知道的hadoop调度器,并简要说明其工作方法
答:
Fifoschedular:
默认,先进先出的原则
Capacityschedular:
计算能力调度器,选择占用最小、优先级高的先执行,依此类推。
Fairschedular:
公平调度,所有的job具有相同的资源。
5.0请列出你在工作中使用过的开发mapreduce的语言
答:
java,hive,(python,c++)hadoopstreaming
6.0当前日志采样格式为
a,b,c,d
b,b,f,e
a,a,c,f
请你用最熟悉的语言编写mapreduce,计算第四列每个元素出现的个数
答:
publicclassWordCount1{
publicstaticfinalStringINPUT_PATH="hdfs:
//hadoop0:
9000/in";
publicstaticfinalStringOUT_PATH="hdfs:
//hadoop0:
9000/out";
publicstaticvoidmain(String[]args)throwsException{
Configurationconf=newConfiguration();
FileSystemfileSystem=FileSystem.get(conf);
if(fileSystem.exists(newPath(OUT_PATH))){}
fileSystem.delete(newPath(OUT_PATH),true);
Jobjob=newJob(conf,WordCount1.class.getSimpleName());
//1.0读取文件,解析成key,value对
FileInputFormat.setInputPaths(job,newPath(INPUT_PATH));
//2.0写上自己的逻辑,对输入的可以,value进行处理,转换成新的key,value对进行输出
job.setMapperClass(MyMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class);
//3.0对输出后的数据进行分区
//4.0对分区后的数据进行排序,分组,相同key的value放到一个集合中
//5.0对分组后的数据进行规约
//6.0对通过网络将map输出的数据拷贝到reduce节点
//7.0写上自己的reduce函数逻辑,对map输出的数据进行处理
job.setReducerClass(MyReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
FileOutputFormat.setOutputPath(job,newPath(OUT_PATH));
job.waitForCompletion(true);
}
staticclassMyMapperextendsMapper{
@Override
protectedvoidmap(LongWritablek1,Textv1,
org.apache.hadoop.mapreduce.Mapper.Contextcontext)
throwsIOException,InterruptedException{
String[]split=v1.toString().split("\t");
for(Stringwords:
split){
context.write(split[3],1);
}
}
}
staticclassMyReducerextendsReducer{
protectedvoidreduce(Textk2,Iterablev2,
org.apache.hadoop.mapreduce.Reducer.Contextcontext)
throwsIOException,InterruptedException{
Longcount=0L;
for(LongWritabletime:
v2){
count+=time.get();
}
context.write(v2,newLongWritable(count));
}
}
}
7.0你认为用java,streaming,pipe方式开发map/reduce,各有哪些优点
就用过java和hiveQL。
Java写mapreduce可以实现复杂的逻辑,如果需求简单,则显得繁琐。
HiveQL基本都是针对hive中的表数据进行编写,但对复杂的逻辑(杂)很难进行实现。
写起来简单。
8.0hive有哪些方式保存元数据,各有哪些优点
三种:
自带内嵌数据库derby,挺小,不常用,只能用于单节点
mysql常用
上网上找了下专业名称:
singleusermode..multiusermode...remoteusermode
9.0请简述hadoop怎样实现二级排序(就是对key和value双排序)
第一种方法是,Reducer将给定key的所有值都缓存起来,然后对它们再做一个Reducer内排序。
但是,由于Reducer需要保存给定key的所有值,可能会导致出现内存耗尽的错误。
第二种方法是,将值的一部分或整个值加入原始key,生成一个组合key。
这两种方法各有优势,第一种方法编写简单,但并发度小,数据量大的情况下速度慢(有内存耗尽的危险),
第二种方法则是将排序的任务交给MapReduce框架shuffle,更符合Hadoop/Reduce的设计思想。
这篇文章里选择的是第二种。
我们将编写一个Partitioner,确保拥有相同key(原始key,不包括添加的部分)的所有数据被发往同一个Reducer,还将编写一个Comparator,以便数据到达Reducer后即按原始key分组。
10.简述hadoop实现jion的几种方法
Mapsidejoin----大小表join的场景,可以借助distributedcache
Reducesidejoin
11.0请用java实现非递归二分查询
1.public class BinarySearchClass
2.{
3.
4. public static int binary_search(int[] array, int value)
5. {
6. int beginIndex = 0;// 低位下标
7. int endIndex = array.length - 1;// 高位下标
8. int midIndex = -1;
9. while (beginIndex <= endIndex) {
10. midIndex = beginIndex + (endIndex - beginIndex) / 2;//防止溢出
11. if (value == array[midIndex]) {
12. return midIndex;
13. } else if (value < array[midIndex]) {
14. endIndex = midIndex - 1;
15. } else {
16. beginIndex = midIndex + 1;
17. }
18. }
19. return -1;
20. //找到了,返回找到的数值的下标,没找到,返回-1
21. }
22.
23.
24. //start 提示:
自动阅卷起始唯一标识,请勿删除或增加。
25. public static void main(String[] args)
26. {
27. System.out.println("Start...");
28. int[] myArray = new int[] { 1, 2, 3, 5, 6, 7, 8, 9 };
29. System.out.println("查找数字8的下标:
");
30. System.out.println(binary_search(myArray, 8));
31. }
32. //end //提示:
自动阅卷结束唯一标识,请勿删除或增加。
33.}
12.0请简述mapreduce中的combine和partition的作用
答:
combiner是发生在map的最后一个阶段,其原理也是一个小型的reducer,主要作用是减少输出到reduce的数据量,缓解网络传输瓶颈,提高reducer的执行效率。
partition的主要作用将map阶段产生的所有kv对分配给不同的reducertask处理,可以将reduce阶段的处理负载进行分摊
13.0hive内部表和外部表的区别
Hive向内部表导入数据时,会将数据移动到数据仓库指向的路径;若是外部表,数据的具体存放目录由用户建表时指定
在删除表的时候,内部表的元数据和数据会被一起删除,
而外部表只删除元数据,不删除数据。
这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
14.Hbase的rowKey怎么创建比较好?
列簇怎么创建比较好?
答:
rowKey最好要创建有规则的rowKey,即最好是有序的。
经常需要批量读取的数据应该让他们的rowkey连续;
将经常需要作为条件查询的关键词组织到rowkey中;
列族的创建:
按照业务特点,把数据归类,不同类别的放在不同列族
15.用mapreduce怎么处理数据倾斜问题
本质:
让各分区的数据分布均匀
可以根据业务特点,设置合适的partition策略
如果事先根本不知道数据的分布规律,利用随机抽样器抽样后生成partition策略再处理
16.hadoop框架怎么来优化
答:
可以从很多方面来进行:
比如hdfs怎么优化,mapreduce程序怎么优化,yarn的job调度怎么优化,hbase优化,hive优化。
。
。
。
。
。
。
17.hbase内部机制是什么
答:
Hbase是一个能适应联机业务的数据库系统
物理存储:
hbase的持久化数据是存放在hdfs上
存储管理:
一个表是划分为很多region的,这些region分布式地存放在很多regionserver上
Region内部还可以划分为store,store内部有memstore和storefile
版本管理:
hbase中的数据更新本质上是不断追加新的版本,通过compact操作来做版本间的文件合并
Region的split
集群管理:
zookeeper+hmaster(职责)+hregionserver(职责)
18.我们在开发分布式计算job的时候,是否可以去掉reduce阶段
答:
可以,例如我们的集群就是为了存储文件而设计的,不涉及到数据的计算,就可以将mapReduce都省掉。
比如,流量运营项目中的行为轨迹增强功能部分
怎么样才能实现去掉reduce阶段
19hadoop中常用的数据压缩算法
答:
Lzo
Gzip
Default
Snapyy
如果要对数据进行压缩,最好是将原始数据转为SequenceFile或者ParquetFile(spark)
20.mapreduce的调度模式(题意模糊,可以理解为yarn的调度模式,也可以理解为mr的内部工作流程)
答:
appmaster作为调度主管,管理maptask和reducetask
Appmaster负责启动、监控maptask和reducetask
Maptask处理完成之后,appmaster会监控到,然后将其输出结果通知给reducetask,然后reducetask从map端拉取文件,然后处理;
当reduce阶段全部完成之后,appmaster还要向resourcemanager注销自己
21.hive底层与数据库交互原理
答:
Hive的查询功能是由hdfs+mapreduce结合起来实现的
Hive与mysql的关系:
只是借用mysql来存储hive中的表的元数据信息,称为metastore
22.hbase过滤器实现原则
答:
可以说一下过滤器的父类(比较过滤器,专用过滤器)
过滤器有什么用途:
增强hbase查询数据的功能
减少服务端返回给客户端的数据量
23.reduce之后数据的输出量有多大(结合具体场景,比如pi)
Sca阶段的增强日志(1.5T---2T)
过滤性质的mr程序,输出比输入少
解析性质的mr程序,输出比输入多(找共同朋友)
24.现场出问题测试mapreduce掌握情况和hive的ql语言掌握情况
25.datanode在什么情况下不会备份数据
答:
在客户端上传文件时指定文件副本数量为1
bine出现在哪个过程
答:
shuffle过程中
具体来说,是在maptask输出的数据从内存溢出到磁盘,可能会调多次
Combiner使用时候要特别谨慎,不能影响最后的逻辑结果
27.hdfs的体系结构
答:
集群架构:
namenodedatanodesecondarynamenode
(activenamenode,standbynamenode)journalnodezkfc
内部工作机制:
数据是分布式存储的
对外提供一个统一的目录结构
对外提供一个具体的响应者(namenode)
数据的block机制,副本机制
Namenode和datanode的工作职责和机制
读写数据流程
28.flush的过程
答:
flush是在内存的基础上进行的,首先写入文件的时候,会先将文件写到内存中,当内存写满的时候,一次性的将文件全部都写到硬盘中去保存,并清空缓存中的文件,
29.什么是队列
答:
是一种调度策略,机制是先进先出
30.List与set的区别
答:
List和Set都是接口。
他们各自有自己的实现类,有无顺序的实现类,也有有顺序的实现类。
最大的不同就是List是可以重复的。
而Set是不能重复的。
List适合经常追加数据,插入,删除数据。
但随即取数效率比较低。
Set适合经常地随即储存,插入,删除。
但是在遍历时效率比较低。
31.数据的三范式
答:
第一范式()无重复的列
第二范式(2NF)属性完全依赖于主键[消除部分子函数依赖]
第三范式(3NF)属性不依赖于其它非主属性[消除传递依赖]
32.三个datanode中当有一个datanode出现错误时会怎样?
答:
Namenode会通过心跳机制感知到datanode下线
会将这个datanode上的block块在集群中重新复制一份,恢复文件的副本数量
会引发运维团队快速响应,派出同事对下线datanode进行检测和修复,然后重新上线
33.sqoop在导入数据到mysql中,如何不重复导入数据,如果存在数据问题,sqoop如何处理?
答:
34.描述一下hadoop中,有哪些地方使用到了缓存机制,作用分别是什么?
答:
Shuffle中
Hbase----客户端/regionserver
35.MapReduce优化经验
答:
(1.)设置合理的map和reduce的个数。
合理设置blocksize
(2.)避免出现数据倾斜
(bine函数
(4.对数据进行压缩
(5.小文件处理优化:
事先合并成大文件,combineTextInputformat,在hdfs上用mapreduce将小文件合并成SequenceFile大文件(key:
文件名,value:
文件内容)
(6.参数优化
36.请列举出曾经修改过的/etc/下面的文件,并说明修改要解决什么问题?
答:
/etc/profile这个文件,主要是用来配置环境变量。
让hadoop命令可以在任意目录下面执行。
/ect/sudoers
/etc/hosts
/etc/sysconfig/network
/etc/inittab
37.请描述一下开发过程中如何对上面的程序进行性能分析,对性能分析进行优化的过程。
38.现有1亿个整数均匀分布,如果要得到前1K个最大的数,求最优的算法。
参见《海量数据算法面试大全》
39.mapreduce的大致流程
答:
主要分为八个步骤
1/对文件进行切片规划
2/启动相应数量的maptask进程
3/调用FileInputFormat中的RecordReader,读一行数据并封装为k1v1
4/调用自定义的map函数,并将k1v1传给map
5/收集map的输出,进行分区和排序
6/reducetask任务启动,并从map端拉取数据
7/reducetask调用自定义的reduce函数进行处理
8/调用outputformat的recordwriter将结果数据输出
41.用mapreduce实现sql语selectcount(x)fromagroupbyb;
44.搭建hadoop集群,master和slaves都运行哪些服务
答:
master主要是运行我们的主节点,slaves主要是运行我们的从节点。
45.hadoop参数调优
46.pig,latin,hive语法有什么不同
答:
46.描述Hbase,ZooKeeper搭建过程
48.hadoop运行原理
答:
hadoop的主要核心是由两部分组成,HDFS和mapreduce,首先HDFS的原理就是分布式的文件存储系统,将一个大的文件,分割成多个小的文件,进行存储在多台服务器上。
Mapreduce的原理就是使用JobTracker和TaskTracker来进行作业的执行。
Map就是将任务展开,reduce是汇总处理后的结果。
49.mapreduce的原理
答:
mapreduce的原理就是将一个MapReduce框架由一个单独的masterJobTracker和每个集群节点一个slaveTaskTracker共同组成。
master负责调度构成一个作业的所有任务,这些的slave上,master监控它们的执行,重新执行已经失败的任务。
而slave仅负责执行由maste指派的任务。
50.HDFS存储机制
答:
HDFS主要是一个分布式的文件存储系统,由namenode来接收用户的操作请求,然后根据文件大小,以及定义的block块的大小,将大的文件切分成多个block块来进行保存
51.举一个例子说明mapreduce是怎么运行的。
Wordcount
52.如何确认hadoop集群的健康状况
答:
有完善的集群监控体系(ganglia,nagios)
Hdfsdfsadmin–report
Hdfshaadmin–getServiceStatenn1
53.mapreduce作业,不让reduce输出,用什么代替reduce的功能。
54.hive如何调优
答:
hive最终都会转化为mapreduce的job来运行,要