すべてのプロダクト
Search
ドキュメントセンター

E-MapReduce:Kerberos 認証が有効になっている Hive に Java を使用して接続する

最終更新日:Mar 27, 2025

エンタープライズレベルのビッグデータプラットフォームでは、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 構成を取得する

  1. SSH を使用してクラスタのマスターノードにログインします。 詳細については、「クラスタにログインする」をご参照ください。

  2. 次のコマンドを実行して、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 ファイルをコピーし、プリンシパルを取得する

  1. Hive の keytab ファイルをローカル開発環境にコピーします。

    scp root@<パブリック IP アドレス>:/etc/taihao-apps/hive-conf/keytab/hive.keytab /tmp/hive.keytab

    <パブリック IP アドレス>: マスターノードのパブリック IP アドレス。 IP アドレスの取得方法については、「ノードのパブリック IP アドレスと名前を取得する」をご参照ください。

  2. ローカル環境で 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 クラスタにアクセスできるようにするには、次の操作を実行してセキュリティグループルールを構成します。

  1. ローカル開発環境の IP アドレスを取得します。

    サーバーの IP アドレスを取得するには、この Web サイトにアクセスしてください。

  2. セキュリティグループの詳細タブに移動します。

    1. EMR コンソール にログインします。

    2. 上部のナビゲーションバーで、クラスタが存在するリージョンを選択し、ビジネス要件に基づいてリソースグループを選択します

    3. [EMR On ECS] ページで、目的のクラスタを見つけ、クラスタの名前をクリックします。

    4. [基本情報] タブの [セキュリティ] セクションで、[クラスタセキュリティグループ] の右側のリンクをクリックします。

  3. 表示されるページの [セキュリティグループの詳細] タブで、[ルールの追加] をクリックします。

    [プロトコルタイプ] パラメータに [すべて] を選択し、ステップ 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

$IPORHOSTjava.security.krb5.kdc の値に設定します。

デバッグを実行する場合は、main メソッドの先頭に次のコードを追加します。

System.setProperty("sun.security.krb5.debug", "true");

一般的なエラーと解決策

エラーメッセージ

原因

解決策

Cannot contact any KDC

KDC アドレスが正しくないか、ネットワークの問題が発生しています。

krb5.conf ファイルの KDC アドレスが正しいことを確認し、nc -zv コマンドを使用してポートに接続できることを確認します。

keytab contains no suitable keys

keytab ファイルが一致しません。

klist -kt /path/to/hive.keytab コマンドを実行して、プリンシパルが正しいことを確認します。

LoginException: Unable to obtain password

keytab ファイルにアクセスできません。

chmod 400 /path/to/hive.keytab コマンドを実行して権限を構成します。

GSS initiate failed

Kerberos が正しく構成されていません。

java.security.krb5.conf ファイルが正しく構成されていることを確認します。