2018 大数据面试

大数据工程师(开发)面试

1.HBase和Hive都是基于Hadoop,为什么Hive查询起来非常慢,但HBase不是?
Hive是类SQL引擎,其查询都需要遍历整张表,跑MapReduce自然很慢,但HBase是一种NoSQL的列式数据库,基于Key/Value的存储格式,不需要像Hive一样遍历,自然在速度上,乃至写的性能上是相当之快的。

HIVE和HBASE区别

2.通过Java,判断一个数是否是2的n次方?
我想到的一种方法是,给定范围或者直接将Java语言所能表示的数据类型的最大值作为范围,通过Math.pow(2,n)的方法,在整个范围中遍历,然后通过if’判断比较,设置一个boolean值,如果在设定的范围中有等于给出的数值的数,则将boolean值设置为true。反之为false。后来面试官给出了一个很巧妙的方法,将所给出的数与所给出的数减一的数进行与的位运算,如果运算结果为零则表示这个数为2的n次方,而这道题据说考验的是数据敏感性。

【java】判断一个数是不是2的N次方

3.Java中的经典排序算法?
java的几种经典排序算法
程序员必知的8大排序-------冒泡排序,快速排序(java实现)

4.Java链表的概念、用法以及实现原理?
链表
数组和链表–Java学习笔记(一)

5.Java HashMap有序吗?如果没序,那么有序的map是怎么实现的呢?
普通的HashMap没有序,有序的HashMap有两种:LinkedHashMap和TreeMap,其中前者是基于原有HashMap的定制拓展,后者采用了一种“红黑树”的算法。

相关参考文献

Map集合中的entry是什么?
HashMap输出顺序的问题
有序的HashMap-LinkedHashMap
TreeMap实现原理
红黑树(Red-black tree)

6.JVM调优方法?
JVM调优总结

7.MapReduce的工作原理以及一个简单的WordCount的实现流程和Daemon?
Hadoop集群(第6期)_WordCount运行详解

8.TCP工作在OSI模型的第几层?IP呢?
前者工作在第四层:传输层,后者为第三层:网络层。

9.进程与线程的区别?进程有哪几种状态?
进程与线程的区别
进程状态百度百科
僵尸进程百度百科

大数据工程师(存储)面试

1.固态硬盘为什么会比机械硬盘快?
固态硬盘为什么会比机械硬盘快

2.闪存(flash)的实现原理?
flash百度百科

3.Python在爬取网页的时候用到的库?将网页中的,全部替换为.如何实现?网页中的图片如何爬取?
①urllib
②re.sub:

③键查看源码,找到图片的相应匹配规则(当时想的深了,想着图片的编码怎么在爬取的时候转换和普通文本一致。。。。)比如jpg文件那么.jpg就是一个很好的匹配过滤条件,以爬取百度图片-------hello为例:

图形页面:

源码界面:

具体爬取方式:
Python爬虫爬取网页图片

4.利用MapReduce实现group by的功能?
MapReduce实现基本SQL操作的原理-join和group by,以及Dinstinct

5.Hive与HBase的区别?
之前看过一篇文章,所以就着文章笃定的答道:Hive是遍历全表查询的,忽略了前提条件,可以说是不严谨,那个前提条件就是Hive不做分区表的情况下:

HBase 与 Hive 的区别和关系
hive与hbase的联系与区别
hive中partition如何使用

6.什么是ETL?
ETL百度百科
数据清洗百度百科
脏数据百度百科
元数据百度百科

7.Sqoop在超大数据的情况下,性能不佳,如何解决?
这个问题不是面试官问我的,而是出于疑惑,我请教面试官的,因为之前的一些面试,都谈到Sqoop好不好用这个问题?基于Sqoop 的使用效果,我垂直搜索了一下,发现,无非两类:一是Sqoop2较Sqoop1的架构上的演进,以及Sqoop和淘宝的DataX,还有Kettel相比性能之优越,插件之丰富,然而我要的是关于Sqoop的一些负面的文章,垂直搜索的时候并没有搜到。请教了面试官后,面试官给出了解答:Spark dataFrame,大量异构数据同步的一种框架级解决方案!!!

Hadoop教程:Hadoop数据传输工具Sqoop
大数据同步工具DataX与Sqoop之比较
Spark DataFrame小试牛刀

