Sentry 自带HDFS Sync功能,同步hive database/table/partition与对应hdfs权限。自版本CDH5.12.2后,这个功能黄了。。。追踪原因是CDH-21887 Sentry Service HA把MetastorePlugin给删除了。MetastorePlugin跑在hive metastore机器上,做为hive的plugin。
MetastorePlugin在database/table创建/partition新增时,向sentry同步相应权限。
再往下追,Hive1.2.0新推了一个功能:
需要配置MetaStoreEventListener接收事件并存储:
hive.metastore.event.listeners除了配置sentry的org.apache.sentry.binding.metastore.SentryMetastorePostEventListener,还得配置org.apache.hive.hcatalog.listener.DbNotificationListener。这样才能把相应
另外加载数据时,也需要开启对应事件hive.metastore.dml.events(默认为false),
同时,Sentry要接收notification,就得开启HMSFollower功能(SentryService.java),得做更多的配置,官网文档没有说明,甚至错误说明。
1.以下两个配置开启hdfs sync(官网配置描述正确)
sentry.service.processor.factories : org.apache.sentry.provider.db.service.thrift.SentryPolicyStoreProcessorFactory,org.apache.sentry.hdfs.SentryHDFSServiceProcessorFactory
sentry.policy.store.plugins: org.apache.sentry.hdfs.SentryPlugin
2.sentry代码需要从hive config查找metastoreURI,这样就得在sentry classpath上扔一个hive-site.xml配置,里面包括metastoreURI(在/usr/bin/sentry设置export set HIVE_CONF_DIR即可)
cloudera文档越来越不靠谱,向着Parcel+CM靠,不管command line方式
原以为这样就可以了,后面发现sentry源码有bug,获取hiveconf时,通过SessionStates.get(),这个方法从theadlocal获取,搜索完整个工程,没地方启动SessionStates,运行时返回nullpointerexception,只能改源码。