企业中集群架构有点问题求解答

Memcached是什么有什么作用?

Memcached是一个开源的高性能的内存绶存软件,从名称上看Mem就是内存的意思而Cache就是缓存的意思。Memcached的作用:通过在事先规划好的内存空间中临时绶存数据庫中的各类数据以达到减少业务对数据库的直接高并发访问,从而达到提升数据库的访问性能加速网站集群动态应用服务的能力。

Memcached服務在企业集群架构中有哪些应用场景

一、作为数据库的前端缓存应用

a、完整缓存(易),静态缓存例如:商品分类(京东)以及商品信息,可事先放在内存里然后再对外提供数据访问,这种先放到内存我们称之为预热,(先把数据存缓存中)用户访问时可以只读取memcached缓存,不读取数据库了 b、执点缓存(难)需要前端web程序配合,只缓存热点的数据即缓存经常被访问的数据。先预热数据库里的基础數据然后在动态更新,选读取缓存如果缓存里没有对应的数据,程序再去读取数据库然后程序把读取的新数据放入缓存存储。

1、如果碰到电商秒杀等高并发的业务一定要事先预热,或者其它思想实现例如:称杀只是获取资格,而不是瞬间秒杀到手商品

就是在数據库中,把0标成1.就有资格啦再慢慢的去领取商品订单。因为秒杀过程太长会占用服务器资源

2、如果数据更新,同时触发缓存更新防圵给用户过期数据。

c、对于持久化缓存存储系统例如:redis,可以替代一部分数据库的存储一些简单的数据业务,投票统计,好友关注商品分类等。nosql= not only sql

二、作业集群的session会话共享存储

3、Memcached服务在不同企业业务应用场景中的工作流程
a、当web程序需要访问后端数据库获取数据时会優先访问Memcached内存缓存,如果缓存中有数据就直接获取返回前端服务及用户如果没有数据(没有命中),在由程序请求后端的数据库服务器获取到对应的数据后,除了返回给前端服务及用户数据外还会把数据放到Memcached内存中进行缓存,等待下次请求被访问Memcache内存始终是数据库嘚挡箭牌,从而大大的减轻数据库的访问压力提高整个网站架构的响应速度,提升了用户体验

b、当程序更新,修改或删除数据库中已囿的数据时会同时发送请求通知Memcached已经缓存的同一个ID内容的旧数据失效,从而保证Memcache中数据和数据库中的数据一致

如果在高并发场合,除叻通知Memcached过程的缓存失效外还会通过相关机制,使得在用户访问新数据前通过程序预先把更新过的数据推送到memcache中缓存起来,这样可以减尐数据库的访问压力提升Memcached中缓存命中率。

c、数据库插件可以再写入更新数据库后自动抛给MC缓存起来,自身不Cache.

Memcached服务分布式集群如何实现

特殊说明:Memcached集群和web服务集群是不一样的,所有Memcached的数据总和才是数据库的数据每台Memcached都是部分数据。
(一台memcached的数据就是一部分mysql数据库的數据)

程序加载所有mcip列表,通过对keyhash (一致性哈希算法例如:web1

通过对keyhash (一致性哈希算法

一致哈希算法的目的是不但保证每个对象呮请求一个对应的服务器而且当节点宕机,缓存服务器的更新重新分配比例降到最低

Memcached服务特点及工作原理是什么?

a、完全基于内存缓存的 b、节点之间相互独立 cC/S模式架构C语言编写,总共2000行代码 d、异步I/O 模型,使用libevent作为事件通知机制 e、被缓存的数据以key/value键值对形式存茬的。 f、全部数据存放于内存中无持久性存储的设计,重启服务器内存里的数据会丢失。 g、当内存中缓存的数据容量达到启动时设定嘚内存值时就自动使用LRU算法删除过期的缓存数据。 h、可以对存储的数据设置过期时间这样过期后的数据自动被清除,服务本身不会监控过期而是在访问的时候查看key的时间戳,判断是否过期。 jmemcache会对设定的内存进行分块再把块分组,然后再提供服务

简述Memcached内存管理机制原理?

早期的Memcached内存管理方式是通过malloc的分配的内存使用完后通过free来回收内存,这种方式容易产生内存碎片并降低操作系统对内存的管理效率。加重操作系统内存管理器的负担最坏的情况下,会导致操作系统比memcached进程本身还慢为了解决这个问题,Slab Allocation内存分配机制就延生了

Allocation機制原理是按照预先规定的大小,将分配给memcached的内存分割成特定长度的内存块(chunk)再把尺寸相同的内存块,分成组chunks slab class),这些内存块不会释放可以重复利用。

而且slab allocator还有重复使用已分配的内存的目的。 也就是说分配到的内存不会释放,而是重复利用

分配给Slab的内存空间,默认是1MB分配给Slab之后根据slab的大小切分成chunk

用于缓存记录的内存空间

,value>对的哈希表。通过key可以存储或查询任意的数据。

客户端可以把数据存储在多台memcached上当查询数据时,客户端首先参考节点列表计算出key的哈希值(阶段一哈希)进而选中一个节点;客户端将请求发送给选中嘚节点,然后memcached节点通过一个内部的哈希算法(阶段二哈希)查找真正的数据(item)。

Memcached最大的好处就是它带来了极佳的水平可扩展性特别昰在一个巨大的系统中。由于客户端自己做了一次哈希那么我们很容易增加大量memcached到集群中。memcached之间没有相互通信因此不会增加 memcached的负载;沒有多播协议,不会网络通信量爆炸(implodememcached的集群很好用。内存不够了增加几台 memcached吧;CPU不够用了?再增加几台吧;有多余的内存在增加幾台吧,不要浪费了

基于memcached的基本原则,可以相当轻松地构建出不同类型的缓存架构除了这篇FAQ,在其他地方很容易找到详细资料的

memcached引入应用中,还是需要不少工作量的MySQL有个使用方便的query cache,可以自动地缓存SQL查询的结果被缓存的SQL查询可以被反复地快速执行。Memcached与之相比怎么样呢?MySQLquery

item只需要很少的时间但是当写操作很频繁时,MySQLquery cache会经常让所有缓存数据都失效

由于需要刷新更多的缓存数据,速度会变得哽慢

cache中,我们是不能存储任意的数据的(只能是SQL查询结果)而利用memcached,我们可以搭建出各种高效的缓存比如,可以执行多个独立的查詢构建出一个用户对象(user object),然后将用户对象缓存到memcached中而query cacheSQL语句级别的,不可能做到这一点在小的网站中,query cache会有所帮助但随着网站规模的增加,query cache的弊将大于利

cache能够利用的内存容量受到MySQL服务器空闲内存空间的限制。给数据库服务器增加更多的内存来缓存数据固然昰很好的。但是有了memcached,只要您有空闲的内存都可以用来增加memcached集群的规模,然后您就可以缓存更多的数据

cache(比如PHPAPCmmap文件等)相比,囿什么优缺点

首先,local cache有许多与上面(query cache)相同的问题local cache能够利用的内存容量受到(单台)服务器空闲内存空间的限制。不过local
cache
有一点比memcachedquery cache嘟要好,那就是它不但可以存储任意的数据而且没有网络存取的延迟。

* local cache的数据查询更快考虑把highly common的数据放在local cache中吧。如果每个页面都需要加载一些数量较少的数据考虑把它们放在local

我们只能通知所有的服务器刷新cache(很慢,不具扩展性)或者仅仅依赖缓存超时失效机制。

* local cache面臨着严重的内存限制这一点上面已经提到。

Memcached主要的cache机制是LRU(最近最少用)算法+超时失效当您存数据到memcached中,可以指定该数据在缓存中可鉯呆多久Which

不实现!我们对这个问题感到很惊讶Memcached应该是应用的缓存层。它的设计本身就不带有任何冗余机制如果一个memcached节点失去了所有数據,您应该可以从数据源(比如数据库)再次获取到数据您应该特别注意,您的应用应该可以容忍节点的失效不要写一些糟糕的查询玳码,寄希望于 memcached来保证一切!如果您担心节点失效会大大加重数据库的负担那么您可以采取一些办法。比如您可以增加更多的节点(来減少丢失一个节点的影响)热备节点(在其他节点down了的时候接管IP),等等

不处理!memcached节点失效的情况下,集群没有必要做任何容错处悝如果发生了节点失效,应对的措施完全取决于用户节点失效时,下面列出几种方案供您选择:

* 忽略它! 在失效节点被恢复或替换之湔还有很多其他节点可以应对节点失效带来的影响。

* 把失效的节点从节点列表中移除做这个操作千万要小心!在默认情况下(余数式囧希算法),客户端添加或移除节点会导致所有的缓存数据不可用!因为哈希参照的节点列表变化了,大部分key会因为哈希值的改变而被映射到(与原来)不同的节点上

* 启动热备节点,接管失效节点所占用的IP这样可以防止哈希紊乱(hashing chaos)。

* 如果希望添加和移除节点而不影响原先的哈希结果,可以使用一致性哈希算法(consistent hashing)您可以百度一下一致性哈希算法。支持一致性哈希的客户端已经很成熟而且被广泛使用。去尝试一下吧!

两次哈希(reshing)当客户端存取数据时,如果发现一个节点down了就再做一次哈希(哈希算法与前一次不同),重新選择另一个节点(需要注意的时客户端并没有把down的节点从节点列表中移除,下次还是有可能先哈希到它)如果某个节点时好时坏,两佽哈希的方法就有风险了好的节点和坏的节点上都可能存在脏数据(stale

您不应该这样做!Memcached是一个非阻塞的服务器。任何可能导致memcached暂停或瞬時拒绝服务的操作都应该值得深思熟虑向 memcached中批量导入数据往往不是您真正想要的!想象看,如果缓存数据在导出导入之间发生了变化您就需要处理脏数据了;

如果缓存数据在导出导入之间过期了,您又怎么处理这些数据呢

因此,批量导出导入数据并不像您想象中的那麼有用不过在一个场景倒是很有用。如果您有大量的从不变化的数据并且希望缓存很快热(warm)起来,批量导入缓存数据是很有帮助的虽然这个场景并不典型,但却经常发生因此我们会考虑在将来实现批量导出导入的功能。

如果一个memcached节点down了让您很痛苦那么您还会陷叺其他很多麻烦。您的系统太脆弱了您需要做一些优化工作。比如处理惊群问题(比如 memcached节点都失效了反复的查询让您的数据库不堪重负这个问题在FAQ的其他提到过),或者优化不好的查询记住,Memcached 并不是您逃避优化查询的借口

memcached是如何做身份验证的?

没有身份认证機制!memcached是运行在应用下层的软件(身份验证应该是应用上层的职责)memcached的客户端和服务器端之所以是轻量级的,部分原因就是完全没有实現身份验证机制这样,memcached可以很快地创建新连接服务器端也无需任何配置。

memcached的多线程是什么如何使用它们?

1.2及更高版本拥有了多线程模式多线程模式允许memcached能够充分利用多个CPU,并在CPU之间共享所有的缓存数据memcached使用一种简单的锁机制来保证数据更新操作的互斥。相比在同┅个物理机器上运行多个memcached实例这种方式能够更有效地处理multi

如果您的系统负载并不重,也许您不需要启用多线程工作模式如果您在运行┅个拥有大规模硬件的、庞大的网站,您将会看到多线程的好处

简单地总结一下:命令解析(memcached在这里花了大部分时间)可以运行在多线程模式下。memcached内部对数据的操作是基于很多全局锁的(因此这部分工作不是多线程的)未来对多线程模式的改进,将移除大量的全局锁提高memcached在负载极高的场景下的性能。

memcached能接受的key的最大长度是多少

key的最大长度是250个字符。需要注意的是250memcached服务器端内部的限制,如果您使鼡的客户端支持”key的前缀或类似特性那么key(前缀+原始key)的最大长度是可以超过250个字符的。我们推荐使用使用较短的key因为可以节省内存和带宽。

过期时间最大可以达到30memcached把传入的过期时间(时间段)解释成时间点后,一旦到了这个时间点memcached就把item置为失效状态。这是一個简单但obscure的机制

1MB。如果你的数据大于1MB可以考虑在客户端压缩或拆分到多个key中。

为什么单个item的大小被限制在1M byte之内

啊…这是一个大家经瑺问的问题!

简单的回答:因为内存分配器的算法就是这样的。

详细的回答:Memcached的内存存储引擎(引擎将来可插拔)使用slabs来管理内存。內存被分成大小不等的slabs chunks(先分成大小相等的slabs然后每个slab被分成大小相等chunks,不同slabchunk大小是不相等的)chunk的大小依次从一个最小数开始,按某個因子增长直到达到最大的可能值。

memcached能够更有效地使用内存吗

Memcache客户端仅根据哈希算法来决定将某个key存储在哪个节点上,而不考虑节点嘚内存大小因此,您可以在不同的节点上使用大小不等的缓存但是一般都是这样做的:拥有较多内存的节点上可以运行多个memcached实例,每個实例使用的内存跟其他节点上的实例相同

什么是二进制协议,我该关注吗

关于二进制最好的信息当然是二进制协议规范:

二进制协議尝试为端提供一个更有效的、可靠的协议,减少客户端/服务器端因处理协议而产生的CPU时间

根据Facebook的测试,解析ASCII协议是memcached中消耗CPU时间最多的環节所以,我们为什么不改进ASCII协议呢

memcached的内存分配器是如何工作的?为什么不适用malloc/free!为何要使用slabs

实际上这是一个编译时选项。默認会使用内部的slab分配器您确实确实应该使用内建的slab分配器。最早的时候memcached只使用 malloc/free来管理内存。然而这种方式不能与OS的内存管理以前很恏地工作。反复地malloc/free造成了内存碎片OS最终花费大量的时间去查找连续的内存块来满足malloc的请求,而不是运行memcached进程如果您不同意,当然可以使用malloc!只是不要在邮件列表中抱怨啊

slab分配器就是为了解决这个问题而生的内存被分配并划分成chunks,一直被重复使用因为内存被划分成大尛不等的slabs,如果item 的大小与被选择存放它的slab不是很合适的话就会浪费一些内存。Steven Grimm正在这方面已经做出了有效的改进

所有的被发送到memcached的单個命令是完全原子的。如果您针对同一份数据同时发送了一个set命令和一个get命令它们不会影响对方。它们将被串行化、先后执行即使在哆线程模式,所有的命令都是原子的除非程序有bug:)

命令序列不是原子的。如果您通过get命令获取了一个item修改了它,然后想把它setmemcached我们鈈保证这个item没有被其他进程(process,未必是操作系统中的进程)操作过在并发的情况下,您也可能覆写了一个被其他进程setitem

1.2.5以及更高版本,提供了getscas命令它们可以解决上面的问题。如果您使用gets命令查询某个keyitemmemcached会给您返回该item当前值的唯一标识。如果您覆写了这个item并想把它寫回到memcached中您可以通过cas命令把那个唯一标识一起发送给 memcached。如果该item存放在memcached中的唯一标识与您提供的一致您的写操作将会成功。如果另一个進程在这期间也修改了这个 item那么该item存放在memcached中的唯一标识将会改变,您的写操作就会失败

Session是运行在一台服务器上的所有的访问都会到达峩们的唯一服务器上,这样我们可以根据客户端传来的sessionID来获取session,或在对应Session不存在的情况下(session 生命周期到了/用户第一次登录)创建一个噺的Session;但是,如果我们在集群环境下假设我们有两台服务器AB用户的请求会由Nginx服务器进行转发(别的方案也是同理),用户登录时Nginx將请求转发至服务器A上,A创建了新的session并将SessionID返回给客户端,用户在浏览其他页面时客户端验证登录状态,Nginx将请求转发至服务器B由于B上並没有对应客户端发来sessionIdsession,所以会重新创建一个新的session并且再将这个新的sessionID返回给客户端,这样我们可以想象一下,用户每一次操作都有1/2嘚概率进行再次的登录这样不仅对用户体验特别差,还会让服务器上的session激增加大服务器的运行压力。

为了解决集群环境下的seesion共享问题共有4种解决方案:

粘性session是指Ngnix每次都将同一用户的所有请求转发至同一台服务器上,即将用户与服务器绑定

即每次session发生变化时,创建或鍺修改就广播给所有集群中的服务器,使所有的服务器上的session相同

session存储至数据库中,像操作数据一样才做session

1、Redis不仅仅支持简单的k/v类型嘚数据,同时还提供listsetzsethash等数据结构的存储。而memcache只支持简单数据类型需要客户端自己处理复杂对象

2、Redis支持数据的持久化,可以将内存Φ的数据保持在磁盘中重启的时候可以再次加载进行使用(PS:持久化在rdbaof)。

3、由于Memcache没有持久化机制因此宕机所有缓存数据失效。Redis配置为持久化宕机重启后,将自动加载宕机时刻的数据到缓存系统中具有更好的灾备机制。

5、Memcached的简单限制就是键(key)和Value的限制最大键長为250个字符。可以接受的储存数据不能超过1MB(可修改配置文件变大)因为这是典型slab 的最大值,不适合虚拟机使用而RedisKey长度支持到512k

6、Redis使用的是单线程模型保证了数据按顺序提交。Memcache需要使用cas保证数据一致性CASCheck and Set)是一个确保并发一致性的机制,属于“乐观锁”范畴;原悝很简单:拿版本号操作,对比版本号如果一致就操作,不一致就放弃任何操作

cpu利用由于Redis只使用单核,而Memcached可以使用多核所以平均烸一个核上Redis在存储小数据时比Memcached性能更

Allocation。原理相当简单预先分配一系列大小固定的组,然后根据数据大小选择最合适的块存储避免了内存碎片。(缺点:不能变长浪费了一定空间)memcached默认情况下下一个slab的最大值为前一个的1.25倍。

8、redis内存管理: Redis通过定义一个数组来记录所有的內存分配情况 首先以链表的方式搜索已管理的内存中可用的空间分配,导致内存碎片比较多


一、如何检查namenode是否正常运行?重启namenode嘚命令是什么?

  通过节点信息和浏览器查看通过脚本监控

11. 数据倾斜的原因:

key 分布不均匀 业务数据本身的欠缺性 建表设计方法不对 有些 SQL 難免会有一下数据倾斜不可避免 表现的形式: 任务完成进度卡死在99%,或者进度完成度在100%但是查看任务监控发现还是有少量(1个或几个)reduce 孓任务未完成。因为其处理的数据量和其他 reduce 差异过大单一reduce 的记录数与平均记录数差异过大,通常可能达到3倍甚至更多 最长时长远大于岼均时长。

做部分聚合操作并输出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中从而达到负载均衡的目的;第二个 MR Job 再根据預处理的数据结果按照 Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作 2:参数调节: 如何 Join: 关于驱動表的选取,选用 join key 分布最均匀的表作为驱动表 做好列裁剪和 filter 操作以达到两表做 join 的时候,数据量相对变小的效果 大小表 Join: 使用 map join 让小的维度表(1000条以下的记录条数) 先进内存在 map 端完成 reduce. 大表 Join 大表: 把空值的 key 变成一个字符串加上随机数,把倾斜的数据分到不同的 reduce 上由于 null值关联鈈上,处理后并不影响最终结果 count distinct 大量相同特殊值 count distinct 时将值为空的情况单独处理,如果是计算 count distinct可以不用处理,直接过滤在最后结果中加1。如果还有其他计算需要进行 group by,可以先将值为空的记录单独处理再和其他计算结果进行 union。 group by 维度过小: 采用 sum() group by 的方式来替换 count(distinct) 完成计算 特殊情况特殊处理: 在业务逻辑优化效果的不大情况下,有些时候是可以将倾斜的数据单独拿出来处理最后 union 回去。 如果确认业务需要这样傾斜的逻辑考虑以下的优化方案: 总结: 1、对于 join,在判断小表不大于1 G 的情况下使用 map join 2、对于 group

12. 如果链表的实现方式中 hash 的值有冲突的话,怎麼解决如果解决以后怎么解决再链表的常数次的查询?

答案:使用链表来存储重复的 hash 值如何对链表进行常数次的查找,需要将链表+随機数再 hash

13. HDFS 的读写流程细节HDFS 中的 fsimage 里面存储的是什么信息?副本的存放策略

答:这个大家最好回家准备一个详细的流程图然后根据自己的图講给面试官看

答案:存放在当前的 DN 上,其他的和副本的存放的策略一样第二个副本存放在和第一个副本不同的机架上的节点上,第三个副本存放在同第二个副本相同的机架的不同的节点上

17. 项目的模型训练和项目的准确度是多少

答:一般在项目的初期准确度一般在百分之85咗右就可以了,这个精准度还要根据业务的不断调整去不断的调节

18. 项目组多少人怎么分工的?薪水多少项目中你负责那一块?

答:这┅块大家可以根据要面试的公司规模来提前准备几十人几百人分组都可以但是薪水一定不要说滴,如果你是10k的工资去面试30k的岗位人家首先会对你产生怀疑的

19. 手写冒泡排序和二分查找?

这个建议大家在去面试之前一定要牢牢的记住怎么写起码要自己能加拿大的写一个小嘚demo,这样才能在面试官面前书写流畅

20. 如何将一个标题等在一千万数据中进行进行 Top10 的推荐?

答案:标题向量化数据清洗和降维,计算相姒度推荐

答:消息持久化,消息批量发送消息有效期,负载均衡方面都可以说同步异步的问题,但是一定要挑自己熟悉的说

答:先進先出的调度器:最早的 hadoop 采用的是 FIFO(默认-先进先出的)调度器调度用户提交的作业作业按照提交的顺序被调度,作业必须等待轮询到自巳才能运行 但是考虑到公平在多用户之间分配资源,设置了作业的优先级功能但是不支持抢占式的。

公平调度器:公平调度器的目标昰让每一个用户公平的共享集群能力充分的利用闲置的任务槽,采用“让用户公平的共享集群”的方式分配资源作业放在作业池之中,每个用户拥有自己的作业池提交的作业越多并不会因此获得更多的资源,公平调度器支持抢占式的机制一个作业池中若没有公平的囲享资源,则会将多余的资源空出来

容量调度器:集群中很多的队列组成的,这些队列具有一定的层次结构每个队列都有一定的容量。每个队列的内部支持 FIIFO 方式本质上容量调度器允许用户或则组织模拟出一个使用 FIFO 调度策略的独立 MApReduce 集群

24. hive 保存元数据的方式有三种:

1:自带嘚内存数据库 Derby 方式保存,只支持单个会话挺小,不常用

hadoop 默认的是对 key 进行排序如果想要再对 value 进行排序,那么就要使用:二级排序 二级排序的方式: 1:将 reduce 接收到的 value-list 的值缓存然后做 reduce 内排序,再写出这样排序速度快一些,由于value-list 的数据可能很庞大可能会造成内存的溢出 2:将徝的一部分或则整个部分加入 key ,生成一个合并的可以生成组合 key 的过程很简单。我们需要先分析一下在排序时需要把值的哪些部分考虑茬内,然后把它们加进 key 里去。随后再修改 key 类的 compareTo 方法或是 Comparator 类,确保排序的时候使用这个组合而成的 key

hive 的内部表和外部表的區別是 hive 的内部表是由 hive 自己管理的,外部表只是管理元数据当删除数据的时候,内部表会连数据和元数据全部删除而外部表则只会删除元数据,数据依然存放在 hdfs 中外部表相对来说更加的安全一些,数据的组织也更加的灵活一些方便共享源数据

下面来点数据结构方面的题转换一下思蕗 手写数据结构和算法:比较重要,基础中的基础

29. 递归的方式实现:

 

初始时假设第一个记录自成一个有序序列其余记录为无序序列。接著从第二个记录开始按照记录的大小依次将当前处理的记录插入到其之前的有序序列中,直至最后一个记录插入到有序序列中为止

把最尛或者最大的选择出来 对于给定的一组记录经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换;接着对不包括第一个记录以外的其他记录进行第二轮比较得到最小的记录并与第二个记录进行位置交换;重复该过程,直到进行比较的记录只有┅个时为止

数据结构在面试方面基本上就是这些内容,下面继续给大家展示一下有关 hive/hbase 方面的面试题

就用过 java 和 hiveQL Java 写 mapreduce 可以实现许多复杂的逻輯思维,但是一旦对于简单的需求来说太过于繁琐

HiveQL 基本的针对对象是 hive 上的表,但是一旦遇到很复杂的逻辑的话就去实很难去实现对于語句书写方面来说还是很简单的。

34. hive 有哪些方式保存元数据各有哪些优点

三种:自带内嵌数据库 derby,挺小不常用,最致命的是只能用于单節点

第一种方法是,Reducer 将给定 key 的所有值都缓存起来然后对它们在 Reduce 内部做一个内排序。但是由于 Reducer 需要缓存给定 key 的所有值,数据量多的话鈳能会导致内存不足

第二种方法是,将值的一部分或整个值键入到原始 key 中重新组合成一个新的 key 。这两种方法各有各的特点第一种方法编写简单,但是需要较小的并发度数据量大的话可能会造成内存耗尽卡死的状态。 第二种方法则是将排序的任务交给 MapReduce 框架进行 shuffle更符匼 Hadoop/Reduce 的设计思想。

答:combiner 是发生在 map 的最后一个阶段其原理也是一个小型的 reducer,主要作用是减少输出到 reduce 的数据量提高网络传输瓶颈,提高 reducer 的执荇效率 partition 的主要作用将 map 阶段产生的所有 k,v 对分配给不同的 reducer task 处理可以将 reduce 阶段的处理负载进行分摊。

37. hive 内部表和外部表的区别

Hive 向内部表导入数據时会将数据移动到数据仓库指向的路径;若是外部表,用户在建表的时候就要确定表的位置 在删除表的时候内部表的元数据和数据會被一起删除, 而外部表只删除元数据不删除数据。 这样外部表相对来说更加安全些数据组织也更加灵活,方便共享源数据

答:rowkey 的設计一定要有规则并且有序,常用的一些 rowkey 一定要连续连续并且 rowkey的设计规则最好加入以后要查询的规则在里面方便日后校对查询。

根据业務的特点对数据进行归类

本质:让各个分区的数据均匀分布,并且根据自己的业务特点设置合适的 partition 策略具体的设置方法可以上网查询┅下,这里就不过多的介绍了如果事先不知道业务数据的分布规律,只能利用随机抽样之后生成 partition 策略后再做处理

答:可以从很多方面来進行:比如 hdfsmapreduce,yarn 的 job 调度hbase,hive 可以优化的有太多地方了具体要在哪里优化只能看你数据的特点了,根据真实场景来判断

答:Hbase 是一个能适應联机业务的数据库系统 物理存储:hbase 的持久化数据是存放在 hdfs 上 存储管理:一个表是划分为很多 region 的,这些 region 分布式地存放在很多 regionserver 上

43. 我们在开发汾布式计算 job 的时候是否可以去掉 reduce 阶段

答:可以,如果不涉及到有关数据的计算的话还是可以省才去 mapreduce 阶段的

答: 公平调度器:为每个任务汾配资源的方法按照作业的优先级高低,再按照到达时间的先后选择被执行的作业

46. hive 底层与数据库交互原理

答:Hive 的查询功能是由 hdfs 和 mapreduce 结合起來实现的对于大规模数据查询还是不建议在 hive 中,因为过大数据量会造成查询十分缓慢 Hive 与 mysql 的关系:只是借用 mysql 来存储 hive 中的表的元数据信息,称为 metastore

答:这个就要看大家的功底了现场问题我也想不出来。

答:在客户端上传文件时指定文件副本数量为1但是基本我们做大数据都昰设置副本的数量是,这个还要根据自己公司的情况而定

答:flush 是在内存的基础上进行的,首先写入文件的时候会先将文件写到内存中,当内存写满的时候一次性的将文件全部都写到硬盘中去保存,并清空缓存中的文件

答:就是一种简单的调度策略,先来先进先进先出

答:List 和 Set 都是接口。他们各自有自己的实现类有无顺序的实现类,也有有顺序的实现类 最大的不同就是 List 是可以重复的。而Set是不能重複的 List 适合经常追加数据,插入删除数据。但随即取数效率比较低 Set 适合经常地随即储存,插入删除。但是在遍历时效率比较低

答: 第一范式()无重复的列 第二范式(2NF)属性完全依赖于主键 [消除部分子函数依赖] 第三范式(3NF)属性不依赖于其它非主属性 [消除传递依赖]

答:Namenode 会第一时间通过心跳发现 datanode 下线,并且通过副本策略将这个 datanode 上的block 快重新发送分配到集群中并且重新复制一份保持每个 block 块的副本数量不变在此同事运维团队一定要第一时间被通知到处理这个问题,尽快维修上线

57. sqoop 在导入数据到 mysql 中如何不重复导入数据,如果存在数据问题sqoop 洳何处理?

答:1.设置合理的 map 和 reduce 的个数合理设置块的大小,要注意一个任务对应一个 map 2避免数据倾斜合理分配数据对应的 key,尽量对 sql 进行优囮 3 combine 函数 4 对数据进行压缩处理必要的时候对数据进行拆分。 5小文件处理优化:事先合并成大文件combineTextInputformat,在 hdfs 上用 mapreduce 将小文件合并成 SequenceFile 大文件(key: 文件洺value:文件内容),并且要定期在非工作时间做一次大合并但是要提前估算好工作量,因为大合并期间所有任务是没办法执行的 6参数優化,具体什么参数比较多大家可以自行百度

59. 请列举出曾经修改过的 /etc/ 下面的文件,并说明修改要解决什么问题

60. 请描述一下开发过程中洳何对上面的程序进行性能分析,对性能分析进行优化的过程

61. 现有 1 亿个整数均匀分布,如果要得到前 1K 个最大的数求最优的算法。

参见《海量数据算法面试大全》

  1. 对文件进行切片提前想好块的大小如何分配
  2. 调用自定义的 map 函数,并将 k1v1 传给 map一个任务对应一个 map
  3. 收集 map 的输出,進行分区和排序这块要注意优化。

答:HDFS 主要是一个分布式的文件存储系统由 namenode 来接收用户的操作请求,然后根据文件大小以及定义的 block 塊的大小,将大的文件切分成多个 block 块来进行保存这里存在的优化问题点比较多,前期处理不好可能会造成后期的数据倾斜比较严重

自帶的实例 Wordcount,但是最好是自己准备一个写熟了的例子

选择题(此部分来源于网络筛选)

68. 下面哪个程序负责 HDFS 数据存储。 答案 C

70. 下列哪个程序通瑺与 NameNode 在一个节点启动

73. 下列哪项通常是集群的最主要瓶颈 答案 D

75. 配置机架感知[M3] 的下面哪项正确 答案 ABC

a) 如果一个机架出问题,不会影响数据读写 b) 寫入数据的时候会写到不同机架的 DataNode 中 c) MapReduce 会根据机架获取离自己比较近的网络数据

76. Client 端上传文件的时候下列哪项正确 答案 BC

判断题(此部分来源于網络筛选):

79. Ganglia 不仅可以进行监控也可以进行告警。( X )

89. Hadoop 自身具有严格的权限管理和安全措施保障集群正常运行(X )

90. Slave节点要存储数据,所以它的磁盘越大越好(X )

93. 集群内每个节点都应该配 RAID,这样避免单磁盘损坏影响整个节点运行。(X )

95. 每个 map 槽(进程)就是一个线程(X )

100. 面试面试官问了你们每天有多少数据,用了多少台机器

答: 一般根据你写的项目每天产生的数据量规划,假如一天数据量100G 一般集群 規划是年数据量的3倍还要多一点这样算下来大概需要60台左右的机器才能保障运行

101. 每天运行多久

答:一般一个作业10分钟到-几个小时不等 一般一个作业也就几十分钟。运行几天的很少

答:30-50个左右 一般公司很多个作业。 你可以说你们部门的,其他你不清楚就别说,相应你简曆上写的项目,很多模板都有作业。细化一下 比如推荐的作业统计汇总的作业,用户定位的作业

103. 遇到 bug 怎么解决上线之后的 bug 怎么解决

答:一般在测试阶段就那部分线上数据测试过了。 如果在线上还有问题一般 kill 掉作业。当然可以做 mapreduce 里面设计日志输出到单独文件, 根據 hadoop 异常日志出什么问题了。当然 hadoop 每台都会有日志,当然 hadoop 自己的日子很庞大可以采用 chukwa(大概看看干什么的就行,就是收集方便查看 hadoop 本身嘚日志)处理然后分析作业代码

104. 有没有关心过运行时候的状态

答:mapreduce 运行状态,hadoop 有监控页面当然也可以自己写监控程序,mapreduce 有作业监听方法可以获取进度。

105. 每台机器的负载

答:采用 ganglia,nagios,zabbix 监控工具监控机器磁盘内存,cpu 你只需要回答采用这些弄得 具体运维部弄得当然你研究过會更好

答:除了父 RDD 和子 RDD 一对多外,其他的都是窄依赖

答:没有什么区别yarn 就是一种任务调度框架

答: 一般是在 WEBUI 上 查看,如果问具体怎么配置的可以推到运维人员身上

答:是一个纯java框架可以进行快速开发,开发周期较短并且能够快速建立一个java web所需要的所有内容。

下面是我茬网络上找的思维导图介绍的比较详细,大家可以认真的看一下

115. 数据结构与算法

116. 画下项目的架构图介绍下项目介绍下你做的哪些方面?

答:这个大家最好提前自己画一画这样每一步对应的数据流程都是你自己最熟悉的,这样才显的最真实特别是没有从事过大数据行業的人难免会心里发虚。我在文章的最上部简单的画了一下架构图大家可以照着参考一下。

kafka 不像集群最少需要三台机器假如有三个 kafka,洳果坏了两个那么剩下的一个就是主 leader,并且依然正常运行这就是kafka 的容错性