8.HBase二级索引如何建立?
HBase二级索引的设计(案例讲解)

大数据工程师(开发)面试

1.LVS和HAProxy相比,它的缺点是什么?
之前,的确是用LVS进行过MySQL集群的负载均衡,对HAProxy也有过了解,但是将这两者放在眼前进行比较,还真没试着了解过。面试中出现了这么一题,面试官给予的答案是LVS的配置相当繁琐,后来查找了相关资料,对这两种负载均衡方案有了更进一步的了解。LVS的负载均衡性能之强悍已经达到硬件负载均衡的F5的百分之60了,而HAproxy的负载均衡和Nginx负载均衡,均为硬件负载均衡的百分之十左右。由此可见,配置复杂,相应的效果也是显而易见的。在查找资料的过程中,试着将LVS的10种调度算法了解了一下,看似数量挺多的10种算法其实在不同的算法之间,有些只是有着一些细微的差别。在这10种调度算法中,静态调度算法有四种,动态调度算法有6种。

静态调度算法:
①RR轮询调度算法
这种调度算法不考虑服务器的状态,所以是无状态的,同时也不考虑每个服务器的性能,比如我有1-N台服务器,来N个请求了,第一个请求给第一台,第二个请求给第二台,,,第N个请求给第N台服务器,就酱紫。

②加权轮询
这种调度算法是考虑到服务器的性能的,你可以根据不同服务器的性能,加上权重进行分配相应的请求。

③基于目的地址的hash散列
这种调度算法和基于源地址的hash散列异曲同工,都是为了维持一个session,基于目的地址的hash散列,将记住同一请求的目的地址,将这类请求发往同一台目的服务器。简而言之,就是发往这个目的地址的请求都发往同一台服务器。而基于源地址的hash散列,就是来自同一源地址的请求都发往同一台服务器。

④基于源地址的hash散列
上述已讲,不再赘述。

动态调度
①最少连接调度算法
这种调度算法会记录响应请求的服务器上所建立的连接数,每接收到一个请求会相应的将该服务器的所建立连接数加1,同时将新来的请求分配到当前连接数最少的那台机器上。

②加权最少连接调度算法
这种调度算法在最少连接调度算法的基础上考虑到服务器的性能。当然,做这样子的考虑是有其合理性存在的,如果是同一规格的服务器,那么建立的连接数越多,必然越增加其负载,那么仅仅根据最少连接数的调度算法,必然可以实现合理的负载均衡。但如果,服务器的性能不一样呢?比如我有一台服务器,最多只能处理10个连接,现在建立了3个,还有一台服务器最多能处理1000条连接,现在建立了5个,如果单纯地按照上述的最少连接调度算法,妥妥的前者嘛,但前者已经建立了百分之三十的连接了,而后者连百分之一的连接还没有建立,试问,这合理吗?显然不合理。所以加上权重,才算合理。相应的公式也相当简单:active*256/weight。

③最短期望调度算法
这种算法,是避免出现上述加权最少连接调度算法中的一种特殊情况,导致即使加上权重,调度器也无差别对待了,举个栗子:
假设有三台服务器ABC,其当前所建立的连接数相应地为1,2,3,而权重也是1,2,3。那么如果按照加权最少连接调度算法的话,算出来是这样子的:
A: 1256/1=256
B: 2256/2=256
C: 3256/3=256
我们会发现,即便加上权重,A、B、C,经过计算还是一样的,这样子调度器会无差别的在A、B、C中任选一台,将请求发过去。
而最短期望将active256/weight的算法改进为(active+1)256/weight
那么还是之前的例子:
A:(1+1)256/1=2/1256=2256
B:(2+1)256/2=3/2256=1.5256
C:(3+1)256、3=4/3256≈1.3256
显然C<B<A,那么这时候调度器就会将请求发给C了哈。

④永不排队算法
将请求发给当前连接数为0的服务器上。

