1、 HDFS文件读流程?
(1)客户端通过调用FileSystem的open方法获取需要读取的数据文件,对HDFS来说该FileSystem就是DistributeFileSystem
(2)DistributeFileSystem通过RPC来调用NameNode,获取到要读的数据文件对应的bock存储在哪些NataNode之上
(3)客户端先到最佳位置(距离最近)的DataNode上调用FSDataInputStream的read方法,通过反复调用read方法,可以将数据从DataNode传递到客户端
(4)当读取完所有的数据之后,FSDataInputStream会关闭与DataNode的连接,然后寻找下一块的最佳位置,客户端只需要读取连续的流。
(5)一旦客户端完成读取操作之后,就对FSDataInputStream调用close方法来完成资源的关闭操作
2、HDFS文件写操作
(1)客户端通过调用DistributeFileSystem的create方法来创建一个文件
(2)DistributeFileSystem会对NameNode发起RPC请求,在文件系统的名称空间中创建一个新的文件,此时会进行各种检查,比如:检查要创建的文件是否已经存在,如果该文件不存在,NameNode就会为该文件创建一条元数据记录
(3)客户端调用FSDataOututStream的write方法将数据写到一个内部队列中。假设副本数为3,那么将队列中的数据写到3个副本对应的存储的DataNode上。
(4)FSDataOututStream内部维护着一个确认队列,当接收到所有DataNode确认写完的消息后,数据才会从确认队列中删除
(5)当客户端完成数据的写入后,会对数据流调用close方法来关闭相关资源
3、Hive与HBase的对比区别?
Hive
(1)数据仓库
Hive的本质其实就相当于将HDFS中已经存储的文件在Mysql中做了一个双射关系,以方便使用HQL去管理查询。
(2) 用于数据分析、清洗
Hive适用于离线的数据分析和清洗,延迟较高。
(3) 基于HDFS、MapReduce
Hive存储的数据依旧在DataNode上,编写的HQL语句终将是转换为MapReduce代码执行。
HBase
(1) 数据库
是一种面向列存储的非关系型数据库。
(2) 用于存储结构化和非结构化的数据
适用于单表非关系型数据的存储,不适合做关联查询,类似JOIN等操作。
(3) 基于HDFS
数据持久化存储的体现形式是Hfile,存放于DataNode中,被ResionServer以region的形式进行管理。
(4) 延迟较低,接入在线业务使用
面对大量的企业数据,HBase可以直线单表大量数据的存储,同时提供了高效的数据访问速度。
3、Hive内部表和外部表的区别?
创建表时:创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。
删除表时:在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
4、mapReduce中shuffle阶段的工作流程,如何优化shuffle阶段?
分区,排序,溢写,拷贝到对应reduce机器上,增加combiner,压缩溢写的文件。
5、保证kafka数据的容错性、一致性,在集群运行环境过程中,若机器发生宕机了