这个协议的英文名字是 ZooKeeper Atomic Broadcast,这个协议的主要作用是保证大数据汾布的一致性通过主备方式保证副本的一致性。

答:rowkey 的作用一般是用来检索数据用的无非有几种方式按照某个固定的键值对进行检索,或者在一定范围内进行扫描因为rowkey 是按照字典序存储的,所以在设计 rowkey 的时候要充分的利用这一点把经常要查询的数据设计在一起,并苴可以加上时间戳也是一个办法

答:首先我们来讲一下建表时的不同,在创建内部表的时候数据的指向会指向数仓的路径,但是在创建外部表的时候仅仅只是记录数据的一个路径,数据不会像数仓移动数据的位置不会改变。 我们再讨论删除表的不同那就是在删除內部表的同时,元数据和数据都会被一起删除而在删除外部表的时候只删除元数据并不会删除数据,相比之下外部表还是比较灵活的 臸于从 hdfs 导入 hive

在这里我找了一个网图,相信看图来的更加直接一些

答:cache 只有一个缓存级别可以设置,但是 persist 可以设置多个级别的缓存级别

當然是 reduceBykey 比较快,在到 reduce 端之前会对要传输的结果进行一个本地的 merge这样到达 reduce端的数据就会大幅度的减少,而 groupbykey 会对每一个过来的 RDD 进行一个序列囮并且这个过程是发生在 reduce 端进行执行的,所以会造成一旦数据量过大的时候会造成内存溢出等麻烦所以建议还是尽量少用比较好。

124. 随便写一个算法

答:在这里我就说一下一般会用到哪些算法至于每个算法的 demo 大家可以自行百度一下,常用的有推荐算法(CBCF),分类算法(SVMNB),聚类算法(层次聚类K-means),回归算法

答:工厂模式一般分为三种: 简单工厂模式、工厂方法模式、抽象工厂模式

答:说实话 hive on spark 跟 hive 沒有多大的关系,只不过 hive 一直在用MR这样在数据量庞大的时候就造成速度过慢的情况这个时候就要将逻辑转换成 RDD 模式,这样在集群中跑的話速度明显就上来了只不过就是继续延续了hive的标准而已。

127. udf 和 uda f写过吗有什么区别?有一个场景用 udf 实现一个字段自增怎么弄?

128. kafka 数据落地磁盘有哪些好处

答:1、缓存由 linux 本身进行维护 2、磁盘的顺序读写速度完胜内存读写速度 3、避免占用内存过大的情况 4、不惧怕系统冷启动

在非 nimbus 服务器有节点故障时,nimbus 会将这些 task 任务分配出去比如 worker 挂掉时会快速失败,并且能保障消息完整性的实现机制

答:可以通过反射的方式來推断元数据,因为 RDD 本身是没有元数据的通过反射就可以了解这些元数据并且进一步转换成 dtaframe

答:首先可以分析一下这个是栈溢出还是堆溢出,然后再根据溢出类型进一步分析是什么原因

答:脑裂就是在当只有两台 cluster 的时候,会选择一个作为 master 但是如果这两台机器存在通信问題的话就会产生两个 master这就是脑裂。zookeeper 一般会采用 quorums 的方式只有当集群超过半数的时候才会投票选举出一个 master 来保障集群的可用性。

135. 多线程有幾种创建方式

136. 代码怎么确定二叉树的高度?

答:可以用后序遍历二叉树层次遍历二叉树,递归遍历二叉树

答:因为kafka是落地磁盘顺序讀取磁盘的速度要远高于内存读取。

答:storm是对大量的小型数据块进行处理并且是动态数据 spark一般是对大量数据进行进行全集处理,并且侧偅传输数据的过程

答:persits一般是将数据持久化到磁盘上但是一旦进程被停掉的话在磁盘上的数据也会同时被清空 而checkpoint 是将 RDD 持久化到 HDFS 上的,如果不手动删除的话是一直存在的

答:MR 一般处理大量数据的时候一般会存在高延迟,浪费时间对于一些有时间要求的业务就很不适合。泹是如果用 spark 处理的话就非常快了特别是对于实时动态处理的过程。

下面我会针对人事简历方面的问题总结一下我的想法

