2019/10/14 晚 9.20分
开篇点题
最近由于未年底的找工作做准备,自己就收集了一些面试,进行学习,之前看视频的方法总觉得不够痛快,胡子眉毛一把抓,就计划每天晚上写一篇博客,每天都更新一篇,也是激励自己,负重前行,我会把每一个问题的讲解回答,还有我自己的思考都写进来,大家可以一起讨论。(每天5-10个)(V:18211850987)
一.10亿条数据,求top10如何优化
答:(刚开始没看明白问题啥意思,后来理解了,核心在于对于大数据并行,分而治之的思想上;附一个我觉得洗的比较好的文章链接https://blog.csdn.net/zyq522376829/article/details/47686867)
首先,处理的思路有
1.将数据全部排序(比较慢),使用快速排序算法(冒泡排序还有快速排序)。(稍后补充这两个算法)
2.局部淘汰:就是先拿一部分值做初始值,然后剩下的和这些值进行比较
3.分治法:将数据分为一定的集合,在每个小的集合里边进行数据比较比较出前几位值,然后再比较这几个集合里边的值
4.Hash法:进行hash(https://blog.csdn.net/liushengxi_root/article/details/86571193个人觉得讲hash比较通俗的博客)
5.采用最小堆:建立堆大小然后,使用其余数字和堆顶数字进行比较
实际问题不光是处理运行cpu核数,还有内存问题,还有考虑算法的容错,以及计算失败后继续进行,而不是重头再来
topN问题适合Hadoop的mapreduce进行处理,将数据通过hash进行划分到不同的机器,将数据读入内存,然后不同的机器负责不同的数据,各个机器计算各个机器的topN,人后进行汇总,就类似map和Reduce任务,统计每个reduce的函数,然后进行汇总。
(我的优化思路,就是增加reduce数量,hash换分更小单位,投提高计算效率)
(里边设计的,冒泡排序,还有快速排序,及hash算法稍后单独补充)
二.HDSF的读写流程
答:(我自己会跟mapreduce的读写过程进行混淆,注意区分)
HDFS读数据:首先客户端会调用FileSystem API的open方法发送请求给NameNode,NameNode将相应的Block块信息返回给客户端,客户端通过FSDate InputStream的read方法并发的读每一个block中的数据,关闭输入流,客户端将读取的block中的数据统一成一个文件
HDFS写数据:
客户端调用FileStream 的create方法请求NameNode创建一个文件,包括文件大小,拥有者相关信息,然后根据文件大小进行文件的切分为多个block,将相关信息返回客户端,客户端通过FSData OutputStream的Write方法,首先把一个Block写到一个DataNode上,每个默认有三个副本,副本上的数据不是有客户端写,而是由DataNode创建新线程,按照副本存放规则存放(其实就是第一个Data会和其他两个副本建立pipline机制,不断地向下创建副本,每个副本还要想上一个node汇报复制情况,是否复制完成,如果出现问题,重新进行复制,并且也有一个ack机制,就是检测副本肤质情况,进行汇报)
三.HBase的读写流程
答:(之前确实没有太关注过HBASE的读写过程)
Hbase的写过程:
1,Client先访问zookeeper,从meta表获取相应region信息,然后找到meta表的数据
2,根据namespace、表名和rowkey根据meta表的数据找到写入数据对应的region信息
3,找到对应的regionserver
4,把数据分别写到HLog和MemStore上一份
4,MemStore达到一个阈值后则把数据刷成一个StoreFile文件。(若MemStore中的数据有丢失,则可以总HLog上恢复)
5,当多个StoreFile文件达到一定的大小后,会触发Compact合并操作,合并为一个StoreFile,(这里同时进行版本的合并和数据删除。)
Hbase的读过程:
1,Client先访问zookeeper,从meta表读取region的位置,然后读取meta表中的数据。meta中又存储了用户表的region信息。
2,根据namespace、表名和rowkey在meta表中找到对应的region信息
3,找到这个region对应的regionserver
4,查找对应的region
5,先从MemStore找数据,如果没有,再到StoreFile上读(为了读取的效率)。
(一篇较为详细的文档https://blog.csdn.net/whdxjbw/article/details/81107285)
不早了,早点休息,明天继续。。。-=-。。。。