Penyiapan

Memasang PySpark mode lokal, membersihkan keluaran log, dan menjalankan program pertama.

Daftar isi

Topik ini membahas cara memasang PySpark pada mode lokal, meredam keluaran lognya, lalu menjalankan program pertama yang lengkap. Setiap perintah dieksekusi pada lingkungan nyata dan keluarannya ditampilkan apa adanya, sehingga hasil di layar dapat dibandingkan baris demi baris. Yang diperlukan adalah Python 3, Java 17 atau 21, terminal, dan akses ke repositori paket Python.

Memasang PySpark#

PySpark dipasang sebagai paket Python bernama pyspark melalui pip, pengelola paket bawaan Python. Satu perintah berikut cukup karena paket tersebut membawa runtime Spark lengkap beserta seluruh dependensinya. Perintah dijalankan pada terminal dengan lingkungan Python yang sudah aktif.

bash
# memasang PySpark dari Python Package Index
pip install pyspark
text Keluaran
Requirement already satisfied: pyspark in /home/kal/.venv/lib/python3.12/site-packages (4.2.1)
Requirement already satisfied: py4j<0.10.9.10,>=0.10.9.7 in /home/kal/.venv/lib/python3.12/site-packages (from pyspark) (0.10.9.9)

[notice] A new release of pip is available: 26.2.2 -> 26.3
[notice] To update, run: pip install --upgrade pip

Keluaran di atas menunjukkan kondisi lingkungan yang sudah terpasang. Baris “Requirement already satisfied” berarti paket pyspark 4.2.1 sudah ada pada folder site-packages milik lingkungan Python aktif, bersama dependensi py4j yang menjadi jembatan komunikasi antara Python dan JVM. Dua baris notice di akhir berasal dari pip itu sendiri mengenai pembaruan pip dan tidak berhubungan dengan Spark. Pada lingkungan yang baru, perintah yang sama akan menampilkan proses unduhan dan pesan “Successfully installed pyspark”.

Paket pyspark bukan pembungkus tipis. Instalasinya menyalin runtime Spark lengkap ke folder site-packages, mulai dari berkas JAR, skrip peluncur seperti spark-submit, sampai pustaka py4j. Karena itu ukuran unduhannya besar, dan pemasangan Spark manual dari sumber resmi tidak diperlukan untuk keperluan mode lokal. Apabila versi tertentu dibutuhkan, nomor versinya dapat disematkan pada perintah, misalnya pip install pyspark==4.2.1, sehingga lingkungan kerja tetap konsisten.

Memeriksa Java#

Spark 4.2 berjalan di atas JVM, sehingga Java wajib tersedia sebelum program pertama dicoba. Versi yang didukung adalah Java 17 atau Java 21, dan pemeriksaannya cukup dengan java -version. Perintahnya dijalankan pada terminal yang sama dengan perintah pip sebelumnya.

bash
# memeriksa versi Java, keluarannya ditulis ke stderr
java -version 2>&1
text Keluaran
openjdk version "21.0.13" 2026-10-20
OpenJDK Runtime Environment (build 21.0.13+9-1-deb13u2-Debian)
OpenJDK 64-Bit Server VM (build 21.0.13+9-1-deb13u2-Debian, mixed mode, sharing)

Perhatikan akhiran 2>&1 pada perintahnya. java -version menuliskan seluruh keluarannya ke stderr, yaitu aliran keluaran untuk pesan di luar hasil utama, sehingga pada sebagian terminal perintah ini tampak diam bila stderr tidak digabungkan. Keluaran di atas menunjukkan OpenJDK 21.0.13, yang memenuhi syarat Spark 4.2. Bila Java belum terpasang, perintah berakhir dengan pesan command not found dan Java perlu dipasang terlebih dahulu.

Java menjadi syarat karena inti Spark ditulis dalam bahasa Scala dan berjalan di atas JVM, sedangkan PySpark berperan sebagai antarmuka Python di depannya. Setiap program PySpark meluncurkan proses JVM saat dimulai, sehingga kelengkapan Java perlu dipastikan lebih dahulu. OpenJDK 21 termasuk versi dukungan jangka panjang (long term support) yang didukung oleh Spark 4.

Memverifikasi instalasi#

Paket Python yang terpasang belum membuktikan runtime Spark siap digunakan. Verifikasi paling ringan dilakukan melalui spark-submit, yaitu alat yang pada praktiknya digunakan untuk mengirim aplikasi ke cluster. Alat ini ikut terpasang bersama paket pyspark, sehingga tidak diperlukan instalasi tambahan.

