hadoop面试百题

第1题、简要描述如何安装配置一个apache开源hadoop,只描述即可,无需列出完整步骤。能列出步骤更好。
1、创建 hadoop帐户。 
2、setup.改IP。 
3、安装java,并修攕 /etc/profile文件,配置 java的环境变量。 
4、修改Host文件域名。 
5、安装SSH,配置无密钥通信。 
6、解压hadoop。 
7、配置conf文件? hadoop-env.sh、core-site.sh、mapre-site.sh、hdfs-site.sh。 
8、配置hadoop的环境变量。 
9.Hadoop namenode -format 
10.start-dfs.sh start-yarn.sh


第2题、请列出正常工作的Hadoop集群中Hadoop都分别需要启动哪些进程。他们的作用分别是什么,尽可能写的全面些。
   (1)namenode节点
namenode:管理集群,并记录 datanode文件信息。 
SecondaryName:可以做冷备,对一定范围内数据做快照性备份。 
Master:Spark主节点
Jobtracker :管理任务,并将任务分配给 tasktracker。 
Tasktracker:任务执行方。
ResourceManager:负责集群中所有资源的统一管理和分配,它接受来自各个节点(NodeManager)的资源汇报信息,
并把这些信息按照一定的策略分配给各个应用程序(实际上是ApplicationManager)
   (2)node节点
        Datanode:存储数据
NodeManager:Yarn中每个节点上的代理,它管理Hadoop集群中单个计算节点,包括与ResourceManager保持通信,监督Container的生命周期管理。
Worker:工作节点


第3题、启动Hadoop时报如下错误,如何解决
Error Directory /tmp/hadoop-root/dfs/name is in an inconsistent state storage directory does not exist or is not accessible.
可能的原因:1、hdfs没有启动成功,通过查看jps确认下。
            2、确认文件是否存在。


第4题、请写出以下执行命令
1)杀死一个Job
hadoop job -list 拿到jobid,
./hadoop job -kill job_201212111628_11166


2)删除hdfs上的/tmp/aaa 目录
hadoop fs -rmr /spark/output


3)加入一个新的存储节点和删除一个计算节点需要刷新集群状态命令
bin/Hadoop-daemon.sh start DataNode
bin/yarn-daemon.sh start nodemanager


动态的加入集群
bin/Hadoop-daemon.sh --config ./conf start DataNode
bin/yarn-daemon.sh --config ./conf start nodemanager




删除时:
hadoop mradmin -refreshnodes
hadoop dfsadmin -refreshnodes


hdfs dfsadmin -refreshNodes


查看集群情况:
hdfs dfsadmin -report


集群自均衡完成
sbin/start-balancer.sh -threshold 5


yarn框架启动
yarn-daemon.sh start nodemanager


查看集群情况
yarn node -list
---------------------------------------------------------------------------------------


第5题、请列出你所知道的hadoop调度器,并简要说明其工作方法。
 Fifo schedular :即先来先服务,在该调度机制下,所有作业被统一提交到一个队列中,hadoop按照提交顺序依次运行这些作业。
 典型的应用有以下几种:
     批处理作业:这种作业往往耗时很长,对时间完成一半没有严格要求,如数据挖掘,机器学习等方面的应用程序。
     交互式作业:这种作业期望能及时放回结果(sql查询,hive)等
     生产性作业:这种作业要求有一定量得资源保证,如统计值计算,垃圾数据分析等。
---yarn支持的调度器-------------------------------
 Capacity schedular :计算能力调度器,选择占用最小、优先级高的先执行,依此类推。 
 Fair schedular:公平调度,所有的job具有相同的资源。
-----------
资源表示模型(container)
当前yarn支持内存和cpu两种资源类型的管理和分配,yarn采用了动态资源分配机制。nodemanager启动时会向resourceManager注册,注册信息中包含该节点可分配的cpu和内存总量。
yarn.nodemanager.resource.memory-mb:可分配的物理内存总量,默认是8mb*1024,即8G
yarn.nodemanager.vmem-pmem-ratio:任务使用单位物理内存量对应最多可使用的虚拟内存量,默认值是2.1,表示每1mb的物理内存,最多可以使用2.1mb虚拟内存总量
yarn.nodemanager.resource.cpu-vcores:可分配的虚拟cpu个数,默认是8.为了更细粒度的划分cpu资源和考虑到cpu性能异构性,yarn允许管理员根据实际需要和cpu性能将每个物理cpu划分成若干个虚拟cpu,二管理员可以为每个节点单独配置可用的虚拟cpu个数,且用户提交应用程序时,也可指定每个人物需要的虚拟cpu个数。比如node1节点上面有8个cpu,node2上有16个cpu,且node1的cpu是node2的2倍,那么可为这2个节点配置相同数目的虚拟cpu个数,比如均为32.由于用户设置虚拟cpu个数必须是整数,每个任务最少使用node2的半个cpu。
ps:出了cpu和内存两种资源,服务器还有很多其他资源,比如磁盘容量,网络和磁盘io等,yarn可能在将来支持这些资源的调度。


