Metastore
Hive Metastore是Hive用来管理库表元数据的一个服务,有了它上层的服务不用再跟裸的文件数据打交道,而是可以基于结构化的库表信息构建计算框架。现在除了Hive之外很多计算框架都支持以Hive Metastore为元数据中心来查询底层Hadoop生态的数据,比如Drill, Presto, Spark等等。
Hive Metastore默认是不做任何用户认证的,也就是说只要指定metastore服务的IP和端口就可以通过Thrift协议连接上并读取元数据。Metastore也支持基于Kerberos的认证,不过这里的认证只是为了保护对于metastore的访问,一旦认证通过,任何人调用相同api所获得的结果都是一样的,而不会管当前到底是谁在调用。
授权方面在Hive里面有几种方式,一种是基于存储层面的文件权限来进行授权管理,如果你有对应的目录/文件的权限你就可以进行相应的查询,这种机制的问题在于力度比较粗,因为它权限的对象是目录/文件,无法进行更细粒度的控制,比如列级别的权限控制。而且对于Blob Store类的服务比如AWS的S3和阿里云的OSS等这种,由于已经没有真正HDFS层面的“用户”,因此这种机制也无法实施。
另外一种授权机制是HiveServer2中基于SQL标准的授权机制(GRANT/REVOKE),它提供了更细粒度的授权机制,但是这种机制是在HiveServer2里面提供的,跟Metastore没有关系。社区还发展出另外两框插件式的授权解决方案: Apache Ranger和Apache Sentry, 以Ranger为例,要使用Ranger都要把它内嵌到对应的上层引擎比如Presto、Spark里面去。Presto、Spark在发送查询语句的时候,会被Ranger插件拦截,根据当前用户的权限信息决定对请求进行拦截还是放行。也就是说这些授权机制都是在Metastore之外实现的,Metastore的作用更多的只是底层数据库的一个简单服务,没有实现更多的多租户、权限认证管理的功能。
社区对Metastore做过一些有意思的扩展,比如Hotels.com公司开发了一个叫做Waggle Dance的框架,它的出发动机是在一个公司内部往往会搭建不止一个大数据集群,因此也就有了多个Metastore元数据服务,这些Metastore之间是互相不通的,造成了数据/元数据的孤岛。Waggle Dance则相当于Metastore的一个路由服务,它完整的实现了Metastore的Thrift API,用户需要访问Metastore的时候直接访问Waggle Dance,而Waggle Dance背后则对接了多个Hive Metastore,把这些本来互不相连的Metastore组合成了一个整体,解决了数据/元数据孤岛的问题。不过Waggle Dance也有它的问题,比如不同的Hive Metastore之间可能会有同名的schema,这样就必须不通metastore之间事先商量好一些shcema名字前缀才能保证整体schema名字的唯一性;再比如Hive Metastore的Thrift API是在不断演进的,不同版本之间的API不完全一样,这样Waggle Dance可能会需要支持多个版本的API,如果Hive Metastore API出现一些breaking change的话,可能会导致Waggle Dance整个方案无法维持。
AWS Glue是对于Hive Metastore的另一个扩展,跟普通Hive Metastore不一样的是,Glue是一个支持多租户的元数据服务 — 不同的用户去调用同样的元数据接口: `getAllDatabases()` 返回的结果是不一样的。而且Glue也把授权信息内置到服务里面,不过它提供的方式不是SQL标准里面的grant/revoke的方式,而是基于AWS统一的IAM权限策略的方式,比如下面的权限规则允许用户访问finegrainaccess数据库以及它下面以dev_开头的所有的表。
"arn:aws:glue:us-east-1:123456789012:catalog",
"arn:aws:glue:us-east-1:123456789012:database/finegrainaccess",
"arn:aws:glue:us-east-1:123456789012:tables/finegrainaccess/dev_*"
这样即使是在同一个租户下的不同子帐号调用同样的元数据方法`getAllDatabases()` 返回的数据也是不一样的。
如果说Waggle Dance是在Hive Metastore的“体制内创新”,那么AWS Glue则是对于Hive Metastore的“推翻式创新”:Waggle Dance实现的是Hive Metastore的API,对于上层引擎来说可以说是基本无感,而Glue则只是保证实现了Hive Metastore一样的功能,但是它不再是一个Thrift API,而是一个REST API,上层引擎需要做相应的改动才能对接到这个Glue。