bash
# menampilkan identitas instalasi Spark
spark-submit --version 2>&1
text Keluaran
WARNING: Using incubator modules: jdk.incubator.vector
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 4.2.1
      /_/

Using Scala version 2.13.18, OpenJDK 64-Bit Server VM, 21.0.13
Branch HEAD
Compiled by user runner on 2026-10-21T19:19:49Z
Revision 617618396087429b5627a86ce933bb0f5d6645cb
Url https://github.com/apache/spark
Type --help for more information.

Keluaran tersebut memuat tiga informasi sekaligus, yaitu versi Spark 4.2.1, versi Scala 2.13.18 yang menjadi bahasa inti Spark, dan JVM yang dipakai. Baris pertama berbunyi “WARNING: Using incubator modules: jdk.incubator.vector” dan akan muncul kembali di awal setiap program Spark pada jalur ini. Baris itu berasal dari JVM, bukan dari program Python, karena Spark 4 meminta Java Vector API, yaitu modul Java yang masih berstatus incubator atau eksperimental. Status inkubator hanya berarti API-nya boleh berubah antar versi Java, sehingga baris peringatan ini tidak berbahaya dan dapat diabaikan.

Pemeriksaan –version adalah yang paling ringan karena tidak memulai cluster maupun membaca berkas data, cukup menampilkan identitas build lalu berhenti. Setelah instalasi terbukti, alat yang sama digunakan untuk menjalankan aplikasi, misalnya spark-submit program_pertama.py menjalankan skrip pada mode lokal. Pada jalur ini skrip dijalankan langsung melalui perintah python3, sedangkan spark-submit menjadi alat pengiriman ketika aplikasi berpindah ke cluster.

Membersihkan keluaran log#

Tanpa penyetelan, konsol dipenuhi log internal Spark berlevel INFO dan progress bar per job, sehingga keluaran program sendiri sulit dibaca. Dua berkas konfigurasi menyelesaikannya. Berkas pertama, log4j2.properties, mengatur level log yang ditampilkan dengan menaikkan logger yang berisik ke level error, sedangkan akar (root) tetap warn. Berkas kedua, spark-defaults.conf, mematikan progress bar konsol.

ini log4j2.properties
# Menekan log internal Spark di konsol: root tetap WARN dan logger yang
# berisik dinaikkan ke ERROR.
rootLogger.level = warn
rootLogger.appenderRef.stdout.ref = console

appender.console.type = Console
appender.console.name = console
appender.console.target = SYSTEM_ERR
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n

logger.ncl.name = org.apache.hadoop.util.NativeCodeLoader
logger.ncl.level = error
logger.ncl.additivity = false

# kueri streaming beragregasi selalu mematikan AQE dengan peringatan
# ber-timestamp; paket streaming dinaikkan ke ERROR agar keluaran bersih.
logger.stream.name = org.apache.spark.sql.execution.streaming
logger.stream.level = error

# operasi Delta Lake mencatat peringatan ber-timestamp per commit dan
# per checkpoint; naikkan ke ERROR agar keluaran konsol tetap bersih.
logger.delta.name = org.apache.spark.sql.delta
logger.delta.level = error

# MERGE pada tabel Delta memicu peringatan checkpoint RDD; naikkan ke
# ERROR dengan alasan yang sama.
logger.rdd.name = org.apache.spark.rdd.MapPartitionsRDD
logger.rdd.level = error
ini spark-defaults.conf
spark.ui.showConsoleProgress false

Kedua berkas diletakkan pada folder conf di dalam SPARK_HOME. Untuk pemasangan melalui pip, SPARK_HOME menunjuk ke folder pyspark di dalam site-packages, sehingga pada lingkungan seperti keluaran pip di atas letaknya menjadi site-packages/pyspark/conf. Folder conf mungkin belum ada pada pemasangan pip yang baru, sehingga perlu dibuat terlebih dahulu sebelum kedua berkas dituliskan.

