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?
-
Tulis dan paket kode Spark Anda secara lokal. Lingkungan Python harus menggunakan Python 2.7.
-
Unggah paket resource ke DataWorks. Lihat Buat dan gunakan resource MaxCompute.
-
Buat node ODPS Spark di DataWorks. Lihat Buat node ODPS Spark.
-
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?
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:
-
Tidak perlu akses ke tabel MaxCompute atau OSS — Jalankan paket JAR yang sudah ada secara langsung. Atur dependensi Spark dan Hadoop ke
provided. Lihat Siapkan lingkungan pengembangan Linux. -
Perlu akses ke tabel MaxCompute — Tambahkan dependensi yang diperlukan dan repaket. Lihat Siapkan lingkungan pengembangan Linux.
-
Perlu akses ke OSS — Dapatkan paket OSS yang diperlukan, bangun koneksi jaringan, lalu kompilasi ulang dan repaket. Lihat Siapkan lingkungan pengembangan Linux.
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.instancesxspark.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:
-
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 dispark-defaults.confatau item konfigurasi DataWorks. -
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.instancesuntuk 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:
-
Aktifkan koneksi jalur sewa berbasis ENI. Lihat Akses instansi terhubung-VPC dari Spark.
-
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.
-
Konfigurasikan parameter ENI untuk pekerjaan di
spark-defaults.confatau 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
-
Aktifkan koneksi jalur sewa berbasis ENI. Lihat Akses instansi terhubung-VPC dari Spark.
-
Pastikan VPC yang terhubung memiliki akses Internet. Lihat Gunakan fitur SNAT gateway NAT Internet untuk mengakses Internet.
-
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:
-
Bergabunglah dengan komunitas developer MaxCompute (grup DingTalk ID: 11782920) dan minta tim dukungan untuk menambahkan
https://aliyundoc.com:443keodps.security.outbound.internetlist. -
Aktifkan SmartNAT di
spark-defaults.confatau 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.
-
Klik Otorisasi Sekali Klik untuk memberi otorisasi MaxCompute mengakses resource OSS menggunakan token STS.
-
Aktifkan layanan HTTP lokal di
spark-defaults.confatau item konfigurasi DataWorks:spark.hadoop.odps.cupid.http.server.enable = true -
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/pythonLibrary 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/python3Library 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.
-
Di
pom.xml, atur semua dependensi edisi komunitas Spark, edisi komunitas Hadoop, dan dependensi ODPS/Cupid keprovided. -
Identifikasi dan kecualikan dependensi yang bertentangan.
-
Jika pengecualian tidak cukup, gunakan
maven-shade-plugin relocationuntuk mengisolasi paket yang bertentangan.
Bagaimana cara men-debug dalam mode lokal?
Metode konfigurasi tergantung pada versi Spark Anda.
Spark 2.3.0
-
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> -
Jalankan dalam mode lokal:
./bin/spark-submit --master local spark_sql.py
Spark 2.4.5 / Spark 3.1.1
-
Buat file
odps.confdengan konten berikut:odps.access.id=<YourAccessKeyID> odps.access.key=<YourAccessKeySecret> odps.end.point=<endpoint> odps.project.name=<Yourprojectname> -
Atur variabel lingkungan untuk menunjuk ke file tersebut:
export ODPS_CONF_FILE=/path/to/odps.conf -
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:
-
Temukan JAR yang berisi kelas bermasalah di
$SPARK_HOME/jars:grep <AbnormalClassName> $SPARK_HOME/jars/*.jar -
Lihat semua dependensi proyek:
mvn dependency:tree -
Kecualikan dependensi yang bertentangan:
maven dependency exclusions -
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.
-
Verifikasi bahwa kelas tersebut ada di JAR Anda:
jar -tf <JobJARFile> | grep <ClassName> -
Periksa dependensi di
pom.xml. -
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.