All Products
Search
Document Center

E-MapReduce:Phoenix

Last Updated:Jun 21, 2026

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

  1. Hubungkan ke kluster menggunakan SSH. Untuk informasi lebih lanjut, lihat Log on to a cluster.

  2. Jalankan perintah berikut untuk menggunakan tool command line Phoenix.

    /opt/apps/PHOENIX/phoenix-current/bin/sqlline.py
  3. 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.

  1. Hubungkan ke node master menggunakan SSH. Untuk informasi lebih lanjut, lihat Log on to a cluster.

  2. 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_realm

    Berikut adalah contoh respons.

    default_realm = EMR.C-4FC5FDDE3759****.COM
  3. Buat principal klien.

    Principal adalah identitas unik klien dalam Kerberos. Anda harus membuat principal untuk aplikasi Java.

    1. Pada node master, jalankan perintah berikut untuk menggunakan tool kadmin.local.

      sudo kadmin.local
    2. Pada sesi interaktif kadmin.local, jalankan perintah berikut untuk membuat principal.

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

      Saat diminta, atur dan ingat password untuk principal tersebut. Meskipun file keytab memungkinkan login tanpa password, password ini mungkin tetap diperlukan dalam beberapa kasus.

  4. Ekspor file keytab.

    1. Pada tool kadmin.local, jalankan perintah berikut untuk mengekspor file keytab.

      xst -k /tmp/phoenix_client.keytab phoenix_client@EMR.C-4FC5FDDE3759****.COM
    2. Jalankan perintah berikut untuk keluar dari kadmin.local.

      exit
      Penting
      • 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.keytab dan file /etc/krb5.conf ke 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)

    hbase-phoenix-kerberos-1.0-SNAPSHOT.jar

  • Metode 2: Kompilasi dan kemas secara manual (disarankan untuk lingkungan produksi)

    Anda dapat menggunakan contoh kode berikut untuk kompilasi dan pengemasan manual.

    Contoh Kode Inti (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;
    /**
     * A client that connects to a Kerberos-secured Phoenix cluster using JDBC.
     * All connection parameters are provided through a complete JDBC URL passed from the command line.
     */
    public class PhoenixKerberosDemo {
        /**
         * The main entry point for the application.
         *
         * @param args Command-line arguments. The program expects one argument: the complete Phoenix JDBC URL.
         */
        public static void main(String[] args) {
            // --- 1. Validasi input command line: Harus ada satu argumen, yaitu URL JDBC ---
            if (args.length != 1) {
                System.err.println("ERROR: Jumlah argumen tidak valid.");
                System.err.println("Penggunaan: java PhoenixKerberosDemo \"<full_jdbc_url>\"");
                System.err.println("Contoh: \"jdbc:phoenix:zk1,zk2:2181:/hbase:user@REALM.COM:/path/to/user.keytab\"");
                System.exit(1); // Keluar dengan kode error
            }
            String jdbcUrl = args[0];
            System.out.println("Mencoba menghubungkan ke Phoenix...");
            System.out.println("Menggunakan URL JDBC: " + jdbcUrl);
            try {
                // --- 2. Muat driver Phoenix ---
                Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");
            } catch (ClassNotFoundException e) {
                System.err.println("FATAL ERROR: Driver JDBC Phoenix tidak ditemukan di classpath.");
                e.printStackTrace();
                System.exit(1);
            }
            // --- 3. Gunakan pernyataan try-with-resources untuk membuat koneksi dan mengeksekusi SQL. Sintaks ini secara otomatis menutup sumber daya. ---
            try (Connection con = DriverManager.getConnection(jdbcUrl);
                 Statement stmt = con.createStatement()) {
                System.out.println("Koneksi berhasil dibuat.");
                final String tableName = "TEST";
                System.out.println("Membuat tabel '" + tableName + "'...");
                stmt.executeUpdate("CREATE TABLE IF NOT EXISTS " + tableName + " (mykey INTEGER NOT NULL PRIMARY KEY, mycolumn VARCHAR)");
                con.commit();
                System.out.println("Memasukkan data...");
                stmt.executeUpdate("UPSERT INTO " + tableName + " VALUES (1, 'Hello')");
                stmt.executeUpdate("UPSERT INTO " + tableName + " VALUES (2, 'World-Kerberos!')");
                con.commit();
                System.out.println("Data berhasil dimasukkan.");
                String sql = "SELECT * FROM " + tableName;
                System.out.println("Menjalankan kueri: " + sql);
                try (PreparedStatement statement = con.prepareStatement(sql);
                     ResultSet rset = statement.executeQuery()) {
                    System.out.println("Hasil kueri:");
                    while (rset.next()) {
                        System.out.println(rset.getInt("mykey") + " -> " + rset.getString("mycolumn"));
                    }
                }
                System.out.println("Membersihkan tabel uji...");
                stmt.executeUpdate("DROP TABLE IF EXISTS " + tableName);
                con.commit();
            } catch (SQLException e) {
                // Tangani eksepsi SQL dan berikan tips troubleshooting yang membantu
                System.err.println("\n--- GAGAL MENJALANKAN OPERASI DATABASE ---");
                System.err.println("Periksa hal-hal berikut:");
                System.err.println("1. URL JDBC benar (format, principal, path keytab).");
                System.err.println("2. Konektivitas jaringan ke ZooKeeper dan HBase.");
                System.err.println("3. File keytab tersedia dan memiliki izin baca yang sesuai.");
                System.err.println("4. Principal memiliki izin yang cukup pada tabel dan namespace HBase.");
                e.printStackTrace();
            }
            System.out.println("\nEksekusi selesai.");
        }
    }
    

    Konfigurasi 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>

Langkah 3: Jalankan aplikasi

  1. 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.conf kluster 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.

  2. Jalankan skrip.

    Skrip kerberos-phoenix.sh berikut 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
    # =================================================================================
    1. Unggah file JAR yang dikemas dalam Langkah 2 dan skrip kerberos-phoenix.sh ke direktori target pada Node master.

    2. Jalankan perintah berikut untuk memberikan izin eksekusi pada skrip.

      chmod +x kerberos-phoenix.sh
    3. Jalankan perintah berikut untuk menjalankan skrip.

      ./kerberos-phoenix.sh

      Berikut 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: