Cluster saya: 1 master, 11 slave, setiap node memiliki memori 6 GB.
Pengaturan saya:
spark.executor.memory=4g, Dspark.akka.frameSize=512
Inilah masalahnya:
Pertama , saya membaca beberapa data (2,19 GB) dari HDFS ke RDD:
val imageBundleRDD = sc.newAPIHadoopFile(...)
Kedua , lakukan sesuatu pada RDD ini:
val res = imageBundleRDD.map(data => {
val desPoints = threeDReconstruction(data._2, bg)
(data._1, desPoints)
})
Terakhir , keluaran ke HDFS:
res.saveAsNewAPIHadoopFile(...)
Ketika saya menjalankan program saya itu menunjukkan:
.....
14/01/15 21:42:27 INFO cluster.ClusterTaskSetManager: Starting task 1.0:24 as TID 33 on executor 9: Salve7.Hadoop (NODE_LOCAL)
14/01/15 21:42:27 INFO cluster.ClusterTaskSetManager: Serialized task 1.0:24 as 30618515 bytes in 210 ms
14/01/15 21:42:27 INFO cluster.ClusterTaskSetManager: Starting task 1.0:36 as TID 34 on executor 2: Salve11.Hadoop (NODE_LOCAL)
14/01/15 21:42:28 INFO cluster.ClusterTaskSetManager: Serialized task 1.0:36 as 30618515 bytes in 449 ms
14/01/15 21:42:28 INFO cluster.ClusterTaskSetManager: Starting task 1.0:32 as TID 35 on executor 7: Salve4.Hadoop (NODE_LOCAL)
Uncaught error from thread [spark-akka.actor.default-dispatcher-3] shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled for ActorSystem[spark]
java.lang.OutOfMemoryError: Java heap space
Terlalu banyak tugas?
PS : Semuanya baik-baik saja ketika input data sekitar 225 MB.
Bagaimana saya bisa menyelesaikan masalah ini?
out-of-memory
apache-spark
hequn8128
sumber
sumber
Jawaban:
Saya punya beberapa saran:
spark.executor.memory=6g
. Pastikan Anda menggunakan memori sebanyak mungkin dengan memeriksa UI (ini akan mengatakan berapa banyak yang Anda gunakan)spark.storage.memoryFraction
. Jika Anda tidak menggunakancache()
ataupersist
dalam kode Anda, ini mungkin juga 0. Secara default adalah 0,6, yang berarti Anda hanya mendapatkan 0,4 * 4g memori untuk tumpukan Anda. IME mengurangi mem frac sering membuat OOM pergi. UPDATE: Dari spark 1.6 tampaknya kita tidak perlu lagi bermain dengan nilai-nilai ini, spark akan menentukannya secara otomatis.String
dan struktur bersarang banyak (sepertiMap
dan kelas kasus bersarang). Jika memungkinkan cobalah untuk hanya menggunakan tipe primitif dan indeks semua non-primitif terutama jika Anda mengharapkan banyak duplikat. PilihWrappedArray
lebih dari struktur bersarang bila memungkinkan. Atau bahkan meluncurkan serialisasi Anda sendiri - ANDA akan memiliki informasi paling banyak tentang cara efisien mengembalikan data Anda ke dalam byte, GUNAKAN !Dataset
cache struktur Anda karena akan menggunakan serialisasi yang lebih efisien. Ini harus dianggap sebagai retasan jika dibandingkan dengan poin sebelumnya. Membangun pengetahuan domain Anda ke dalam algo / serialisasi Anda dapat meminimalkan memori / cache-ruang sebesar 100x atau 1000x, sedangkan semuaDataset
kemungkinan akan memberi adalah 2x - 5x dalam memori dan 10x dikompresi (parket) pada disk.http://spark.apache.org/docs/1.2.1/configuration.html
EDIT: (Jadi saya bisa google sendiri lebih mudah) Berikut ini juga menunjukkan masalah ini:
sumber
spark.executor.memory
karena Anda pasti membutuhkan sejumlah memori untuk overhead I / O. Jika Anda menggunakan semua itu, itu akan memperlambat program Anda. Pengecualian untuk ini mungkin Unix, dalam hal ini Anda memiliki ruang swap.Untuk menambahkan kasus penggunaan ke ini yang sering tidak dibahas, saya akan mengajukan solusi ketika mengirimkan
Spark
aplikasi melaluispark-submit
dalam mode lokal .Menurut gitbook Mastering Apache Spark oleh Jacek Laskowski :
Jadi, jika Anda mengalami
OOM
kesalahan denganheap
, itu sudah cukup untuk menyesuaikandriver-memory
daripadaexecutor-memory
.Berikut ini sebuah contoh:
sumber
Anda harus mengkonfigurasi pengaturan memori offHeap seperti yang ditunjukkan di bawah ini:
Berikan memori driver dan memori pelaksana sesuai ketersediaan RAM mesin Anda. Anda dapat meningkatkan ukuran offHeap jika Anda masih menghadapi masalah OutofMemory .
sumber
config
memecahkan masalah.Anda harus menambah memori driver. Dalam folder $ SPARK_HOME / conf Anda, Anda harus menemukan file
spark-defaults.conf
, mengedit dan mengaturspark.driver.memory 4000m
tergantung pada memori pada master Anda, saya kira. Inilah yang memperbaiki masalah bagi saya dan semuanya berjalan lancarsumber
Lihat skrip start up ukuran heap Java diatur di sana, sepertinya Anda tidak mengatur ini sebelum menjalankan Spark pekerja.
Anda dapat menemukan dokumentasi untuk menggunakan skrip di sini .
sumber
start up scripts
Sayangnya, konten pada skrip yang ditautkan oleh telah berubah. Tidak ada opsi seperti ada pada 2019-12-19Saya sangat menderita karena masalah ini, kami menggunakan alokasi sumber daya dinamis dan saya pikir ini akan memanfaatkan sumber daya kluster saya yang paling sesuai dengan aplikasi.
Tetapi kenyataannya adalah, alokasi sumber daya dinamis tidak mengatur memori driver dan menyimpannya ke nilai default yaitu 1g.
Saya telah mengatasinya dengan menetapkan spark.driver.memory ke nomor yang sesuai dengan memori pengemudi saya (untuk ram 32 GB saya atur ke 18gb)
Anda dapat mengaturnya menggunakan perintah spark submit sebagai berikut:
Catatan yang sangat penting, properti ini tidak akan dipertimbangkan jika Anda menetapkannya dari kode, menurut dokumentasi percikan:
sumber
Secara garis besar, percikan memori JVM Pelaksana dapat dibagi menjadi dua bagian. Memori percikan dan memori pengguna. Ini dikontrol oleh properti
spark.memory.fraction
- nilainya antara 0 dan 1. Saat bekerja dengan gambar atau melakukan pemrosesan intensif memori dalam aplikasi percikan, pertimbangkan untuk mengurangispark.memory.fraction
. Ini akan membuat lebih banyak memori tersedia untuk pekerjaan aplikasi Anda. Spark dapat tumpah, sehingga masih akan bekerja dengan berbagi memori yang lebih sedikit.Bagian kedua dari masalah adalah pembagian kerja. Jika memungkinkan, partisi data Anda menjadi potongan yang lebih kecil. Data yang lebih kecil mungkin membutuhkan lebih sedikit memori. Tetapi jika itu tidak mungkin, Anda berkorban menghitung untuk ingatan. Biasanya satu eksekutor akan menjalankan banyak core. Memori total pelaksana harus cukup untuk menangani persyaratan memori dari semua tugas bersamaan. Jika menambah memori pelaksana bukan opsi, Anda dapat mengurangi inti per pelaksana sehingga setiap tugas mendapatkan lebih banyak memori untuk bekerja. Uji dengan 1 pelaksana inti yang memiliki memori sebesar mungkin yang dapat Anda berikan dan kemudian terus tingkatkan core sampai Anda menemukan jumlah inti terbaik.
sumber
Apakah Anda membuang log master gc Anda? Jadi saya menemukan masalah yang sama dan saya menemukan SPARK_DRIVER_MEMORY hanya mengatur heap Xmx. Ukuran tumpukan awal tetap 1G dan ukuran tumpukan tidak pernah naik ke tumpukan Xmx.
Melewati "--conf" spark.driver.extraJavaOptions = -Xms20g "menyelesaikan masalah saya.
ps aux | grep java dan Anda akan melihat log ikuti: =
24501 30.7 1.7 41782944 2318184 poin / 0 Sl + 18:49 0:33 / usr / java / terbaru / bin / java -cp / opt / spark / conf /: / opt / spark / jars / * -Xmx30g -Xms20g
sumber
Lokasi untuk mengatur ukuran tumpukan memori (setidaknya di spark-1.0.0) di conf / spark-env. Variabel yang relevan adalah
SPARK_EXECUTOR_MEMORY
&SPARK_DRIVER_MEMORY
. Lebih banyak dokumen ada dalam panduan penerapanJuga, jangan lupa menyalin file konfigurasi ke semua node slave.
sumber
SPARK_EXECUTOR_MEMORY
&SPARK_DRIVER_MEMORY
?SPARK_EXECUTOR_MEMORY
, dan kesalahan apa yang akan memberitahu Anda untuk meningkatkanSPARK_DRIVER_MEMORY
?Saya memiliki beberapa saran untuk kesalahan yang disebutkan di atas.
● Periksa memori pelaksana yang ditetapkan sebagai pelaksana mungkin harus berurusan dengan partisi yang membutuhkan lebih banyak memori daripada yang ditugaskan.
● Cobalah untuk melihat apakah lebih banyak shuffles aktif karena shuffles adalah operasi yang mahal karena melibatkan disk I / O, serialisasi data, dan I / O jaringan
● Gunakan Broadcast Joins
● Hindari menggunakan groupByKeys dan coba ganti dengan ReduceByKey
● Hindari menggunakan Java Objects besar di mana pun pengocokan terjadi
sumber
Dari pemahaman saya tentang kode yang diberikan di atas, itu memuat file dan melakukan operasi peta dan menyimpannya kembali. Tidak ada operasi yang membutuhkan pengocokan. Juga, tidak ada operasi yang memerlukan data untuk dibawa ke pengemudi sehingga menyetel apa pun yang terkait dengan shuffle atau driver mungkin tidak berdampak. Pengemudi memang memiliki masalah ketika ada terlalu banyak tugas tapi ini hanya sampai versi 2.0.2 memicu. Mungkin ada dua hal yang salah.
sumber
Pengaturan konfigurasi yang tepat ini membantu menyelesaikan masalah.
sumber