全部产品
Search
文档中心

E-MapReduce:Phoenix

更新时间:Nov 10, 2025

Apache Phoenix adalah lapisan perantara SQL yang dibangun di atas HBase, memungkinkan Anda menjalankan pernyataan SQL standar untuk mengkueri dan mengelola data HBase.

Prasyarat

Kluster DataServing atau kluster kustom telah dibuat dengan layanan Phoenix dan HBase dipilih saat pembuatan kluster. Untuk informasi selengkapnya, lihat Buat kluster.

Gunakan Phoenix dari baris perintah

  1. Masuk ke kluster Anda melalui SSH. Untuk informasi selengkapnya, lihat Masuk ke kluster.

  2. Jalankan perintah berikut untuk membuka CLI Phoenix:

    /opt/apps/PHOENIX/phoenix-current/bin/sqlline.py
  3. Jalankan pernyataan SQL untuk mengelola data. Operasi umum:

    • 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 ke dalam tabel.

      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 dari tabel.

      SELECT * FROM example;

      Output berikut dikembalikan:

      +--------+-------------+------------+
      | MY_PK  | FIRST_NAME  | LAST_NAME  |
      +--------+-------------+------------+
      | 100    | Jack        | Ben        |
      | 200    | Jack3       | Ben3       |
      +--------+-------------+------------+
    • Hapus tabel.

      DROP TABLE IF EXISTS example;

Sambungkan ke Phoenix menggunakan JDBC

Konfigurasi dependensi Maven

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

Variabel ${phoenix.version} harus sesuai dengan versi Phoenix di kluster Anda.

Kode contoh

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();
    }
}

Sambungkan ke kluster Phoenix yang diaktifkan Kerberos menggunakan JDBC

Jika kluster Anda menggunakan otentikasi Kerberos, bagian ini menjelaskan cara menulis program klien Java Database Connectivity (JDBC) untuk terhubung secara aman ke layanan Phoenix pada kluster EMR yang diaktifkan Kerberos. Program klien melakukan otentikasi menggunakan URL JDBC yang berisi informasi principal dan keytab, lalu menjalankan operasi Data Definition Language (DDL) dan Data Manipulation Language (DML) dasar untuk memverifikasi koneksi.

Langkah 1: Siapkan lingkungan dan kredensial

Sebelum menulis dan menjalankan kode, Anda harus menyiapkan lingkungan dan membuat kredensial Kerberos. Lakukan semua operasi berikut pada node master kluster.

  1. Sambungkan ke node master kluster menggunakan SSH. Untuk informasi selengkapnya, lihat Masuk ke kluster.

  2. Tentukan realm Kerberos.

    Setiap kluster yang diaktifkan Kerberos memiliki realm unik.

    Jalankan perintah berikut untuk mengambil informasi realm. Temukan dan catat realm tersebut untuk digunakan nanti.

    cat /etc/krb5.conf | grep default_realm

    Informasi berikut dikembalikan.

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

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

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

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

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

      Setelah menjalankan perintah tersebut, Anda akan diminta menetapkan kata sandi untuk principal tersebut. Ingat kata sandi ini. Meskipun file keytab memungkinkan login tanpa kata sandi, kata sandi tersebut mungkin tetap diperlukan dalam beberapa kasus.

  4. Ekspor file keytab.

    1. Pada alat 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 tidak dijalankan pada node master, Anda harus mendistribusikan file phoenix_client.keytab dan file /etc/krb5.conf ke mesin tempat kode dijalankan secara aman. Tempatkan file-file tersebut di jalur yang dapat diakses oleh skrip.

