1、HDFS文件的输入输出流

     Configuration conf = new Configuration();

      FileSystem fs = FileSystem .get(conf);

      FSDataInputStream in = fs.open(new Path(uri));

     FSDataOutputStream out = fs.create(new Path(uri1));

2、FSDataInputStream 封装了HDFS的DFSInputStream,DFSInputStream通过询问名称节点,返回数据块的位置;

      客户端获得位置信息列表以后,就可以进行read();读取万数据后,DFSInputStream会关闭与数据节点的连接;

      如果数据很大,保存在不同的数据节点上,DFSInputStream会再次请求名称节点,获取数据块位置,重复读取数据。

3、FSDataOutputStream 封装了HDFS的DFSOutputStream。客户端首先创建文件请求,DFSOutputStream RPC请求名称节点,询问是否可以在命名空间中创建新的文件。返回客户端写入数据节点的信息。

     数据节点之间采用流水线复制。

4、Hbase

    通过水平扩展的方式,存储非结构化或者半结构化的松散数据,是谷歌Bigtable的一个开源实现。底层是通过HDFS文件系统,利用Hadoop MapReduce处理海量数据。

5、MapReduce和HBase的区别与联系

      HBase与关系型数据库的区别:

      1)关系型数据库有丰富的数据类型,而HBase只有未经解析的字符串bytes.

       2)关系型数据库又复杂的操作,而HBase是由简单的插入,删除,查询,清空等操作;

      3)关系型数据库是基于行模式存储的,HBase是基于列存储的,每个列族由几个文件保存,不同的列族保存在不同的文件上。

      4)关系型数据库可以有负责的索引,而HBase只有行键索引;

       5)关系型数据库有更新操作,会覆盖原来的记录,HBase不会,只是会生成新的版本的数据;

     6)伸缩性方面

6、HBase的数据模型

     HBase采用表来组织数据,表由行和列组成,列划分为多个列族;

     行:Hbase的表由多行数据组成,每个行有行键;

    列族:HBase表包含多个列族,列族是基本的访问控制单元;

    列限定符:列族里的数据通过列限定符来定位;

    单元格:通过行,列族和列限定符确定一个单元;

    时间戳:每个单元格保存这数据的不同版本,通过时间戳来索引。

7、HBase的底层存储

    是行键,不同的时间戳以及列族组成的一个个文件存储的。传统的关系型数据库都是采用基于行存储是,而HBase是把一列的数据存储在一起;如果事务性比较多,采用行存储,如果要分析数据的相似性,采用列存储,因为同以列中的数据具有较高的相似度,分析的效率比行存储高。

8、HBase的主要功能组件

     库函数——连接到每个客户端

     Master服务器——负责管理和维护HBase的分区信息,维护Region服务器列表,附在均衡;

     Region服务器——负责存储和维护分配给自己的Region,处理来自客户端的读写请求。

  客户端并不直接从Master获取数据,而是在获得Region存储位置信息后,直接从Region上读写数据。

   客户端并不依赖Master获取Region的位置信息,而是通过Zookeeper获取Region位置信息,这种方式使得Master的负载非常小。

9、Region

     目前一个Region的大小为1-2G,同一个Region不会分到不同的Region服务器。Region的定位采用三级结构,

    首先,Region和Region服务器之间的映射关系会被保存到元数据表.META中,当HBase很大的时候,元数据表又会被分裂成不同的Region,这时候记录表数据表的位置的表为ROOT表,ROOT表中只有一个Region,并且有固定的名字。最终ROOT表的位置交由Zookeeper管理。

    所以客户端访问数据,是经过三级寻址找到Region。

10、用户读写数据的过程

   用户写入数据的时候,被分配到响应的Region服务器去执行,用户数据会首先写到MemStore和HLog中,只有当写操作写入HLog后,commit()操作才会返回给客户端。度数据的时候,会首先MemStore,没有才会去磁盘上的StoreFile中找。

11、刷新操作

     系统会周期性的把MemStore缓存中的内容刷新到StoreFile中,清空缓存,并在Hlog中做一个标识。每一次刷新写操作都会产生一个StoreFile ,所以一个Store文件包含多个StoreFile。

    每个Region服务器都有一个自己的Hlog文件,每次启动的时候都检查这个文件,确认最近一次执行缓存刷新操作后是否有新的写入操作,如果有,则把数据写入MemStore中,在刷新到StoreFile,删除旧的Hlog文件。

12、StoreFile的合并

    因为每一次刷新操作都会生成一个StoreFile,会影响查找效率,所以当数量到达一定阈值后,会调用Store.compact()合并StoreFile。但这个操作很需要占用资源。

   而因为StoreFile合并后,会产生一个大的StoreFile,产生Region的分裂,一个大的Region就被分裂成两个Region。

13、Hlog的工作原理

    因为HBase工作在廉价的硬件资源上,很有可能硬件资源出故障,所以通过Hlog实现故障的恢复。