Pengenalan kepada Apache Spark

1. Pengenalan

Apache Spark adalah kerangka pengkomputeran kluster sumber terbuka . Ia menyediakan API pengembangan yang elegan untuk Scala, Java, Python, dan R yang membolehkan pemaju melaksanakan pelbagai beban kerja intensif data di pelbagai sumber data termasuk HDFS, Cassandra, HBase, S3 dll.

Dari segi sejarah, MapReduce Hadoop terbukti tidak efisien untuk beberapa pekerjaan pengkomputeran berulang dan interaktif, yang akhirnya menyebabkan pengembangan Spark. Dengan Spark, kita dapat menjalankan logik hingga dua urutan magnitud lebih cepat daripada dengan memori Hadoop, atau satu urutan magnitud lebih cepat pada cakera .

2. Senibina Spark

Aplikasi percikan berjalan sebagai set proses bebas pada kelompok seperti yang dijelaskan dalam rajah di bawah:

Set proses ini diselaraskan oleh objek SparkContext dalam program utama anda (disebut program pemacu). SparkContext menghubungkan ke beberapa jenis pengurus kluster (sama ada pengurus kluster mandiri Spark, Mesos atau YARN), yang memperuntukkan sumber daya di seluruh aplikasi.

Setelah disambungkan, Spark memperoleh pelaksana pada node dalam kluster, yang merupakan proses yang menjalankan pengiraan dan menyimpan data untuk aplikasi anda.

Seterusnya, ia menghantar kod aplikasi anda (ditentukan oleh fail JAR atau Python yang diserahkan ke SparkContext ) kepada pelaksana. Akhirnya, SparkContext menghantar tugas kepada pelaksana untuk dijalankan .

3. Komponen Teras

Gambar rajah berikut memberikan gambaran yang jelas mengenai pelbagai komponen Spark:

3.1. Teras Spark

Komponen Spark Core dipertanggungjawabkan untuk semua fungsi asas I / O, penjadualan dan pemantauan pekerjaan pada kelompok percikan, pengiriman tugas, jaringan dengan sistem penyimpanan yang berbeza, pemulihan kesalahan, dan pengurusan memori yang efisien.

Tidak seperti Hadoop, Spark mengelakkan data yang dikongsi disimpan di kedai perantaraan seperti Amazon S3 atau HDFS dengan menggunakan struktur data khas yang dikenali sebagai RDD (Resilient Distributed Datasets).

Set Data Terdistribusi yang berdaya tahan tidak dapat diubah, kumpulan rekod yang berpisah yang dapat dikendalikan - secara selari dan memungkinkan - pengiraan 'dalam-memori' yang toleran terhadap kesalahan .

RDD menyokong dua jenis operasi:

  • Transformasi - Transformasi Spark RDD adalah fungsi yang menghasilkan RDD baru dari RDD yang ada. Transformer mengambil RDD sebagai input dan menghasilkan satu atau lebih RDD sebagai output . Transformasi bersifat malas iaitu, ia dapat dilaksanakan ketika kita memanggil tindakan
  • Tindakan - transformasi membuat RDD antara satu sama lain, tetapi ketika kita ingin bekerja dengan set data yang sebenarnya, pada ketika itu tindakan dilakukan. Oleh itu, Tindakan adalah operasi Spark RDD yang memberikan nilai bukan RDD. Nilai tindakan disimpan ke pemacu atau ke sistem storan luaran

Tindakan adalah salah satu cara menghantar data dari Executor kepada pemandu.

Pelaksana adalah ejen yang bertanggungjawab untuk melaksanakan tugas. Manakala pemacu adalah proses JVM yang menyelaraskan pekerja dan pelaksanaan tugas. Beberapa tindakan Spark dikira dan dikumpulkan.

3.2. Spark SQL

Spark SQL adalah modul Spark untuk pemprosesan data berstruktur. Ia digunakan terutamanya untuk melaksanakan pertanyaan SQL. DataFrame merupakan abstraksi utama untuk Spark SQL. Pengumpulan data yang diedarkan yang disusun ke dalam lajur bernama dikenali sebagai DataFrame di Spark.

Spark SQL menyokong pengambilan data dari pelbagai sumber seperti Hive, Avro, Parquet, ORC, JSON, dan JDBC. Ia juga menimbang ke ribuan nod dan pertanyaan berbilang jam menggunakan mesin Spark - yang memberikan toleransi kesalahan pertanyaan pertengahan penuh.

3.3. Pengaliran Spark

Streaming Spark adalah lanjutan dari Spark API teras yang membolehkan pemprosesan aliran data langsung secara berskala, throughput tinggi, toleransi kesalahan. Data dapat diambil dari sejumlah sumber, seperti soket Kafka, Flume, Kinesis, atau TCP.

Akhirnya, data yang diproses dapat dibawa ke sistem fail, pangkalan data, dan papan pemuka langsung.

3.4. Spark Mlib

