65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2016 年 3 月 26 日

CPOL

3分钟阅读

viewsIcon

26567

downloadIcon

202

使用 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 概念。为了成功建立连接,需要执行以下步骤

  1. 设置 Hadoop 服务器配置信息
  2. 根据 Hadoop Keytab 文件生成 Kerberos 身份验证票证
  3. 创建到 Hadoop 服务器的 ODBC 连接

先决条件

在 .NET 和 Hadoop 之间建立连接之前,应安装以下先决条件

  1. 此链接安装 Windows 版 MIT Kerberos
  2. 此链接安装 Microsoft Hadoop ODBC 驱动程序

您需要拥有以下信息

  1. Hadoop 配置文件 (krb5.ini)
  2. Keytab 文件 (HDDev.keytab)
  3. Hadoop 服务器主机名
  4. Hadoop 服务器端口地址(默认为 10000)
  5. Hadoop hostFQDN
  6. Hadoop 服务名称
  7. Hadoop 主体帐户(如下所述)

详细信息

安装 MIT Kerberos 后,将 Hadoop 配置文件 (krb5.ini) 复制到位置 C:\ProgramData\MIT\Kerberos5(根据您的安装位置更改路径)。

将 Keytab 复制到您认为方便的任何位置。在我的演示中,我已将其复制到项目 Bin\DebugBin\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 查询。

摘要

如前所述,这仅仅是我的想法,请提供您可以实施的建议或优化。

© . All rights reserved.