【最新】2021年Hive阶段最全⾯试真题-附答案
1.你处理过的最⼤的数据量?你是如何处理他们的?处理的结果。
1000万条数据(10G);为了加快解析速度,使⽤redis作为缓存,MR运⾏只与redis交互,解析完成后统⼀在hbase中持久化存储.
2.在处理⼤数据过程中,如何保证得到期望值?
对数据进⾏清洗,过滤和排序以达到期望值
3.如何让⼀个⽹络爬⾍速度更快、抽取更好的信息以及更好总结数据从⽽得到⼀⼲净的数据库?
多个账号,多窗⼝操作;定向抽取数据需求数据
4.点击流数据应该是实时处理?为什么?哪部分应该实时处理?
点击流数据是⽤户浏览⽹站持续轨迹,是持续的⾏为(数据具有时效性?);
访问,浏览,点击⾏为应该实时处理
购物车,⾜迹,评论,收藏,订单数据采集到kafka后进⾏实时处理.
5.你最喜欢的编程语⾔是什么?为什么?
我认为编程语⾔是程序员得基本功,不论是java,scala还是sql,只有熟练掌握才能够写出简洁⾼效的代码.
6.如何把⾮结构化的数据转换成结构化的数据?这是否真的有必要做这样的转换?把数据存成平⾯⽂本⽂件是否⽐存成关系数据库更好?
对源数据设置统⼀的切割符,清洗冗余数据,⽆效数据;
源数据没有结构化,不会直接应⽤使⽤,不利于分析,容易导致数据倾斜,转换后的数据便于后期的使⽤和开发;
⽂本⽂件不利于管理和维护,并且⽂件会占⽤存储空间
7.如何判别mapreduce过程有好的负载均衡?什么是负载均衡?
当有⼤⽂件或⼤量数据的时候,就会体现出mapreduce的负载均衡,其中mapreduce核⼼shuffle过程实现的负载均衡;
扩展⽹络设备和服务器的带宽,增加吞吐量,加强⽹络数据处理能⼒,增加⽹络的灵活性和可⽤性.(这⾥可以通过MR的shuffle,阐述spark的shuffle,做⼀个对⽐,然后怎样调优)
8.Spark和Hive的区别,以及Spark和Hive的数据倾斜调优问题?
区别:
spark拥有mapreduce所具备的优点,但不同于mapreduce的是job中间输出结果保存在内存中,从⽽不再读写hdfs.
hive是基于Hadoop的⼯具,提供sql语句运⾏mapreduce,核⼼为mapreduce处理数据,需要进⾏频繁的io操作.
hive数据倾斜:
参数调节:
进⾏负载均衡
sql语句调节:
选⽤join key分布最均匀的表作为驱动表.
使⽤map join 让⼩的维度表先进内存.在map端完成reduce
把空值加上随机数,把倾斜的数据分到不同的reduce上,null值不影响最终的处理结果
countdistinct ⼤量相同特殊值:将值为空的单独处理,相同的不⽤处理直接过率,在最后结果中加1;
还有其它计算,需要进⾏group by,可以先将值为空的记录单独处理,在和其它计算结果进⾏union]
spark数据倾斜:
数据倾斜是由于少数task执⾏时间过长导致的,shuffle过程出现此问题
distinct,groupByKey,reduceByKey,aggregateByKey,join,cogroup,repartition
数据倾斜原因:
key本⾝分布不均匀
key的设置不合理,(我之前公司的key是怎么设计的)
如果是其它情况具体情况具体分析
如果是业务导致的数据正常分布
spark下:
spark时的并发度不够
计算⽅式有误
解决:key分布问题则清除⽆效的key
解决:
如果是有效数据正常分布
隔离执⾏,将异常的key过滤出来单独处理,最后与正常数据的处理结果进⾏union操作
将task过多的key添加随机值,进⾏操作,去掉随机值,在进⾏操作
shuffle问题,sparksql和dataframe可以设置增加shuffle并⾏度;使⽤map join 代替reduce join 9.Hive和Hbase的区别?
共同点:hbase与hive都是架构在Hadoop上,都是⽤hadoop作为底层存储.
共同点:
区别:
hive是建⽴在hadoop上为了减少mapreduce job编写⼯作的批处理系统,HBase是⽀持hadoop的实时操作的缺陷;
当操作RMDB数据库,如果是全表扫描,就⽤Hive+hadoop,如果是索引访问采⽤Hbase+hadoop;
hivequery mapreduce 从5分钟到数⼩时,hbase是⾮常⾼效的,⽐hive快;
Hive本⾝不存储数据和计算数据,完全依赖HDFS和mapreduce,借⽤mapreduce完成命令执⾏,hive表纯逻辑
hbase是物理表,列存储,⾮逻辑表,提供⼤内存hash表,搜索引擎通过它来存储索引,⽅便查询操作.
hdfs作为底层存储,是存放⽂件的系统,⽽Hbase负责组织⽂件.
hive需要⽤到hdfs存储⽂件,需要⽤到Mapreduce计算框架.
10.MapReduce的思想,以及MapReduce调优问题?
mapReduce是⼀个分布式运算程序的编程框架,分⽽治之的思想,(阐述mapreduce的整个流程),
jvm面试题总结及答案配置l参数
默认开启的reduce数量,多台机器分担⼀台机器的压⼒,增加数量
环形缓冲区所占内存⼤⼩默认100M,增加到200M
环形缓冲区的阀值
ReduceTask中合并⼩⽂件时,增加⼀次合并的⽂件数据
map输出是否进⾏压缩,如果压缩就会多耗cpu,但是减少传输时间,如果不压缩,就需要较多的传输带宽。
设置http传输的的并⾏数
以下的主要思想就是增加内存:
Map阶段,增加map端的内存分配
增加Map端启⽤JVM所占⽤的内存
增加reduce阶段,reduce端的内存分配
增加reduce端启⽤JVM所占⽤的内存
shuffle调优:
调整缓冲区的⼤⼩,将缓冲区调⼤.
阈值降低到60%,80%会刷磁盘浪费io,达到减少io的效果
11.谈谈数据倾斜,它如何发⽣的,并给出优化⽅案!
⾸先谈⼀下什么是数据倾斜? 答:map /reduce程序执⾏时,reduce节点⼤部分执⾏完毕,但是有⼀个或者⼏个reduce节点运⾏很慢,导致整个程序的处理时间很长。现象是: 进度长时间维持在99%(或100%),查看任务监控页⾯,发现只有少量(1个或⼏个)reduce⼦任务未完成;查看未完成的⼦任务,可以看到本地读写数据量积累⾮常⼤,通常超过10GB可以认定为发⽣数据倾斜。
如何发⽣的?数据的倾斜主要是两个的数据相差的数量不在⼀个级别上 ,这是因为某⼀个key的条数⽐其他key多很多(有时是百倍或者千倍之多),这条key所在的reduce节点所处理的数据量⽐其他节点就⼤很多,从⽽导致某⼏个节点迟迟运⾏不完。
优化⽅案 :
⽅式⼀ :reduce 本⾝的计算需要以合适的内存作为⽀持,在硬件环境容许的情况下,增加reduce 的JVM内存⼤⼩显然有改善数据倾斜的可能,⽅式⼀ :
这种⽅式尤其适合数据分布第⼀种情况,单个值有⼤量记录, 这种值的所有纪录已经超过了分配给reduce 的内存,⽆论你怎么样分区这种情况都不会改变. 当然这种情况的限制也⾮常明显, 1.内存的限制存在,2.可能会对集其他任务的运⾏产⽣不稳定的影响。
⽅式⼆ : 这个对于数据分布第⼆种情况有效,情况(⼀值较多,单个唯⼀值的记录数不会超过分配给reduce 的内存). 如果发⽣了偶尔的数据倾斜情况,增加reduce 个数可以缓解偶然情况下的某些reduce 不⼩⼼分配了多个较多记录数的情况. 但是对于第⼀种数据分布⽆效。
⽅式三:
⽅式三: ⼀种情况是某个领域知识告诉你数据分布的显著类型,⽐如<<hadoop权威指南>> ⾥⾯的温度问题,⼀个固定的组合(观测站点的位置和温度) 的分布是固定的,对于特定的查询如果前⾯两种⽅式都没⽤,实现⾃⼰的partitioner 也许是⼀个好的⽅式。
总结 : 数据倾斜没有⼀劳永逸的⽅式可以解决,了解你的数据集的分布情况,然后了解你所使⽤计算框架的运⾏机制和瓶颈,针对特定的情况做特定的优化,做多种尝试,观察是否有效。
12.datanode ⾸次加⼊ cluster 的时候,如果 log 报告不兼容⽂件版本,那需要namenode 执⾏格式化操作,这样处理的原因是?
(可以当成⼯作中遇到的问题!) 这样处理是不合理的,因为那么 namenode 格式化操作,是对⽂件系统进⾏格式化,namenode 格式化时清空dfs/name 下空两个⽬录下的所有⽂件,之后,会在⽬录 dfs.name.dir 下创建⽂件。⽂本不兼容,有可能时 namenode 与 datanode 的 数据⾥的 namespaceID、clusterID 不⼀致,到两个 ID 位置,修改为⼀样即可解决。
13.简述HDFS数据存储机制?
HDFS是解决海量数据存储问题的存储系统。具有⾼可靠,读写效率⾼等特点。通过将⼤⽂件拆分成⼀个⼀个block块,Hadoop2.x默认是
128M,分布式的存储到各个DataNode节点中并且备份,通过横向扩展解决了纵向扩展的问题,⼤⼤提升了读写的效率和降低了成本。同时,通过设置NameNode主节点来记录每个block的元数据信息,包括块名,所在DataNode节点,备份所在位置,⼤⼩等等信息,实现⽂件的⾼可靠存储和⾼效率读取。⽽且在Hadoop2.0以上版本,通过HA解决了NameNode的单点故障问题,使得HDFS更为可靠。
14.如何实现⼩⽂件的合并?
先将这些⼩⽂件保存到本地的⼀个路径中同⼀个⽂件中,通过shell脚本,可以设置这个新⽂件达到多⼤再上传,⼀般设置为128M,上传到HDFS 中,这样就实现了⼩⽂件上传之前的合并。还有,⼀般当天的⽇志和数据都存在⼀个HDFS路径中,如果没有达到上传⼤⼩,可以设置每天凌晨对
前⼀天的本地⽂件路径的扫描,如果发现有⽂件,不管多⼤,都上传到前⼀天的HDFS⽂件⽬录下。
15.Hadoop的Shuffer过程
map ----> partition(分区默认,可修改) ----> sort(排序默认,可修改) -----> combiner(map阶段排序,可选) -----> spill (溢写,默认不可改) -----> meger(合并⽂件,默认,不可改) -----> compress(压缩,可选) -----> Copy 阶段----->Merge 阶段----->Sort 阶段。这是整个MapReduce阶段, ⽽Map 产⽣输出开始到Reduce取得数据作为输⼊之前的过程称shuffle阶段
1 . Collect阶段 :
Collect阶段 : 将MapTask的结果输出到默认⼤⼩为100M的环形缓冲区 . 保存的是key/value ,Partition分区信息等。
Spill阶段 : 当内存中的数据量达到⼀定的阈值的时候,就会将数据写⼊到本地磁盘 , 在将数据写⼊到磁盘之前需要对数据进⾏⼀次排序 2 . Spill阶段 :
的操作。如果配置了combiner,还会将相同分区号和key的数据进⾏排序。
3 . Merge阶段 :
Merge阶段 : 把所有的溢出的临时⽂件进⾏⼀次合并操作 , 以确保⼀个MapTask最终只产⽣⼀个中间数据⽂件。
Copy阶段 : ReduceTask启动Fetcher线程到已经完成MapTask的节点上复制⼀份属于⾃⼰的数据 , 这些数据默认会保存到内存的 4 . Copy阶段 :
缓冲区中 , 当内存的缓冲区达到⼀定的阈值的时候,就会将数据写到磁盘之上
5 . 在reduceTask远程复制数据的同时 , 会在后台开启两个线程对内存到本地的数据⽂件进⾏合并操作
Sort阶段 : 在对数据进⾏合并的同时 , 会进⾏排序操作 , 由于MapTask阶段已经对数据进⾏了局部的排序 , ReduceTask只需要保证 6 . Sort阶段 :
Copy的数据最终整体有效性即可。
Shuffer中的缓冲区⼤⼩会影响到MapReduce程序的执⾏效率 , 原则上说 , 缓冲区越⼤ , 磁盘IO的次数越少,执⾏速度越快.
16.两个⽂件合并的问题
给定a、b两个⽂件,各存放50亿个url,每个url各占⽤64字节,内存限制是4G,如何出a、b⽂件共同的url?主要的思想是把⽂件分开进⾏计算,在对每个⽂件进⾏对⽐,得出相同的URL,因为以上说是含有相同的URL所以不⽤考虑数据倾斜的问题。详细的解题思路为:可以估计每个⽂件的⼤⼩为5G*64=300G,远⼤于4G。所以不可能将其完全加载到内存中处理。考虑采取分⽽治之的⽅法。
遍历⽂件a,对每个url求取hash(url)%1000,然后根据所得值将url分别存储到1000个⼩⽂件(设为a0,a1,...a999)当中。这样每个⼩⽂件的⼤⼩约为300M。遍历⽂件b,采取和a相同的⽅法将url分别存储到1000个⼩⽂件(b999)中。这样处理后,所有可能相同的url都在对应的⼩⽂件(a0 vs b0, a1 a999 vsb999)当中,不对应的⼩⽂件(⽐如a0 vs b99)不可能有相同的url。然后我们只要求出1000对⼩⽂件中相同的url即可。 ⽐如对于a0 vs b0,我们可以遍历a0,将其中的url存储到hash_map当中。然后遍历b0,如果url在hash_map中,则说明此url在a和b中同时存在,保存到⽂件中即可。
如果分成的⼩⽂件不均匀,导致有些⼩⽂件太⼤(⽐如⼤于2G),可以考虑将这些太⼤的⼩⽂件再按类似的⽅法分成⼩⼩⽂件即可。
17.当场java或者scala⼿写word count。(会⼀种)
18.YARN的调度策略
FIFO: 先进先出. ⼩任务会被⼤任务阻塞
· Capacity: 容量调度器(默认).
按照你的队列的形式!给不同的队列划分不同的百分⽐,当然如果⼀个队列空闲!那么另外⼀个队列就会不断的“吞噬”剩下的资源直⾄达到(⾃⼰设定的最⼤“吞噬”量的百分⽐),如果这个时候被吞噬的资源⼜开始忙的话!那么就会释放资源!最终达到⾃⼰设定的那个动态的平衡点!例⼦ :
Root
队列⼀ : prod 40% 剩余25%
队列⼀ :
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论