大数据面试题(二)
一、什么是传统的消息传递方法?
传统的消息传递方法有两种:
排队:在队列中,一组用户可以从服务器中读取消息,每条消息都发送给其中一个人。
发布--订阅:在这个模型中,消息被广播给所有的用户。
二、请说明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