⑤基于局部的最少连接调度算法
这种调度算法应用于Cache系统,维持一个请求到一台服务器的映射,其实我们仔细想想哈,之前做的一系列最少连接相关的调度算法。考虑到的是服务器的状态与性能,但是一次请求并不是单向的,就像有一个从未合作过的大牛,他很闲,你让他去解决一个之前碰到过的一个问题,未必有找一个之前已经跟你合作过哪怕现在不怎么闲的臭皮匠效果好哦~,所以基于局部的最少连接调度算法,维持的这种映射的作用是,如果来了一个请求,相对应的映射的那台服务器,没有超载,ok交给老伙伴完事吧,俺放心,如果那台服务器不存在,或者是超载的状态且有其他服务器工作在一半的负载状态,则按最少连接调度算法在集群其余的服务器中找一台将请求分配给它。

⑥基于复制的局部最少连接调度算法
这种调度算法同样应用于cache系统,但它维持的不是到一台服务器的映射而是到一组服务器的映射,当有新的请求到来,根据最小连接原则,从该映射的服务器组中选择一台服务器,如果它没有超载则交给它去处理这个请求,如果发现它超载,则从服务器组外的集群中,按最少连接原则拉一台机器加入服务器组,并且在服务器组有一段时间未修改后,将最忙的那台服务器从服务器组中剔除。

相关参考文献:
LVS基本介绍
LVS 三种工作模式原理、以及优缺点比较(转载)
LVS十种调度算法介绍
LVS集群之十种调度算法及负载均衡——理论
lvs、haproxy、nginx 负载均衡的比较分析
Keepalived百度百科
高可用开源方案 Keepalived VS Heartbeat对比

2.Sqoop用起来感觉怎样?
说实话,Sqoop在导入数据的速度上确实十分感人,通过进一步了解,发现Sqoop1和Sqoop2在架构上还是有明显不同的,无论是从数据类型上还是从安全权限,密码暴露方面,Sqoop2都有了明显的改进,同时同一些其他的异构数据同步工具比较,如淘宝的DataX或者Kettle相比,Sqoop无论是从导入数据的效率上还是从支持插件的丰富程度上,Sqoop还是相当不错滴!!

3.ZooKeeper的角色以及相应的Zookepper工作原理?
果然,人的记忆力是有衰减曲线的,当面试官抛出这个问题后,前者角色,我只答出了两种(leader和follower),后者原理压根就模糊至忘记了。所以恶补了一下,涉及到Zookeeper的角色大概有如下四种:leader、learner(follower)、observer、client。其中leader主要用来决策和调度,follower和observer的区别仅仅在于后者没有写的职能,但都有将client请求提交给leader的职能,而observer的出现是为了应对当投票压力过大这种情形的,client就是用来发起请求的。而Zookeeper所用的分布式一致性算法包括leader的选举其实和-原始部落的获得神器为酋长,或者得玉玺者为皇帝类似,谁id最小,谁为leader,会根据你所配置的相应的文件在相应的节点机下生成id,然后相应的节点会通过getchildren()这个函数获取之前设置的节点下生成的id,谁最小,谁是leader。并且如果万一这个leader挂掉了或者堕落了,则由次小的顶上。而且在配置相应的zookeeper文件的时候回有类似于如下字样的信息:Server.x=AAAA:BBBB:CCCC。其中的x即为你的节点号哈,AAAA对应你所部属zookeeper所在的ip地址,BBBB为接收client请求的端口,CCCC为重新选举leader端口。

相关参考文献:
Zookeeper基本介绍

4.HBase的Insert与Update的区别?
这个题目是就着最近的一次项目问的,当时实现的与hbase交互的三个方法分别为insert、delete、update。由于那个项目是对接的一个项目,对接的小伙伴和我协商了下,不将update合并为insert,如果合并的话,按那个项目本身,其实通过insert执行overwrite相当于间接地Update,本质上,或者说在展现上是没什么区别的包括所调用的put。但那仅仅是就着那个项目的程序而言,如果基于HBase shell层面。将同一rowkey的数据插入HBase,其实虽然展现一条,但是相应的timestamp是不一样的,而且最大的版本数可以通过配置文件进行相应地设置。

相关参考文献:
hbase shell&java 获取多版本的值 .

大数据工程师(开发)面试

  1. Java的第三方模块你用过哪些?
    我:也没有刻意去记,所以也没说出来。
    补:技术干货:十个非常有用的第三方Java开源库
    细数一下,上述所列十个里,大致用过1/2。

  2. Python的第三方模块你用过哪些?
    我:爬虫所用urllib,urllib2
    补:模块和包.那些让你相见恨晚的PYTHON第三方好用的模块儿和包?

  3. 你用你的程序调度Kylin以及承接数据失败怎么办?
    我:在调度之前有落地策略,所以不用担心
    面试官:如果落地之前,程序就停止运行了怎么办?
    我:因为当初并没有遇见或者着重这个问题,所以并没有考虑到相应的解决策略。
    补:确实,数据落地是可靠性的一种保障,而保障本身也需要保障,之前工作中没有遇见,所以没有细加思考,现在想想,我们不妨借助
    下图Spark的一种故障恢复的手段进行发散:

可靠

Spark的失败恢复和Hadoop的checkpoint有异曲同工之妙,就是在落地的时候并不是光落地个数据,同时也会落地相应的计算(操作)。所以落地前崩溃怎么办?我们可以设想一种方式进行数据操作的记录,这样子等失败后重启,依据相应的记录可以实现断点重传的效果。再有甚者,遇到相当极端的情形,导致代码逻辑层面无法解决,那么就从架构层面解决;架构层面如果无法解决,那么就从运维层面解决;运维层面无法解决,那么就从产品层面去解决。

4.Kylin有哪些组件?
我:Kylin极其的友好,是非侵入式的,所以谈不上组件,Hive只是作为Kylin的MetaData,HBase只是作为Kylin Cube的MetaData。
补:其实这个问题,如果换成Kylin的组织架构怎么样?可能会答的好一点,因为当时的我已经沉醉在Kylin友好的非侵入式中无法自拔,所以从Hadoop般宏观层面去了解组件这个概念,比如Sqoop、HBase、Hive都可以说成是Hadoop的组件,但是他们每个单独拿出来,又何尝不是大数据圈中一等一的神器呢?所以如果说他们是Kylin的组件,一来有种臣服之感,二来也不能体现Kylin的友好非侵入。后来,查阅资料,对组件这个概念有了更深的了解,比如在某种层面上它又可以称之为模块,每个系统可以有很多的模块构成,而这些个模块就类似于组成这个系统的部件,所以唤之组件也未尝不可呀~
kylin(一): 原理架构

  1. 谈一谈,你心目中的Restful API?
    我:对于Restful API的理解,个人仅限于使用层面。DELETE用来删除,GET用来获取,POST和PUT不同,POST用来更新,PUT用来创建。
    面试官:你能认识到POST和PUT的不同很好,但,刚好说反了,POST可以创建,PUT可以更新。
    补:所以恶补了一下:

Restful

同时,借助这个题目,对于人的决策也产生了一定的思考,如果将使用这种行为类比成训练,而通过它获得的经验可以类比成模型,而通过这种模型可以指导我们进行决策。在我个人使用Restful的接口中,比如ES学习的时候,有这个需求,我就是通过POST进行相同数据不同ID的数据的更新的,也就是非幂等的更新,不属于常用资源的已知更新,所以这种使用训练在我脑海中生成了一个模型,这个模型在被调用,也就相当于有新数据集进来时,指导我的决策就成了POST可以更新,而还有一个模型是POST和PUT使用上要注意,它们不同,所以两者一结合,指导我的决策是POST用来更新,PUT用来创建。而这道题目本身训练出来的模型给我指导的决策是模型的正确性是由训练方式的正确性决定的,而训练方式的正确性又包括逻辑上的正确,以及多样性的保证不能以偏概全;同时训练方式的正确性很大一部分又取决于原始数据集的正确性;牵一发而动全身,不容疏忽!

大数据工程师(ETL)面试

  1. 你觉得Spark和Hadoop的区别是什么,请简要说一说?
    我:Hadoop适合离线分析,是批处理;Spark适合实时分析,是近实时流,微批处理。

  2. 你觉得Python和Java在使用起来,有什么区别?
    我:其实自己在平时使用的时候,并没有过度割裂开这两种,因为毕竟自己是结果导向所以无论Python的缩进格式还是Java的要加逗号,最后可以实现我的需求就可以了。
    补:如今,再来审视这个问题,会发现其实在使用过程中,Python,Java确实有一些需要你拐个弯注意下的,比如【Python】list的remove函数和【Java】list的re

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值