大数据面试题(二)

一、什么是传统的消息传递方法?

传统的消息传递方法有两种:

排队:在队列中,一组用户可以从服务器中读取消息,每条消息都发送给其中一个人。

发布--订阅:在这个模型中,消息被广播给所有的用户。

二、请说明kafka相对传统技术有什么优势?

Kafka与传统的消息传递技术相比优势在于:

快速:单一的kafka代理可以处理成千上万的客户端,每秒处理数兆字节的读写操作。

可伸缩:在一组机器上对数据进行分区和简化,以支持更大的数据。

持久:消息是持久性的,并在集群中进行复制,以防止数据丢失。

设计:它提供了容错保证和持久性。

三、HDFS是通过什么机制保证数据可靠性的?

主要有以下6点:

1.安全模式:

HDFS刚启动时,namenode进入安全模式,处于安全模式的namenode不能做任何的文件操作,甚至内部的副本创建也是不允许的,namenode此时需要和各个datanode通信,获得datanode存储的数据块信息,并对数据块信息进行检查,只有通过了namenode的检查,一个数据块才被认为是安全的。当认为安全的数据块所占比例达到了某个阈值,namenode才会启动。

2.SecondaryNamenode:

Hadoop中使用SecondaryNameNode来备份namenode的元数据,以便在namenode失效时能从SecondaryNameNode恢复出namenode上的元数据。SecondaryNameNode充当namenode的一个副本,它本身并不处理任何请求,因为处理这些请求都是NameNode的责任。

namenode中保存了整个文件系统的元数据,而SecondaryNameNode的作用就是周期性(周期长短也可配)保存NameNode的元数据。这些源数据中包括文件镜像数据FSImage和编辑日志EditLog。FSImage相当于HDFS的检查点,namenode启动时候会读取FSImage的内容到内存,并将其与EditLog日志中的所有修改信息合并生成新的FSImage;在namenode

运行过程中,所有关于HDFS的修改都将写入EditLog。这样,如果namenode失效,可以通过SecondaryNameNode中保存的FSImage和EditLog数据恢复出namenode最近的状态,尽量减少损失。

3.心跳机制和副本重新创建

为了保证namenode和各个datanode的联系,HDFS采用了心跳机制。位于整个HDFS核心的namenode,通过周期性的活动来检查datanode的活性,像跳动的心脏一样。Namenode周期性向各个datanode发送心跳包,而收到心跳包的datanode要进行回复。因为心跳包是定时发送的,所以namenode就把要执行的命令也通过心跳包发送给datanode,而datanode收到心跳包,一方面回复namenode,另一方面就开始了用户或者应用的数据传输。

如果侦测到datanode失效,namenode之前保存在这个datanode上的数据就变成不可用数据。如果有的副本存储在失效的datanode上,则需要重新创建这个副本,放到另外可用的地方。

4.数据一致性:

一般来讲,datanode与应用交互的大部分情况都是通过网络进行的,而网络数据传输带来的一大问题就是数据是否原样到达。为了保证数据的一致性,HDFS采用了数据校验和(checkSum)机制。创建文件时,HDFS会为这个文件生成一个校验和,校验和文件和文件本身保存在同一空间中。传输数据时会将数据与校验数据和一同传输,应用收到数据后可以进行校验,如果两个校验的结果不同,则文件肯定出错了,这个数据块就变成无效的。如果判定无效,则需要从其他datanode上读取副本。

5.租约:

在linux中,为了防止多个进程向同一个文件写数据的情况,采用了文件加锁的机制。而在HDFS中,同样需要一个机制来防止同一个文件被多个人写入数据。这种机制就是租约(Lease),每当写入数据之前,一个客户端必须获得namenode发放的一个租约。Namenode保证同一个文件只发放一个允许写的租约。那么就可以有效防止多人写入的情况。

6.回滚:

HDFS安装或升级时,会将当前的版本信息保存起来,如果升级一段时间内运行正常,可以认为这次升级没有问题,重新保存版本信息,否则,根据保存的旧版本信息,将HDFS恢复至之前的版本。

四、如何修改hadoop Block Size?

修改方法有两种:

1.修改hdfs块大小的方法的方法

在hdfs-site.xml文件中修改配置块大小的地方,dfs.block.size节点

重启集群后,重新上传文件到hadoop集群中,新增的文件会按照新的块大小存储,旧的不会改变。

2.hadoop指定某个文件的blocksize,而不改变整个集群的blocksize

文件上传的时候,使用下面的命令即可:

hadoop fs -D fs.block.size=134217728 -put local_name remote_location

posted @ 2019-02-24 21:57  sandywei  阅读(162)  评论(0编辑  收藏  举报