МАШИННО ОБУЧЕНИЕ SCALA SPARK

Наука за данни и машинно обучение със Scala и Spark (епизод 02/03)

Spark със Scala API

Изобретателите на Spark избраха Scala за написване на модулите от ниско ниво. В „Наука за данни и машинно обучение със Scala и Spark (Епизод 01/03)“ разгледахме основите на езика за програмиране Scala, докато използвахме среда на Google Colab. В тази статия научаваме за екосистемата Spark и нейния API от по-високо ниво за потребителите на Scala. Както и преди, ние все още използваме Spark 3.0.0 и Google Colab за практикуване на някои кодови фрагменти.

Какво е Apache Spark?

Според „Apache Spark и Delta Lake Under the Hood“

Apache Spark е унифицирана изчислителна машина и набор от библиотеки за паралелна обработка на данни в компютърни клъстери. Към момента на писане, Spark е най-активно разработваният двигател с отворен код за тази задача; което го прави де факто инструмент за всеки разработчик или учен по данни, който се интересува от големи данни. Spark поддържа множество широко използвани езици за програмиране (Python, Java, Scala и R), включва библиотеки за различни задачи, вариращи от SQL до стрийминг и машинно обучение, и работи навсякъде от лаптоп до клъстер от хиляди сървъри. Това я прави лесна система за стартиране и мащабиране до обработка на големи данни или невероятно голям мащаб.

Силно препоръчвам да прочетете брошурата за бърз справочник Apache Spark и Delta Lake Under the Hood. Това е документ от 45 страници с примери в API на Scala и pyspark и разглеждането му няма да отнеме повече от 30 минути.

Защо машинно обучение със Spark?

Като учен по данни, можем да зададем въпроса „какво е значението на Spark за задачите за машинно обучение?“ С увеличаването на използването на електронни устройства, социални медийни платформи и усъвършенствани ИТ системи, данните се генерират на ниво, невиждано досега. Също така, поради евтиното съхранение на данни, клиентите са щастливи да събират големи данни за стойности, които да бъдат извлечени. Моделите на машинно обучение са доказани и работят за бизнеса, за да разбере по-добре и да изготви стратегия за бъдещи разширения. За да има достъп до големи данни, Spark е де факто изборът за машинно обучение, за да прехвърля огромни обеми от събрани данни за изграждане на модели.

DataFrame API е най-важният API от по-високо ниво за машинно обучение. MLlib на Spark отказа поддръжката на RDD в полза на API на DataFrame.

Scala API в Spark

Scala беше избрана да бъде основният език за писане на двигателя Spark. Apache Spark обаче предоставя API на високо ниво в Java, Scala, Python и R. В тази статия ще използваме spark 3.0.0.

По-долу са командите за получаване на модули за Scala и Spark в Google colab

// Run below commands
import $ivy.`org.apache.spark::spark-sql:3.0.0`
import org.apache.spark.sql._
import $ivy.`sh.almond::ammonite-spark:0.3.0`

Има две важни абстракции на Spark, Spark Context и Spark Session. Използвайки редовете по-долу, създаваме искрова сесия и контекст.

import org.apache.spark.SparkContext
import org.apache.spark.SparkConf

Обикновено при стартиране на spark има много предупреждения, като използвате командите по-долу, можете да ги изключите.

// TIP: Turn off the millions lines of logs
import org.apache.log4j.{Level, Logger}
Logger.getLogger(“org”).setLevel(Level.OFF)
// define spark session
val spark = {
SparkSession.builder()
.master("local[*]")
.getOrCreate()
}
// Define Spark Context
def sc = spark.sparkContext

Spark RDD със Scala

Устойчивите разпределени набори от данни (RDD) са най-често срещаната абстракция на структурата на данни на Spark, тясно свързана със Scala. Много е подобна на собствената паралелна функция на Scala. Нека напишем някои фрагменти за RRD в Scala.

// Spark RDD
import scala.util.Random
// Define variable in Scala
val bigRng = scala.util.Random.shuffle(1 to 100000)
// convert Scala variable to spark RDD
val bigPRng = sc.parallelize(bigRng)

Можете да приложите много операции върху bigPRng, той ще работи на Spark.

// calculate the mean of the population
bigPRng.mean
// Find the min of the population
bigPRng.min
// Find the stanndard deviation of the population
bigPRng.popStdev

Прилагането на функцията върху всеки елемент от RDD е много подобно на функцията Scala parallel map.

// Map function on RDD, similar to Paralell in Scala
val bigPRng2 = bigPRng.map(_ * 2)
// Scala function function to apply on RDD
def div3(x:Int) : Boolean = {val y:Int=(x%3); return(y==0)}
val bigBool = bigPRng2.map(div3(_))

Spark DataFrame API в Scala

В предишните раздели сме включили примери за RDD и как RDD може да се използва за паралелно изчисляване. Друг популярен API в spark е Dataframe. Идвайки от опит в Data Scientist, вероятно DataFrame API ще има повече смисъл. Въпреки това, има основна разлика в това как да се активират рамки с данни и рамки с данни на pandas, които работят под капака.

Spark DataFrames могат да живеят на множество физически машини и следователно техните изчисления се извършват по разпределен начин, за разлика от pandas DataFrames.

Spark MLlib се внедрява в DataFrame API в бъдеще.

Нека научим някои основни трикове на Spark DataFrame API, полезни най-вече за задачи за машинно обучение.

Прочетете раздел 0 в Google Collab относно подготовката на данни за фрагментите по-долу.

// Read the .txt file
val df_emps = spark.read.option("header", "true").csv(data_dir + "employee.txt")
// print the schema
df_emps.printSchema()
// show top 10 records similar to df.head(10) in pandas
df_emps.show(10, false)

Прочетете втората таблица

// Read the .txt file
val df_cr = spark.read.option("header", "true").csv(data_dir + "country_region.txt")
// print the schema
df_cr.printSchema()
// show top 10 records similar to df.head(10) in pandas
df_cr.show(10, false)

Прочетете третата таблица

// Read the .txt file
val df_dd = spark.read.option("header", "true").csv(data_dir + "dept_div.txt")
// print the schema
df_dd.printSchema()
// show top 10 records similar to df.head(10) in pandas
df_dd.show(10, false)

Обединяването е една от най-често срещаните и ефективни операции в Spark в сравнение с pandas.

// Merge all three tables
val df_joined = df_emps.join(df_cr, "region_id").join(df_dd, "department")

Бележник на Google Colab

Подготвих функционален Google colab бележник. Чувствайте се свободни да използвате тетрадката за упражнения.

За повече примери вижте официалната документация на Spark

заключение на-реалността-проект

В този епизод научихме основите на Spark със Scala и покрихме по-долу ключови концепции с упражнения.

  • Изпълнение на Scala в Google Colab
  • Основи на Spark
  • RDD на Spark със Scala
  • DataFrame API на Sparks със Scala

В следващия епизод ще научим за моделите на машинно обучение със Spark и Scala, използвайки среда за изпълнение на Google Colab.

Препратки Четения/Връзки

„Машинно обучение със Scala в Google Collaboratory“

Scala Docs -https://docs.scala-lang.org/tour/tour-of-scala.html

https://www.lynda.com/Scala-tutorials/Scala-Essential-Training-Data-Science/559182-2.html



https://databricks.com/p/ebook/apache-spark-under-the-hood