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

E-MapReduce:Phoenix

最終更新日:Nov 09, 2025

Apache Phoenix は、HBase 上に構築された SQL 中間レイヤーです。Apache Phoenix を使用すると、標準の SQL 文を実行して HBase データをクエリおよび管理できます。

前提条件

DataServing またはカスタムクラスターが作成され、クラスターの作成時に Phoenix および HBase サービスが選択されています。詳細については、「クラスターの作成」をご参照ください。

コマンドラインから Phoenix を使用する

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

  2. 次のコマンドを実行して Phoenix CLI を開きます。

    /opt/apps/PHOENIX/phoenix-current/bin/sqlline.py
  3. SQL 文を実行してデータを管理します。一般的な操作:

    • テーブルを作成します。

      CREATE TABLE IF NOT EXISTS example(
          my_pk bigint not null,
          m.first_name varchar(50),
          m.last_name varchar(50) 
          CONSTRAINT pk PRIMARY KEY (my_pk)
      );
    • テーブルにデータを挿入します。

      UPSERT INTO example(my_pk,m.first_name,m.last_name) VALUES(100,'Jack','Ben');
      UPSERT INTO example(my_pk,m.first_name,m.last_name) VALUES(200,'Jack3','Ben3');
    • テーブルからデータをクエリします。

      SELECT * FROM example;

      次の出力が返されます。

      +--------+-------------+------------+
      | MY_PK  | FIRST_NAME  | LAST_NAME  |
      +--------+-------------+------------+
      | 100    | Jack        | Ben        |
      | 200    | Jack3       | Ben3       |
      +--------+-------------+------------+
    • テーブルを削除します。

      DROP TABLE IF EXISTS example;

JDBC を使用して Phoenix に接続する

Maven 依存関係の構成

<dependency>
     <groupId>org.apache.phoenix</groupId>
     <artifactId>phoenix-core</artifactId>
     <version>${phoenix.version}</version>
</dependency>

${phoenix.version} 変数は、クラスター内の Phoenix バージョンと一致する必要があります。

サンプルコード

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.Statement;

public class TestPhoenixJdbc {

    public static void main(String[] args) throws SQLException {
        Statement stmt = null;
        ResultSet rset = null;

        Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");
        Connection con = DriverManager.getConnection("jdbc:phoenix:[zookeeper quorum hosts]");
        stmt = con.createStatement();

        stmt.executeUpdate("create table test (mykey integer not null primary key, mycolumn varchar)");
        stmt.executeUpdate("upsert into test values (1,'Hello')");
        stmt.executeUpdate("upsert into test values (2,'World!')");
        con.commit();

        PreparedStatement statement = con.prepareStatement("select * from test");
        rset = statement.executeQuery();
        while (rset.next()) {
            System.out.println(rset.getString("mycolumn"));
        }
        statement.close();
        con.close();
    }
}

JDBC を使用して Kerberos 対応の Phoenix クラスターに接続する

クラスターで Kerberos 認証を使用している場合、このセクションでは、JDBC (Java Database Connectivity) クライアントプログラムを作成して、Kerberos 対応の EMR クラスター上の Phoenix サービスに安全に接続する方法について説明します。クライアントプログラムは、プリンシパルと keytab 情報を含む JDBC URL を使用して認証します。次に、プログラムは基本的なデータ定義言語 (DDL) とデータ操作言語 (DML) 操作を実行して接続を検証します。

ステップ 1: 環境と認証情報の準備

