All Products
Search
Document Center

:FAQ Spark

Last Updated:Mar 27, 2026

Halaman ini menjawab pertanyaan umum mengenai pengembangan dan eksekusi pekerjaan Spark di MaxCompute, dikelompokkan berdasarkan topik.

Kembangkan dengan Spark

Bagaimana cara melakukan pemeriksaan mandiri pada proyek saya?

Periksa item berikut sebelum mengirimkan pekerjaan:

dependensi pom.xml — Cakupan semua dependensi spark-xxxx_${scala.binary.version} harus diatur ke provided:

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_${scala.binary.version}</artifactId>
    <version>${spark.version}</version>
    <scope>provided</scope>
</dependency>

`spark.master` di kelas utama — Jangan hard-code local[N] saat mengirimkan dalam mode yarn-cluster:

val spark = SparkSession
      .builder()
      .appName("SparkPi")
      // Hapus .config("spark.master", "local[4]") sebelum mengirimkan dalam mode yarn-cluster.
      .getOrCreate()

Definisi kelas utama Scala — Titik masuk harus berupa object, bukan class:

object SparkPi {  // Harus berupa object; class tidak dapat memuat fungsi main.
  def main(args: Array[String]) {
    val spark = SparkSession
      .builder()
      .appName("SparkPi")
      .getOrCreate()

Konfigurasi yang di-hard-code — Konfigurasi yang diatur langsung dalam kode mungkin tidak berlaku dalam mode yarn-cluster. Tambahkan semua item konfigurasi ke spark-defaults.conf sebagai gantinya:

// Hindari hard-coding konfigurasi MaxCompute seperti ini dalam mode kluster.
val spark = SparkSession
      .builder()
      .appName("SparkPi")
      .config("key1", "value1")
      .config("key2", "value2")
      .getOrCreate()
Saat mengirimkan pekerjaan dalam mode yarn-cluster, tambahkan semua item konfigurasi ke spark-defaults.conf.

Apa langkah-langkah untuk menjalankan node ODPS Spark di DataWorks?

  1. Tulis dan paket kode Spark Anda secara lokal. Lingkungan Python harus menggunakan Python 2.7.

  2. Unggah paket resource ke DataWorks. Lihat Buat dan gunakan resource MaxCompute.

  3. Buat node ODPS Spark di DataWorks. Lihat Buat node ODPS Spark.

  4. Tulis kode node dan jalankan. Lihat hasilnya di Konsol DataWorks.

Bagaimana cara men-debug Spark di MaxCompute secara lokal?

Gunakan IntelliJ IDEA untuk men-debug secara lokal. Lihat Siapkan lingkungan pengembangan Linux.

Bagaimana cara menggunakan Spark untuk mengakses layanan di VPC?

Lihat Akses instansi terhubung-VPC dari Spark.

Bagaimana cara mereferensikan paket JAR sebagai resource?

Gunakan parameter spark.hadoop.odps.cupid.resources. Resource dapat dibagikan lintas beberapa proyek — atur izin yang sesuai untuk memastikan keamanan data.

## Tambahkan ke spark-defaults.conf atau item konfigurasi DataWorks.
spark.hadoop.odps.cupid.resources = projectname.xx0.jar,projectname.xx1.jar

Bagaimana cara pass parameter menggunakan Spark?

Lihat panduan Spark on DataWorks di GitHub.

Bagaimana cara mengalirkan data DataHub ke MaxCompute menggunakan Spark?

Untuk contoh kode, lihat contoh streaming DataHub di GitHub.

Bagaimana cara migrasi kode Spark open source ke Spark di MaxCompute?

Pilih berdasarkan kebutuhan akses data pekerjaan Anda:

Bagaimana cara menggunakan Spark untuk memproses data tabel MaxCompute?

Spark di MaxCompute mendukung tiga mode eksekusi: Local, Cluster, dan DataWorks. Konfigurasinya berbeda-beda tergantung mode. Lihat Mode eksekusi.

Bagaimana cara mengatur paralelisme resource untuk Spark?

Paralelisme ditentukan oleh jumlah executor dikalikan jumlah core CPU per executor:

Jumlah maksimum tugas paralel = spark.executor.instances x spark.executor.cores
Parameter Deskripsi
spark.executor.instances Jumlah executor yang diminta oleh pekerjaan
spark.executor.cores Core CPU per proses executor. Setiap core menjalankan satu tugas sekaligus. Atur ke nilai antara 2 dan 4.

Bagaimana cara mengatasi masalah out-of-memory (OOM)?

Error OOM muncul sebagai:

  • java.lang.OutOfMemoryError: Java heap space

  • java.lang.OutOfMemoryError: GC overhead limit exceeded

  • Cannot allocate memory

  • The job has been killed by "OOM Killer", please check your job's memory usage

Atur parameter berikut untuk mengatasi OOM:

Parameter Deskripsi Panduan
spark.executor.memory Memori heap per executor Pertahankan rasio 1:4 dengan spark.executor.cores. Misalnya, jika spark.executor.cores=1, atur spark.executor.memory=4g. Tingkatkan jika executor melempar error OutOfMemoryError.
spark.executor.memoryOverhead Memori off-heap per executor (overhead JVM, string, buffer NIO) Default: spark.executor.memory x 0.1, minimum 384 MB. Tingkatkan jika Anda melihat error Cannot allocate memory atau error OOM Killer di log executor.
spark.driver.memory Memori heap untuk driver Pertahankan rasio 1:4 dengan spark.driver.cores. Tingkatkan jika driver mengumpulkan data dalam jumlah besar atau melempar error OutOfMemoryError.
spark.driver.memoryOverhead Memori off-heap untuk driver Default: spark.driver.memory x 0.1, minimum 384 MB. Tingkatkan jika Anda melihat error Cannot allocate memory di log driver.

Bagaimana cara mengatasi masalah ruang disk tidak mencukupi?

Error No space left on device berarti ruang disk lokal telah habis — biasanya terjadi pada executor, menyebabkan executor keluar.

Dua cara untuk memperbaikinya:

  1. Tingkatkan ukuran disk — Atur spark.hadoop.odps.cupid.disk.driver.device_size (default: 20 GB, maksimum: 100 GB). Parameter ini berlaku untuk driver dan setiap executor, dan hanya berlaku di spark-defaults.conf atau item konfigurasi DataWorks.

  2. Tingkatkan jumlah executor — Jika error tetap muncul setelah ukuran disk ditingkatkan ke 100 GB, data shuffle pada satu executor telah melebihi batas. Hal ini mungkin disebabkan oleh data skew. Dalam kasus ini, Anda perlu mempartisi ulang data. Error juga bisa terjadi karena volume data terlalu besar. Dalam hal ini, tingkatkan spark.executor.instances untuk mendistribusikan beban.

Bagaimana cara mereferensikan resource di proyek MaxCompute?

Spark di MaxCompute mendukung dua metode:

Metode 1: Referensikan melalui parameter (direkomendasikan untuk resource besar)

Atur spark.hadoop.odps.cupid.resources di spark-defaults.conf atau item konfigurasi DataWorks. Format: <projectname>.<resourcename>[:<newresourcename>]. Pisahkan beberapa resource dengan koma.

Resource diunduh ke direktori kerja driver dan setiap executor. Nama file default adalah <projectname>.<resourcename>. Untuk mengganti nama resource, gunakan <projectname>.<resourcename>:<newresourcename>.

## Tambahkan ke item konfigurasi DataWorks atau spark-defaults.conf.

## Referensikan beberapa resource.
spark.hadoop.odps.cupid.resources=public.python-python-2.7-ucs4.zip,public.myjar.jar

## Ganti nama resource saat diunduh.
spark.hadoop.odps.cupid.resources=public.myjar.jar:myjar.jar

Lihat Operasi resource untuk informasi lebih lanjut.

Metode 2: Referensikan dari DataWorks

Tambahkan resource dari MaxCompute ke alur bisnis di panel Pengembangan Data di DataWorks. Lihat Kelola resource MaxCompute. Lalu pilih resource JAR, file, dan arsip di node ODPS Spark.

Metode 2 mengunggah resource saat runtime tugas. Untuk resource besar, gunakan Metode 1.

Bagaimana cara mengakses VPC?

Spark di MaxCompute terhubung ke VPC menggunakan antarmuka jaringan elastis (ENI). Koneksi ENI hanya terbatas pada VPC di wilayah yang sama. Untuk mengakses beberapa VPC, hubungkan VPC target ke VPC yang terhubung ENI.

Untuk menyiapkan akses VPC berbasis ENI:

  1. Aktifkan koneksi jalur sewa berbasis ENI. Lihat Akses instansi terhubung-VPC dari Spark.

  2. Di layanan target, tambahkan aturan daftar putih untuk mengizinkan akses dari grup keamanan MaxCompute yang dibuat di langkah 1. Misalnya, untuk mengakses ApsaraDB RDS, tambahkan aturan di RDS yang mengizinkan grup keamanan dari langkah 1. Jika layanan hanya menerima alamat IP (bukan grup keamanan), tambahkan Blok CIDR vSwitch yang digunakan di langkah 1.

  3. Konfigurasikan parameter ENI untuk pekerjaan di spark-defaults.conf atau item konfigurasi DataWorks. Ganti [regionid] dan [vpcid] dengan ID wilayah dan ID VPC Anda yang sebenarnya:

    spark.hadoop.odps.cupid.eni.enable = true
    spark.hadoop.odps.cupid.eni.info = [regionid]:[vpcid]

Bagaimana cara mengakses Internet?

Dua metode tersedia:

Metode 1: Koneksi ENI

  1. Aktifkan koneksi jalur sewa berbasis ENI. Lihat Akses instansi terhubung-VPC dari Spark.

  2. Pastikan VPC yang terhubung memiliki akses Internet. Lihat Gunakan fitur SNAT gateway NAT Internet untuk mengakses Internet.

  3. Konfigurasikan pekerjaan. Ganti [region] dan [vpcid] dengan ID wilayah dan ID VPC Anda yang sebenarnya:

    ## Tambahkan ke item konfigurasi DataWorks atau spark-defaults.conf.
    spark.hadoop.odps.cupid.internet.access.list=aliyundoc.com:443
    spark.hadoop.odps.cupid.eni.enable=true
    spark.hadoop.odps.cupid.eni.info=[region]:[vpcid]

Metode 2: SmartNAT

SmartNAT tidak didukung untuk Spark 3.4 dan versi selanjutnya.

Misalnya, untuk mengakses https://aliyundoc.com:443:

  1. Bergabunglah dengan komunitas developer MaxCompute (grup DingTalk ID: 11782920) dan minta tim dukungan untuk menambahkan https://aliyundoc.com:443 ke odps.security.outbound.internetlist.

  2. Aktifkan SmartNAT di spark-defaults.conf atau item konfigurasi DataWorks:

    spark.hadoop.odps.cupid.internet.access.list=aliyundoc.com:443
    spark.hadoop.odps.cupid.smartnat.enable=true

Bagaimana cara mengakses OSS?

Spark di MaxCompute mengakses Alibaba Cloud Object Storage Service (OSS) melalui Jindo SDK.

Langkah 1: Konfigurasikan Jindo SDK dan titik akhir OSS

Tambahkan berikut ke spark-defaults.conf atau item konfigurasi DataWorks:

## Referensikan paket JAR Jindo SDK.
spark.hadoop.odps.cupid.resources=public.jindofs-sdk-3.7.2.jar

## Atur kelas implementasi OSS.
spark.hadoop.fs.AbstractFileSystem.oss.impl=com.aliyun.emr.fs.oss.OSS
spark.hadoop.fs.oss.impl=com.aliyun.emr.fs.oss.JindoOssFileSystem

## Atur titik akhir OSS (hanya titik akhir internal).
spark.hadoop.fs.oss.endpoint=oss-[YourRegionId]-internal.aliyuncs.com

## Opsional: tambahkan ke daftar putih layanan tepercaya jika koneksi gagal saat runtime.
spark.hadoop.odps.cupid.trusted.services.access.list=[YourBucketName].oss-[YourRegionId]-internal.aliyuncs.com
Dalam mode kluster, hanya titik akhir OSS internal yang didukung. Titik akhir publik tidak didukung. Lihat Wilayah dan titik akhir OSS.

Langkah 2: Konfigurasikan otentikasi

Dua metode otentikasi didukung:

  • AccessKey pair — Atur kredensial secara langsung di SparkConf:

    val conf = new SparkConf()
      .setAppName("jindo-sdk-demo")
      .set("spark.hadoop.fs.oss.accessKeyId", "<YourAccessKeyId>")
      .set("spark.hadoop.fs.oss.accessKeySecret", "<YourAccessKeySecret>")
  • Token Layanan Keamanan (STS) — Gunakan metode ini ketika proyek MaxCompute dan bucket OSS berada di bawah Akun Alibaba Cloud yang sama.

    1. Klik Otorisasi Sekali Klik untuk memberi otorisasi MaxCompute mengakses resource OSS menggunakan token STS.

    2. Aktifkan layanan HTTP lokal di spark-defaults.conf atau item konfigurasi DataWorks:

      spark.hadoop.odps.cupid.http.server.enable = true
    3. Konfigurasikan kredensial STS di SparkConf. Ganti ${aliyun-uid} dengan UID Akun Alibaba Cloud dan ${role-name} dengan nama role:

      val conf = new SparkConf()
        .setAppName("jindo-sdk-demo")
        .set("spark.hadoop.fs.jfs.cache.oss.credentials.provider", "com.aliyun.emr.fs.auth.CustomCredentialsProvider")
        .set("spark.hadoop.aliyun.oss.provider.url", "http://localhost:10011/sts-token-info?user_id=${aliyun-uid}&role=${role-name}")

Bagaimana cara mereferensikan library Python pihak ketiga?

Jika pekerjaan PySpark melempar error No module named 'xxx', library yang diperlukan tidak ada di lingkungan Python default. Tiga metode tersedia:

Metode 1: Gunakan lingkungan Python publik MaxCompute

Tambahkan berikut ke spark-defaults.conf atau item konfigurasi DataWorks:

  • Python 2.7:

    spark.hadoop.odps.cupid.resources = public.python-2.7.13-ucs4.tar.gz
    spark.pyspark.python = ./public.python-2.7.13-ucs4.tar.gz/python-2.7.13-ucs4/bin/python

    Library pihak ketiga yang disertakan: https://odps-repo.oss-cn-hangzhou.aliyuncs.com/pyspark/py27/py27-default_req.txt

  • Python 3.7:

    spark.hadoop.odps.cupid.resources = public.python-3.7.9-ucs4.tar.gz
    spark.pyspark.python = ./public.python-3.7.9-ucs4.tar.gz/python-3.7.9-ucs4/bin/python3

    Library pihak ketiga yang disertakan: https://odps-repo.oss-cn-hangzhou.aliyuncs.com/pyspark/py37/py37-default_req.txt

Metode 2: Unggah satu paket wheel

Gunakan metode ini ketika Anda memiliki sedikit dan sederhana dependensi Python.

## Ganti nama paket wheel menjadi file .zip (misalnya, pymysql.zip).
## Unggah file .zip sebagai resource arsip.
## Referensikan di node ODPS Spark (tipe arsip).
## Tambahkan berikut ke spark-defaults.conf atau item konfigurasi DataWorks:
spark.executorEnv.PYTHONPATH=pymysql
spark.yarn.appMasterEnv.PYTHONPATH=pymysql

Lalu impor paket tersebut di kode Anda:

import pymysql

Metode 3: Unggah lingkungan Python kustom lengkap

Gunakan metode ini untuk dependensi kompleks atau ketika Anda memerlukan versi Python kustom. Paket lingkungan Python dalam kontainer Docker dan unggah. Lihat Paket dependensi.

Bagaimana cara mengatasi konflik dependensi JAR?

Error NoClassDefFoundError atau NoSuchMethodError saat runtime biasanya berarti versi dependensi pihak ketiga di JAR Anda bertentangan dengan dependensi bawaan Spark.

  1. Di pom.xml, atur semua dependensi edisi komunitas Spark, edisi komunitas Hadoop, dan dependensi ODPS/Cupid ke provided.

  2. Identifikasi dan kecualikan dependensi yang bertentangan.

  3. Jika pengecualian tidak cukup, gunakan maven-shade-plugin relocation untuk mengisolasi paket yang bertentangan.

Bagaimana cara men-debug dalam mode lokal?

Metode konfigurasi tergantung pada versi Spark Anda.

Spark 2.3.0

  1. Tambahkan berikut ke spark-defaults.conf:

    spark.hadoop.odps.project.name=<Yourprojectname>
    spark.hadoop.odps.access.id=<YourAccessKeyID>
    spark.hadoop.odps.access.key=<YourAccessKeySecret>
    spark.hadoop.odps.end.point=<endpoint>
  2. Jalankan dalam mode lokal:

    ./bin/spark-submit --master local spark_sql.py

Spark 2.4.5 / Spark 3.1.1

  1. Buat file odps.conf dengan konten berikut:

    odps.access.id=<YourAccessKeyID>
    odps.access.key=<YourAccessKeySecret>
    odps.end.point=<endpoint>
    odps.project.name=<Yourprojectname>
  2. Atur variabel lingkungan untuk menunjuk ke file tersebut:

    export ODPS_CONF_FILE=/path/to/odps.conf
  3. Jalankan dalam mode lokal:

    ./bin/spark-submit --master local spark_sql.py

Error umum dalam mode lokal

Error Penyebab Solusi
Incomplete config, no accessId or accessKey / Incomplete config, no odps.service.endpoint EventLog diaktifkan dalam mode lokal Hapus spark.eventLog.enabled=true dari spark-defaults.conf
Cannot create CupidSession with empty CupidConf Spark 2.4.5 atau 3.1.1 tidak dapat membaca odps.access.id dari spark-defaults.conf Buat file odps.conf, atur variabel lingkungan ODPS_CONF_FILE, lalu jalankan lagi
java.util.NoSuchElementException: odps.access.id Spark 2.3.0 tidak dapat menemukan access ID Tambahkan spark.hadoop.odps.access.id dan parameter terkait ke spark-defaults.conf

Error pekerjaan

Apa yang harus saya lakukan jika muncul "User signature does not match"?

com.aliyun.odps.OdpsException: ODPS-0410042:
Invalid signature value - User signature does not match

ID AccessKey atau Secret AccessKey di spark-defaults.conf salah. Periksa kembali terhadap AccessKey ID dan AccessKey Secret di Manajemen Informasi Pengguna di Konsol Alibaba Cloud dan perbaiki ketidaksesuaian apa pun.

Apa yang harus saya lakukan jika muncul "You have NO privilege"?

com.aliyun.odps.OdpsException: ODPS-0420095:
Access Denied - Authorization Failed [4019], You have NO privilege 'odps:CreateResource' on {acs:odps:*:projects/*}

Akun Anda tidak memiliki izin yang diperlukan. Minta pemilik proyek untuk memberikan izin Baca dan Buat pada resource tersebut. Lihat Izin MaxCompute.

Apa yang harus saya lakukan jika muncul "Access Denied"?

Tugas tidak dalam jangkauan rilis: CUPID

Diagnosis penyebabnya:

  • Apakah ID AccessKey atau Secret AccessKey di `spark-defaults.conf` benar? — Verifikasi terhadap Manajemen Informasi Pengguna di Konsol Alibaba Cloud. Lihat Siapkan lingkungan pengembangan Linux untuk format konfigurasi yang benar.

  • Apakah Spark di MaxCompute tersedia di wilayah Anda? — Layanan mungkin belum diaktifkan di wilayah Anda. Periksa ketersediaan wilayah atau hubungi dukungan dengan bergabung ke grup DingTalk 21969532 (dukungan Spark di MaxCompute).

Apa yang harus saya lakukan jika muncul "No space left on device"?

Spark menggunakan disk lokal untuk data shuffle dan overflow BlockManager. Ukuran disk dikendalikan oleh spark.hadoop.odps.cupid.disk.driver.device_size (default: 20 GB, maksimum: 100 GB).

Jika error tetap muncul setelah Anda meningkatkan ukuran disk ke 100 GB, penyebab umumnya adalah data skew, di mana data terkonsentrasi di beberapa blok selama proses shuffle atau cache. Kurangi spark.executor.cores dan tingkatkan spark.executor.instances untuk mendistribusikan data lebih merata.

Apa yang harus saya lakukan jika muncul "Table or view not found"?

Table or view not found: xxx

Diagnosis penyebabnya:

  • Apakah tabel atau view tersebut ada? — Buat tabel sebelum menjalankan pekerjaan.

  • Apakah dukungan katalog Hive diaktifkan? — Jika tabel ada tetapi tidak ditemukan, periksa apakah enableHiveSupport() ada di pembangun sesi Anda. Hapus:

    # Sebelum
    spark = SparkSession.builder.appName(app_name).enableHiveSupport().getOrCreate()
    # Sesudah
    spark = SparkSession.builder.appName(app_name).getOrCreate()

Apa yang harus saya lakukan jika muncul "Shutdown hook called before final status was reported"?

App Status: SUCCEEDED, diagnostics: Shutdown hook called before final status was reported.

Aplikasi utama tidak meminta resource kluster melalui ApplicationMaster (AM). Alasan paling umum adalah spark.master diatur ke local dalam kode, atau SparkContext tidak pernah dibuat. Hapus pengaturan spark.master=local dari kode Anda saat mengirimkan ke kluster.

Apa yang harus saya lakukan jika muncul error konflik versi paket JAR?

User class threw exception: java.lang.NoSuchMethodError

Terjadi konflik versi paket JAR atau kelas yang salah dimuat. Untuk mengidentifikasi dependensi yang bertentangan:

  1. Temukan JAR yang berisi kelas bermasalah di $SPARK_HOME/jars:

    grep <AbnormalClassName> $SPARK_HOME/jars/*.jar
  2. Lihat semua dependensi proyek:

    mvn dependency:tree
  3. Kecualikan dependensi yang bertentangan:

    maven dependency exclusions
  4. Kompilasi ulang dan kirim ulang.

Apa yang harus saya lakukan jika muncul error "ClassNotFound"?

java.lang.ClassNotFoundException: xxxx.xxx.xxxxx

Kelas tersebut tidak ada di JAR yang dikirimkan, atau dependensinya salah konfigurasi.

  1. Verifikasi bahwa kelas tersebut ada di JAR Anda:

    jar -tf <JobJARFile> | grep <ClassName>
  2. Periksa dependensi di pom.xml.

  3. Jika diperlukan, gunakan metode Shade untuk repaket dan kirim ulang.

Apa yang harus saya lakukan jika muncul "The task is not in release range"?

The task is not in release range: CUPID

Spark di MaxCompute belum diaktifkan di wilayah Anda. Pilih wilayah tempat layanan tersebut tersedia.

Apa yang harus saya lakukan jika muncul error "java.io.UTFDataFormatException"?

java.io.UTFDataFormatException: encoded string too long: 2818545 bytes

Tingkatkan nilai spark.hadoop.odps.cupid.disk.driver.device_size di spark-defaults.conf. Nilai default adalah 20 GB dan maksimum 100 GB.

Apa yang harus saya lakukan jika karakter Tionghoa muncul rusak di output Spark?

Tambahkan berikut ke spark-defaults.conf atau item konfigurasi DataWorks:

"--conf" "spark.executor.extraJavaOptions=-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"
"--conf" "spark.driver.extraJavaOptions=-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"

Apa yang harus saya lakukan jika terjadi error saat Spark memanggil layanan pihak ketiga melalui Internet?

Spark di MaxCompute tidak memiliki koneksi Internet langsung, sehingga panggilan outbound ke Internet gagal. Bangun reverse proxy Nginx di VPC untuk mengarahkan trafik tersebut, lalu gunakan akses VPC berbasis ENI Spark untuk mencapai proxy. Lihat Akses instansi terhubung-VPC dari Spark.