使用 Kerberos 票证的 .NET 到 Hadoop 连接





5.00/5 (4投票s)
使用 Keytab 文件的 .NET 到 Hadoop 连接
引言
经过两天的挣扎,我终于弄清楚了如何使用 Hadoop Keytab 文件将 .NET 代码连接到 Hadoop。我无法在 Google 上找到任何可以帮助我完成此任务的文章或解决方案。由于此代码完全是我的想法,请告诉我您的建议,以便更好地改进它。
keytab 是一个包含 Kerberos 主体及其加密密钥副本的文件。 Hadoop 守护程序的 keytab 文件对于每个主机都是唯一的,因为主体名称包含主机名。此文件用于在主机上向 Kerberos 验证主体,无需人工交互或将密码存储在纯文本文件中(来源)。
Hadoop 配置文件
krb5.conf 文件包含 Kerberos 配置信息,包括感兴趣的 Kerberos 域的 KDC 和管理服务器的位置、当前域和 Kerberos 应用程序的默认值以及主机名到 Kerberos 域的映射。(来源)
工作原理
我在此处解释的场景是将 .NET C# 应用程序连接到经过 Kerberos 身份验证的 Hadoop 服务器。本文仅介绍连接部分,因此我不会解释 Hadoop 概念。为了成功建立连接,需要执行以下步骤
- 设置 Hadoop 服务器配置信息
- 根据 Hadoop Keytab 文件生成 Kerberos 身份验证票证
- 创建到 Hadoop 服务器的 ODBC 连接
先决条件
在 .NET 和 Hadoop 之间建立连接之前,应安装以下先决条件
您需要拥有以下信息
- Hadoop 配置文件 (krb5.ini)
- Keytab 文件 (HDDev.keytab)
- Hadoop 服务器主机名
- Hadoop 服务器端口地址(默认为 10000)
- Hadoop hostFQDN
- Hadoop 服务名称
- Hadoop 主体帐户(如下所述)
详细信息
安装 MIT Kerberos 后,将 Hadoop 配置文件 (krb5.ini) 复制到位置 C:\ProgramData\MIT\Kerberos5(根据您的安装位置更改路径)。
将 Keytab 复制到您认为方便的任何位置。在我的演示中,我已将其复制到项目 Bin\Debug 和 Bin\Release 文件夹。
安装 MIT Kerberos 软件后,您将能够使用 kinit
命令生成 Kerberos 票证。使用 kinit
命令的语法是
kinit -k -t HDDev.keytab
hadoopDevPrincipal@HDP.DEV
在此语法中,HDDev.keytab 是 keytab 文件。如果需要,您也可以在命令语法中指定文件的完整路径。示例:kinit -k -t “d:\test\HDDev.keytab”
hadoopDevPrincipal@HDP.DEV
要连接到 Hadoop,需要 Kerberos 主体。它读取以适当权限保存在 keytab 文件中的身份验证信息。在我的演示中,我将其用作 hadoopDevPrincipal@HDP.DEV,这显然是用于演示目的的伪造内容,但它将使您了解 Kerberos 主体帐户的格式。
您可以进一步在命令中添加开关来配置 Kerberos 票证到期时间等。有关 kinit
命令的更多文档,请参阅此链接。
现在,我们准备好进入代码并建立连接。
步骤 1
执行 kinit
命令,提供 Keytab 文件和主体帐户,以生成 Kerberos 票证。
string.Format("-k -t \"{0}\\{1}\" {2}",
Environment.CurrentDirectory, //Path of Bin\Debug directory
ConfigurationManager.AppSettings["keyTabFileName"],
ConfigurationManager.AppSettings["principal"]);
ProcessStartInfo psi = new ProcessStartInfo("kinit")
{
UseShellExecute = true,
RedirectStandardOutput = false,
RedirectStandardInput = false,
RedirectStandardError = false,
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden,
Arguments = path
};
Process process = Process.Start(psi);
第二步
使用 Hadoop 服务器信息创建到 Hadoop 的 ODBC 连接
OdbcConnection conn = new OdbcConnection(
string.Format(@"DRIVER={{Microsoft Hive ODBC Driver}};
Host={0};
Port={1};
Schema={2};
HiveServerType=2;
AuthMech=1;
KrbHostFQDN={3};
KrbServiceName={4};"));
conn.Open();
AuthMech=1 specifies the Kerberos Authentication Mode
After this Hadoop queries can be fired normally as we do for SQL Server or Oracle:
OdbcCommand cmd = new OdbcCommand("select * from Schema_Name.Table_Name;", conn);
Using the Code
下载 Hadoop Connector.zip。请将 Web.Config 中的 AppSettings
替换为您的 Hadoop 设置
<appSettings>
<!-- Hadoop Settings -->
<add key="host" value="hostname" />
<add key="port" value="10000" />
<add key="schema" value="Schema_Name" />
<add key="hostFQDN" value="hostname.domain.com" />
<add key="serviceName" value="Service_Name" />
<add key="principal" value="hadoopDevPrincipal@HDP.DEV" />
<add key="kerberosAquireTicketCommand"
value="kinit -k -t HDDev.keytab hadoopDevPrincipal@HDP.DEV" />
<add key="keyTabFileName" value="HDDev.keytab" />
</appSettings>
在第 19 行的代码中,将 Environment.CurrentDirectory
更改为相关文件路径。
在第 67 行的代码中,将查询语句替换为您相关的 Hadoop 查询。
摘要
如前所述,这仅仅是我的想法,请提供您可以实施的建议或优化。