Managed Service untuk Apache Spark dan Apache Spark menyediakan infrastruktur dan kapasitas yang dapat Anda gunakan untuk menjalankan simulasi Monte Carlo yang ditulis dalam Java, Python, atau Scala.
Metode Monte Carlo dapat membantu menjawab berbagai pertanyaan dalam bisnis, teknik, sains, matematika, dan bidang lainnya. Dengan menggunakan sampling acak berulang untuk membuat distribusi probabilitas suatu variabel, simulasi Monte Carlo dapat memberikan jawaban atas pertanyaan yang mungkin tidak dapat dijawab. Misalnya, dalam bidang keuangan, penetapan harga opsi ekuitas memerlukan analisis ribuan cara harga saham dapat berubah dari waktu ke waktu. Metode Monte Carlo menyediakan cara untuk menyimulasikan perubahan harga saham tersebut dalam berbagai kemungkinan hasil, sekaligus mempertahankan kontrol atas domain kemungkinan input untuk masalah tersebut.
Sebelumnya, menjalankan ribuan simulasi dapat memerlukan waktu yang sangat lama dan menimbulkan biaya yang tinggi. Managed Service untuk Apache Spark memungkinkan Anda menyediakan kapasitas sesuai permintaan dan membayar per menit. Apache Spark memungkinkan Anda menggunakan cluster yang terdiri dari puluhan, ratusan, atau ribuan server untuk menjalankan simulasi dengan cara yang intuitif dan dapat diskalakan untuk memenuhi kebutuhan Anda. Artinya, Anda dapat menjalankan lebih banyak simulasi dengan lebih cepat, yang dapat membantu bisnis Anda berinovasi lebih cepat dan mengelola risiko dengan lebih baik.
Keamanan selalu penting saat menangani data keuangan. Managed Service untuk Apache Spark berjalan di Google Cloud, yang membantu menjaga data Anda tetap aman, terlindungi, dan bersifat pribadi dengan beberapa cara. Misalnya, semua data dienkripsi selama transmisi dan saat disimpan, serta Google Cloud mematuhi ISO 27001, SOC3, dan PCI.
Tujuan
- Buat cluster Managed Service untuk Apache Spark terkelola dengan Apache Spark bawaan.
- Jalankan simulasi Monte Carlo menggunakan Python yang memperkirakan pertumbuhan portofolio saham dari waktu ke waktu.
- Jalankan simulasi Monte Carlo menggunakan Scala yang menyimulasikan cara kasino menghasilkan uang.
Biaya
Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, baca bagian Pembersihan.
Sebelum memulai
- Siapkan project Google Cloud
- Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Dataproc and Compute Engine APIs, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Dataproc and Compute Engine APIs, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
Membuat cluster Managed Service untuk Apache Spark
Ikuti langkah-langkah untuk membuat cluster Managed Service untuk Apache Spark dari konsol Google Cloud . Setelan cluster default, yang mencakup dua worker node, sudah cukup untuk tutorial ini.
Menonaktifkan logging untuk peringatan
Secara default, Apache Spark mencetak logging panjang di jendela konsol. Untuk tujuan tutorial ini, ubah level logging agar hanya mencatat error ke dalam log. Ikuti langkah-langkah berikut:
Gunakan ssh untuk terhubung ke node utama cluster Managed Service untuk Apache Spark
Node utama cluster Managed Service untuk Apache Spark memiliki akhiran -m pada nama VM-nya.
- Di konsol Google Cloud , buka halaman VM instances.
-
Di daftar instance virtual machine, klik SSH di baris
instance yang ingin Anda hubungkan.

Jendela SSH yang terhubung ke node utama akan terbuka.
Connected, host fingerprint: ssh-rsa 2048 ... ... user@clusterName-m:~$
Mengubah setelan logging
Dari direktori beranda node utama, edit
/etc/spark/conf/log4j.properties.sudo nano /etc/spark/conf/log4j.propertiesTetapkan
log4j.rootCategorysama denganERROR.# Set only errors to be logged to the console log4j.rootCategory=ERROR, console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.target=System.err log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%nSimpan perubahan dan keluar dari editor. Jika Anda ingin mengaktifkan logging panjang lagi, batalkan perubahan dengan memulihkan nilai
.rootCategoryke nilai aslinya (INFO).
Bahasa pemrograman Spark
Spark mendukung Python, Scala, dan Java sebagai bahasa pemrograman untuk aplikasi mandiri, serta menyediakan penafsir interaktif untuk Python dan Scala. Bahasa yang Anda pilih adalah preferensi pribadi. Tutorial ini menggunakan interpreter interaktif karena Anda dapat bereksperimen dengan mengubah kode, mencoba nilai input yang berbeda, lalu melihat hasilnya.
Memperkirakan pertumbuhan portofolio
Dalam bidang keuangan, metode Monte Carlo terkadang digunakan untuk menjalankan simulasi yang mencoba memprediksi performa investasi. Dengan menghasilkan sampel acak hasil dari berbagai kemungkinan kondisi pasar, simulasi Monte Carlo dapat menjawab pertanyaan tentang bagaimana performa portofolio secara rata-rata atau dalam skenario terburuk.
Ikuti langkah-langkah berikut untuk membuat simulasi yang menggunakan metode Monte Carlo untuk mencoba memperkirakan pertumbuhan investasi keuangan berdasarkan beberapa faktor pasar umum.
Mulai interpreter Python dari node utama Managed Service untuk Apache Spark.
pysparkTunggu perintah Spark
>>>.Masukkan kode berikut. Pastikan Anda mempertahankan indentasi dalam definisi fungsi.
import random import time from operator import add def grow(seed): random.seed(seed) portfolio_value = INVESTMENT_INIT for i in range(TERM): growth = random.normalvariate(MKT_AVG_RETURN, MKT_STD_DEV) portfolio_value += portfolio_value * growth + INVESTMENT_ANN return portfolio_valueTekan
returnhingga Anda melihat perintah Spark lagi.Kode sebelumnya menentukan fungsi yang memodelkan apa yang mungkin terjadi saat investor memiliki akun pensiun yang sudah ada yang diinvestasikan di pasar saham, yang kemudian menambahkan dana tambahan setiap tahun. Fungsi menghasilkan laba atas investasi acak, sebagai persentase, setiap tahun selama jangka waktu yang ditentukan. Fungsi ini menggunakan nilai awal sebagai parameter. Nilai ini digunakan untuk menyemai ulang generator angka acak, yang memastikan bahwa fungsi tidak mendapatkan daftar angka acak yang sama setiap kali dijalankan. Fungsi
random.normalvariatememastikan bahwa nilai acak terjadi di seluruh distribusi normal untuk mean dan deviasi standar yang ditentukan. Fungsi ini meningkatkan nilai portofolio berdasarkan jumlah pertumbuhan, yang bisa positif atau negatif, dan menambahkan jumlah tahunan yang mewakili investasi lebih lanjut.Anda akan menentukan konstanta yang diperlukan pada langkah berikutnya.
Buat banyak nilai awal untuk dimasukkan ke fungsi. Pada prompt Spark, masukkan kode berikut, yang menghasilkan 10.000 seed:
seeds = sc.parallelize([time.time() + i for i in range(10000)])Hasil operasi
parallelizeadalah resilient distributed dataset (RDD), yang merupakan kumpulan elemen yang dioptimalkan untuk pemrosesan paralel. Dalam hal ini, RDD berisi nilai awal yang didasarkan pada waktu sistem saat ini.Saat membuat RDD, Spark mengiris data berdasarkan jumlah worker dan core yang tersedia. Dalam hal ini, Spark memilih untuk menggunakan delapan slice, satu slice untuk setiap inti. Hal ini tidak masalah untuk simulasi ini, yang memiliki 10.000 item data. Untuk simulasi yang lebih besar, setiap slice mungkin lebih besar dari batas default. Dalam hal ini, menentukan parameter kedua ke
parallelizedapat meningkatkan jumlah slice, yang dapat membantu menjaga ukuran setiap slice tetap mudah dikelola, sementara Spark tetap memanfaatkan kedelapan core.Masukkan RDD yang berisi seed ke fungsi pertumbuhan.
results = seeds.map(grow)Metode
mapmeneruskan setiap seed di RDD ke fungsigrowdan menambahkan setiap hasil ke RDD baru, yang disimpan diresults. Perhatikan bahwa operasi ini, yang melakukan transformasi, tidak langsung menghasilkan hasil. Spark tidak akan melakukan pekerjaan ini hingga hasilnya diperlukan. Evaluasi lambat ini adalah alasan Anda dapat memasukkan kode tanpa menentukan konstanta.Tentukan beberapa nilai untuk fungsi.
INVESTMENT_INIT = 100000 # starting amount INVESTMENT_ANN = 10000 # yearly new investment TERM = 30 # number of years MKT_AVG_RETURN = 0.11 # percentage MKT_STD_DEV = 0.18 # standard deviationPanggil
reduceuntuk menggabungkan nilai dalam RDD. Masukkan kode berikut untuk menjumlahkan hasil dalam RDD:sum = results.reduce(add)Perkirakan dan tampilkan pengembalian rata-rata:
print (sum / 10000.)Pastikan untuk menyertakan karakter titik (
.) di akhir. Hal ini menandakan aritmetika floating point.Sekarang ubah asumsi dan lihat bagaimana perubahan hasilnya. Misalnya, Anda dapat memasukkan nilai baru untuk rata-rata pengembalian barang di pasar:
MKT_AVG_RETURN = 0.07Jalankan simulasi lagi.
print (sc.parallelize([time.time() + i for i in range(10000)]) \ .map(grow).reduce(add)/10000.)Setelah selesai bereksperimen, tekan
CTRL+Duntuk keluar dari interpreter Python.
Memprogram simulasi Monte Carlo di Scala
Monte Carlo, tentu saja, terkenal sebagai tujuan perjudian. Di bagian ini, Anda akan menggunakan Scala untuk membuat simulasi yang memodelkan keuntungan matematika yang dinikmati kasino dalam permainan untung-untungan. "Keunggulan kasino" di kasino sungguhan sangat bervariasi dari satu game ke game lainnya; misalnya, bisa lebih dari 20% dalam keno. Tutorial ini membuat game sederhana di mana rumah hanya memiliki keunggulan satu persen. Berikut cara kerja game ini:
- Pemain memasang taruhan, yang terdiri dari sejumlah chip dari dana bankroll.
- Pemain melempar dadu 100 sisi (keren, bukan?).
- Jika hasil lemparan dadu adalah angka dari 1 hingga 49, pemain menang.
- Untuk hasil 50 hingga 100, pemain kalah taruhan.
Anda dapat melihat bahwa game ini menciptakan kerugian satu persen bagi pemain: dalam 51 dari 100 kemungkinan hasil untuk setiap lemparan, pemain kalah.
Ikuti langkah-langkah berikut untuk membuat dan menjalankan game:
Mulai interpreter Scala dari node utama Managed Service untuk Apache Spark.
spark-shellSalin dan tempel kode berikut untuk membuat game. Scala tidak memiliki persyaratan yang sama dengan Python dalam hal indentasi, jadi Anda cukup menyalin dan menempelkan kode ini di perintah
scala>.val STARTING_FUND = 10 val STAKE = 1 // the amount of the bet val NUMBER_OF_GAMES = 25 def rollDie: Int = { val r = scala.util.Random r.nextInt(99) + 1 } def playGame(stake: Int): (Int) = { val faceValue = rollDie if (faceValue < 50) (2*stake) else (0) } // Function to play the game multiple times // Returns the final fund amount def playSession( startingFund: Int = STARTING_FUND, stake: Int = STAKE, numberOfGames: Int = NUMBER_OF_GAMES): (Int) = { // Initialize values var (currentFund, currentStake, currentGame) = (startingFund, 0, 1) // Keep playing until number of games is reached or funds run out while (currentGame <= numberOfGames && currentFund > 0) { // Set the current bet and deduct it from the fund currentStake = math.min(stake, currentFund) currentFund -= currentStake // Play the game val (winnings) = playGame(currentStake) // Add any winnings currentFund += winnings // Increment the loop counter currentGame += 1 } (currentFund) }Tekan
returnhingga Anda melihat perintahscala>.Masukkan kode berikut untuk memainkan game sebanyak 25 kali, yang merupakan nilai default untuk
NUMBER_OF_GAMES.playSession()Modal awal Anda adalah 10 unit. Apakah sekarang lebih tinggi atau lebih rendah?
Sekarang simulasikan 10.000 pemain yang bertaruh 100 chip per game. Mainkan 10.000 game dalam satu sesi. Simulasi Monte Carlo ini menghitung probabilitas kehilangan semua uang Anda sebelum sesi berakhir. Masukkan kode berikut:
(sc.parallelize(1 to 10000, 500) .map(i => playSession(100000, 100, 250000)) .map(i => if (i == 0) 1 else 0) .reduce(_+_)/10000.0)Perhatikan bahwa sintaksis
.reduce(_+_)adalah singkatan di Scala untuk menggabungkan dengan menggunakan fungsi penjumlahan. Secara fungsional, sintaksis ini sama dengan sintaksis.reduce(add)yang Anda lihat dalam contoh Python.Kode sebelumnya melakukan langkah-langkah berikut:
- Membuat RDD dengan hasil pemutaran sesi.
- Mengganti hasil pemain yang bangkrut dengan angka
1dan hasil yang tidak nol dengan angka0. - Menjumlahkan jumlah pemain yang bangkrut.
- Membagi jumlah dengan jumlah pemain.
Hasil umumnya mungkin:
0.998
Yang hampir menjamin Anda akan kehilangan semua uang Anda, meskipun kasino hanya memiliki keunggulan satu persen.
Pembersihan
Menghapus project
- Di konsol Google Cloud , buka halaman Manage resources.
- Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
- Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.
Langkah berikutnya
- Untuk mengetahui informasi selengkapnya tentang cara mengirimkan tugas Spark ke Managed Service untuk Apache Spark tanpa harus menggunakan
sshuntuk terhubung ke cluster, baca Managed Service untuk Apache Spark—Mengirimkan tugas