大数据之hadoop面试题2

2.7.  用mapreduce来实现下面需求?
如今有10个文件夹,每一个文件夹都有1000000个url.如今让你找出top1000000url。
方法一:
运用2个job,第一个job直接用filesystem读取10个文件夹做为map输入,url作key,reduce计算url的sum,
下一个job map用url做key,运用sum做二次排序,reduce中取top10000000
1:首先进行wordcount计算
2:进行二次排序
如何启动两个job代码以下:
public class TopUrl {
     public static void main(String[] args) throws Exception {
     depending();
 }
 
 public static void depending() throws Exception{
      Configuration conf = new Configuration();
      //排序
      Job job2 = initJob2(conf, SecondSortMapper.class,SecondSortReduce.class);
      //读取url
      Job job1 = initJob(conf, FirstMapper.class, FirstReduce.class);
      
      JobControl jobControl = new JobControl("groupName");
      List<ControlledJob>  dependingJobs = new ArrayList<ControlledJob>();
      //进行排序
      ControlledJob controlledJob1 = new ControlledJob(conf);
      controlledJob1.setJob(job1);
 //   dependingJobs.add(controlledJob1);
   
      //排序
      ControlledJob controlledJob2 = new ControlledJob(conf);
      controlledJob2.setJob(job2);
      controlledJob2.addDependingJob(controlledJob1);
      jobControl.addJob(controlledJob2);
      jobControl.addJob(controlledJob1);
  
   
    Thread jcThread = new Thread(jobControl);
    jcThread.start();
    while(true){
    if(jobControl.allFinished()){
         System.out.println(jobControl.getSuccessfulJobList());
         jobControl.stop();
         break;
    }
    if(jobControl.getFailedJobList().size() > 0){
         System.out.println(jobControl.getFailedJobList());
         jobControl.stop();
         break;
    }
   }
  
   FileSystem fs = FileSystem.get(conf);
   boolean ret = fs.deleteOnExit(new Path("hdfs://master:9000/user/hadoop/20130601/output"));
   System.out.println(ret);
 }
 
 
 public static Job  initJob2(Configuration conf,Class o1,Class o2) throws Exception{
      Job job = new Job(conf, "Join2");
      job.setJarByClass(TopUrl.class);
      job.setMapperClass(o1);
      job.setMapOutputKeyClass(Text.class);//map输出key
      job.setOutputValueClass(IntWritable.class);
      job.setReducerClass(o2);
      job.setOutputKeyClass(Text.class); //reduce输出key
      job.setOutputValueClass(IntWritable.class);
     
//      job.setPartitionerClass(cls);
      job.setSortComparatorClass(TextIntComparator.class);
//      job.setGroupingComparatorClass(cls);
     
      FileInputFormat.addInputPath(job, new Path
      ("hdfs://master:9000/user/hadoop/20130601/output"));
      FileOutputFormat.setOutputPath(job, new Path
      ("hdfs://master:9000/user/hadoop/20130601/output2"));
//      System.exit(job.waitForCompletion(true) ? 0 : 1);
      return job;
 }
 
 
 public static Job initJob(Configuration conf,Class o1,Class o2) throws Exception{
      Job job = new Job(conf, "Join1");
      job.setJarByClass(TopUrl.class);
      job.setMapperClass(o1);
      job.setMapOutputKeyClass(Text.class);//map输出key
      job.setOutputValueClass(IntWritable.class);
      job.setReducerClass(o2);
      job.setOutputKeyClass(Text.class); //reduce输出key
      job.setOutputValueClass(IntWritable.class);
      FileInputFormat.addInputPath(job, new Path
      ("hdfs://master:9000/user/hadoop/20130601/ippaixv.txt"));
      FileOutputFormat.setOutputPath(job, new Path
      ("hdfs://master:9000/user/hadoop/20130601/output"));
//    System.exit(job.waitForCompletion(true) ? 0 : 1);
      return job;
 }
}


方法二:
建hive表A,挂分区channel,每一个文件夹是一个分区.
select x.url,x.c from(select url,count(1) as c from A where channel ='' group by url) x order by x.c desc limit 1000000;

还能够用treeMap, 到1000000了每来一个都加进去, 删掉最小的node

2.8.  hadoop中Combiner的做用?
combiner是reduce的实现,在map端运行计算任务,减小map端的输出数据。
做用就是优化。
可是combiner的使用场景是mapreduce的map和reduce输入输出同样。
2.9.  简述hadoop安装
1)建立hadoop用户
2)改IP,修改HOSTS文件域名
3)安装SSH,配置无密钥通讯
4)安装JAVA,配置JAVA的环境变量
5)解压hadoop
6)配置conf下的core-site.xml,hdfs-site.xml,mapred-site.xml,yarn-site.xml
7)配置hadoop的环境变量
8)hadoop namenode -format
9)start-all.sh
2.10. 请列出hadoop进程名
Namenode:管理集群,并记录datanode文件信息。
Secondarynamenode:能够作冷备,对必定范围内数据作快照性备份。
Datanode:存储数据。
Resourcemanager:管理任务,并将任务分配给MRAppMaster。
NodeManager:任务执行方。
2.11. 解决下面的错误
一、权限问题,可能曾经用root启动过集群。(例如hadoop搭建的集群,是tmp/hadoop-hadoop/.....)
二、多是文件夹不存在
三、解决: 删掉tmp下的那个文件,或改为当前用户
2.12. 写出下面的命令
1)杀死一个job
hadoop job -list 拿到job-id,
hadoop job -kill job-id
2)删除hdfs上的/tmp/aaa目录
hadoop fs -rmr /tmp/aaa
3)加入一个新的存储节点和删除一个计算节点须要刷新集群状态命令
加薪节点时:
hadoop-daemon.sh start datanode
yarn-daemon.sh start nodemanager
删除时:
hadoop mradmin -refreshnodes
hadoop dfsadmin -refreshnodesapp