Kombinasi kedua berkas membuat konsol hanya menampilkan hal yang penting. Logger NativeCodeLoader yang memunculkan peringatan berulang tentang pustaka native diangkat ke level error, root logger tetap warn agar pesan yang benar-benar perlu diperhatikan tidak hilang, dan progress bar yang menimpa baris program dimatikan. Entri berikutnya, logger.stream, mengangkat paket log streaming ke level error. Tanpa entri ini, kueri beragregasi pada modul streaming selalu mencetak dua baris peringatan ber-timestamp tentang AQE yang dimatikan Spark secara otomatis, dan baris ber-timestamp semacam itu membuat keluaran tidak dapat direproduksi. Entri logger.delta melakukan hal yang sama untuk peringatan per commit pada modul ekosistem, dan logger.rdd meredam peringatan checkpoint RDD yang ikut muncul pada operasi MERGE. Hasil akhirnya adalah keluaran yang bersih dan konsisten, kecuali satu baris WARNING incubator yang sudah dijelaskan.

Program pertama#

Program pertama berupa satu skrip Python yang lengkap dan dapat langsung dijalankan. SparkSession dibangun dengan pola baku, yaitu master local[2] untuk dua thread pemroses pada mode lokal dan appName sebagai identitas aplikasi. Data contohnya berupa nilai ujian empat siswa yang berasal dari daftar tuple.

python program_pertama.py
from pyspark.sql import SparkSession

spark = (
    SparkSession.builder
    .master("local[2]")
    .appName("program-pertama")
    .getOrCreate()
)

data = [
    (101, "Ali", 86),
    (102, "Budi", 91),
    (103, "Citra", 78),
    (104, "Dewi", 88),
]
nilai = spark.createDataFrame(data, ["nim", "nama", "nilai"])

nilai.orderBy("nim").show()

print("Jumlah baris data:", len(data))

spark.stop()
text Keluaran
WARNING: Using incubator modules: jdk.incubator.vector
+---+-----+-----+
|nim| nama|nilai|
+---+-----+-----+
|101|  Ali|   86|
|102| Budi|   91|
|103|Citra|   78|
|104| Dewi|   88|
+---+-----+-----+

Jumlah baris data: 4

Skrip dibaca dari atas ke bawah. SparkSession.builder merangkai konfigurasi dan getOrCreate() membuat sesinya. createDataFrame mengubah daftar tuple menjadi DataFrame dengan kolom nim, nama, dan nilai, kemudian orderBy(“nim”).show() menampilkan isinya sebagai tabel yang urutannya terjamin. Baris print mencetak jumlah baris dari sisi Python, dan spark.stop() mengakhiri sesi serta melepaskan resource yang digunakan.

Baris pertama keluaran adalah peringatan incubator yang sama seperti pada spark-submit, yaitu pesan dari JVM karena Spark 4 menggunakan Java Vector API. Peringatan itu aman diabaikan, sehingga tabel empat baris di bawahnya adalah keluaran program yang sesungguhnya. Menghitung jumlah baris DataFrame dengan count() sebenarnya dapat dilakukan, tetapi operasi tersebut memicu satu job tambahan, sehingga program pertama ini mengambil jumlahnya langsung dari daftar Python.

Kesalahan umum#

Kesalahan yang sering terjadi saat memeriksa Java adalah lupa menggabungkan stderr. Perintah java -version tanpa 2>&1 tampak tidak menghasilkan apa pun pada sebagian terminal, padahal Java sudah terpasang. Perbaikannya sederhana, yaitu menambahkan 2>&1 seperti pada contoh.

Kesalahan kedua adalah Java yang tidak ditemukan oleh PySpark. Gejalanya berupa error dengan pesan “Java gateway process exited before sending the driver its port number” saat SparkSession dibuat. Penyebabnya, Java belum terpasang atau variabel JAVA_HOME tidak menunjuk ke instalasi Java. Perbaikannya adalah memasang Java 17 atau 21, lalu mengatur JAVA_HOME sehingga proses Python dapat menemukannya.

Kesalahan ketiga adalah meletakkan kedua berkas konfigurasi di folder proyek. Spark hanya membaca folder conf di dalam SPARK_HOME, sehingga log berisik tetap muncul walaupun berkasnya ada. Perbaikannya adalah memindahkan kedua berkas ke site-packages/pyspark/conf pada pemasangan pip.

Ringkasan#

  • pip memasang paket pyspark beserta dependensinya pada lingkungan Python aktif, dengan Java 17 atau 21 sebagai syarat runtime.
  • spark-submit –version memverifikasi instalasi dan menampilkan versi Spark, Scala, dan JVM yang digunakan.
  • Berkas log4j2.properties dan spark-defaults.conf pada folder conf menekan log internal serta mematikan progress bar, sehingga keluaran konsol bersih.
  • Baris WARNING incubator berasal dari JVM karena Java Vector API dan dapat diabaikan.

Referensi#