名词解释:
是否支持动态加载配置文件:2种调度器的配置文件修改后是否能够动态生效。
 
是否支持负载均衡:fair schedler提供了一个基于任务数目的负载均衡机制,改机制尽可能将系统中的任务均匀分配到各个节点上,此外用户也可以根据自己的需要设计负载均衡策略。
 
是否支持资源抢占:每个队列可以设置一个最小资源量和最大资源量。为了提高资源利用率,资源调度器会将负载较轻的队列的资源暂时分配给负载较重的队列,仅当负载较轻的队列突然收到需要资源请求时,调度器才进一步将本属于该队列的资源分配给他,因为这个时候资源可能正在被别的队列使用,所以调度器要等那个队列释放资源释放资源才能将资源归还,这通常需要一段不确定的等待时间,为了防止应用程序等待时间太长,调度器等待一段时间后,发现资源并为得到释放,则进行资源抢占。
 
fifo:按照优先级高低调度,如果优先级相同,则按照提交时间先后顺序调度,如果提交时间也相同,则按照(队列或者应用程序)名称大小(字符串比较)调度。
 
fair:按照内存资源使用量比率调度,即按照used_memory/minshare大小调度(核心思想是按照该调度算法决定调度顺序。)如果一个队列中有2个应用程序同时运行,则每个得到1/2的资源,如果是3个则是1/3.
 
drf:按照主资源公平调度算法进行调度,drf被证明非常适合应用于多资源和复杂需求的环境中,因此被越来越多的系统采用,包括apache mesos。在drf算法中,将所需份额(资源比例)最大的资源成为主资源,而drf的基本设计思想则是将最大最小公平算法应用于主资源上。即drf总是最大化所有主资源中最小的。
假设系统中共有9个cpu和18gb ram,有2个用户分别运行了2种任务,分别需要的资源量为a:<1cpu,4gb>,b:<3cpu,1gb>对于用户a,每个任务要消耗总cpu的1/9和总内存的2.9,a的主资源为内存;b的主资源为cpu。
所以最终a的资源分配为:<3cpu,12gb>可以运行3个任务,b的资源分配为<6cpu,2gb>可运行2个任务。
-----------------------------------------------------------------------------------
第6题、请列出在你以前的工作中所有使用过的开发map/reduce的语言
java、python、hql、scala
---------------------------------------------------------------------
第7题、当前日志采集格式为
a、b、c、d
b、b、f、e
a、a、c、f
请用你最熟悉的语言编写一个map/reduce程序,计算第四列每个元素出现的个数
java:


public class WordCount{
   public static class WordCountMap extends Mapper<Object,Text,Text,IntWritable>{
   private final static IntWritable one = new IntWritable(1);
   private Text word = new Text();
   StringTokenizer itr = new StringTokenizer(value.toString());
   while(itr.hasMoreTokens()){
word.set(itr.nextToken());
context.write(word,one);
   }
}
}


public static class IntSumReducer extends<Text,IntWritable,Text,IntWritable>{
    private IntWritable result = new IntWritable();
    public void reduce(Text key,Iterable<IntWritable> values,Context context) throws IOException,InterruptedException{
        int sum = 0;
for(IntWritable val : values){
 sum += val.get();
}
result.set(sum);
context.write(key,result);
    }
}


public static void main(String[] args) throws Exception{
    Configuration conf = new Configuration();
    String[] ioArgs = new String[]{"hdfs://localhost:9000/input","hdfs://localhost:9000/output"};
    String[] otherArgs = new GenericOptionsParser(conf,ioArgs).getRemainingArgs();
    if(otherArgs.length != 2){
      System.out.println("Usage:wordcount<in><out>");
      System.exit(2);
    }
}
scala:


val rdd = sc.textFile("hdfs://192.168.1.30:9000/spark/test.txt")
rdd.cache()
val wordcount = rdd.flatMap(_.split(",")).map(x=>(x,1)).reduceByKey(_+_).collect().foreach(println)


---------------------------------------------------------
第8题 你认为用Java,Streaming,pipe方式开发map/reduce,各有哪些优缺点
  1、Java写MapReduce可以实现复杂的逻辑,如果需求简单,则显得繁琐
  2、HiveQL基本都是针对hive中的表数据进行编写,但对复杂的逻辑很难进行实现。写起来简单。


第9题   Hive有哪些方式保存元数据的,各有哪些特点
  三种:内存数据库derby,挺小,不常用。
        本地mysql... 常用
