Apache Phoenix は、HBase 上に構築された SQL 中間レイヤーです。Apache Phoenix を使用すると、標準の SQL 文を実行して HBase データをクエリおよび管理できます。
前提条件
DataServing またはカスタムクラスターが作成され、クラスターの作成時に Phoenix および HBase サービスが選択されています。詳細については、「クラスターの作成」をご参照ください。
コマンドラインから Phoenix を使用する
SSH モードでクラスターにログインします。詳細については、「クラスターへのログイン」をご参照ください。
次のコマンドを実行して Phoenix CLI を開きます。
/opt/apps/PHOENIX/phoenix-current/bin/sqlline.pySQL 文を実行してデータを管理します。一般的な操作:
テーブルを作成します。
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 認証情報を作成する必要があります。次の操作はすべて、クラスターのマスターノードで実行してください。
SSH を使用してクラスターのマスターノードに接続します。詳細については、「クラスターへのログイン」をご参照ください。
Kerberos レルムを決定します。
Kerberos 対応の各クラスターには、一意のレルムがあります。
次のコマンドを実行してレルム情報を取得します。後で使用するためにレルムを見つけて記録します。
cat /etc/krb5.conf | grep default_realm次の情報が返されます。
default_realm = EMR.C-4FC5FDDE3759****.COMクライアントプリンシパルを作成します。
プリンシパルは、Kerberos システムにおけるクライアントの一意の ID です。Java アプリケーション用にプリンシパルを作成する必要があります。
マスターノードで、次のコマンドを実行して
[kadmin.local]ツールを使用します。sudo kadmin.localkadmin.local 対話型インターフェイスで、次のコマンドを実行してプリンシパルを作成します。
addprinc phoenix_client@EMR.C-4FC5FDDE3759****.COMコマンドを実行すると、プリンシパルのパスワードを設定するように求められます。このパスワードを覚えておいてください。keytab ファイルを使用するとパスワードなしでログインできますが、場合によってはパスワードが必要になることがあります。
keytab ファイルをエクスポートします。
kadmin.local ツールで、次のコマンドを実行して keytab ファイルをエクスポートします。
xst -k /tmp/phoenix_client.keytab phoenix_client@EMR.C-4FC5FDDE3759****.COM次のコマンドを実行して kadmin.local を終了します。
exit重要権限: Java プログラムを実行するユーザーが keytab ファイルに対する読み取り権限を持っていることを確認してください。
配布: Java プログラムがマスターノードで実行されない場合は、
phoenix_client.keytabファイルと/etc/krb5.confファイルを、コードが実行されるマシンに安全に配布する必要があります。スクリプトがアクセスできるパスにファイルを配置してください。
ステップ 2: Java アプリケーションの作成とパッケージ化
方法 1: プリコンパイル済みの JAR ファイルを使用する (迅速な検証のため)
方法 2: アプリケーションを手動でコンパイルしてパッケージ化する (本番環境に推奨)
次のコードサンプルを参照して、アプリケーションを手動でコンパイルしてパッケージ化できます。
ステップ 3: アプリケーションの実行
ランタイム環境を選択します。
アプリケーションを実行するときは、次の 2 つのランタイム環境のいずれかを選択できます。
クラスターノードで実行 (推奨)
クラスターノードには、必要なすべての Hadoop、HBase、および Phoenix 依存関係ライブラリがプリインストールされています。追加の構成は必要ありません。ネットワーク接続は事前構成されているため、環境は完全で安定しています。
シナリオ: この方法は、迅速な検証、テスト、開発、およびデバッグに適しています。
クラスター外で実行
プログラムをクラスター外で実行するには、次の条件が満たされていることを確認してください。
ネットワーク接続: プログラムが実行されるマシンが、クラスターの ZooKeeper、HBase Master、および RegionServer ノードに接続できることを確認してください。
Kerberos 構成: クラスターの
krb5.confファイルと生成された keytab ファイルを、プログラムが実行されるマシンにコピーします。依存関係の管理: 実行コマンドのクラスパスには、必要なすべての Hadoop、HBase、および Phoenix クライアント依存関係 JAR パッケージが含まれている必要があります。このプロセスは、クラスターノードで実行するよりも複雑になることがよくあります。Maven や Gradle などのツールを使用して依存関係を管理できます。
スクリプトを実行します。
次の
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 # =================================================================================ステップ 2 で作成した JAR パッケージと
kerberos-phoenix.shスクリプトをマスターノードの指定されたディレクトリにアップロードします。次のコマンドを実行して、スクリプトに実行権限を付与します。
chmod +x kerberos-phoenix.sh次のコマンドを実行して、スクリプトを実行します。
./kerberos-phoenix.sh次の例は、返された情報の一部を示しています。

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