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

E-MapReduce:Java を使用して Kerberos が有効化された Hive に接続する

最終更新日:Jul 18, 2026

macOS または Linux 上のローカル Java クライアントを、Kerberos 認証を設定し Hive JDBC ドライバーを使用することで、E-MapReduce (EMR) の Kerberos が有効化された Hive サービスに接続します。

前提条件

Software ConfigurationページのAdvanced SettingsセクションでKerberos ID 認証を有効にしてクラスターを作成済みである必要があります。詳細については、「クラスターの作成」をご参照ください。

手順 1: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@<public IP address>:/etc/taihao-apps/hive-conf/keytab/hive.keytab /tmp/hive.keytab

    <public IP address> はマスターノードのパブリック 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 コード内で使用します。

手順 3:ネットワークアクセス制御ポリシーの構成

ローカル開発環境から EMR クラスターへのアクセスを許可するよう、セキュリティグループルールを構成します。

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

    IP アドレス検索サービスを使用してパブリック IP アドレスを確認できます。

  2. セキュリティグループページに移動します。

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

    2. 上部ナビゲーションバーでリージョンとリソースグループを選択します。

    3. Clustersページで、対象クラスターのクラスター ID をクリックします。

    4. 基本情報ページで、Cluster Security Groupの横にあるリンクをクリックします。

  3. ルールページで、ルールの追加をクリックします。

    プロトコルすべてのトラフィックに、送信元をローカル環境のパブリック 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

$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 構成が正しいことを確認してください。