Hadoop面试题汇总(4)

2019-08-30 11:29

出现故障的datanode会从当前的pipeline中移除,剩余的block会继续剩下的datanode中继续以pipeline的形式传输,同时Namenode会分配一个新的datanode,保持 replicas设定的数量。

49、Zookeeper的做什么的

zookeeper是一个开放源码的分布式协调服务,是一种典型的分布式数据一致性解决方案。由雅虎创建,贡献给了apache。 利用zookeeper可以实现数据发布订阅、负载均衡、命名服务、分布式协调/通知、集群管理、分布式锁、分布式队列等功能。

50、NIO是什么

NIO是jdk4提供的一种新的io方式,也叫做非阻塞式IO,特点是可以在非阻塞模式下进行工作,ACCEPT CONNECT READ WRITE时都不会产生阻塞,从而可以解决BIO在高并发场景下遇到的问题。

51、Hbase的细节

hbase中的表在行的方向上分隔为多个HRegion,分散在不同的RegionServer中 这样做的目的是在查询时可以将工作量分布到多个RegionServer中以提高速度 region由[startkey,endkey)表示 HRegion是hbase分布式存储和负载均衡的最小单元 要注意HRegion不在hdfs中,而是在RegionServer的内存中,在内存(其实也有数据在本地文件系统中,因为内存空间毕竟是有限的)中存储数据以提高查询性能,对于修改会将数据同步到hdfs中,以持久化数据。 hbase中的数据按照rowkey的字典顺序(字典顺序!!!先比较第一位如果相同再比较第二位。。。)按序存储,所以当以rowkey查询数据时,可以提高速度。 hregion的分裂,当hregion变的很大时会分裂成两个,存放到不同的RegionServer中,防止一个Region过大,导致查询其中数据时速度很慢 hbase的系统结构:主要有client master regionServer zookeeper

52、什么是分布式

分布式处理则是将不同地点的,或具有不同功能的,或拥有不同数据的多台计算机通过通信网络连接起来,在控制系统的统一管理控制下,协调地完成大规模信息处理任务的计算机系统。

53 函数式编程的好处:

1. 2.

代码简洁,开发快速 接近自然语言,易于理解

3. 更方便的代码管理 4. 易于“并发编程” 5. 代码的热升级(函数式编程没有副作用,只要保证接口不变,内部实现是外部无关的。所以,可以在运行状态下直接升级代码,不需要重启,也不需要停机。)

54在linux中,比如启动hadoop,会打印很多日志,什么命令可以不显示这些日志?

可以通过在命令前增加上nohup命令来实现

55 concurrent 的map 加锁是加部分锁是加的哪部分?

数据分段上

56环形缓冲区集群搭配的作用和优化?

每个MapperTask有一个环形内存缓冲区,用于存储map任务的输出。默认大小100MB(io.sort.mb属性),一旦达到阀值0.8(io.sort.spill.percent),一个后台线程把内容写到(spill)磁盘的指定目录(mapred.local.dir)下的新建的一个溢出写文件。 写磁盘前,要partition,sort,Combiner。如果有后续的数据,将会继续写入环形缓冲区中,最终写入下一个溢出文件中。 环形缓冲区是一种缓冲区技术,通过首尾相接的方式循环使用缓冲区,解决了数据量过大时缓冲区大小过大的问题。

57、 zookeeper原理

leader和所有的follower都可以提供查询功能 只有leader能够提供增删改的功能,如果客户端连接follower表示要进行增删改,follower会将请求转发给leader来处理。 所有的增删改的操作都会有一个版本号,这个版本号是递增唯一的,用来记录提案的顺序。

如何选老大? 选老大情况1:集群刚启动时,谁当老大都可以,一般是最先启动的做老大 选老大情况2:老大挂了,集群会暂时停止对外服务进入选举阶段,所有follower都会广播一个自己的所持有的最高版本给整个集群,当大家收到其他follwoer发过来的最高版本信息后,就会进行投票,投给收到的版本信息最高的follwer,每个机器只能发一票,此时选择集群中数据版本最高的机器做老大,任意一个follower当发现自己收到了过半的投票(自己也可以投给自己),可以认为获得了选举胜利,可以成为leader了。 老大如何决定一个提案是否通过? 如果老大自己说了算,那么如果刚好老大挂了,其他人不知道老大同一的提案,可

能就造成新选出来的leader不知道之前老大同意过的提案,从而造成违反一致性。不可行 如果老大把提案发给所有人,所有人都同意了才能通过提案,这时如果集群中任意一台机器出问题,投票都无法进行,相当于存在单节点故障的可能。不可取。 折中一下,老大收到提案后,发给所有人,所有人收到后都要回复老大,当老大收到过半同意的投票时,则通过这个提案。 这样一来,极端的情况下只要集群中有过半的机器还活着,选出来的老大是一定知道之前老大最后提案的。