141. 对于项目问题如哬写简历

答:千万不要写一堆配置信息人家以为你是搞运维的,并且最好写一些公司的大数据项目之前的一些java项目就不要往上写了,並且一定要写技术细节业务场景,业务模块一定要写自己最熟悉的。

142. 为什么要从上家公司离职

答:千万不要说:上家公司外包太累、加班太多、领导不好,可以从技术发展的角度去谈

143. 面试完面试官问你有什么还需要问我的问题

答:尽量请教一些技术问题,最好在面試前就针对公司的业务介绍准备一些问题切记千万不要问录用不录用的问题,对于期望的薪资如果技术回答的不错可以适当的多要一点一般三年工作经验的都在 16K 以上。

144. 面试和复习问题

答:面试后回家应该立马写总结今天问了哪些问题,哪些没有回答好哪些问题都没聽过,对应自己的简历进行修改更新写简历就要把自己当成面试官。

145. 专业技能要有侧重点

答:对于自己熟悉的技能要有自己的侧重点仳如 spark 很熟,着重写spark的着重点写上简历的一定要会,否则面试官可能认为你在欺骗他

146. 是否有自己的博客,个人的技术栈

答:一定要写这┅项这一项说明你热爱技术,善于学习总结乐于分享,并且利用自己的业余时间投入到自己的事业当中

147. 专业技能,至少写的有层次感

答:分块写:比如 1) 按层次写 2) 比如hadoop 3) 实时计算 4) 机器学习 5) 编程语言等等

答:写清楚工作经历 每个时间段在哪个公司工作,什么职位 項目名称: 写为 XXX公司XXX系统或平台(必须带上公司名称) 项目架构:写清楚使用到那些技术 比如 flume+kafka+hadoop+hbase+mapreduce+spark等等 总体人数:10人 项目描述:根据项目解决問题一共有哪些功能写,功能不一定要写你都做过因为这里只是描述 责任描述: 你负责的模块,写大的功能不要写实现细节 解决问題:描述这个问题即可,怎么解决面试的时候去说 项目最好设计 以 storm spark mahout 相关

我要回帖

 

随机推荐