MLlib adalah perpustakaan pembelajaran mesin (ML) Spark. Tujuannya adalah untuk menjadikan pembelajaran mesin praktikal berskala dan mudah. Pada tahap tinggi, ia menyediakan alat seperti:

  • Algoritma ML - algoritma pembelajaran biasa seperti klasifikasi, regresi, pengelompokan, dan penapisan kolaboratif
  • Featurisasi - pengekstrakan ciri, transformasi, pengurangan dimensi, dan pemilihan
  • Saluran Paip - alat untuk membina, menilai, dan menyesuaikan Paip ML
  • Kegigihan - penjimatan dan pemuatan algoritma, model, dan saluran paip
  • Utiliti - aljabar linear, statistik, pengendalian data, dll.

3.5. Spark GrafikX

GraphX ​​adalah komponen untuk graf dan pengiraan selari grafik. Pada tahap tinggi, GraphX ​​memperluas Spark RDD dengan memperkenalkan abstraksi Graf baru: multigraf yang diarahkan dengan sifat yang dilekatkan pada setiap bucu dan tepi.

Untuk sokongan Graf pengiraan, Graphx mendedahkan satu set pengendali asas (contohnya, subgraf , joinVertices dan aggregateMessages ).

Di samping itu, GraphX ​​merangkumi koleksi algoritma grafik dan pembangun yang semakin meningkat untuk memudahkan tugas analisis grafik.

4. "Hello World" di Spark

Setelah memahami komponen teras, kita dapat beralih ke projek Spark berasaskan Maven yang mudah - untuk mengira jumlah perkataan .

We'll be demonstrating Spark running in the local mode where all the components are running locally on the same machine where it's the master node, executor nodes or Spark's standalone cluster manager.

4.1. Maven Setup

Let's set up a Java Maven project with Spark-related dependencies in pom.xml file:

  org.apache.spark spark-core_2.10 1.6.0  

4.2. Word Count – Spark Job

Let's now write Spark job to process a file containing sentences and output distinct words and their counts in the file:

public static void main(String[] args) throws Exception { if (args.length < 1) { System.err.println("Usage: JavaWordCount "); System.exit(1); } SparkConf sparkConf = new SparkConf().setAppName("JavaWordCount"); JavaSparkContext ctx = new JavaSparkContext(sparkConf); JavaRDD lines = ctx.textFile(args[0], 1); JavaRDD words = lines.flatMap(s -> Arrays.asList(SPACE.split(s)).iterator()); JavaPairRDD ones = words.mapToPair(word -> new Tuple2(word, 1)); JavaPairRDD counts = ones.reduceByKey((Integer i1, Integer i2) -> i1 + i2); List
    
      output = counts.collect(); for (Tuple2 tuple : output) { System.out.println(tuple._1() + ": " + tuple._2()); } ctx.stop(); }
    

Notice that we pass the path of the local text file as an argument to a Spark job.

A SparkContext object is the main entry point for Spark and represents the connection to an already running Spark cluster. It uses SparkConf object for describing the application configuration. SparkContext is used to read a text file in memory as a JavaRDD object.

Next, we transform the lines JavaRDD object to words JavaRDD object using the flatmap method to first convert each line to space-separated words and then flatten the output of each line processing.

We again apply transform operation mapToPair which basically maps each occurrence of the word to the tuple of words and count of 1.

Then, we apply the reduceByKey operation to group multiple occurrences of any word with count 1 to a tuple of words and summed up the count.

Lastly, we execute collect RDD action to get the final results.

4.3. Executing – Spark Job

Let's now build the project using Maven to generate apache-spark-1.0-SNAPSHOT.jar in the target folder.

Next, we need to submit this WordCount job to Spark:

${spark-install-dir}/bin/spark-submit --class com.baeldung.WordCount --master local ${WordCount-MavenProject}/target/apache-spark-1.0-SNAPSHOT.jar ${WordCount-MavenProject}/src/main/resources/spark_example.txt

Spark installation directory and WordCount Maven project directory needs to be updated before running above command.

On submission couple of steps happens behind the scenes:

  1. From the driver code, SparkContext connects to cluster manager(in our case spark standalone cluster manager running locally)
  2. Cluster Manager memperuntukkan sumber untuk aplikasi lain
  3. Spark memperoleh pelaksana pada node dalam kluster. Di sini, aplikasi penghitungan kata kami akan mendapat proses pelaksana sendiri
  4. Kod aplikasi (fail jar) dihantar kepada pelaksana
  5. Tugas dihantar oleh SparkContext kepada pelaksana.

Akhirnya, hasil kerja percikan dikembalikan kepada pemandu dan kami akan melihat jumlah perkataan dalam fail sebagai output:

Hello 1 from 2 Baledung 2 Keep 1 Learning 1 Spark 1 Bye 1

5. Kesimpulan

Dalam artikel ini, kami membincangkan seni bina dan komponen yang berbeza dari Apache Spark. Kami juga menunjukkan contoh kerja Spark yang memberikan penghitungan kata dari fail.

Seperti biasa, kod sumber penuh tersedia di GitHub.