コードを作成して実行する前に、環境を準備し、Kerberos 認証情報を作成する必要があります。次の操作はすべて、クラスターのマスターノードで実行してください。

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

  2. Kerberos レルムを決定します。

    Kerberos 対応の各クラスターには、一意のレルムがあります。

    次のコマンドを実行してレルム情報を取得します。後で使用するためにレルムを見つけて記録します。

    cat /etc/krb5.conf | grep default_realm

    次の情報が返されます。

    default_realm = EMR.C-4FC5FDDE3759****.COM
  3. クライアントプリンシパルを作成します。

    プリンシパルは、Kerberos システムにおけるクライアントの一意の ID です。Java アプリケーション用にプリンシパルを作成する必要があります。

    1. マスターノードで、次のコマンドを実行して [kadmin.local] ツールを使用します。

      sudo kadmin.local
    2. kadmin.local 対話型インターフェイスで、次のコマンドを実行してプリンシパルを作成します。

      addprinc phoenix_client@EMR.C-4FC5FDDE3759****.COM

      コマンドを実行すると、プリンシパルのパスワードを設定するように求められます。このパスワードを覚えておいてください。keytab ファイルを使用するとパスワードなしでログインできますが、場合によってはパスワードが必要になることがあります。

  4. keytab ファイルをエクスポートします。

    1. kadmin.local ツールで、次のコマンドを実行して keytab ファイルをエクスポートします。

      xst -k /tmp/phoenix_client.keytab phoenix_client@EMR.C-4FC5FDDE3759****.COM
    2. 次のコマンドを実行して kadmin.local を終了します。

      exit
      重要
      • 権限: Java プログラムを実行するユーザーが keytab ファイルに対する読み取り権限を持っていることを確認してください。

      • 配布: Java プログラムがマスターノードで実行されない場合は、phoenix_client.keytab ファイルと /etc/krb5.conf ファイルを、コードが実行されるマシンに安全に配布する必要があります。スクリプトがアクセスできるパスにファイルを配置してください。

ステップ 2: Java アプリケーションの作成とパッケージ化

  • 方法 1: プリコンパイル済みの JAR ファイルを使用する (迅速な検証のため)

    hbase-phoenix-kerberos-1.0-SNAPSHOT.jar

  • 方法 2: アプリケーションを手動でコンパイルしてパッケージ化する (本番環境に推奨)

    次のコードサンプルを参照して、アプリケーションを手動でコンパイルしてパッケージ化できます。

    コアコードサンプル (PhoenixKerberosDemo.java)

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    /**
     * JDBC を使用して Kerberos で保護された Phoenix クラスターに接続するクライアント。
     * すべての接続パラメーターは、コマンドラインから渡される完全な JDBC URL を介して提供されます。
     */
    public class PhoenixKerberosDemo {
    
        /**
         * アプリケーションのメインエントリポイント。
         *
         * @param args コマンドライン引数。プログラムは 1 つの引数、つまり完全な Phoenix JDBC URL を想定しています。
         */
        public static void main(String[] args) {
            // --- 1. コマンドライン入力を検証: 1 つの引数、JDBC URL を想定 ---
            if (args.length != 1) {
                System.err.println("ERROR: Invalid number of arguments.");
                System.err.println("Usage: java PhoenixKerberosDemo \"<full_jdbc_url>\"");
                System.err.println("Example: \"jdbc:phoenix:zk1,zk2:2181:/hbase:user@REALM.COM:/path/to/user.keytab\"");
                System.exit(1); // エラーコードで終了
            }
    
            String jdbcUrl = args[0];
    
            System.out.println("Attempting to connect to Phoenix...");
            System.out.println("Using JDBC URL: " + jdbcUrl);
    
            try {
                // --- 2. Phoenix ドライバーをロード ---
                Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");
            } catch (ClassNotFoundException e) {
                System.err.println("FATAL ERROR: Phoenix JDBC driver not found in the classpath.");
                e.printStackTrace();
                System.exit(1);
            }
    
            // --- 3. try-with-resources 文を使用して接続を確立し、SQL を実行します。この構文はリソースを自動的に閉じます。---
            try (Connection con = DriverManager.getConnection(jdbcUrl);
                 Statement stmt = con.createStatement()) {
    
                System.out.println("Connection established successfully.");
    
                final String tableName = "TEST";
                System.out.println("Creating table '" + tableName + "'...");
                stmt.executeUpdate("CREATE TABLE IF NOT EXISTS " + tableName + " (mykey INTEGER NOT NULL PRIMARY KEY, mycolumn VARCHAR)");
                con.commit();
    
                System.out.println("Upserting data...");
                stmt.executeUpdate("UPSERT INTO " + tableName + " VALUES (1, 'Hello')");
                stmt.executeUpdate("UPSERT INTO " + tableName + " VALUES (2, 'World-Kerberos!')");
                con.commit();
                System.out.println("Data upserted successfully.");
    
                String sql = "SELECT * FROM " + tableName;
                System.out.println("Querying for results with: " + sql);
    
                try (PreparedStatement statement = con.prepareStatement(sql);
                     ResultSet rset = statement.executeQuery()) {
    
                    System.out.println("Query results:");
                    while (rset.next()) {
                        System.out.println(rset.getInt("mykey") + " -> " + rset.getString("mycolumn"));
                    }
                }
    
                System.out.println("Cleaning up the test table...");
                stmt.executeUpdate("DROP TABLE IF EXISTS " + tableName);
                con.commit();
    
            } catch (SQLException e) {
                // SQL 例外をキャッチし、役立つトラブルシューティングのヒントを提供します
                System.err.println("\n--- FAILED TO EXECUTE DATABASE OPERATION ---");
                System.err.println("Please check the following:");
                System.err.println("1. The JDBC URL is correct (format, principal, keytab path).");
                System.err.println("2. Network connectivity to ZooKeeper and HBase.");
                System.err.println("3. The keytab file exists and has correct read permissions.");
                System.err.println("4. The principal has sufficient permissions on HBase tables and namespaces.");
                e.printStackTrace();
            }
    
            System.out.println("\nExecution finished.");
        }
    }
    

    Maven 構成 (pom.xml)

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                                 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.aliyun.emr.doctor</groupId>
        <artifactId>hbase-phoenix-kerberos</artifactId>
        <version>1.0-SNAPSHOT</version>
        <name>Archetype - hbase-phoenix-kerberos</name>
        <url>http://maven.apache.org</url>
        <properties>
            <phoenix.version>5.2.1</phoenix.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.apache.phoenix</groupId>
                <artifactId>phoenix-core</artifactId>
                <version>${phoenix.version}</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <!--  Java Compiler  -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>3.2.4</version>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>shade</goal>
                            </goals>
                            <configuration>
                                <filters>
                                    <filter>
                                        <artifact>*:*</artifact>
                                        <excludes>
                                            <exclude>META-INF/*.SF</exclude>
                                            <exclude>META-INF/*.DSA</exclude>
                                            <exclude>META-INF/*.RSA</exclude>
                                        </excludes>
                                    </filter>
                                </filters>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>

ステップ 3: アプリケーションの実行

  1. ランタイム環境を選択します。

    アプリケーションを実行するときは、次の 2 つのランタイム環境のいずれかを選択できます。

    • クラスターノードで実行 (推奨)

      • クラスターノードには、必要なすべての Hadoop、HBase、および Phoenix 依存関係ライブラリがプリインストールされています。追加の構成は必要ありません。ネットワーク接続は事前構成されているため、環境は完全で安定しています。

      • シナリオ: この方法は、迅速な検証、テスト、開発、およびデバッグに適しています。

    • クラスター外で実行

      プログラムをクラスター外で実行するには、次の条件が満たされていることを確認してください。

      • ネットワーク接続: プログラムが実行されるマシンが、クラスターの ZooKeeper、HBase Master、および RegionServer ノードに接続できることを確認してください。

      • Kerberos 構成: クラスターの krb5.conf ファイルと生成された keytab ファイルを、プログラムが実行されるマシンにコピーします。

      • 依存関係の管理: 実行コマンドのクラスパスには、必要なすべての Hadoop、HBase、および Phoenix クライアント依存関係 JAR パッケージが含まれている必要があります。このプロセスは、クラスターノードで実行するよりも複雑になることがよくあります。Maven や Gradle などのツールを使用して依存関係を管理できます。

  2. スクリプトを実行します。

    次の kerberos-phoenix.sh スクリプトは、変更と実行を容易にするために必要なすべての構成を統合しています。

    #!/bin/bash
    
    # ======================= 1. ユーザー構成 (環境に応じて変更) =======================
    
    # Hadoop および HBase 構成ファイルが配置されているディレクトリ
    HADOOP_CONF_DIR="/etc/taihao-apps/hadoop-conf"
    HBASE_CONF_DIR="/etc/taihao-apps/hbase-conf"
    
    # Phoenix クライアント JAR ファイルへのパス。シンボリックリンクを使用することは、バージョンの変更を処理するためのベストプラクティスです。
    # まず、'ls -l /opt/apps/PHOENIX/phoenix-current/' を使用してこのファイルが存在することを確認します。このパスは、バージョンによって変更する必要がある場合があります。
    PHOENIX_JAR="/opt/apps/PHOENIX/phoenix-current/phoenix-client-lite-hbase-2.6.jar"
    
    # アプリケーションの JAR ファイル名。
    YOUR_JAR_FILE="hbase-phoenix-kerberos-1.0-SNAPSHOT.jar"
    
    # Kerberos 構成ファイルへのパス。
    KRB5_CONF_PATH="/etc/krb5.conf"
    
    # --- [コア] JDBC URL 構成 ---
    # フォーマット: jdbc:phoenix:[ZK アドレス]:[ZK ポート]:[HBase ZNode]:[プリンシパル]:[絶対 Keytab パス]
    # 以下の ZK アドレス、REALM、および Keytab パスを実際の情報に置き換えてください。
    ZK_QUORUM="master-1-1" # 複数の ZooKeeper ノードがある場合は、"zk1,zk2,zk3" のようにカンマで区切ります
    ZK_PORT="2181"
    HBASE_ZNODE="/hbase" # セキュアなクラスターの場合、/hbase-secure になることがあります
    PRINCIPAL="phoenix_client@EMR.C-4FC5FDDE3759****.COM" # プリンシパルに置き換えてください
    KEYTAB_PATH="/tmp/phoenix_client.keytab" # Keytab ファイルへの絶対パス
    
    JDBC_URL="jdbc:phoenix:${ZK_QUORUM}:${ZK_PORT}:${HBASE_ZNODE}:${PRINCIPAL}:${KEYTAB_PATH}"
    # =================================================================================
    
    # ======================= 2. 実行エリア (通常は変更不要) =================================
    echo "================================================="
    echo "Starting Phoenix Kerberos JDBC Demo..."
    echo "Using JDBC URL: ${JDBC_URL}"
    echo "================================================="
    
    # クラスパスを構築します。順序: 現在のディレクトリ -> 構成ディレクトリ -> JAR -> 依存関係 JAR
    # `hbase classpath` は、コア Hadoop/HBase 依存関係を自動的にロードします
    CLASS_PATH=".:${HADOOP_CONF_DIR}:${HBASE_CONF_DIR}:${YOUR_JAR_FILE}:${PHOENIX_JAR}:$(hbase classpath)"
    
    # Java プログラムを実行します
    java -cp "${CLASS_PATH}" \
         -Djava.security.krb5.conf="${KRB5_CONF_PATH}" \
         PhoenixKerberosDemo "${JDBC_URL}"
    
    # 終了コードを確認します
    if [ $? -eq 0 ]; then
        echo -e "\n[SUCCESS] Program finished successfully."
    else
        echo -e "\n[FAILED] Program terminated with an error."
    fi
    # =================================================================================
    1. ステップ 2 で作成した JAR パッケージと kerberos-phoenix.sh スクリプトをマスターノードの指定されたディレクトリにアップロードします。

    2. 次のコマンドを実行して、スクリプトに実行権限を付与します。

      chmod +x kerberos-phoenix.sh
    3. 次のコマンドを実行して、スクリプトを実行します。

      ./kerberos-phoenix.sh

      次の例は、返された情報の一部を示しています。

      image

リファレンス

Phoenix の詳細については、公式ドキュメントの次のトピックをご参照ください: