エンタープライズレベルのビッグデータプラットフォームでは、Kerberos 認証は、Hadoop、Hive、HBase などのサービスのセキュリティを確保するための重要なメカニズムです。 ローカル Java クライアントが Kerberos 認証が有効になっている E-MapReduce(EMR)クラスタに接続する必要がある場合は、Kerberos を適切に構成し、Hive Java Database Connectivity(JDBC)ドライバを使用して接続を確立する必要があります。 このトピックでは、macOS または Linux 環境で Kerberos 認証が有効になっている EMR Hive サービスに Java コードを使用して接続する方法について説明します。
前提条件
EMR クラスタが作成されており、クラスタの作成時に [kerberos 認証] [詳細設定] セクションの [ソフトウェア構成] ステップがオンになっています。 詳細については、「クラスタを作成する」をご参照ください。
ステップ 1:EMR クラスタの Kerberos 構成を取得する
SSH を使用してクラスタのマスターノードにログインします。 詳細については、「クラスタにログインする」をご参照ください。
次のコマンドを実行して、Kerberos 構成ファイル krb5.conf を取得します。 ほとんどの場合、このファイルは、クラスタの master-1-1 ノードの /etc/krb5.conf パスにあります。
cat /etc/krb5.conf
設定項目 default_realm の情報を取得します。 この情報は後で Java コードで使用されます。 この例では、次の構成情報が取得されます。
[logging] default = FILE:/mnt/disk1/log/kerberos/krb5libs.log kdc = FILE:/mnt/disk1/log/kerberos/krb5kdc.log admin_server = FILE:/mnt/disk1/log/kerberos/kadmind.log [libdefaults] default_realm = EMR.C-EXAMPLE.COM dns_lookup_realm = false dns_lookup_kdc = false ticket_lifetime = 24h renew_lifetime = 7d forwardable = true rdns = false dns_canonicalize_hostname = true pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt kdc_timeout = 30s max_retries = 3 [realms] EMR.C-EXAMPLE.COM = { kdc = master-1-1.c-ce2fcb9c9c0b****.cn-hangzhou.emr.aliyuncs.com:88 admin_server = master-1-1.c-ce2fcb9c9c0b****.cn-hangzhou.emr.aliyuncs.com:749 }
ステップ 2:keytab ファイルをコピーし、プリンシパルを取得する
Hive の keytab ファイルをローカル開発環境にコピーします。
scp root@<パブリック IP アドレス>:/etc/taihao-apps/hive-conf/keytab/hive.keytab /tmp/hive.keytab
<パブリック IP アドレス>: マスターノードのパブリック IP アドレス。 IP アドレスの取得方法については、「ノードのパブリック IP アドレスと名前を取得する」をご参照ください。
ローカル環境で keytab ファイルの有効性を確認し、プリンシパルを取得します。
klist -kt /tmp/hive.keytab
コマンド出力の例:
Keytab name: FILE:/tmp/hive.keytab KVNO Timestamp Principal ---- ------------------- ------------------------------------------------------ 2 02/25/2025 10:40:41 hive/master-1-1.c-EXAMPLE.cn-hangzhou.emr.aliyuncs.com@EMR.C-EXAMPLE.COM 2 02/25/2025 10:40:41 hive/master-1-1.c-EXAMPLE.cn-hangzhou.emr.aliyuncs.com@EMR.C-EXAMPLE.COM
この例では、取得されたプリンシパルは hive/master-1-1.c-EXAMPLE.cn-hangzhou.emr.aliyuncs.com@EMR.C-EXAMPLE.COM 形式です。 プリンシパルの値は、後で Java コードを使用して Hive に接続するときに使用されます。
ステップ 3:アクセス制御ポリシーを構成する
ローカル開発環境が EMR クラスタにアクセスできるようにするには、次の操作を実行してセキュリティグループルールを構成します。
ローカル開発環境の IP アドレスを取得します。
サーバーの IP アドレスを取得するには、この Web サイトにアクセスしてください。
セキュリティグループの詳細タブに移動します。
EMR コンソール にログインします。
上部のナビゲーションバーで、クラスタが存在するリージョンを選択し、ビジネス要件に基づいてリソースグループを選択します。
[EMR On ECS] ページで、目的のクラスタを見つけ、クラスタの名前をクリックします。
[基本情報] タブの [セキュリティ] セクションで、[クラスタセキュリティグループ] の右側のリンクをクリックします。
表示されるページの [セキュリティグループの詳細] タブで、[ルールの追加] をクリックします。
[プロトコルタイプ] パラメータに [すべて] を選択し、ステップ 1 で取得した IP アドレスを [承認オブジェクト] パラメータのフィールドに入力し、その他のパラメータにはデフォルト値を保持します。 詳細については、「セキュリティグルーフルールを追加する」をご参照ください。
ステップ 4:Java コードを作成する
Maven 依存関係を構成する
次の依存関係を pom.xml ファイルに追加します。
<dependencies>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>3.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-auth</artifactId>
<version>3.2.1</version>
</dependency>
</dependencies>
Java のサンプルコード
ステップ 1:EMR クラスタの Kerberos 構成を取得する および ステップ 2:keytab ファイルをコピーし、プリンシパルを取得する で取得した構成情報に基づいて、次のサンプルコードのパラメータの値を変更します。 次に、コードを Main.java ファイルにコピーします。
package com.aliyun.emr.example;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.security.UserGroupInformation;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Main {
private static final String DRIVER_CLASS = "org.apache.hive.jdbc.HiveDriver";
public static void main(String[] args) throws Exception {
// Kerberos 認証の Realm 情報と KDC アドレスを構成します。
System.setProperty("java.security.krb5.realm", "EMR.EXAMPLE.COM");
System.setProperty("java.security.krb5.kdc", "$IPORHOST");
Configuration conf = new Configuration();
conf.set("hadoop.security.authentication", "kerberos");
UserGroupInformation.setConfiguration(conf);
// Kerberos ログインに keytab ファイルを使用します。
UserGroupInformation.loginUserFromKeytab(
"hive/master-1-1.c-EXAMPLE.cn-hangzhou.emr.aliyuncs.com@EMR.C-EXAMPLE.COM",
"/tmp/hive.keytab"
);
Class.forName(DRIVER_CLASS);
// JDBC 認証用の Hive のプリンシパルを定義します。
String hivePrincipal = "hive/master-1-1.c-EXAMPLE.cn-hangzhou.emr.aliyuncs.com@EMR.C-EXAMPLE.COM";
// 接続アドレスとプリンシパル情報を含む Hive JDBC URL を構築します。
String hiveUrl = "jdbc:hive2://$IPORHOST:10000/;principal=" + hivePrincipal;
Connection connection = DriverManager.getConnection(hiveUrl);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SHOW DATABASES");
while (resultSet.next()) {
System.out.println(resultSet.getString(1));
}
resultSet.close();
statement.close();
connection.close();
}
}
次の表にパラメータを示します。
パラメータ | 説明 |
java.security.krb5.realm | ステップ 1:EMR クラスタの Kerberos 構成を取得する で取得した krb5.conf ファイルの default_realm の値にこのパラメータを設定します。 |
java.security.krb5.kdc | KDC サーバーのアドレス。 このパラメータは、マスターノードのアドレス(パブリック IP アドレスまたはドメイン名など)に設定できます。 アクセス可能であることを確認してください。 |
hivePrincipal | ステップ 2:keytab ファイルをコピーし、プリンシパルを取得する で取得したプリンシパルの値にこのパラメータを設定します。 |
UserGroupInformation.loginUserFromKeytab | 最初のパラメータを hivePrincipal の値に設定します。 |
hiveUrl | $IPORHOST を java.security.krb5.kdc の値に設定します。 |
デバッグを実行する場合は、main メソッドの先頭に次のコードを追加します。
System.setProperty("sun.security.krb5.debug", "true");
一般的なエラーと解決策
エラーメッセージ | 原因 | 解決策 |
Cannot contact any KDC | KDC アドレスが正しくないか、ネットワークの問題が発生しています。 | krb5.conf ファイルの KDC アドレスが正しいことを確認し、 |
keytab contains no suitable keys | keytab ファイルが一致しません。 |
|
LoginException: Unable to obtain password | keytab ファイルにアクセスできません。 |
|
GSS initiate failed | Kerberos が正しく構成されていません。 |
|