使用Java API连接Apache Sentry

mac2026-04-15  1

文章目录

准备工作代码构建 工作中需要使用Java API来连接Sentry,但是很神奇地发现Sentry的 官网没有API文档,经过一番搜索和试错之后最终搞定了,在此分享一下。

准备工作

假设sentry服务运行在 SENTRY_HOST上,Sentry RPC的默认端口是 8038。一般来说,如果在CDH里使用了Sentry服务的话,Kerberos应该已经启用了,所以连接Sentry需要进行Kerberos认证,但并不是所有用户都允许连接Sentry的,要知道哪些用户允许连接,在CDH里查看 sentry.service.allow.connect,然后从中选择一个用户,准备好对应的keytab文件,假设用户为 hdfs,文件名为 hdfs.keytab,同时也准备好Kerberos配置文件krb5.conf,假设默认域为 EXAMPLE.COM。

代码构建

使用maven构建项目,在pom.xml里合适的位置添加如下内容:

<dependency> <groupId>org.apache.sentry</groupId> <artifactId>sentry-service-client</artifactId> <version>2.1.0</version> </dependency>

部分Java代码如下:

import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.security.UserGroupInformation; import org.apache.sentry.api.service.thrift.SentryPolicyServiceClient; import org.apache.sentry.service.common.ServiceConstants; import org.apache.sentry.service.thrift.SentryServiceClientFactory; System.setProperty("java.security.krb5.conf", "/path/to/krb5.conf"); Configuration conf = new Configuration(); conf.set("hadoop.security.authentication", "kerberos"); UserGroupInformation.setConfiguration(conf); UserGroupInformation.loginUserFromKeytab(clientPrincipal, "hdfs@EXAMPLE.COM"); conf.set("sentry.service.client.server.rpc-addresses", "SENTRY_HOST:8038"); conf.set(ServiceConstants.ServerConfig.PRINCIPAL, "sentry/SENTRY_HOST@EXAMPLE.COM"); SentryPolicyServiceClient client = SentryServiceClientFactory.create(conf);

连接上之后,就可以通过 client 来进行各种Sentry操作,比如,列出所有角色:

client.listAllRoles("admin")

基本上所有Sentry API都带有一个 requestor 的String类型的参数,根据实践经验,这个参数可能是要传一个具有server权限的用户名,为什么说是可能呢,因为有的用户不符合这个规律,关于这个问题没有继续深究。

另外,当Sentry配置高可用之后,服务器的地址会有两个,服务器的principal也会有两个,这时可以通过下面这种方式连接,当然,没有配置高可用的情况也可以使用:

conf.set("sentry.service.client.server.rpc-addresses", "SENTRY_HOST1:8038,SENTRY_HOST2:8038"); // 这里用_HOST模糊了具体的hostname,无论连接了哪台Sentry服务器,都可以推断出正确的principal conf.set(ServiceConstants.ServerConfig.PRINCIPAL, "sentry/_HOST@EXAMPLE.COM");

PS:如果你和我一样对Hadoop/Spark/Kafka/Zeppelin/Flink等技术感兴趣,可以来【大数据学徒】一起交流讨论,共同学习。

最新回复(0)