我正在尝试使用EMR集群(启用Kerberos)上的beeline连接到Hive,并且想知道为什么要运行kinit(使用我的用户帐户),然后执行以下操作:
beeline -u "jdbc:hive2://localhost:10000/default;principal=hive/_HOST@REALM"
令我困惑的部分是上面的原理。当我在上一个命令中使用kinit对用户帐户进行身份验证时,为什么我们使用“ principal = hive / _HOST @ REALM”(从我的阅读中是Hive服务主体)?
我将针对Hive服务主体还是我的用户帐户运行查询?使用Beeline时是否所有用户都使用Hive服务主体?这背后有什么原因吗?
进一步的上下文链接:Connecting to Hive via Beeline using Kerberos keytab
答案 0 :(得分:0)
principal=
选项实际上是指服务主体(SPN),即您需要连接的内容。公认的模棱两可和令人困惑。
kinit
对您的用户主体(UPN)进行身份验证,从而创建一个“票证授予票证”(TGT),并将其转储到票证缓存中。
稍后,JDBC客户端(或HTTP客户端,Hive Metastore Java客户端或HDFS Java客户端,无论如何)将使用TGT来为适当的服务类型请求服务票证在适当的主机上;出于某种原因,Java从未将服务票证放入缓存中(不同于curl
或Python,后者使用的是C库,例如kinit
)。
SPN通常在名为***-site.xml
的Hadoop配置文件中定义,由Hadoop客户端库使用。
但是... JDBC驱动程序应该是独立的,不依赖于外部库或配置文件,并且可以从URL获取其所有连接参数。这就是为什么您必须在URL上显式填充SPN的原因。 h