zoukankan      html  css  js  c++  java
  • Hadoop/Spark相关面试问题总结

    Hadoop/Spark相关面试问题总结


    面试回来之后把当中比較重要的问题记了下来写了个总结:
    (答案在后面)

    1、简答说一下hadoop的map-reduce编程模型

    2、hadoop的TextInputFormat作用是什么,如何自己定义实现

    3、hadoop和spark的都是并行计算,那么他们有什么同样和差别

    4、为什么要用flume导入hdfs,hdfs的构架是如何的

    5、map-reduce程序执行的时候会有什么比較常见的问题

    6、简单说一下hadoop和spark的shuffle过程

    下面是自己的理解,假设有不正确的地方希望各位大侠能够帮我指出来~:

    1、简答说一下hadoop的map-reduce编程模型

    首先map task会从本地文件系统读取数据,转换成key-value形式的键值对集合

    使用的是hadoop内置的数据类型,比方longwritable、text等

    将键值对集合输入mapper进行业务处理过程。将其转换成须要的key-value在输出

    之后会进行一个partition分区操作。默认使用的是hashpartitioner。能够通过重写hashpartitioner的getpartition方法来自己定义分区规则

    之后会对key进行进行sort排序,grouping分组操作将同样key的value合并分组输出。在这里能够使用自己定义的数据类型,重写WritableComparator的Comparator方法来自己定义排序规则。重写RawComparator的compara方法来自己定义分组规则

    之后进行一个combiner归约操作,事实上就是一个本地段的reduce预处理。以减小后面shufle和reducer的工作量

    reduce task会通过网络将各个数据收集进行reduce处理。最后将数据保存或者显示,结束整个job

    2、hadoop的TextInputFormat作用是什么。如何自己定义实现

    InputFormat会在map操作之前对数据进行双方面的预处理
    1是getSplits,返回的是InputSplit数组,对数据进行split分片,每片交给map操作一次
    2是getRecordReader。返回的是RecordReader对象。对每一个split分片进行转换为key-value键值对格式传递给map

    经常使用的InputFormat是TextInputFormat,使用的是LineRecordReader对每一个分片进行键值对的转换,以行偏移量作为键,行内容作为值

    自己定义类继承InputFormat接口。重写createRecordReader和isSplitable方法
    在createRecordReader中能够自己定义分隔符

    3、hadoop和spark的都是并行计算,那么他们有什么同样和差别

    两者都是用mr模型来进行并行计算,hadoop的一个作业称为job,job里面分为map task和reduce task。每一个task都是在自己的进程中执行的,当task结束时,进程也会结束

    spark用户提交的任务成为application,一个application相应一个sparkcontext,app中存在多个job。每触发一次action操作就会产生一个job

    这些job能够并行或串行执行,每一个job中有多个stage。stage是shuffle过程中DAGSchaduler通过RDD之间的依赖关系划分job而来的。每一个stage里面有多个task,组成taskset有TaskSchaduler分发到各个executor中执行,executor的生命周期是和app一样的。即使没有job执行也是存在的。所以task能够高速启动读取内存进行计算

    hadoop的job仅仅有map和reduce操作。表达能力比較欠缺并且在mr过程中会反复的读写hdfs。造成大量的io操作,多个job须要自己管理关系

    spark的迭代计算都是在内存中进行的。API中提供了大量的RDD操作如join,groupby等。并且通过DAG图能够实现良好的容错

    4、为什么要用flume导入hdfs。hdfs的构架是如何的

    flume能够实时的导入数据到hdfs中,当hdfs上的文件达到一个指定大小的时候会形成一个文件,或者超过指定时间的话也形成一个文件

    文件都是存储在datanode上面的。namenode记录着datanode的元数据信息,而namenode的元数据信息是存在内存中的,所以当文件切片非常小或者非常多的时候会卡死

    5、map-reduce程序执行的时候会有什么比較常见的问题

    比方说作业中大部分都完毕了,可是总有几个reduce一直在执行

    这是由于这几个reduce中的处理的数据要远远大于其它的reduce,可能是由于对键值对任务划分的不均匀造成的数据倾斜

    解决办法能够在分区的时候又一次定义分区规则对于value数据非常多的key能够进行拆分、均匀打散等处理。或者是在map端的combiner中进行数据预处理的操作

    6、简单说一下hadoop和spark的shuffle过程

    hadoop:map端保存分片数据,通过网络收集到reduce端
    spark:spark的shuffle是在DAGSchedular划分Stage的时候产生的,TaskSchedule要分发Stage到各个worker的executor

    降低shuffle能够提高性能

    部分答案不是十分准确欢迎补充:-)

    ——-补充更新———

    1、Hive中存放是什么?
    表。
    存的是和hdfs的映射关系。hive是逻辑上的数据仓库,实际操作的都是hdfs上的文件,HQL就是用sql语法来写的mr程序。

    2、Hive与关系型数据库的关系?
    没有关系。hive是数据仓库,不能和数据库一样进行实时的CURD操作。
    是一次写入多次读取的操作,能够看成是ETL工具。

    3、Flume工作机制是什么?
    核心概念是agent。里面包含source、chanel和sink三个组件。


    source执行在日志收集节点进行日志採集,之后暂时存储在chanel中,sink负责将chanel中的数据发送到目的地。


    仅仅有成功发送之后chanel中的数据才会被删除。
    首先书写flume配置文件。定义agent、source、chanel和sink然后将其组装,执行flume-ng命令。

    4、Sqoop工作原理是什么?
    hadoop生态圈上的传输数据工具。
    能够将关系型数据库的数据导入非结构化的hdfs、hive或者bbase中,也能够将hdfs中的数据导出到关系型数据库或者文本文件里。
    使用的是mr程序来执行任务,使用jdbc和关系型数据库进行交互。
    import原理:通过指定的分隔符进行数据切分,将分片传入各个map中,在map任务中在每行数据进行写入处理没有reduce。


    export原理:依据要操作的表名生成一个java类,并读取其元数据信息和分隔符对非结构化的数据进行匹配。多个map作业同一时候执行写入关系型数据库

    5、Hbase行健列族的概念,物理模型。表的设计原则?
    行健:是hbase表自带的,每一个行健相应一条数据。
    列族:是创建表时指定的。为列的集合,每一个列族作为一个文件单独存储,存储的数据都是字节数组,当中的数据能够有非常多,通过时间戳来区分。
    物理模型:整个hbase表会拆分为多个region。每一个region记录着行健的起始点保存在不同的节点上,查询时就是对各个节点的并行查询。当region非常大时使用.META表存储各个region的起始点。-ROOT又能够存储.META的起始点。


    rowkey的设计原则:各个列簇数据平衡。长度原则、相邻原则,创建表的时候设置表放入regionserver缓存中,避免自己主动增长和时间,使用字节数组取代string,最大长度64kb,最好16字节以内,按天分表,两个字节散列,四个字节存储时分毫秒。
    列族的设计原则:尽可能少(依照列族进行存储,依照region进行读取,不必要的io操作),经常和不经常使用的两类数据放入不同列族中。列族名字尽可能短。

    6、Spark Streaming和Storm有何差别?
    一个实时毫秒一个准实时亚秒,只是storm的吞吐率比較低。

    7、mllib支持的算法?
    大体分为四大类,分类、聚类、回归、协同过滤。

    8、简答说一下hadoop的map-reduce编程模型?
    首先map task会从本地文件系统读取数据,转换成key-value形式的键值对集合。
    将键值对集合输入mapper进行业务处理过程,将其转换成须要的key-value在输出。
    之后会进行一个partition分区操作,默认使用的是hashpartitioner,能够通过重写hashpartitioner的getpartition方法来自己定义分区规则。


    之后会对key进行进行sort排序,grouping分组操作将同样key的value合并分组输出。
    在这里能够使用自己定义的数据类型,重写WritableComparator的Comparator方法来自己定义排序规则,重写RawComparator的compara方法来自己定义分组规则。
    之后进行一个combiner归约操作。事实上就是一个本地段的reduce预处理,以减小后面shufle和reducer的工作量。


    reduce task会通过网络将各个数据收集进行reduce处理,最后将数据保存或者显示。结束整个job。

    9、Hadoop平台集群配置、设置环境变量?
    zookeeper:改动zoo.cfg文件,配置dataDir。和各个zk节点的server地址端口,tickTime心跳时间默认是2000ms,其它超时的时间都是以这个为基础的整数倍。之后再dataDir相应文件夹下写入myid文件和zoo.cfg中的server相相应。

    hadoop:改动
    hadoop-env.sh配置java环境变量
    core-site.xml配置zk地址。暂时文件夹等
    hdfs-site.xml配置nn信息,rpc和http通信地址,nn自己主动切换、zk连接超时时间等
    yarn-site.xml配置resourcemanager地址
    mapred-site.xml配置使用yarn
    slaves配置节点信息
    格式化nn和zk。

    hbase:改动
    hbase-env.sh配置java环境变量和是否使用自带的zk
    hbase-site.xml配置hdfs上数据存放路径,zk地址和通讯超时时间、master节点
    regionservers配置各个region节点
    zoo.cfg复制到conf文件夹下

    spark:
    安装Scala
    改动spark-env.sh配置环境变量和master和worker节点配置信息

    环境变量的设置:直接在/etc/profile中配置安装的路径就可以。或者在当前用户的宿主文件夹下。配置在.bashrc文件里,该文件不用source又一次打开shell窗体就可以,配置在.bash_profile的话仅仅对当前用户有效。

    10、Hadoop性能调优?

    调优能够通过系统配置、程序编写和作业调度算法来进行。
    hdfs的block.size能够调到128/256(网络非常好的情况下,默觉得64)
    调优的大头:mapred.map.tasks、mapred.reduce.tasks设置mr任务数(默认都是1)
    mapred.tasktracker.map.tasks.maximum每台机器上的最大map任务数
    mapred.tasktracker.reduce.tasks.maximum每台机器上的最大reduce任务数
    mapred.reduce.slowstart.completed.maps配置reduce任务在map任务完毕到百分之几的时候開始进入
    这个几个參数要看实际节点的情况进行配置,reduce任务是在33%的时候完毕copy,要在这之前完毕map任务。(map能够提前完毕)
    mapred.compress.map.output,mapred.output.compress配置压缩项。消耗cpu提升网络和磁盘io
    合理利用combiner
    注意重用writable对象

    11、Hadoop高并发?
    首先肯定要保证集群的高可靠性,在高并发的情况下不会挂掉,支撑不住能够通过横向扩展。


    datanode挂掉了使用hadoop脚本又一次启动。

    12、hadoop的TextInputFormat作用是什么,如何自己定义实现?
    InputFormat会在map操作之前对数据进行双方面的预处理。
    1是getSplits,返回的是InputSplit数组,对数据进行split分片,每片交给map操作一次 。
    2是getRecordReader,返回的是RecordReader对象。对每一个split分片进行转换为key-value键值对格式传递给map。


    经常使用的InputFormat是TextInputFormat,使用的是LineRecordReader对每一个分片进行键值对的转换,以行偏移量作为键,行内容作为值。
    自己定义类继承InputFormat接口,重写createRecordReader和isSplitable方法 。
    在createRecordReader中能够自己定义分隔符。

    13、hadoop和spark的都是并行计算,那么他们有什么同样和差别?
    两者都是用mr模型来进行并行计算,hadoop的一个作业称为job,job里面分为map task和reduce task,每一个task都是在自己的进程中执行的,当task结束时。进程也会结束。
    spark用户提交的任务成为application。一个application相应一个sparkcontext,app中存在多个job。每触发一次action操作就会产生一个job。
    这些job能够并行或串行执行。每一个job中有多个stage,stage是shuffle过程中DAGSchaduler通过RDD之间的依赖关系划分job而来的。每一个stage里面有多个task。组成taskset有TaskSchaduler分发到各个executor中执行,executor的生命周期是和app一样的,即使没有job执行也是存在的,所以task能够高速启动读取内存进行计算。
    hadoop的job仅仅有map和reduce操作。表达能力比較欠缺并且在mr过程中会反复的读写hdfs,造成大量的io操作。多个job须要自己管理关系。


    spark的迭代计算都是在内存中进行的,API中提供了大量的RDD操作如join。groupby等,并且通过DAG图能够实现良好的容错。

    14、为什么要用flume导入hdfs。hdfs的构架是如何的?
    flume能够实时的导入数据到hdfs中。当hdfs上的文件达到一个指定大小的时候会形成一个文件,或者超过指定时间的话也形成一个文件。
    文件都是存储在datanode上面的,namenode记录着datanode的元数据信息。而namenode的元数据信息是存在内存中的,所以当文件切片非常小或者非常多的时候会卡死。

    15、map-reduce程序执行的时候会有什么比較常见的问题?
    比方说作业中大部分都完毕了,可是总有几个reduce一直在执行。
    这是由于这几个reduce中的处理的数据要远远大于其它的reduce,可能是由于对键值对任务划分的不均匀造成的数据倾斜。


    解决办法能够在分区的时候又一次定义分区规则对于value数据非常多的key能够进行拆分、均匀打散等处理,或者是在map端的combiner中进行数据预处理的操作。

    16、简单说一下hadoop和spark的shuffle过程?
    hadoop:map端保存分片数据,通过网络收集到reduce端。
    spark:spark的shuffle是在DAGSchedular划分Stage的时候产生的,TaskSchedule要分发Stage到各个worker的executor。
    降低shuffle能够提高性能。

    17、RDD机制?
    rdd分布式弹性数据集。简单的理解成一种数据结构,是spark框架上的通用货币。


    全部算子都是基于rdd来执行的,不同的场景会有不同的rdd实现类。可是都能够进行互相转换。
    rdd执行过程中会形成dag图,然后形成lineage保证容错性等。
    从物理的角度来看rdd存储的是block和node之间的映射。

    18、spark有哪些组件?
    (1)master:管理集群和节点。不參与计算。
    (2)worker:计算节点,进程本身不參与计算,和master汇报。


    (3)Driver:执行程序的main方法,创建spark context对象。
    (4)spark context:控制整个application的生命周期,包含dagsheduler和task scheduler等组件。
    (5)client:用户提交程序的入口。

    19、spark工作机制?
    用户在client端提交作业后。会由Driver执行main方法并创建spark context上下文。
    执行add算子,形成dag图输入dagscheduler。依照add之间的依赖关系划分stage输入task scheduler。
    task scheduler会将stage划分为task set分发到各个节点的executor中执行。

    20、spark的优化怎么做?
    通过spark-env文件、程序中sparkconf和set property设置。


    (1)计算量大。形成的lineage过大应该给已经缓存了的rdd加入checkpoint。以降低容错带来的开销。


    (2)小分区合并。过小的分区造成过多的切换任务开销,使用repartition。

    21、kafka工作原理?
    producer向broker发送事件,consumer从broker消费事件。


    事件由topic区分开,每一个consumer都会属于一个group。
    同样group中的consumer不能反复消费事件,而同一事件将会发送给每一个不同group的consumer。

    22、ALS算法原理?
    答:对于user-product-rating数据,als会建立一个稀疏的评分矩阵。其目的就是通过一定的规则填满这个稀疏矩阵。
    als会对稀疏矩阵进行分解,分为用户-特征值,产品-特征值,一个用户对一个产品的评分能够由这两个矩阵相乘得到。
    通过固定一个未知的特征值,计算另外一个特征值。然后交替反复进行最小二乘法。直至差平方和最小,就可以得想要的矩阵。

    23、kmeans算法原理?
    随机初始化中心点范围,计算各个类别的平均值得到新的中心点。


    又一次计算各个点到中心值的距离划分,再次计算平均值得到新的中心点,直至各个类别数据平均值无变化。

    24、canopy算法原理?
    依据两个阈值来划分数据,以随机的一个数据点作为canopy中心。
    计算其它数据点到其的距离,划入t1、t2中,划入t2的从数据集中删除。划入t1的其它数据点继续计算,直至数据集中无数据。

    25、朴素贝叶斯分类算法原理?
    对于待分类的数据和分类项,依据待分类数据的各个特征属性。出如今各个分类项中的概率推断该数据是属于哪个类别的。

    26、关联规则挖掘算法apriori原理?
    一个频繁项集的子集也是频繁项集。针对数据得出每一个产品的支持数列表。过滤支持数小于预设值的项,对剩下的项进行全排列。又一次计算支持数,再次过滤,反复至全排列结束,可得到频繁项和相应的支持数。

    作者:@小黑

    下面是自己的理解,假设有不正确的地方希望各位大侠能够帮我指出来~:

    1、简答说一下hadoop的map-reduce编程模型

    首先map task会从本地文件系统读取数据。转换成key-value形式的键值对集合

    使用的是hadoop内置的数据类型,比方longwritable、text等

    将键值对集合输入mapper进行业务处理过程,将其转换成须要的key-value在输出

    之后会进行一个partition分区操作。默认使用的是hashpartitioner。能够通过重写hashpartitioner的getpartition方法来自己定义分区规则

    之后会对key进行进行sort排序。grouping分组操作将同样key的value合并分组输出,在这里能够使用自己定义的数据类型。重写WritableComparator的Comparator方法来自己定义排序规则,重写RawComparator的compara方法来自己定义分组规则

    之后进行一个combiner归约操作,事实上就是一个本地段的reduce预处理,以减小后面shufle和reducer的工作量

    reduce task会通过网络将各个数据收集进行reduce处理。最后将数据保存或者显示,结束整个job

    2、hadoop的TextInputFormat作用是什么,如何自己定义实现

    InputFormat会在map操作之前对数据进行双方面的预处理
    1是getSplits,返回的是InputSplit数组,对数据进行split分片。每片交给map操作一次
    2是getRecordReader,返回的是RecordReader对象。对每一个split分片进行转换为key-value键值对格式传递给map

    经常使用的InputFormat是TextInputFormat,使用的是LineRecordReader对每一个分片进行键值对的转换,以行偏移量作为键,行内容作为值

    自己定义类继承InputFormat接口。重写createRecordReader和isSplitable方法
    在createRecordReader中能够自己定义分隔符

    3、hadoop和spark的都是并行计算。那么他们有什么同样和差别

    两者都是用mr模型来进行并行计算,hadoop的一个作业称为job,job里面分为map task和reduce task。每一个task都是在自己的进程中执行的,当task结束时,进程也会结束

    spark用户提交的任务成为application,一个application相应一个sparkcontext。app中存在多个job,每触发一次action操作就会产生一个job

    这些job能够并行或串行执行。每一个job中有多个stage,stage是shuffle过程中DAGSchaduler通过RDD之间的依赖关系划分job而来的。每一个stage里面有多个task。组成taskset有TaskSchaduler分发到各个executor中执行,executor的生命周期是和app一样的。即使没有job执行也是存在的,所以task能够高速启动读取内存进行计算

    hadoop的job仅仅有map和reduce操作,表达能力比較欠缺并且在mr过程中会反复的读写hdfs。造成大量的io操作,多个job须要自己管理关系

    spark的迭代计算都是在内存中进行的,API中提供了大量的RDD操作如join,groupby等。并且通过DAG图能够实现良好的容错

    4、为什么要用flume导入hdfs,hdfs的构架是如何的

    flume能够实时的导入数据到hdfs中,当hdfs上的文件达到一个指定大小的时候会形成一个文件,或者超过指定时间的话也形成一个文件

    文件都是存储在datanode上面的。namenode记录着datanode的元数据信息,而namenode的元数据信息是存在内存中的,所以当文件切片非常小或者非常多的时候会卡死

    5、map-reduce程序执行的时候会有什么比較常见的问题

    比方说作业中大部分都完毕了,可是总有几个reduce一直在执行

    这是由于这几个reduce中的处理的数据要远远大于其它的reduce,可能是由于对键值对任务划分的不均匀造成的数据倾斜

    解决办法能够在分区的时候又一次定义分区规则对于value数据非常多的key能够进行拆分、均匀打散等处理,或者是在map端的combiner中进行数据预处理的操作

    6、简单说一下hadoop和spark的shuffle过程

    hadoop:map端保存分片数据,通过网络收集到reduce端
    spark:spark的shuffle是在DAGSchedular划分Stage的时候产生的,TaskSchedule要分发Stage到各个worker的executor

    降低shuffle能够提高性能

    部分答案不是十分准确欢迎补充:-)

    作者:@小黑

  • 相关阅读:
    MSCRM 2011 自定义页面 CrmService 实现增,删,改,查需要注意的
    Microsoft Dynamics CRM 4.0,IFD验证下,自定义aspx页面,如何获取当前的用户ID ?
    CRM 4.0表单脚本开发一览
    MSCRM关于时区时间的操作
    常用JS操作方法
    详解 Visual C# 数据库编程
    Java 日志
    《信息检索导论》第二十章总结
    java文件添加包语句后的编译和运行问题
    查看端口占用情况:FPort和Moo0 ConnectionWatcher软件介绍
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7354265.html
Copyright © 2011-2022 走看看