Hive metastore(2)

在这里插入图片描述
从package结构来看,主要的5个package:

  1. metastore是metastore模块的入口,也是整个metastore模块的核心所在,里面包含了HiveMetaStore类作为整个模块的核心,接收来自Hive的请求,返回需要的信息
  2. metastore.api包含了调用和访问metastore模块的接口以及接口参数和返回值类型,metastore模块的用户可以通过api对metastore模块进行访问
  3. metastore.events用于metastore模块内部的观察者模式。因为metastore模块是支持notification通知机制和一些其他的后续处理的。通过观察者模式,当metastore对元信息进行一些操作以后,会同时产生一些event,这些event会被它们的listener捕获并作出一些相应的处理,如发出一些通知等
  4. metastore.model与数据持久化相关,metastore模块通过datanucleus库将model持久化到数据库,这里的model与数据库中的表是对应的
  5. metastore.tools是供后台的元数据管理员对元信息进行查看和修改的工具

在这里插入图片描述
在这里插入图片描述
Hive
  Hive内所有的对于元数据的操作都通过生成一个DDL Task,在task中完成。Hive 是对Hive元数据的最顶层的抽象。DDL Task通过操作Hive类,完成各种DDL操作,例如createTable、dropTable等。Hive中提供的接口几乎与DDL的操作一一对应。

HiveMetaStoreClient
  HiveMetaStoreClient是Hive连接MetaStore的客户端。HiveMetaStoreClient首先会检查hive.metastore.local是否为true,即metastore是否是在本地。如果在本地,则生成一个服务端,并通过函数调用的方式连接。如果为false,metastore不在本地,则生成一个Thrift的客户端,并连接Thrift的服务端(服务端必须首先在远程被启动,通过hive --server metastore命令)。HiveMetaStoreClient继承自IMetaStoreClient接口,HiveMetaStoreClient可以通过本地和远程两种方式访问和调用HiveMetaStore的Server。如果是远程连接,用户可以指定多个uri,用户连接thrift server。HiveMetaStoreClient会依次尝试连接,直到找到一个可用连接。无论是本地还是远程,接口都是统一的。

HiveMetaHook
  MetaStoreHook提供了从HiveMetaStoreClient向StorageHandler通知的机制,每当HiveMetaStoreClient对MetaStore进行操作时,会首先调用Hook中的接口,通知StorageHandler采取相应的准备操作。这样当数据存储方式不是文件时,可以保持数据结构和元数据信息是一致的。

HiveMetaStore
  HiveMetaStore是HiveMetaStoreClient的服务端,可能与HiveMetaStoreClient在同一台服务器上,也可以不在同一服务器上。但是HiveMetaStore一定与实际存储Meta信息的数据库在一台服务器上。
  核心部分是HiveMetaStore的内部类HMSHandler,它继承自IHMSHandler接口,IHMSHandler又继承自ThrifHiveMetastore.Iface接口,提供通过Thrift方式进行远程的调用。在HiveMetaStore.HMSHandler内实现了接口的所有metastore模块对外的方法。
  HiveMetaStore将Hive的业务逻辑转换为实际的数据操作,并调用RawStore的接口进行存储和读写操作。
  因为HiveMetaStore与数据在同一端,所以可以进行错误检测以及重试操作,例如要创建的表是否已经存在等等。HiveMetaStore也会利用RawStore提供的transaction接口,在操作前都要open一个transaction。

RawStore
  RawStore定义了一套接口,定义了对元数据操作的一套机制。每一个接口可以看作是一个原子操作。RawStore提供了transaction机制。确保数据的一致性的同时,保证了性能。
  RawStore可以有多种实现,Hive目前实现的是ObjectStore类,即对象存储。通过JDO技术,把每一个要存储数据通过Model定义成一个对象。JDO负责实际存储一个对象。JDO底层可以连接多种存储方式,存储方式可以通过配置参数的javax.jdo.option直接传递给JDO。目前常用的是derby和MySQL。
  JDO(Java Data Object)是Java对象持久化的新的规范,也是一个用于存储某种数据仓库中的对象的标准化API。JDO会将一个对象当作表进行存储。ObjectStore中的transaction机制也是通过JDO提供的transaction实现的。当commit失败时,将rollback所有操作。

ObjectStore
  继承自RowStore接口,是用于对数据进行持久化的部分,Object可以从数据库中获取数据并映射到model的对象中或者将model中的对象存入数据库。

HiveAlterHandler
继承自AlterHandler接口,从HMSHandler分享出来专门进行Alter一类操作。

Warehouse
  主要作用是对HDFS上的文件进行操作。因为在修改元信息的同时可能会涉及到HDFS的一些文件操作,如mkdir,delteDir等操作。

MetaStorePreEventListenerMetaStoreEventListenerMetaStoreEndFunctionListener
  通过观察者模式对产生的event进行相应的处理的观察者。这三个类都是抽象类,由其他一些具体的类来继承和实现。

MetaStore模块与其他模块间的耦合
  MetaStore是一个独立的模块,但由于Hive的逻辑,在进行DDL操作时,不仅会对元数据操作,同时也需要存储数据的系统进行配合。问题在于,Hive目前默认数据都是存储在文件系统中,也利用了文件系统的中的一些特性。例如,元数据中的DataBase,Table,Partition都是通过目录实现的。任何一个对DataBase,Table,Partition的操作,除了需要对元数据进行修改之外,可能还需要对文件系统进行操作。例如创建一个partition,同时需要在文件系统中创建一个目录。这是MetaStore与其他模块耦合的地方。
  目前,HiveMetaHook实现了对部分耦合的剥离,允许通过hook,减少MetaStore与数据存储方式的依赖。但是目前并没有实现完全剥离。在Hive.java、HiveMetaStore.java中依然会调用FileSystem和WareHouse的接口(WareHouse是数据存储的抽象,假设数据全部存储在文件中,WareHouse也会调用FileSystem接口)。
  如果要支持其他数据存储方式,需要将这些耦合全部剥离,或者提供一个临时文件目录,模拟数据存储的文件系统。其中PersistenceManager负责控制一组持久化对象包括创建持久化对象和查询对象,它是ObjectStore的一个实例变量,每个ObjectStore拥有一个pm,RawStore是metastore逻辑层和物理底层元数据库(比如derby)交互的接口类,ObjectStore是RawStore的默认实现类。Hive Metastore Server启动的时候会指定一个TProcessor,包装了一个HMSHandler,内部有一个ThreadLocal threadLocalMS实例变量,每个thread维护一个RawStore。

private final ThreadLocal threadLocalMS =new ThreadLocal() {
   
    @Override
       protected synchronized RawStore initialValue() {
   
          return null;
       }
};

  每一个从hive metastore client过来的请求都会从线程池中分配一个WorkerProcess来处理,在HMSHandler中每一个方法都会通过getMS()获取rawstore instance来做具体操作。

public RawStore getMS() throws MetaException {
   
	  RawStore ms = threadLocalMS.get();
      if (ms == null) {
   
          ms = newRawStore();
          ms.verifySchema();
          threadLocalMS.set(ms);
          ms = threadLocalMS.get();
      }
      return ms;
}

看得出来RawStore是延迟加载,初始化后绑定到threadlocal变量中可以为以后复用。

private RawStore newRawStore() throws MetaException {
      
	LOG.info(addPrefix("Opening raw store with implemenation class:"+ rawStoreClassName
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值