以下资料来源于互联网,很多都是面试者们去面试的时候遇到的问题,我对其中有的问题做了稍许的修改了回答了部分空白的问题,其中里面有些考题出的的确不是很好,但是也不乏有很好的题目,这些都是基于真实的面试来的,希望对即将去面试或向继续学习hadoop,大数据等的朋友有帮助!
前言
有一句话叫做三人行必有我师,其实做为一个开发者,有一个学习的氛围跟一个交流圈子特别重要这是一个我的大数据交流学习qun不管你是小白还是大牛欢迎入驻,正在求职的也可以加入,大家一起交流学习,话糙理不糙,互相学习,共同进步,一起加油吧。
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:/in;
publicstaticfinalStringOUT_PATH=hdfs://hadoop0:/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);
}
staticclassMyMapperextendsMapperLongWritable,Text,Text,LongWritable{
Overrideprotectedvoidmap(LongWritablek1,Textv1,
org.apache.hadoop.mapreduce.Mapper.Contextcontext)
throwsIOException,InterruptedException{
String[]split=v1.toString().split(\t);
for(Stringwords:split){
context.write(split[3],1);
}
}
}
staticclassMyReducerextendsReducerText,LongWritable,Text,LongWritable{
protectedvoidreduce(Textk2,IterableLongWritablev2,
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.publicclassBinarySearchClass
2.{
3.
4.publicstaticintbinary_search(int[]array,intvalue)
5.{
6.intbeginIndex=0;//低位下标
7.intendIndex=array.length-1;//高位下标
8.intmidIndex=-1;
9.while(beginIndex=endIndex){
10.
midIndex=beginIndex+(endIndex-beginIndex)/2;//防止溢出
11.if(value==array[midIndex]){
12.
returnmidIndex;
13.}elseif(valuearray[midIndex]){
14.
endIndex=midIndex-1;
15.}else{
16.
beginIndex=midIndex+1;
17.}
18.
}
19.return-1;
20.
//找到了,返回找到的数值的下标,没找到,返回-1
21.}
22.
23.
24.
//start提示:自动阅卷起始唯一标识,请勿删除或增加。
25.publicstaticvoidmain(String[]args)
26.
{
27.System.out.println(Start...);
28.
int[]myArray=newint[]{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中的