macOS または Linux 上のローカル Java クライアントを、Kerberos 認証を設定し Hive JDBC ドライバーを使用することで、E-MapReduce (EMR) の Kerberos が有効化された Hive サービスに接続します。
前提条件
Software ConfigurationページのAdvanced SettingsセクションでKerberos ID 認証を有効にしてクラスターを作成済みである必要があります。詳細については、「クラスターの作成」をご参照ください。
手順 1: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@<public IP address>:/etc/taihao-apps/hive-conf/keytab/hive.keytab /tmp/hive.keytab<public IP address> はマスターノードのパブリック 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 コード内で使用します。
手順 3:ネットワークアクセス制御ポリシーの構成
ローカル開発環境から EMR クラスターへのアクセスを許可するよう、セキュリティグループルールを構成します。
-
ローカル開発環境のパブリック IP アドレスを取得します。
IP アドレス検索サービスを使用してパブリック IP アドレスを確認できます。
-
セキュリティグループページに移動します。
-
EMR コンソールにログインします。
-
上部ナビゲーションバーでリージョンとリソースグループを選択します。
-
Clustersページで、対象クラスターのクラスター ID をクリックします。
-
基本情報ページで、Cluster Security Groupの横にあるリンクをクリックします。
-
-
ルールページで、ルールの追加をクリックします。
プロトコルをすべてのトラフィックに、送信元をローカル環境のパブリック 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: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 認証用のレルムおよびキー配布センター (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);
// keytab ファイルを使用して Kerberos にログインします。
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:Kerberos 構成の取得で取得した krb5.conf ファイル内の default_realm 値です。 |
|
java.security.krb5.kdc |
KDC サーバーアドレスです。マスターノードのパブリック IP アドレスまたはドメイン名に設定してください。クライアントからこのアドレスにアクセス可能であることを確認してください。 |
|
hivePrincipal |
手順 2:keytab ファイルとプリンシパルの取得で取得したプリンシパルです。 |
|
UserGroupInformation.loginUserFromKeytab |
第 1 引数は 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 構成が正しくありません。 |
|