Hadoop

1、HDFS的读写流程

读:客户端或者用户通过调用DistributedFileSystem对象的Open方法打开需要读取的文件,DistributedFileSystem通过RPC协议调用NameNode,NameNode返回block块的元数据信息,

客户端根据距离值进行选择DataNode,优先从本地节点读取数据。客户端根据这个地址创建一个FSDataInputStream开始对数据进行读取(以流的方式从DataNode中读取数据),所有的

block都读取完成之后,然后调用close()方法,关闭FSDatainputStream,完成任务。

写:客户端通过调用FileSystem的create()方法来请求NameNode创建新的文件,NameNode会做各种校验比如文件是否存在、有没有权限,如果校验通过,NameNode就会记录下新文件,

否则抛出异常,然后返回一个FSDataOutputStream给客户端用来写入数据,FSDataOutputStream找到三个最合适的DataNode,然后进行同级拷贝,所有的DataNode都接收成功的时候,

调用close()方法关闭写入流,客户端写入的数据最终由DataStreamer来读取。

2、NameNode的主备切换(HA搭建原理)

当引入Zookeeper之后做相关配置,在NameNode进程的节点中,有一个ZKFCFailovercontroller服务,启动后,会启动两个重要的组件(健康监控)和(选择器),健康监控会检测NameNode

的健康状态,如果判断需要进行主备切换,会首先使用选择器来进行自动的主备选举。

3、HDFS中小文件的存储

Hadoop在小文件的处理上不但效率低下,而且十分消耗内存(每个小文件占用一个block,每一个block的元数据都存储在NameNode内存中)。

解决的办法通常是一个容器,将这些小文件统一存储,HDFS提供了两种类型的容器,分别是SequenceFile和MapFile

SequenceFile:

SequenceFile的存储类似于Log文件,所不同的是Log File的每条记录的是纯文本数据,而SequenceFile的每条记录是可序列化的字符数组。

SequenceFile可通过如下API来完成新记录的添加操作:

fileWriter.append(key,value)

MapFile:

MapFile是排序后的SequenceFile,通过观察其目录结构可以看到MapFile由两部分组成,分别是data和index。

index作为文件的数据索引,主要记录了每个Record的key值,以及该Record在文件中的偏移位置。在MapFile被访问的时候,索 引文件会被加载到内存,通过索引映射关系可迅速定位到指定Record所在文件位置,因此,相对SequenceFile而言,MapFile的检索效率 是高效的,缺点是会消耗一部分内存来存储index数据。

需注意的是,MapFile并不会把所有Record都记录到index中去,默认情况下每隔128条记录存储一个索引映射。当然,记录间隔可人为修改,通过MapFIle.Writer的setIndexInterval()方法,或修改io.map.index.interval属性;

注意:

使用MapFile或Sequence虽然可以解决HDFS中小文件的存储问题,但也有一定的局限性

1、文件不支持复写操作。

2、执行文件写的操作的时候,文件是不可读取的。

原文地址:https://www.cnblogs.com/lishengnan/p/7360268.html