首页 > 大数据 > Hadoop > 大数据面试题整理-好程序员
今天给大家分享一篇关于大数据面试题整理的详细介绍,下面我们一起来看一下吧。
一、.hdfs 写文件的步骤
答案:
(1)client 向 NameNode 申请上传… /xxx.txt 文件
(2)NN 向 client 响应可以上传文件
(3)Client 向 NameNode 申请 DataNode
(4)NN 向 Client 返回 DN1,DN2,DN3
(5)Client 向 DN1,DN2,DN3 申请建立文件传输通道
(6)DN3,DN2,DN1 依次响应连接
(7)Client 向 DN1 上传一个 block , DN1 向 DN2,DN3 冗余文件
大数据面试题整理
二、hdfs 读取文件步骤
答案:
(1)client 向 NN 请求下载… /xxx.txt 文件
(2)NN 向 client 返回文件的元数据
(3)Client 向 DN1 请求访问读数据 blk_1
(4)DN1 向 Client 传输数据
(5)Client 向 DN2 请求访问读数据 blk_2
(6)DN2 向 Client 传输数据
大数据面试题整理
大数据面试题整理
三、hadoop 的 shuffle 过程
1.Map 端的 shuffle
Map 端会处理输入数据并产生中间结果,这个中间结果会写到本地磁盘,而不是 HDFS 。每个 Map 的输出会先写到内存缓冲区中,当写入的数据达到设定的阈值时,系统将会启动一个线程将缓冲区的数据写到磁盘,这个过程叫做 spill 。
在spill 写入之前,会先进行二次排序,首先根据数据所属的 partition 进行排序,然后每个 partition 中的数据再按 key 来排序。 partition 的目是将记录划分到不同的 Reducer 上去,以期望能够达到负载均衡,以后的 Reducer 就会根据 partition 来读取自己对应的数据。接着运行 combiner( 如果设置了的话 ) , combiner 的本质也是一个 Reducer ,其目的是对将要写入到磁盘上的文件先进行一次处理,这样,写入到磁盘的数据量就会减少。 最 后将数据写到本地磁盘产生spill 文件 (spill 文件保存在 {mapred.local.dir} 指定的目录中, Map 任务结束后就会被删除 ) 。
最 后,每个Map 任务可能产生多个 spill 文件,在每个 Map 任务完成前,会通过多路归并算法将这些 spill 文件归并成一个文件。至此, Map 的 shuffle 过程就结束了。
2.Reduce 端的 shuffle
Reduce 端的 shuffle 主要包括三个阶段, copy 、 sort(merge) 和 reduce 。
首先要将Map 端产生的输出文件拷贝到 Reduce 端,但每个 Reducer 如何知道自己应该处理哪些数据呢?因为 Map 端进行 partition 的时候,实际上就相当于指定了每个 Reducer 要处理的数据 (partition 就对应了 Reducer) ,所以 Reducer 在拷贝数据的时候只需拷贝与自己对应的 partition 中的数据即可。每个 Reducer 会处理一个或者多个 partition ,但需要先将自己对应的 partition 中的数据从每个 Map 的输出结果中拷贝过来。
接下来就是sort 阶段,也成为 merge 阶段,因为这个阶段的主要工作是执行了归并排序。从 Map 端拷贝到 Reduce 端的数据都是有序的,所以很适合归并排序。 最 终在Reduce 端生成一个较大的文件作为 Reduce 的输入。
最 后就是Reduce 过程了,在这个过程中产生了 最 终的输出结果,并将其写到HDFS 上。
四、fsimage 和 edit 的区别?
当NN,SN 要进行数据同步时叫做 checkpoint 时就用到了 fsimage 与 edit , fsimage 是保存 最 新的元数据的信息,当fsimage 数据到一定的大小事会去生成一个新的文件来保存元数据的信息,这个新的文件就是 edit , edit 会回滚 最 新的数据。
五、简单说一下hadoop 的 map-reduce 模型
首先maptask 会从本地文件系统读取数据,转换成 key-value 形式的键值对集合,使用的是 hadoop 内置的数据类型,如 Text , Longwritable 等。
将键值对集合输入mapper 进行业务处理过程,将其转化成需要的 key-value 再输出。
之后会进行一个partition 分区操作,默认使用的是 hashpartitioner ,可以通过重写 hashpartitioner 的 getPartition 方法来自定义分区规则。
之后会对key 进行 sort 排序, grouping 分组操作将相同 key 的 value 合并分组输出,在这里可以使用自定义的数据类型,重写 WritableComparator 的 Comparator 方法来自定义排序规则,重写 RawComparator 的 compara 方法来自定义分组规则。
之后进行一个combiner 归约操作,就是一个本地的 reduce 预处理,以减小 shuffle , reducer 的工作量。
Reducetask 会用过网络将各个数据收集进行 reduce 处理, 最 后将数据保存或者显示,结束整个job 。
六、运行hadoop 集群需要哪些守护进程?
DataNode,NameNode,TaskTracker 和 JobTracker 都是运行 Hadoop 集群需要的守护进程。
七、hadoop 的 TextInputFormat 作用是什么,如何自定义实现?
InputFormat 会在 map 操作之前对数据进行两方面的预处理。
1. 是 getSplits ,返回的是 InputSplit 数组,对数据进行 Split 分片,每片交给 map 操作一次。
2. 是 getRecordReader ,返回的是 RecordReader 对象,对每个 Split 分片进行转换为 key-value 键值对格式传递给 map 常用的 InputFormat 是 TextInputFormat ,使用的是 LineRecordReader 对每个分片进行键值对的转换,以行偏移量作为键,行内容作为值。
自定义类继承InputFormat 接口,重写 createRecordReader 和 isSplitable 方法在 createRecordReader 中可以自定义分隔符。
八、hadoop 和 spark 都是并行计算,那么他们有什么相同和区别?
两者都使用mr 模型来进行并行计算, hadoop 的一个作业称为 job , job 里面分为 maptask 和 reducetask ,每个 task 都是在自己的进程中运行的,当 task 结束时,进程也会结束。
Spark 用户提交的任务称为 application ,一个 application 对应一个 SparkContext , app 中存在多个 job ,没触发一个 action 操作就会产生一个 job 。
这些job 可以并行或者串行执行,每个 job 有多个 stage , stage 是 shuffle 过程中 DAGSchaduler 通过 RDD 之间的依赖关系划分 job 而来的,每个 stage 里面有多个 task ,组成 taskset 有 TaskSchaduler 分发到各个 executor 中执行, executor 的生命周期是和 application 一样的,即使没有 job 运行也是存在的,所以 task 可以快速启动读取内存进行计算的。
Hadoop 的 job 只有 map 和 reduce 操作,表达能力比较欠缺而且在 mr 过程中会重复的读写 hdfs ,造成大量的 io 操作,多个 job 需要自己管理关系。
Spark 的迭代计算都是在内存中进行的, API 中提供了大量的 RDD 操作 join , groupby 等,而且通过 DAG 图可以实现良好的容错。
九、为什么要用flume 导入 hdfs , hdfs 的架构是怎样的?
Flume 可以实时的导入数据到 hdfs 中,当 hdfs 上的文件达到一个指定大小的时候会形成一个文件,或者超时所指定时间的话也形成一个文件。
文件都是存储在datanode 上的, namenode 存储着 datanode 的元数据信息,而 namenode 的元数据信息是存在内存中的,所以当文件切片很小或者很多的时候会卡死。
十、MR 程序运行的时候会有什么比较常见的问题?
比如说作业中大部分都完成了,但是总有几个reduce 一直在运行。
这是因为这几个reduce 中的处理的数据要远远大于其他的 reduce ,可能是对键值对任务划分的不均匀造成的数据倾斜。
解决的方法可以在分区的时候重新定义分区规则对于value 数据很多的 key 可以进行拆分、均匀打散等处理,或者是在 map 端的 combiner 中进行数据预处理的操作。
十一、简单说一下hadoop 和 spark 的 shuffle 过程
Hadoop : map 端保存分片数据,通过网络收集到 reduce 端。
Spark : spark 的 shuffle 实在 DAGSchedular 划分 Stage 的时候产生的, TaskSchedular 要分发 Stage 到各个 worker 的 executor 。减少 shuffle 可以提高性能。
十二、hive 中存放的是什么?
表。
存的是和hdfs 的映射关系, hive 是逻辑上的数据仓库,实际操作的都是 hdfs 上的文件, HQL 就是用 SQL 语法来写的 MR 程序。
十三、Hive 与关系型数据库的关系?
没有关系,hive 是数据仓库,不能和数据库一样进行实时的 CRUD 操作。
是一次写入多次读取的操作,可以看成是ETL 的工具。
十四、Flume 的工作及时是什么?
核心概念是agent ,里面包括 source , channel 和 sink 三个组件。
Source 运行在日志收集节点进行日志采集,之后临时存储在 channel 中, sink 负责将 channel 中的数据发送到目的地。
只有发送成功channel 中的数据才会被删除。
首先书写flume 配置文件,定义 agent 、 source 、 channel 和 sink 然后将其组装,执行 flume-ng 命令。
十五、Hbase 行键列族的概念,物理模型,表的设计原则?
行键:是hbase 表自带的,每个行键对应一条数据。
列族:是创建表时指定的,为列的集合,每个列族作为一个文件单独存储,存储的数据都是字节数组,其中数据可以有很多,通过时间戳来区分。
物理模型:整个hbase 表会拆分成多个 region ,每个 region 记录着行键的起始点保存在不同的节点上,查询时就是对各个节点的并行查询,当 region 很大时使用 .META 表存储各个 region 的起始点, -ROOT 又可以存储 .META 的起始点。
Rowkey 的设计原则:各个列族数据平衡,长度原则、相邻原则,创建表的时候设置表放入 regionserver 缓存中,避免自动增长和时间,使用字节数组代替 string , 最 大长度64kb , 最 好16 字节以内,按天分表,两个字节散列,四个字节存储时分毫秒。
列族的设计原则:尽可能少( 按照列族进行存储,按照 region 进行读取,不必要的 io 操作 ) ,经常和不经常使用的两类数据放入不同列族中,列族名字尽可能短。
十六、请列出正常的hadoop 集群中 hadoop 都分别需要启动哪些进程,他们的作用分别都是什么,请尽量列的详细一些。
namenode :负责管理 hdfs 中文件块的元数据,响应客户端请求,管理 datanode 上文件 block 的均衡,维持副本数量
Secondname: 主要负责做 checkpoint 操作;也可以做冷备,对一定范围内数据做快照性备份。
Datanode: 存储数据块,负责客户端对数据块的 io 请求
Jobtracker: 管理任务,并将任务分配给 tasktracker 。
Tasktracker: 执行 JobTracker 分配的任务。
Resourcemanager 、 Nodemanager 、 Journalnode 、 Zookeeper 、 Zkfc
十七、请说明hive 中 SortBy 、 OrderBy 、 ClusterBy , DistributeBy 各代表什么意思?
orderby :会对输入做全局排序,因此只有一个 reducer (多个 reducer 无法保证全局有序)。只有一个 reducer ,会导致当输入规模较大时,需要较长的计算时间。
sortby :不是全局排序,其在数据进入 reducer 前完成排序。
distributeby :按照指定的字段对数据进行划分输出到不同的 reduce 中。
clusterby :除了具有 distributeby 的功能外还兼具 sortby 的功能。
十八、HBase 简单读写流程?
读:
找到要读数据的region 所在的 RegionServer ,然后按照以下顺序进行读取:先去 BlockCache 读取,若 BlockCache 没有,则到 Memstore 读取,若 Memstore 中没有,则到 HFile 中去读。
写:
找到要写数据的region 所在的 RegionServer ,然后先将数据写到 WAL(Write-AheadLogging ,预写日志系统 ) 中,然后再将数据写到 Memstore 等待刷新,回复客户端写入完成。
十九、HBase 的特点是什么?
(1)hbase 是一个分布式的基于列式存储的数据库,基于 hadoop 的 HDFS 存储, zookeeper 进行管理。
(2)hbase 适合存储半结构化或非结构化数据,对于数据结构字段不够确定或者杂乱无章很难按一个概念去抽取的数据。
(3)hbase 为 null 的记录不会被存储。
(4) 基于的表包括 rowkey ,时间戳和列族。新写入数据时,时间戳更新,同时可以查询到以前的版本。
(5)hbase 是主从结构。 Hmaster 作为主节点, hregionserver 作为从节点。
二十、请描述如何解决Hbase 中 region 太小和 region 太大带来的结果。
Region 过大会发生多次 compaction ,将数据读一遍并写一遍到 hdfs 上,占用 io , region 过小会造成多次 split , region 会下线,影响访问服务,调整 hbase.heregion.max.filesize 为 256m 。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69913864/viewspace-2725038/ ,如需转载,请注明出处,否则将追究法律责任。