zoukankan      html  css  js  c++  java
  • 大数据面试题

    Mapreduce的理解?Mapreduce 的执行原理?

    MapReduce程序运行流程
    Mapper 阶段
    1、先将HDFS中的输入文件file按照一定的标准进行切片
    2、调用自己编写的map逻辑,将输入的键值对<k1,v1>变成<k2,v2>
    3、按照一定的规则对输出的键值对<k2,v2>进行分区
    4、对每个分区中的键值对进行排序。
    Reduce 阶段
    1、对多个Mapper任务的输出,按照不同的分区,通过网络拷贝到不同的Reducer节点上进行处理,将数据按照分区拷贝到不同的Reducer节点之后,
    对多个Mapper任务的输出在进行合并,排序。
    2、调用自己的reduce逻辑,将键值对<k2,v2s>变为<k3,v3>.在这里注意:每一个键值对<k2,v2s>都会调用一次reduce函数。 3、将Reducer任务的输出保存到指定的文件中。

    1 Spark工作流程简述

    1、构建Spark Application的运行环境(启动SparkContext),SparkContext向
       资源管理器(Standalone、Mesos或YARN)注册并申请Executor运行资源;
    2、资源管理器分配Executor资源并启动StandaloneExecutorBackend,Executor
       运行情况将随着心跳发送到资源管理器上;
    3、SparkContext构建成DAG图并分解成Stage,再把Taskset发送给Task Scheduler;
    4、Executor向SparkContext申请Task,Task Scheduler将Task发放给Executor
       运行同时SparkContext将应用程序代码发放给Executor。
    5、Task在Executor上运行,运行完毕释放所有资源。

    Hadoop 中 job 和 task 之间的区别是什么

    JobTracker 是一个 master 服务,软件启动之后 JobTracker 接收 Job,负责调度 Job的每一个子任务, task 运行于 TaskTracker 上,并监控它们,
    如果发现有失败的 task 就重新运行它。一般情况应该把 JobTracker 部署在单独的机器上。 TaskTracker 是运行在多个节点上的 slaver 服务。TaskTracker 主动与 JobTracker 通信,接收作业,并负责直接执行每一个任务。

     hive的使用,内外部表的区别,分区作用,UDF和Hive优化

    (1)hive使用:仓库、工具
    (2)hive内外部表:内部表数据永久删除,外部表数据删除后、其他人依然可以访问
    (3)分区作用:防止数据倾斜
    (4)UDF函数:用户自定义的函数(主要解决格式,计算问题),需要继承UDF类
    java代码实现
    class TestUDFHive extends UDF {
    public String evalute(String str){
    try{
       return "hello"+str
    }catch(Exception e){
       return str+"error"
    }
    }
    }

     Hive优化:看做mapreduce处理

     排序优化:sort by 效率高于 order by
     分区:使用静态分区 (statu_date="20160516",location="beijin"),每个分区对应hdfs上的一个目录
     减少job和task数量:使用表链接操作
     解决groupby数据倾斜问题:设置hive.groupby.skewindata=true ,那么hive会自动负载均衡
     小文件合并成大文件:表连接操作
     使用UDF或UDAF函数:http://www.cnblogs.com/ggjucheng/archive/2013/02/01/2888819.html

    Hbase的rk设计,Hbase优化

      rowkey:hbase三维存储中的关键(rowkey:行键 ,columnKey(family+quilaty):列键  ,timestamp:时间戳)
       rowkey字典排序、越短越好
       使用id+时间:9527+20160517 使用hash散列:dsakjkdfuwdsf+9527+20160518
       应用中,rowkey 一般10~100bytes,8字节的整数倍,有利于提高操作系统性能
      Hbase优化
       分区:RegionSplit()方法 NUMREGIONS=9
       column不超过3个
       硬盘配置,便于regionServer管理和数据备份及恢复
       分配合适的内存给regionserver
       
       其他:
       hbase查询
       (1)get
       (2)scan
           使用startRow和endRow限制 

    jvm运行机制及内存原理

    运行:
    加载.class文件
    管理并且分配内存
    垃圾回收
    
    内存原理:
    JVM装载环境和配置
    装载JVM.dll 并初始化JVM.dll
    处理class类

    hdfs、yarn参数调优

    mapreduce.job.jvm.num.tasks 
    默认为1,设置为 -1,重用jvm

    Hbase、Hive、impala、zookeeper、Storm、spark原理和使用方法、使用其架构图讲解

    1、如何为一个hadoop任务设置mappers的数量

    答案:
    使用job.setNumMapTask(int n)手动分割,这是不靠谱的
    官方文档:“Note: This is only a hint to the framework”说明这个方法只是提示作用,不起决定性作用
    实际上要用公式计算:
    Max(min.split,min(max.split,block))就设置分片的最大最下值  computeSplitSize()设置
    参考:http://blog.csdn.net/strongerbit/article/details/7440111
    2、有可能使hadoop任务输出到多个目录中么?如果可以,怎么做?
    答案:在1.X版本后使用MultipleOutputs.java类实现
    源码:
    MultipleOutputs.addNamedOutput(conf, "text2", TextOutputFormat.class, Long.class, String.class);
    MultipleOutputs.addNamedOutput(conf, "text3", TextOutputFormat.class, Long.class, String.class);
    参考:http://my.oschina.net/leejun2005/blog/94706
    发音:Multiple['m?lt?pl]--》许多的

    两个类TextInputFormat和KeyValueTextInputFormat的区别?

    ?FileInputFormat的子类:
    TextInputFormat(默认类型,键是LongWritable类型,值为Text类型,key为当前行在文件中的偏移量,value为当前行本身);
    ?KeyValueTextInputFormat(适合文件自带key,value的情况,只要指定分隔符即可,比较实用,默认是	分割);
    源码:
       String sepStr =job.get("mapreduce.input.keyvaluelinerecordreader.key.value.separator","	");
       注意:在自定义输入格式时,继承FileInputFormat父类
    参考:http://www.cnblogs.com/vichao/archive/2013/06/06/3118100.html

    在一个运行的hadoop任务中,什么是InputSpilt?

    InputSplit是MapReduce对文件进行处理和运算的输入单位,只是一个逻辑概念,每个InputSplit并没有对文件实际的切割,只是记录了要处理的数据的位置
    (包括文件的path和hosts)和长度(由start和length决定),默认情况下与block一样大。 拓展:需要在定义InputSplit后,展开讲解mapreduce的原理

    Hadoop框架中,文件拆分是怎么被调用的?

    JobTracker, 创建一个InputFormat的 实例,调用它的getSplits()方法,把输入目录的文件拆分成FileSplist作 为Mapper task 的输入,生成Mapper task加入Queue。
    源码中体现了拆分的数量
    long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits);
    long minSize = Math.max(job.getLong(org.apache.hadoop.mapreduce.lib.input.
      FileInputFormat.SPLIT_MINSIZE, 1), minSplitSize);//minSplitSize默认是1

    分别举例什么情况下使用combiner,什么情况下不会使用?

    Combiner适用于对记录汇总的场景(如求和),但是,求平均数的场景就不能使用Combiner了

    Hadoop中job和Tasks之间的区别是什么?

    job是工作的入口,负责控制、追踪、管理任务,也是一个进程
        包含map task和reduce task
    Tasks是map和reduce里面的步骤,主要用于完成任务,也是线程

    Hadoop中通过拆分任务到多个节点运行来实现并行计算,但是某些节点运行较慢会拖慢整个任务的运行,hadoop采用何种机制应对这种情况?

    结果查看监控日志,得知产生这种现象的原因是数据倾斜问题
    解决:
    (1)调整拆分mapper的数量(partition数量)
    (2)增加jvm
    (3)适当地将reduce的数量变大

    流API中的什么特性带来可以使map reduce任务可以以不同语言(如perl ubyawk等)实现的灵活性?

    用可执行文件作为Mapper和Reducer,接受的都是标准输入,输出的都是标准输出
    参考:http://www.web520.cn/archives/9220

    参考下面的M/R系统的场景:
    --HDFS块大小为64MB
    --输入类型为FileInputFormat
    --有3个文件的大小分别是:64k 65MB 127MB
    Hadoop框架会把这些文件拆分为多少块?
    答案:
    64k------->一个block
    65MB---->两个文件:64MB是一个block,1MB是一个block
    127MB--->两个文件:64MB是一个block,63MB是一个block


    Hadoop中的RecordReader的作用是什么?

    属于split和mapper之间的一个过程 
    将inputsplit输出的行为一个转换记录,成为key
    -value的记录形式提供给mapper

    Map阶段结束后,Hadoop框架会处理:Partitioning ,shuffle 和sort,在这个阶段都会发生了什么?

    MR一共有四个阶段,split map shuff reduce 在执行完map之后,可以对map的输出结果进行分区,
    分区:这块分片确定到哪个reduce去计算(汇总)
    排序:在每个分区中进行排序,默认是按照字典顺序。
    Group:在排序之后进行分组

    如果没有定义partitioner,那么数据在被送达reducer前是如何被分区的?

       Partitioner是在map函数执行context.write()时被调用。
    用户可以通过实现自定义的?Partitioner来控制哪个key被分配给哪个?Reducer。
    查看源码知道:
    如果没有定义partitioner,那么会走默认的分区Hashpartitioner
    
    
    public class HashPartitioner<K, V> extends Partitioner<K, V> {
      /** Use {@link Object#hashCode()} to partition. */
      public int getPartition(K key, V value, int numReduceTasks) {
        return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
      }
    }
    参考:http://blog.csdn.net/gamer_gyt/article/details/47339755

    什么是Combiner?

    这是一个hadoop优化性能的步骤,它发生在map与reduce之间
    目的:解决了数据倾斜的问题,减轻网络压力,实际上时减少了maper的输出
    源码信息如下:
    public void reduce(Text key, Iterator<LongWritable> values,
        OutputCollector<Text, LongWritable> output, Reporter reporter)
        throws IOException {
      LongWritable maxValue = null;
      while (values.hasNext()) {
        LongWritable value = values.next();
        if (maxValue == null) {
          maxValue = value;
        } else if (value.compareTo(maxValue) > 0) {
          maxValue = value;
        }
      }
      output.collect(key, maxValue);
    }
    在collect实现类中,有这样一段方法
    public synchronized void collect(K key, V value)
        throws IOException {
      outCounter.increment(1);
      writer.append(key, value);
      if ((outCounter.getValue() % progressBar) == 0) {
        progressable.progress();
      }
    }
    下面是说明输出数量达到10000时,开始合并为一个maper
    public static final long DEFAULT_COMBINE_RECORDS_BEFORE_PROGRESS = 10000;
    Mapreduce原理详解:
    
     
  • 相关阅读:
    可输入下拉框
    display:table-cell 相当于td
    循环拼接HTML
    jq操纵select
    echarts柱状图使用
    原生js 获取路由参数
    js下拉模糊查询
    ie 的hack
    vue 兼容ie11
    vuecli中的绝对路径和相对路径
  • 原文地址:https://www.cnblogs.com/xzjf/p/10899988.html
Copyright © 2011-2022 走看看