Apache Phoenix adalah lapisan SQL yang dibangun di atas HBase, memungkinkan Anda menggunakan SQL standar untuk mengkueri dan mengelola data yang disimpan di HBase.
Prasyarat
Anda telah membuat kluster DataServing atau Custom dengan layanan Phoenix dan HBase yang dipilih. Untuk informasi lebih lanjut, lihat Create a cluster.
Gunakan Phoenix dari command line
-
Hubungkan ke kluster menggunakan SSH. Untuk informasi lebih lanjut, lihat Log on to a cluster.
-
Jalankan perintah berikut untuk menggunakan tool command line Phoenix.
/opt/apps/PHOENIX/phoenix-current/bin/sqlline.py -
Anda dapat menggunakan SQL untuk mengkueri data. Operasi umum meliputi:
-
Buat tabel
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) ); -
Masukkan data
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'); -
Kueri data
SELECT * FROM example;Kueri mengembalikan output berikut.
+--------+-------------+------------+ | MY_PK | FIRST_NAME | LAST_NAME | +--------+-------------+------------+ | 100 | Jack | Ben | | 200 | Jack3 | Ben3 | +--------+-------------+------------+ -
Hapus tabel
DROP TABLE IF EXISTS example;
-
Hubungkan ke Phoenix menggunakan JDBC
Konfigurasikan dependensi Maven
<dependency>
<groupId>org.apache.phoenix</groupId>
<artifactId>phoenix-core</artifactId>
<version>${phoenix.version}</version>
</dependency>
${phoenix.version} harus sesuai dengan versi Phoenix pada kluster Anda.
Contoh kode
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();
}
}
Hubungkan ke Phoenix yang diaktifkan Kerberos melalui JDBC
Jika kluster Anda menggunakan autentikasi Kerberos, bagian ini menjelaskan cara menulis klien JDBC yang terhubung secara aman ke layanan Phoenix pada kluster EMR yang diaktifkan Kerberos. Klien menggunakan URL JDBC dengan informasi principal dan keytab untuk melakukan autentikasi, lalu menjalankan operasi DDL dan DML dasar guna memverifikasi koneksi.
Langkah 1: Siapkan lingkungan dan kredensial
Sebelum menulis kode, konfigurasikan lingkungan Anda dan buat kredensial Kerberos pada node master kluster.
-
Hubungkan ke node master menggunakan SSH. Untuk informasi lebih lanjut, lihat Log on to a cluster.
-
Identifikasi realm Kerberos.
Setiap kluster yang diaktifkan Kerberos memiliki realm unik.
Jalankan perintah berikut untuk mengambil realm Kerberos. Catat realm tersebut untuk digunakan nanti.
cat /etc/krb5.conf | grep default_realmBerikut adalah contoh respons.
default_realm = EMR.C-4FC5FDDE3759****.COM -
Buat principal klien.
Principal adalah identitas unik klien dalam Kerberos. Anda harus membuat principal untuk aplikasi Java.
-
Pada node master, jalankan perintah berikut untuk menggunakan tool
kadmin.local.sudo kadmin.local -
Pada sesi interaktif kadmin.local, jalankan perintah berikut untuk membuat principal.
addprinc phoenix_client@EMR.C-4FC5FDDE3759****.COMSaat diminta, atur dan ingat password untuk principal tersebut. Meskipun file keytab memungkinkan login tanpa password, password ini mungkin tetap diperlukan dalam beberapa kasus.
-
-
Ekspor file keytab.
-
Pada tool kadmin.local, jalankan perintah berikut untuk mengekspor file keytab.
xst -k /tmp/phoenix_client.keytab phoenix_client@EMR.C-4FC5FDDE3759****.COM -
Jalankan perintah berikut untuk keluar dari kadmin.local.
exitPenting-
Izin: Pastikan pengguna yang menjalankan program Java memiliki izin baca pada file keytab.
-
Distribusi: Jika program Java Anda dijalankan pada mesin berbeda, salin secara aman file
phoenix_client.keytabdan file/etc/krb5.confke mesin tersebut, dan pastikan keduanya berada di path yang dapat diakses oleh aplikasi.
-
-
Langkah 2: Tulis dan kemas aplikasi
-
Metode 1: Gunakan file JAR yang telah dikompilasi sebelumnya (verifikasi cepat)
-
Metode 2: Kompilasi dan kemas secara manual (disarankan untuk lingkungan produksi)
Anda dapat menggunakan contoh kode berikut untuk kompilasi dan pengemasan manual.
Langkah 3: Jalankan aplikasi
-
Pilih lingkungan runtime.
Pilih salah satu dari dua opsi berikut:
-
Jalankan di node kluster (disarankan):
-
Node kluster telah dilengkapi pustaka dependensi Hadoop, HBase, dan Phoenix yang diperlukan, sehingga tidak memerlukan konfigurasi tambahan. Konektivitas jaringan juga tersedia secara default, menyediakan lingkungan yang lengkap dan stabil.
-
Paling cocok untuk: verifikasi dan pengujian cepat selama pengembangan dan debugging.
-
-
Jalankan di luar kluster
Untuk menjalankan program di luar kluster, pastikan kondisi berikut terpenuhi:
-
Konektivitas jaringan: Pastikan mesin yang menjalankan program memiliki konektivitas jaringan ke node ZooKeeper, HBase Master, dan RegionServer kluster.
-
Konfigurasi Kerberos: Salin file
krb5.confkluster dan file keytab yang dihasilkan ke mesin tempat program dijalankan. -
Manajemen dependensi: Classpath untuk perintah run harus mencakup semua file JAR dependensi klien Hadoop, HBase, dan Phoenix yang diperlukan. Proses ini biasanya lebih kompleks dibandingkan menjalankan di node kluster. Kami menyarankan menggunakan alat seperti Maven atau Gradle untuk manajemen dependensi.
-
-
-
Jalankan skrip.
Skrip
kerberos-phoenix.shberikut mencakup semua pengaturan yang diperlukan. Anda dapat mengedit dan menjalankannya sesuai kebutuhan.#!/bin/bash # ======================= 1. Konfigurasi pengguna (sesuaikan berdasarkan lingkungan Anda) ======================= # Direktori untuk file konfigurasi Hadoop dan HBase HADOOP_CONF_DIR="/etc/taihao-apps/hadoop-conf" HBASE_CONF_DIR="/etc/taihao-apps/hbase-conf" # Path ke file JAR client Phoenix. Menggunakan tautan simbolik merupakan praktik terbaik agar tetap tangguh terhadap perubahan versi. # Pertama, pastikan file ini ada dengan menggunakan `ls -l /opt/apps/PHOENIX/phoenix-current/`. Path ini mungkin perlu dimodifikasi untuk versi berbeda. PHOENIX_JAR="/opt/apps/PHOENIX/phoenix-current/phoenix-client-lite-hbase-2.6.jar" # Nama file JAR aplikasi Anda. YOUR_JAR_FILE="hbase-phoenix-kerberos-1.0-SNAPSHOT.jar" # Path ke file konfigurasi Kerberos. KRB5_CONF_PATH="/etc/krb5.conf" # --- [Inti] Konfigurasi URL JDBC --- # Format: jdbc:phoenix:[Alamat ZK]:[Port ZK]:[ZNode HBase]:[Principal]:[Path Absolut Keytab] # Ganti alamat ZK, REALM, dan path keytab di bawah ini dengan informasi aktual Anda. ZK_QUORUM="master-1-1" # Jika terdapat multiple node ZooKeeper, pisahkan dengan koma, contohnya "zk1,zk2,zk3" ZK_PORT="2181" HBASE_ZNODE="/hbase" # Untuk kluster aman, nilainya mungkin /hbase-secure PRINCIPAL="phoenix_client@EMR.C-4FC5FDDE3759****.COM" # Ganti dengan principal Anda KEYTAB_PATH="/tmp/phoenix_client.keytab" # Path absolut ke file keytab JDBC_URL="jdbc:phoenix:${ZK_QUORUM}:${ZK_PORT}:${HBASE_ZNODE}:${PRINCIPAL}:${KEYTAB_PATH}" # ================================================================================= # ======================= 2. Eksekusi (biasanya tidak perlu diubah) ================================= echo "=================================================" echo "Memulai Demo JDBC Phoenix Kerberos..." echo "Menggunakan URL JDBC: ${JDBC_URL}" echo "=================================================" # Bangun classpath. Urutan: direktori saat ini -> direktori konfigurasi -> JAR Anda -> JAR dependensi # `hbase classpath` secara otomatis memuat dependensi inti Hadoop/HBase CLASS_PATH=".:${HADOOP_CONF_DIR}:${HBASE_CONF_DIR}:${YOUR_JAR_FILE}:${PHOENIX_JAR}:$(hbase classpath)" # Jalankan program Java java -cp "${CLASS_PATH}" \ -Djava.security.krb5.conf="${KRB5_CONF_PATH}" \ PhoenixKerberosDemo "${JDBC_URL}" # Periksa kode keluar if [ $? -eq 0 ]; then echo -e "\n[SUCCESS] Program selesai berhasil." else echo -e "\n[FAILED] Program dihentikan karena error." fi # =================================================================================-
Unggah file JAR yang dikemas dalam Langkah 2 dan skrip
kerberos-phoenix.shke direktori target pada Node master. -
Jalankan perintah berikut untuk memberikan izin eksekusi pada skrip.
chmod +x kerberos-phoenix.sh -
Jalankan perintah berikut untuk menjalankan skrip.
./kerberos-phoenix.shBerikut adalah contoh output:
2025-08-13 13:22:30,825 INFO query.GuidePostsCacheProvider: Sucessfully loaded class for GuidePostsCacheFactor of type: org.apache.phoenix.query.DefaultGuidePostsCacheFactory 2025-08-13 13:22:30,939 INFO connectionqueryservice.ConnectionQueryServicesMetricsManager: Created object for NoOp Connection query service metrics manager Connection established successfully. Creating table 'TEST'... 2025-08-13 13:22:33,433 INFO client.HBaseAdmin: Operation: CREATE, Table Name: default:TEST, procId: 144 completed Upserting data... Data upserted successfully. Querying for results with: SELECT * FROM TEST Query results: 1 -> Hello 2 -> World-Kerberos! Cleaning up the test table... 2025-08-13 13:22:33,597 INFO client.HBaseAdmin: Started disable of TEST 2025-08-13 13:22:34,209 INFO client.HBaseAdmin: Operation: DISABLE, Table Name: default:TEST, procId: 147 completed 2025-08-13 13:22:34,521 INFO client.HBaseAdmin: Operation: DELETE, Table Name: default:TEST, procId: 151 completed Execution finished. 2025-08-13 13:22:34,559 INFO log.QueryLoggerDisruptor: Shutting down QueryLoggerDisruptor.. 2025-08-13 13:22:34,559 INFO client.ConnectionImplementation: Closing master protocol: MasterService 2025-08-13 13:22:34,563 INFO hbase.ChoreService: Chore service for: AsyncConn Chore Service had [ScheduledChore name=RefreshCredentials, period=30000, unit=MILLISECONDS] on shutdown 2025-08-13 13:22:34,563 INFO query.ConnectionQueryServicesImpl: hconnection-0x1fdf1c5 HConnection closed. Stacktrace for informational purposes: java.lang.Thread.getStackTrace(Thread.java:1564) org.apache.phoenix.util.LogUtil.getCallerStackTrace(LogUtil.java:55) org.apache.phoenix.query.ConnectionQueryServicesImpl.closeConnection(ConnectionQueryServicesImpl.java:537) org.apache.phoenix.query.ConnectionQueryServicesImpl.close(ConnectionQueryServicesImpl.java:649) org.apache.phoenix.jdbc.PhoenixDriver.close(PhoenixDriver.java:349) ... org.apache.phoenix.jdbc.PhoenixDriver.closeInstance(PhoenixDriver.java:138) org.apache.phoenix.jdbc.PhoenixDriver.access$000(PhoenixDriver.java:68) org.apache.phoenix.jdbc.PhoenixDriver$1$1.run(PhoenixDriver.java:94) java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) java.util.concurrent.FutureTask.run(FutureTask.java:266) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) java.lang.Thread.run(Thread.java:750) [SUCCESS] Program finished successfully.
-
Referensi
Untuk informasi lebih lanjut tentang Phoenix, lihat dokumentasi resmi: