Pengantar Apache Spark dengan Contoh dan Kasus Penggunaan

Diterbitkan: 2022-03-11

Saya pertama kali mendengar tentang Spark pada akhir tahun 2013 ketika saya tertarik dengan Scala, bahasa yang digunakan untuk menulis Spark. Beberapa waktu kemudian, saya melakukan proyek ilmu data yang menyenangkan mencoba memprediksi kelangsungan hidup di Titanic. Ini ternyata menjadi cara yang bagus untuk memperkenalkan konsep dan pemrograman Spark lebih jauh. Saya sangat merekomendasikannya untuk setiap calon pengembang Spark yang mencari tempat untuk memulai.

Saat ini, Spark sedang diadopsi oleh pemain besar seperti Amazon, eBay, dan Yahoo! Banyak organisasi menjalankan Spark pada kluster dengan ribuan node. Menurut FAQ Spark, cluster terbesar yang diketahui memiliki lebih dari 8000 node. Memang, Spark adalah teknologi yang patut diperhatikan dan dipelajari.

Artikel ini memberikan pengantar Spark termasuk kasus penggunaan dan contoh. Ini berisi informasi dari situs web Apache Spark serta buku Learning Spark - Lightning-Fast Big Data Analysis.

Apa itu Apache Spark? Sebuah Pengantar

Spark adalah proyek Apache yang diiklankan sebagai "komputasi cluster secepat kilat". Ini memiliki komunitas open-source yang berkembang dan merupakan proyek Apache paling aktif saat ini.

Spark menyediakan platform pemrosesan data yang lebih cepat dan lebih umum. Spark memungkinkan Anda menjalankan program hingga 100x lebih cepat di memori, atau 10x lebih cepat di disk, daripada Hadoop. Tahun lalu, Spark mengambil alih Hadoop dengan menyelesaikan kontes 100 TB Daytona GraySort 3x lebih cepat pada sepersepuluh jumlah mesin dan juga menjadi mesin open source tercepat untuk menyortir petabyte.

Spark juga memungkinkan untuk menulis kode lebih cepat karena Anda memiliki lebih dari 80 operator tingkat tinggi yang Anda inginkan. Untuk mendemonstrasikannya, mari kita lihat "Hello World!" dari BigData: contoh Word Count. Ditulis dalam Java untuk MapReduce memiliki sekitar 50 baris kode, sedangkan di Spark (dan Scala) Anda dapat melakukannya sesederhana ini:

 sparkContext.textFile("hdfs://...") .flatMap(line => line.split(" ")) .map(word => (word, 1)).reduceByKey(_ + _) .saveAsTextFile("hdfs://...")

Aspek penting lainnya saat mempelajari cara menggunakan Apache Spark adalah shell interaktif (REPL) yang disediakan di luar kotak. Menggunakan REPL, seseorang dapat menguji hasil dari setiap baris kode tanpa terlebih dahulu perlu membuat kode dan menjalankan seluruh pekerjaan. Jalur ke kode kerja jauh lebih pendek dan analisis data ad-hoc dimungkinkan.

Fitur utama tambahan dari Spark meliputi:

  • Saat ini menyediakan API di Scala, Java, dan Python, dengan dukungan untuk bahasa lain (seperti R) dalam perjalanan
  • Terintegrasi dengan baik dengan ekosistem Hadoop dan sumber data (HDFS, Amazon S3, Hive, HBase, Cassandra, dll.)
  • Dapat berjalan di cluster yang dikelola oleh Hadoop YARN atau Apache Mesos, dan juga dapat dijalankan secara mandiri

Inti Spark dilengkapi dengan serangkaian pustaka tingkat tinggi yang kuat yang dapat digunakan dengan mulus dalam aplikasi yang sama. Pustaka ini saat ini mencakup SparkSQL, Spark Streaming, MLlib (untuk pembelajaran mesin), dan GraphX, yang masing-masing dirinci lebih lanjut dalam artikel ini. Pustaka dan ekstensi Spark tambahan saat ini juga sedang dalam pengembangan.

perpustakaan dan ekstensi percikan

Inti Percikan

Spark Core adalah mesin dasar untuk pemrosesan data paralel dan terdistribusi skala besar. Ini bertanggung jawab untuk:

  • manajemen memori dan pemulihan kesalahan
  • menjadwalkan, mendistribusikan, dan memantau pekerjaan di sebuah cluster
  • berinteraksi dengan sistem penyimpanan

Spark memperkenalkan konsep RDD (Resilient Distributed Dataset), kumpulan objek terdistribusi yang toleran terhadap kesalahan yang tidak dapat diubah yang dapat dioperasikan secara paralel. RDD dapat berisi semua jenis objek dan dibuat dengan memuat dataset eksternal atau mendistribusikan koleksi dari program driver.

RDD mendukung dua jenis operasi:

  • Transformasi adalah operasi (seperti map, filter, join, union, dan sebagainya) yang dilakukan pada RDD dan yang menghasilkan RDD baru yang berisi hasilnya.
  • Tindakan adalah operasi (seperti mengurangi, menghitung, pertama, dan seterusnya) yang mengembalikan nilai setelah menjalankan komputasi pada RDD.

Transformasi di Spark adalah "malas", artinya mereka tidak langsung menghitung hasilnya. Sebaliknya, mereka hanya "mengingat" operasi yang akan dilakukan dan dataset (misalnya, file) yang operasinya akan dilakukan. Transformasi hanya benar-benar dihitung ketika suatu tindakan dipanggil dan hasilnya dikembalikan ke program driver. Desain ini memungkinkan Spark berjalan lebih efisien. Misalnya, jika file besar diubah dengan berbagai cara dan diteruskan ke tindakan pertama, Spark hanya akan memproses dan mengembalikan hasilnya untuk baris pertama, daripada melakukan pekerjaan untuk seluruh file.

Secara default, setiap RDD yang diubah dapat dihitung ulang setiap kali Anda menjalankan tindakan di dalamnya. Namun, Anda juga dapat mempertahankan RDD di memori menggunakan metode bertahan atau cache, dalam hal ini Spark akan menyimpan elemen di sekitar kluster untuk akses yang lebih cepat saat Anda menanyakannya di lain waktu.

SparkSQL

SparkSQL adalah komponen Spark yang mendukung kueri data baik melalui SQL atau melalui Bahasa Kueri Hive. Itu berasal sebagai port Apache Hive untuk berjalan di atas Spark (sebagai pengganti MapReduce) dan sekarang terintegrasi dengan tumpukan Spark. Selain menyediakan dukungan untuk berbagai sumber data, ini memungkinkan untuk menenun kueri SQL dengan transformasi kode yang menghasilkan alat yang sangat kuat. Di bawah ini adalah contoh kueri yang kompatibel dengan Hive:

 // sc is an existing SparkContext. val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc) sqlContext.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING)") sqlContext.sql("LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src") // Queries are expressed in HiveQL sqlContext.sql("FROM src SELECT key, value").collect().foreach(println)

Aliran Percikan

Spark Streaming mendukung pemrosesan data streaming secara real time, seperti file log server web produksi (misalnya Apache Flume dan HDFS/S3), media sosial seperti Twitter, dan berbagai antrian pengiriman pesan seperti Kafka. Di bawah tenda, Spark Streaming menerima aliran data input dan membagi data menjadi batch. Selanjutnya, mereka diproses oleh mesin Spark dan menghasilkan aliran hasil akhir dalam kumpulan, seperti yang digambarkan di bawah ini.

aliran percikan

Spark Streaming API sangat cocok dengan Spark Core, sehingga memudahkan programmer untuk bekerja di dunia data batch dan streaming.

MLlib

MLlib adalah perpustakaan pembelajaran mesin yang menyediakan berbagai algoritme yang dirancang untuk menskalakan kluster untuk klasifikasi, regresi, pengelompokan, pemfilteran kolaboratif, dan sebagainya (lihat artikel Toptal tentang pembelajaran mesin untuk informasi lebih lanjut tentang topik itu). Beberapa dari algoritme ini juga berfungsi dengan streaming data, seperti regresi linier menggunakan kuadrat terkecil biasa atau pengelompokan k-means (dan masih banyak lagi). Apache Mahout (pustaka pembelajaran mesin untuk Hadoop) telah berpaling dari MapReduce dan bergabung di Spark MLlib.

GrafikX

grafikx

GraphX ​​adalah perpustakaan untuk memanipulasi grafik dan melakukan operasi paralel grafik. Ini menyediakan alat yang seragam untuk ETL, analisis eksplorasi dan perhitungan grafik iteratif. Terlepas dari operasi bawaan untuk manipulasi grafik, ia menyediakan perpustakaan algoritma grafik umum seperti PageRank.

Cara Menggunakan Apache Spark: Kasus Penggunaan Deteksi Peristiwa

Sekarang kita telah menjawab pertanyaan “Apa itu Apache Spark?”, Mari kita pikirkan masalah atau tantangan seperti apa yang paling efektif digunakan.

Saya menemukan artikel baru-baru ini tentang eksperimen untuk mendeteksi gempa bumi dengan menganalisis aliran Twitter. Menariknya, ditunjukkan bahwa teknik ini kemungkinan besar akan memberi tahu Anda tentang gempa bumi di Jepang lebih cepat daripada Badan Meteorologi Jepang. Meskipun mereka menggunakan teknologi yang berbeda dalam artikel mereka, saya pikir ini adalah contoh yang bagus untuk melihat bagaimana kita dapat menggunakan Spark dengan potongan kode yang disederhanakan dan tanpa kode lem.

Pertama, kita harus memfilter tweet yang tampaknya relevan seperti "gempa bumi" atau "gemetar". Kami dapat dengan mudah menggunakan Spark Streaming untuk tujuan itu sebagai berikut:

 TwitterUtils.createStream(...) .filter(_.getText.contains("earthquake") || _.getText.contains("shaking"))

Kemudian, kita harus menjalankan beberapa analisis semantik pada tweet untuk menentukan apakah tweet tersebut tampaknya merujuk pada kejadian gempa bumi saat ini. Tweet seperti ”Gempa bumi!” atau "Sekarang gemetar", misalnya, akan dianggap sebagai kecocokan positif, sedangkan tweet seperti "Menghadiri Konferensi Gempa" atau "Gempa kemarin menakutkan" tidak. Penulis makalah menggunakan mesin vektor dukungan (SVM) untuk tujuan ini. Kami akan melakukan hal yang sama di sini, tetapi juga dapat mencoba versi streaming. Contoh kode yang dihasilkan dari MLlib akan terlihat seperti berikut:

 // We would prepare some earthquake tweet data and load it in LIBSVM format. val data = MLUtils.loadLibSVMFile(sc, "sample_earthquate_tweets.txt") // Split data into training (60%) and test (40%). val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L) val training = splits(0).cache() val test = splits(1) // Run training algorithm to build the model val numIterations = 100 val model = SVMWithSGD.train(training, numIterations) // Clear the default threshold. model.clearThreshold() // Compute raw scores on the test set. val scoreAndLabels = test.map { point => val score = model.predict(point.features) (score, point.label) } // Get evaluation metrics. val metrics = new BinaryClassificationMetrics(scoreAndLabels) val auROC = metrics.areaUnderROC() println("Area under ROC = " + auROC)

Jika kita senang dengan tingkat prediksi model, kita bisa pindah ke tahap berikutnya dan bereaksi setiap kali kita menemukan gempa bumi. Untuk mendeteksinya, kita memerlukan sejumlah (yaitu, kepadatan) tweet positif dalam jangka waktu tertentu (seperti yang dijelaskan dalam artikel). Perhatikan bahwa, untuk tweet dengan layanan lokasi Twitter yang diaktifkan, kami juga akan mengekstrak lokasi gempa. Berbekal pengetahuan ini, kita dapat menggunakan SparkSQL dan menanyakan tabel Hive yang ada (menyimpan pengguna yang tertarik untuk menerima pemberitahuan gempa) untuk mengambil alamat email mereka dan mengirimi mereka email peringatan yang dipersonalisasi, sebagai berikut:

 // sc is an existing SparkContext. val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc) // sendEmail is a custom function sqlContext.sql("FROM earthquake_warning_users SELECT firstName, lastName, city, email") .collect().foreach(sendEmail)

Kasus Penggunaan Apache Spark Lainnya

Kasus penggunaan potensial untuk Spark jauh melampaui deteksi gempa bumi tentunya.

Berikut adalah contoh cepat (tapi jelas tidak lengkap!) dari kasus penggunaan lain yang memerlukan penanganan kecepatan, variasi, dan volume Big Data, yang sangat cocok untuk Spark:

Dalam industri game, memproses dan menemukan pola dari potensi firehose peristiwa dalam game waktu nyata dan dapat meresponsnya dengan segera adalah kemampuan yang dapat menghasilkan bisnis yang menguntungkan, untuk tujuan seperti retensi pemain, iklan bertarget, auto -penyesuaian tingkat kerumitan, dan sebagainya.

Dalam industri e-commerce, informasi transaksi waktu nyata dapat diteruskan ke algoritme pengelompokan streaming seperti k-means atau pemfilteran kolaboratif seperti ALS. Hasilnya bahkan dapat digabungkan dengan sumber data tidak terstruktur lainnya, seperti komentar pelanggan atau ulasan produk, dan digunakan untuk terus meningkatkan dan menyesuaikan rekomendasi dari waktu ke waktu dengan tren baru.

Di industri keuangan atau keamanan, tumpukan Spark dapat diterapkan ke sistem deteksi penipuan atau penyusupan atau otentikasi berbasis risiko. Itu bisa mencapai hasil terbaik dengan memanen sejumlah besar log yang diarsipkan, menggabungkannya dengan sumber data eksternal seperti informasi tentang pelanggaran data dan akun yang disusupi (lihat, misalnya, https://haveibeenpwned.com/) dan informasi dari koneksi/ permintaan seperti geolokasi IP atau waktu.

Kesimpulan

Ringkasnya, Spark membantu menyederhanakan tugas yang menantang dan intensif komputasi dalam memproses data real-time atau yang diarsipkan dalam jumlah besar, baik terstruktur maupun tidak terstruktur, dengan mulus mengintegrasikan kemampuan kompleks yang relevan seperti pembelajaran mesin dan algoritme grafik. Spark menghadirkan pemrosesan Big Data kepada massa. Coba lihat!