Langkah 2: Tulis dan kemas aplikasi Java

  • Metode 1: Gunakan file JAR yang telah dikompilasi sebelumnya (untuk verifikasi cepat)

    hbase-phoenix-kerberos-1.0-SNAPSHOT.jar

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

    Anda dapat merujuk pada contoh kode berikut untuk mengompilasi dan mengemas aplikasi secara 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;
    
    /**
     * Klien yang terhubung ke kluster Phoenix yang diamankan dengan Kerberos menggunakan JDBC.
     * Semua parameter koneksi disediakan melalui URL JDBC lengkap yang diteruskan dari baris perintah.
     */
    public class PhoenixKerberosDemo {
    
        /**
         * Titik masuk utama aplikasi.
         *
         * @param args Argumen baris perintah. Program ini mengharapkan satu argumen: URL JDBC Phoenix lengkap.
         */
        public static void main(String[] args) {
            // --- 1. Validasi input baris perintah: Harapkan 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 kesalahan
            }
    
            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("KESALAHAN FATAL: 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 dengan: " + 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) {
                // Tangkap pengecualian SQL dan berikan tips pemecahan masalah yang membantu
                System.err.println("\n--- GAGAL MENJALANKAN OPERASI BASIS DATA ---");
                System.err.println("Harap 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 ada dan memiliki izin baca yang benar.");
                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.

    Saat menjalankan aplikasi, Anda dapat memilih salah satu dari dua lingkungan runtime berikut:

    • Jalankan di node kluster (Direkomendasikan)

      • Node kluster telah memiliki semua pustaka dependensi Hadoop, HBase, dan Phoenix yang diperlukan dalam keadaan pra-instal. Tidak diperlukan konfigurasi tambahan karena konektivitas jaringan telah dikonfigurasi sebelumnya, sehingga lingkungan tersebut lengkap dan stabil.

      • Skenario: Metode ini cocok untuk verifikasi cepat, pengujian, pengembangan, dan debugging.

    • Jalankan di luar kluster

      Untuk menjalankan program di luar kluster, pastikan kondisi berikut terpenuhi:

      • Konektivitas jaringan: Pastikan mesin tempat program dijalankan dapat terhubung ke node ZooKeeper, HBase Master, dan RegionServer kluster.

      • Konfigurasi Kerberos: Salin berkas krb5.conf kluster dan berkas keytab yang dihasilkan ke mesin tempat program dijalankan.

      • Manajemen dependensi: Classpath untuk perintah run harus mencakup semua paket JAR dependensi klien Hadoop, HBase, dan Phoenix yang diperlukan. Proses ini umumnya lebih kompleks dibandingkan dengan menjalankan di node kluster. Anda dapat menggunakan alat seperti Maven atau Gradle untuk mengelola dependensi.

  2. Jalankan skrip.

    Skrip kerberos-phoenix.sh berikut mengintegrasikan semua konfigurasi yang diperlukan untuk memudahkan modifikasi dan eksekusi.

    #!/bin/bash
    
    # ======================= 1. Konfigurasi Pengguna (Modifikasi sesuai lingkungan Anda) =======================
    
    # Direktori tempat berkas konfigurasi Hadoop dan HBase berada
    HADOOP_CONF_DIR="/etc/taihao-apps/hadoop-conf"
    HBASE_CONF_DIR="/etc/taihao-apps/hbase-conf"
    
    # Path ke berkas JAR klien Phoenix. Menggunakan tautan simbolik merupakan praktik terbaik untuk menangani perubahan versi.
    # Pertama, gunakan 'ls -l /opt/apps/PHOENIX/phoenix-current/' untuk memastikan berkas ini ada. Path ini mungkin perlu dimodifikasi untuk versi yang berbeda.
    PHOENIX_JAR="/opt/apps/PHOENIX/phoenix-current/phoenix-client-lite-hbase-2.6.jar"
    
    # Nama berkas JAR aplikasi Anda.
    YOUR_JAR_FILE="hbase-phoenix-kerberos-1.0-SNAPSHOT.jar"
    
    # Path ke berkas 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 beberapa node ZooKeeper, pisahkan dengan koma, misalnya "zk1,zk2,zk3"
    ZK_PORT="2181"
    HBASE_ZNODE="/hbase" # Untuk kluster aman, mungkin berupa /hbase-secure
    PRINCIPAL="phoenix_client@EMR.C-4FC5FDDE3759****.COM" # Ganti dengan Principal Anda
    KEYTAB_PATH="/tmp/phoenix_client.keytab" # Path absolut ke berkas Keytab
    
    JDBC_URL="jdbc:phoenix:${ZK_QUORUM}:${ZK_PORT}:${HBASE_ZNODE}:${PRINCIPAL}:${KEYTAB_PATH}"
    # =================================================================================
    
    # ======================= 2. Area Eksekusi (Biasanya tidak perlu dimodifikasi) =================================
    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[SUKSES] Program selesai dengan sukses."
    else
        echo -e "\n[GAGAL] Program dihentikan karena terjadi kesalahan."
    fi
    # =================================================================================
    1. Unggah paket JAR yang dibuat pada Langkah 2 dan skrip kerberos-phoenix.sh ke direktori tertentu 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

      Contoh berikut menunjukkan sebagian informasi yang dikembalikan.

      image

Referensi

Untuk informasi selengkapnya tentang Phoenix, lihat topik-topik berikut dalam dokumentasi resmi: