Hadoop相关面试题

1、简答说一下hadoop的map-reduce编程模型 
首先map task会从本地文件系统读取数据,转换成key-value形式的键值对集合 
使用的是hadoop内置的数据类型,比如longwritabletext 
将键值对集合输入mapper进行业务处理过程,将其转换成需要的key-value在输出 
之后会进行一个partition分区操作,默认使用的是hashpartitioner,可以通过重写hashpartitionergetpartition方法来自定义分区规则 
之后会对key进行进行sort排序,grouping分组操作将相同keyvalue合并分组输出,在这里可以使用自定义的数据类型,重写WritableComparatorComparator方法来自定义排序规则,重写RawComparatorcompara方法来自定义分组规则 
之后进行一个combiner归约操作,其实就是一个本地段的reduce预处理,以减小后面shuflereducer的工作量 
reduce task会通过网络将各个数据收集进行reduce处理,最后将数据保存或者显示,结束整个job

 

2、hadoop的TextInputFormat作用是什么,如何自定义实现 
InputFormat会在map操作之前对数据进行两方面的预处理 
1getSplits,返回的是InputSplit数组,对数据进行split分片,每片交给map操作一次 
2getRecordReader,返回的是RecordReader对象,对每个split分片进行转换为key-value键值对格式传递给map 
常用的InputFormatTextInputFormat,使用的是LineRecordReader对每个分片进行键值对的转换,以行偏移量作为键,行内容作为值 
自定义类继承InputFormat接口,重写createRecordReaderisSplitable方法 
createRecordReader中可以自定义分隔符。

 

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

Spark和MapReduce都是分布式计算框架,用于处理大规模数据集,但它们在设计理念、性能和适用场景上有显著差异。‌

(一)相同点
‌(1)分布式计算‌:Spark和MapReduce都是分布式计算框架,能够处理大规模数据集。
‌(2)容错处理‌:两者都具备容错处理机制,能够在节点故障时保证数据的完整性和系统的稳定性。
‌(3)依赖存储系统‌:两者都依赖于HDFS等存储系统来存储数据。

(二)不同点
‌(1)内存与磁盘使用‌:
‌Spark‌:基于内存计算,中间结果可以缓存在内存中,减少了磁盘I/O操作,从而提高了处理速度。Spark的RDD(弹性分布式数据集)和DAG(有向无环图)机制使得数据可以在内存中迭代计算,减少了磁盘I/O‌。
‌MapReduce‌:基于磁盘计算,每次计算的结果需要写入磁盘,然后再从磁盘读取,导致频繁的磁盘I/O操作,影响了处理速度‌。

(2)任务调度和并行度‌:
‌Spark‌:采用多线程模型,任务以线程方式执行,减少了启动和关闭任务的开销。Spark的Job调度以DAG方式进行,每个任务作为独立的线程执行,提高了并行度‌。Spark采用粗粒度资源申请方式,提前申请所需资源,避免了资源不足时的等待时间。
‌MapReduce‌:采用多进程模型,任务以进程方式执行,每次任务的启动和关闭都需要重新申请资源,增加了开销‌。而MapReduce采用细粒度方式,资源利用率高但任务执行速度相对较慢。
(3)功能和扩展性‌:
‌Spark‌:提供了多种工具库,如Spark SQL、Spark Streaming、MLlib和GraphX,支持批处理、流处理、机器学习和图计算等多种数据处理需求‌。
‌MapReduce‌:主要适用于批处理任务,功能相对单一,主要用于大规模数据集的并行运算‌。
(4)适用场景‌:
‌Spark‌:适用于需要高并发、低延迟的应用场景,如实时数据分析、机器学习等。Spark的内存计算和丰富的API使其在复杂数据处理和实时计算中表现优异‌。
‌MapReduce‌:适用于大规模数据集的离线批处理任务,如日志分析、数据仓库构建等。MapReduce的容错性和鲁棒性使其在处理大规模数据集时具有较高的可靠性‌。
综上所述,Spark和MapReduce各有优劣,选择使用哪种框架取决于具体的应用需求和场景。对于需要高并发和低延迟的应用,Spark是更好的选择;而对于大规模离线批处理任务,MapReduce则更为适合。

 

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过程 
hadoopmap端保存分片数据,通过网络收集到reduce 
sparksparkshuffle是在DAGSchedular划分Stage的时候产生的,TaskSchedule要分发Stage到各个workerexecutor,减少shuffle可以提高性能

 

)、hadoop的shuffle过程

  1. shufle: 洗牌、发牌--(核心机制:数据分区,排序,缓存);
  2. shufle具体来说:就是将maptask输出的处理结果数据,分发给reducetask,并在分发的过程中,对数据按key进行排序;

Hadoop的Shuffle过程主要发生在Map和Reduce阶段之间,具体步骤如下:

1)、maptask收集map()方法输出的key-Value对,放到内存缓冲区(环形缓冲区)中;

2)、内存缓冲区大小是有限制的,默认100MB,当缓冲区达到80%容量时,数据会溢出到本地磁盘,生成多个溢写文件;

3)、多个溢出文件会被合并成大的溢出文件;

4)、在溢出的过程以及合并的过程中,都要调用partition进行分组和对key的排序;

5)、reducetask根据分区号,去maptask机器上取相对应的结果分区数据;

6)、reducetask会取到同一个分区的来自不同maptask的结果文件,reducetask会将这些文件在进行合并;

7)、合并成大文件后,shufle的过程也就结束了,后面进入reducetask的逻辑运算过程,调用reduce方法进行逻辑运算;

说明: shufle中的缓冲区大小会影响到mapreduce程序的执行效率,原则上说,缓冲区越大,磁盘io的次数越少,执行的速度就越快;缓冲区的大小默认是100M,可以通过参数io.sort.mb进行设置;

 

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

 

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

 

9、Flume工作机制是什么? 
核心概念是agent,里面包括sourcechanelsink三个组件。 
source运行在日志收集节点进行日志采集,之后临时存储在chanel中,sink负责将chanel中的数据发送到目的地。 
只有成功发送之后chanel中的数据才会被删除。 
首先书写flume配置文件,定义agentsourcechanelsink然后将其组装,执行flume-ng命令。

 

10、Sqoop工作原理是什么? 
hadoop生态圈上的数据传输工具。 
可以将关系型数据库的数据导入非结构化的hdfshive或者bbase中,也可以将hdfs中的数据导出到关系型数据库或者文本文件中。 
使用的是mr程序来执行任务,使用jdbc和关系型数据库进行交互。 
import原理:通过指定的分隔符进行数据切分,将分片传入各个map中,在map任务中在每行数据进行写入处理没有reduce 
export原理:根据要操作的表名生成一个java类,并读取其元数据信息和分隔符对非结构化的数据进行匹配,多个map作业同时执行写入关系型数据库

 

11、Hbase行健列族的概念,物理模型,表的设计原则? 
行健:是hbase表自带的,每个行健对应一条数据。 
列族:是创建表时指定的,为列的集合,每个列族作为一个文件单独存储,存储的数据都是字节数组,其中的数据可以有很多,通过时间戳来区分。 
物理模型:整个hbase表会拆分为多个region,每个region记录着行健的起始点保存在不同的节点上,查询时就是对各个节点的并行查询,当region很大时使用.META表存储各个region的起始点,-ROOT又可以存储.META的起始点。 
rowkey的设计原则:各个列簇数据平衡,长度原则、相邻原则,创建表的时候设置表放入regionserver缓存中,避免自动增长和时间,使用字节数组代替string,最大长度64kb,最好16字节以内,按天分表,两个字节散列,四个字节存储时分毫秒。 
列族的设计原则:尽可能少(按照列族进行存储,按照region进行读取,不必要的io操作),经常和不经常使用的两类数据放入不同列族中,列族名字尽可能短。

 

12、Spark Streaming和Storm有何区别? 
一个实时毫秒一个准实时亚秒,不过storm的吞吐率比较低。

 

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

 

14、简答说一下hadoop的map-reduce编程模型? 
首先map task会从本地文件系统读取数据,转换成key-value形式的键值对集合。 
将键值对集合输入mapper进行业务处理过程,将其转换成需要的key-value在输出。 
之后会进行一个partition分区操作,默认使用的是hashpartitioner,可以通过重写hashpartitionergetpartition方法来自定义分区规则。 
之后会对key进行进行sort排序,grouping分组操作将相同keyvalue合并分组输出。 
在这里可以使用自定义的数据类型,重写WritableComparatorComparator方法来自定义排序规则,重写RawComparatorcompara方法来自定义分组规则。 
之后进行一个combiner归约操作,其实就是一个本地段的reduce预处理,以减小后面shuflereducer的工作量。 
reduce task会通过网络将各个数据收集进行reduce处理,最后将数据保存或者显示,结 
束整个job

 

15、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信息,rpchttp通信地址,nn自动切换、zk连接超时时间等 
yarn-site.xml配置resourcemanager地址 
mapred-site.xml配置使用yarn 
slaves配置节点信息 
格式化nnzk 
hbase:修改 
hbase-env.sh配置java环境变量和是否使用自带的zk 
hbase-site.xml配置hdfs上数据存放路径,zk地址和通讯超时时间、master节点 
regionservers配置各个region节点 
zoo.cfg拷贝到conf目录下 
spark 
安装Scala 
修改spark-env.sh配置环境变量和masterworker节点配置信息 
环境变量的设置:直接在/etc/profile中配置安装的路径即可,或者在当前用户的宿主目录下,配置在.bashrc文件中,该文件不用source重新打开shell窗口即可,配置在.bash_profile的话只对当前用户有效。

 

16、Hadoop性能调优? 
调优可以通过系统配置、程序编写和作业调度算法来进行。 
hdfsblock.size可以调到128/256(网络很好的情况下,默认为64 
调优的大头:mapred.map.tasksmapred.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对象

 

17、Hadoop高并发? 
首先肯定要保证集群的高可靠性,在高并发的情况下不会挂掉,支撑不住可以通过横向扩展。 
datanode挂掉了使用hadoop脚本重新启动。

 

18、hadoop的TextInputFormat作用是什么,如何自定义实现? 
InputFormat会在map操作之前对数据进行两方面的预处理。 
1getSplits,返回的是InputSplit数组,对数据进行split分片,每片交给map操作一次 。 
2getRecordReader,返回的是RecordReader对象,对每个split分片进行转换为key-value键值对格式传递给map 
常用的InputFormatTextInputFormat,使用的是LineRecordReader对每个分片进行键值对的转换,以行偏移量作为键,行内容作为值。 
自定义类继承InputFormat接口,重写createRecordReaderisSplitable方法 。 
createRecordReader中可以自定义分隔符。

 

19、hadoop和spark的都是并行计算,那么他们有什么相同和区别? 
两者都是用mr模型来进行并行计算,hadoop的一个作业称为jobjob里面分为map taskreduce task,每个task都是在自己的进程中运行的,当task结束时,进程也会结束。 
spark用户提交的任务成为application,一个application对应一个sparkcontextapp中存在多个job,每触发一次action操作就会产生一个job 
这些job可以并行或串行执行,每个job中有多个stagestageshuffle过程中DAGSchaduler通过RDD之间的依赖关系划分job而来的,每个stage里面有多个task,组成tasksetTaskSchaduler分发到各个executor中执行,executor的生命周期是和app一样的,即使没有job运行也是存在的,所以task可以快速启动读取内存进行计算。 
hadoopjob只有mapreduce操作,表达能力比较欠缺而且在mr过程中会重复的读写hdfs,造成大量的io操作,多个job需要自己管理关系。 
spark的迭代计算都是在内存中进行的,API中提供了大量的RDD操作如joingroupby等,而且通过DAG图可以实现良好的容错。

 

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

 

21、map-reduce程序运行的时候会有什么比较常见的问题? 
比如说作业中大部分都完成了,但是总有几个reduce一直在运行。 
这是因为这几个reduce中的处理的数据要远远大于其他的reduce,可能是因为对键值对任务划分的不均匀造成的数据倾斜。 
解决的方法可以在分区的时候重新定义分区规则对于value数据很多的key可以进行拆分、均匀打散等处理,或者是在map端的combiner中进行数据预处理的操作。 

 

22、RDD机制? 
rdd分布式弹性数据集,简单的理解成一种数据结构,是spark框架上的通用货币。 
所有算子都是基于rdd来执行的,不同的场景会有不同的rdd实现类,但是都可以进行互相转换。 
rdd执行过程中会形成dag图,然后形成lineage保证容错性等。 
从物理的角度来看rdd存储的是blocknode之间的映射。 


23、spark有哪些组件? 
1master:管理集群和节点,不参与计算。 
2worker:计算节点,进程本身不参与计算,和master汇报。 
3Driver:运行程序的main方法,创建spark context对象。 
4spark context:控制整个application的生命周期,包括dagshedulertask scheduler等组件。 
5client:用户提交程序的入口。

 

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

 

25、spark的优化怎么做? 
通过spark-env文件、程序中sparkconfset property设置。 
1)计算量大,形成的lineage过大应该给已经缓存了的rdd添加checkpoint,以减少容错带来的开销。 
2)小分区合并,过小的分区造成过多的切换任务开销,使用repartition

 

26、kafka工作原理? 
producerbroker发送事件,consumerbroker消费事件。 
事件由topic区分开,每个consumer都会属于一个group 
相同group中的consumer不能重复消费事件,而同一事件将会发送给每个不同groupconsumer

 

posted @ 2023-02-08 23:34  业余砖家  阅读(177)  评论(0)    收藏  举报