!!!引申出来的结论是,zookeeper集群必须过半存活才能正常工作! !!!又引申出来的结论是,偶数台机器提供的集群可靠性和偶数-1台机器提供的可靠性是相同的!所以zookeeper集群中机器的数量最好是基数个。

58、hadoop的namenode可以存那些数据

包括文件和Block之间关系的信息、Block数量信息、Block和DataNode之间的关系信息

59 NIO和BIO

传统的BIO面临的问题: 在执行如下操作时会产生阻塞: ACCEPT CONNECT READ WRITE

在高并发场景下,如上的方法产生的阻塞可能会产生一些无法避免的问题。

在开发服务器程序时,通常针对于每一个客户端都要创建一个线程来处理,而线程的开辟和运行是相当耗费资源的,服务器能够运行的并发线程数量是很有限的。在高并发场景下,大量的客户端并发连接导致服务器创建大量线程,会直接影响服务器的性能。而一些场景下客户端连接后传输的数据并不多,只是保持连接的状态,此时创建的大量线程闲置着浪费服务器资源。所以我们想到用少量的线程来处理多个客户端的连接,但是这种方式下传统BIO会有阻塞的问题决定了是无法实现的。 NIO 也叫做非阻塞式IO,特点是可以在非阻塞模式下进行工作,ACCEPT CONNECT READ WRITE时都不会产生阻塞,从而可以解决BIO在高并发场景下遇到的问题。

BIO:面向流操作的是字节或字符 InputStream OutputStream Reader Writer 流只能单向传输数据操作的是字节或字符 NIO:面向通道操作的是缓冲区 Channel Buffer Selector 通道可以双向的传输数据操作的是缓冲区

60聚类包括那些?一堆数据,怎么用聚类中的一个算法实现?

K-MEANS

k-means 算法接受输入量 k ;然后将n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。 k-means 算法的工作过程说明如下:

首先从n个数据对象任意选择 k 个对象作为初始聚类中心;而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类;

然后再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值);不断重复这一过程直到标准测度函数开始收敛为止。

一般都采用均方差作为标准测度函数. k个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。 K-MEDOIDS(中心法)

K-MEANS有其缺点:产生类的大小相差不会很大,对于脏数据很敏感。 改进的算法:k—medoids 方法。这儿选取一个对象叫做mediod来代替上面的中心的作用,这样的一个medoid就标识了这个类。K-medoids和K-means不一样的地方在于中心点的选取,在K-means中,我们将中心点取为当前cluster中所有数据点的平均值,在 K-medoids算法中,我们将从当前cluster 中选取这样一个点——它到其他所有(当前cluster中的)点的距离之和最小——作为中心点 Clara

上面提到K-medoids算法不适合于大数据量的计算。Clara算法,这是一种基于采样的方法,它能够处理大量的数据。

Clara算法的思想就是用实际数据的抽样来代替整个数据,然后再在这些抽样的数据上利用K-medoids算法得到最佳的medoids。Clara算法从实际数据中抽取多个采样,在每个采样上都用K-medoids算法得到相应的(O1, O2 ? Oi ? Ok),然后在这当中选取E最小的一个作为最终的结果。

61 NIO里面,channel的读写是否必须经过buffer

是的,channel面向通道操作缓冲区。

62hive表的分区和分桶

1、Hive 分区表

在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念。分区表指的是在创建表时指定的partition的分区空间。

Hive可以对数据按照某列或者某些列进行分区管理,所谓分区我们可以拿下面的例子进行解释。

当前互联网应用每天都要存储大量的日志文件,几G、几十G甚至更大都是有可能。存储日志,其中必然有个属性是日志产生的日期。在产生分区时,就可以按照日志产生的

日期列进行划分。把每一天的日志当作一个分区。 将数据组织成分区,主要可以提高数据的查询速度。至于用户存储的每一条记录到底放到哪个分区,由用户决定。即用户在加载数据的时候必须显示的指定该部分数据放到哪个分区。 1.1 实现细节

1、一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。

2、表和列名不区分大小写。

3、分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在, 但是该字段不存放实际的数据内容,仅仅是分区的表示(伪列) 。 2、Hive 桶

对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。 把表(或者分区)组织成桶(Bucket)有两个理由:

(1)获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接(Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。

(2)使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。


Hadoop面试题汇总(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:surfer软件的使用方法

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: