在本文中,将探讨如何将.NETC#应用程序连接到经过Kerberos认证的Hadoop服务器。请注意,本文仅涉及连接部分,因此不会解释Hadoop概念。为了成功连接,需要执行以下步骤:
生成基于Hadoop Keytab文件的Kerberos认证票据
创建到Hadoop服务器的ODBC连接
在.NET和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,
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);
步骤2:使用Hadoop服务器信息创建ODBC连接到Hadoop:
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指定了Kerberos认证模式。
在此之后,可以像对SQL Server或Oracle一样正常执行Hadoop查询:
OdbcCommand cmd = new OdbcCommand(
"select * from Schema_Name.Table_Name;",
conn
);
下载Hadoop Connector.zip。请用Hadoop设置替换Web.Config中的AppSettings:
<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>