远程端mysql... 不常用


第10题  请简述hadoop怎样实现二级排序
  在mr中,所有的key是需要被比较和排序的,并且是二次,先根据partitione,再根据大小。而本例中也是要比较两次。
先按照第一字段排序,然后再对第一字段相同的按照第二字段排序。根据这一点,我们可以构造一个复合类IntPair,他有两个字段,
先利用分区对第一字段排序,再利用分区内的比较对第二字段排序。


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


第11题  简述hadoop实现join的几种方法
假设要进行join的数据分别来自File1和File2.
  2.1 reduce side join
    reduce side join是一种最简单的join方式,其主要思想如下:
    在map阶段,map函数同时读取两个文件File1和File2,为了区分两种来源的key/value数据对,对每条数据打一个标签(tag),比如:tag=0表示来自文件File1,tag=2表示来自文件File2。
    即:map阶段的主要任务是对不同文件中的数据打标签。在reduce阶段,reduce函数获取key相同的来自File1和File2文件的value list, 
    然后对于同一个key,对File1和File2中的数据进行join(笛卡尔乘积)。即:reduce阶段进行实际的连接操作。
  2.2 map side join
    之所以存在reduce side join,是因为在map阶段不能获取所有需要的join字段,即:同一个key对应的字段可能位于不同map中。Reduce side join是非常低效的,因为shuffle阶段要进行大
    量的数据传输。Map side join是针对以下场景进行的优化:两个待连接表中,有一个表非常大,而另一个表非常小,以至于小表可以直接存放到内存中。这样,我们可以将小表复制多份,
    让每个map task内存中存在一份(比如存放到hash table中),然后只扫描大表:对于大表中的每一条记录key/value,在hash table中查找是否有相同的key的记录,如果有,则连接后输出即可。
    为了支持文件的复制,Hadoop提供了一个类DistributedCache,使用该类的方法如下:
(1)用户使用静态方法DistributedCache.addCacheFile()指定要复制的文件,它的参数是文件的URI(如果是HDFS上的文件,可以这样:hdfs://namenode:9000/home/XXX/file,其中9000是自己配
置的NameNode端口号)。JobTracker在作业启动之前会获取这个URI列表,并将相应的文件拷贝到各个TaskTracker的本地磁盘上。(2)用户使用DistributedCache.getLocalCacheFiles()方法获取文件
目录,并使用标准的文件读写API读取相应的文件。
  2.3 SemiJoin
    SemiJoin,也叫半连接,是从分布式数据库中借鉴过来的方法。它的产生动机是:对于reduce side join,跨机器的数据传输量非常大,这成了join操作的一个瓶颈,如果能够在map端过滤掉不会
参加join操作的数据,则可以大大节省网络IO。实现方法很简单:选取一个小表,假设是File1,将其参与join的key抽取出来,保存到文件File3中,File3文件一般很小,可以放到内存中。
在map阶段,使用DistributedCache将File3复制到各个TaskTracker上,然后将File2中不在File3中的key对应的记录过滤掉,剩下的reduce阶段的工作与reduce side join相同。
  2.4 reduce side join + BloomFilter
在某些情况下,SemiJoin抽取出来的小表的key集合在内存中仍然存放不下,这时候可以使用BloomFiler以节省空间。
BloomFilter最常见的作用是:判断某个元素是否在一个集合里面。它最重要的两个方法是:add() 和contains()。最大的特点是不会存在false negative,即:如果contains()返回false,则该元素一定
不在集合中,但会存在一定的true negative,即:如果contains()返回true,则该元素可能在集合中。因而可将小表中的key保存到BloomFilter中,在map阶段过滤大表,可能有一些不在小表中的记录没
有过滤掉(但是在小表中的记录一定不会过滤掉),这没关系,只不过增加了少量的网络IO而已。


第12题  请用java实现非递归二分查找


第13题  请简述MapReduce中combiner,partition作用
  combiner:实现的功能根reduce差不多,接收map的值,经过计算后给reduce,它的key,value类型要跟reduce完全一样,当reduce业务复杂时可以用,不过它貌似只是操作本机的数据。
  partition:将输出的结果分别保存在不同的文件中...


第14题  某个目录下有两个文件a.txt b.txt,文件格式为(ip username),例如:
a.txt
127.0.0.1 zhangsan
127.0.0.1 wangxiaoer
127.0.0.1 lisi
127.0.0.1 wagnwu


b.txt
127.0.0.4 lixiaolu
127.0.0.1 lisi


每个文件至少有100万行,请使用linux命令行完成如下工作:
1)两个文件各自的ip数,以及总ip数
2)出现在b.txt而没有出现在a.txt的ip
3)每个username出现的次数 以及 每个username对应的ip数


------------coding----------------


----------------------------------------------------------------------

































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值