Spark, алтернатива за бърз анализ на данни

Spark е клъстерна изчислителна платформа с отворен код, подобна на Hadoop, но с някои полезни функции, които я правят отличен инструмент за решаване на някои видове проблеми. А именно, в допълнение към интерактивните заявки, Spark поддържа разпределени набори от данни в паметта, оптимизирайки решението на итеративни задачи.

Spark е внедрен в Scala и го използва като среда за разработка на приложения. За разлика от Hadoop, Spark и Scala формират тясна интеграция, при която Scala може лесно да манипулира разпределени набори от данни като локални споделени обекти.

Експериментирайте със Spark

Въпреки че Spark е проектиран за итеративни проблеми с разпределени данни, той всъщност допълва Hadoop и може да работи съвместно с файловата система Hadoop. По-специално, това може да се случи в клъстерната среда на Mesos. Spark е разработен в лабораторията за алгоритми, машини и хора в Калифорнийския университет в Бъркли за изграждане на мащабни, високоскоростни приложения за анализ на данни.

Spark клъстерна изчислителна архитектура

Въпреки приликите с Hadoop, Spark е нова клъстерна изчислителна среда с полезни функции. Първо, Spark е предназначен за решаване на определени видове проблеми в изчислителен клъстер. А именно тези, при които работният набор от данни се използва повторно при паралелни операции (например в алгоритми за машинно обучение). За да оптимизира проблеми от този тип, Spark въвежда концепцията за клъстериране в паметта, когато наборите от данни могат временно да се съхраняват в RAM, за да се намали времето за достъп.

Освен това Spark въвежда концепцията за еластични разпределени набори от данни (RDD). RDD е колекция от неизменяеми обекти, разпространени в много възли. Тези колекции са постоянни, защото могат да бъдат възстановени, ако част от набор от данни бъде загубена. Процесът на възстановяване на част от набор от данни разчита на механизъм за отказоустойчивост, който поддържа родословие (или информация, която позволява част от набор от данни да бъде възстановена от процеса, генерирал данните). RDD е обект Scala и може да бъде създаден от файл; под формата на успореден парче (разпръснато върху възлите); като трансформиране на друг RDD; и накрая чрез промяна на постоянството на съществуващ RDD, като например заявка за кеширане в паметта.

В Spark приложенията се наричат ​​драйвери и тези драйвери извършват операции на един възел или паралелно на набор от възли. Подобно на Hadoop, Spark поддържа клъстери с един и няколко възела. Spark разчита на мениджъра на клъстери Mesos за работа с много възли. Mesos предоставя ефективна платформа за разпределение на ресурси и изолиране на разпределени приложения (вж. Фигура 1). Този подход позволява на Spark да съществува съвместно с Hadoop в споделен пул от възли.

Фигура 1. Spark разчита на мениджъра на клъстери Mesos, за да разпределя и изолира ресурси.

Модел за програмиране на Spark

Драйверът може да извършва два типа операции върху набор от данни: действия и трансформации. Действието е изчисление на набор от данни с върната стойност към драйвера; transform създава нов набор от съществуващ набор от данни. Примери за действия са операции за намаляване (с използване на функции) и итерация над набор от данни (прилагане на функция към всеки елемент, като операцията Map). Примери за трансформации са операцията Map и операцията Cache (което изисква нов набор от данни, които да се съхраняват в паметта).

По-долу ще разгледаме примери за тези две операции, но първо ще се запознаем с езика Scala.

Бързо въведение в Scala

Scala е може би една от най-ценните загадки в Интернет. Scala работи на някои от най-популярните уеб сайтове, включително Twitter, LinkedIn и Foursquare (с платформата си за уеб приложения Lift). Съществуват също доказателства за интерес към представянето на Scala от финансови институции (напр. EDF Trading използва Scala за изчисляване на цените на дериватите).

Scala е език с много парадигми в смисъл, че той гладко и удобно поддържа езикови функции, специфични за императивни, функционални и обектно-ориентирани езици. От обектно-ориентирана програмна перспектива всяка стойност в Scala е обект. По същия начин, от гледна точка на функционалното програмиране, всяка функция е стойност. В допълнение, Scala се набира статично, използвайки изразителна и безопасна система от тип.

В допълнение, Scala е език на виртуална машина (VM) и работи директно на Java Virtual Machine (JVM), използвайки Java Runtime Environment версия 2 чрез байт кодове, генерирани от компилатора Scala. Този подход позволява на Scala да прави почти всичко, което работи на JVM (с незадължителната библиотека за изпълнение на Scala). По този начин Scala използва огромен каталог от съществуващи Java библиотеки заедно със съществуващите Java програми.

И накрая, Scala е разтегателен език (името му всъщност означава Scalable Language), фокусиран върху добавянето на прости, плавно интегрируеми разширения.

Произходът на Скала

Езикът Scala произхожда от Федералния политехнически институт в Лозана. Той е разработен от Мартин Одерски, който преди това е работил върху езика за програмиране Funnel, който комбинира идеите за функционално програмиране и мрежи на Петри. През 2011 г. групата създатели на Scala получи 5-годишен грант от Европейския изследователски съвет, а Typesafe беше създадена за търговска подкрепа на Scala и бе финансирана по подходящ начин.

Скала като пример

Нека да видим някои примери за Scala в действие. Scala има собствен интерпретатор, който ви позволява да експериментирате с езика интерактивно. Практическото използване на Scala е извън обхвата на тази статия, но раздел Ресурси предоставя връзки към допълнителни ресурси.

Нашата бърза обиколка на езика Scala с неговия интерпретатор започва в Листинг 1. След стартирането на Scala имате команден ред, който можете да използвате за интерактивно тестване на изрази и програми. Нека започнем със създаването на две променливи, които са неизменни (vals, известна още като променлива за еднократно присвояване) и променливи (vars). Имайте предвид, че ако опитът за промяна на b (променлива от типа var) е успешен, тогава, когато се опитвате да промените val, се показва съобщение за грешка.

Листинг 1. Прости променливи в Scala

След това нека създадем прост метод за квадратиране на Int. Дефиницията на метод Scala започва с def, последвана от името на метода и списъка с параметри и след това се присвояват различни стойности (една в този пример). Не са посочени връщани стойности, тъй като те произтичат от самия метод. Това е подобно на присвояване на стойност на променлива. Демонстрирам този процес на обект 3 и резултатът е променливата res0 (която интерпретаторът Scala създава автоматично). Всичко това е показано в Листинг 2.

Листинг 2. Един прост метод в Scala

Сега нека разгледаме създаването на прост клас в Scala (вижте Листинг 3). Нека дефинираме прост клас Dog, който приема аргумент String (конструктор на име). Тук трябва да се отбележи, че класът взема параметър директно (без да дефинира параметъра на класа в тялото на класа). Единственият метод, когато е извикан, създава низ. Създаваме нов екземпляр на класа и извикваме метода. Имайте предвид, че вертикалните линии се вмъкват от интерпретатора - те не са част от кода.

Листинг 3. Прост метод в Scala

Когато сте готови, просто напишете: quit, за да излезете от интерпретатора Scala.

Инсталиране на Scala и Spark

Първата стъпка е изтеглянето и конфигурирането на Scala. Командите, показани в Листинг 4, илюстрират процеса на изтегляне и подготовка за инсталиране на Scala. Използвайте Scala 2.8, защото Spark е добре документиран там.

Листинг 4. Инсталиране на Scala

За да направите Scala видима, добавете следните редове към вашия .bashrc файл (ако използвате Bash като черупка):

Можете да тествате вашата инсталация, както е показано в листинг 5. Този набор от команди зарежда промените във файл bashrc и след това изпълнява кратък тест на черупката на Scala.

Листинг 5. Настройка и стартиране на Scala интерактивно

Сега трябва да видите подкана Scala. За да излезете, въведете: quit. Обърнете внимание, че Scala работи в контекста на JVM, който също трябва да присъства. Използвам Ubuntu, който се предлага с OpenJDK по подразбиране.

Сега изтеглете най-новата среда на Spark. За целта използвайте скрипта, показан в листинг 6.

Листинг 6. Изтегляне и инсталиране на средата Spark

Настройте конфигурацията Spark във файла ./conf/spar-env.sh със следния ред в главната директория на Scala:

В последната стъпка от инсталационния процес актуализирайте вашата дистрибуция с помощта на прост инструмент за изграждане (sbt). Това е инструмент за изграждане на Scala, който се използва с разпространението на Spark. Актуализирайте и компилирайте в поддиректория mesos-spark-c86af80:

Моля, обърнете внимание, че в тази стъпка е необходима интернет връзка. Когато приключите, изпълнете краткия тест Spark, както е показано в листинг 7. Този тест решава проблема SparkPi, който изчислява Pi (чрез произволен избор на точки в квадрат от единица площ). Горният формат извиква програмата (spark.examples.SparkPi) и параметъра на хоста, който дефинира главния Mesos (в този случай localhost, тъй като е единичен клъстер на възел) и броя нишки, които да се използват. В списък 7 забележете, че двете задачи се решават последователно (задача 0 стартира и завършва преди задача 1).

Листинг 7. Изпълнение на кратък тест Spark

Чрез увеличаване на броя нишки можете да увеличите паралелизма на тяхното изпълнение и да намалите времето за изчисление (както е показано в листинг 8).

Листинг 8. Друг кратък тест Spark с две нишки

Изграждане на просто приложение на Spark в Scala

За да създадете приложение Spark, Spark и неговите зависимости трябва да са в един и същ файл на Java архив (JAR). Създайте този JAR в директорията Spark на най-високо ниво, като използвате командата sbt:

Резултатът ще бъде файлът ./core/target/scala_2.8.1/"Spark Core-Assembly-0.3.jar "). Добавете го към CLASSPATH, за да го направите достъпен. В този пример този JAR не се използва, защото не го компилираме, а го изпълняваме в интерпретатора Scala.

Това се отнася за стандартната трансформация на MapReduce (вижте Листинг 9). Примерът започва с необходимия импорт на класовете Spark. След това дефинираме клас (SparkTest) с неговия основен метод, който анализира аргументите за по-нататъшно използване. Тези аргументи определят средата, в която ще работи Spark (в този случай клъстер с един възел). След това създаваме обект SparkContext, който казва на Spark как да получи достъп до клъстера. Този обект изисква два параметъра: името на Mesos wizard (предадено) и името, присвоено на задачата (SparkTest). Анализираме броя на фрагментите от командния ред, като казваме на Spark колко нишки да използва в заданието. Последната стъпка за конфигуриране е да посочите текстов файл за операцията MapReduce.

И накрая, получаваме действителния код за примера на Spark, който се състои от поредица от трансформации. Използвайки нашия файл, ние извикваме метода flatMap, който връща RDD (използвайки определената функция за разделяне на ред от текст на маркери). След това този RDD преминава през метода map (който създава двойки ключ-стойност) и накрая чрез метода ReduceByKey, който обединява двойки ключ-стойност. Това се прави чрез предаване на двойки ключ/стойност на анонимната функция _ + _. Тази функция просто взема два параметъра (ключ и стойност) и ги обединява заедно (String и Int), връщайки резултата. Тази стойност се извежда като текстов файл (към изходната директория).

Листинг 9. Scala/Spark MapReduce Script (SparkTest.scala)

За да изпълните скрипта, просто поискайте изпълнение:

Тестовият файл MapReduce може да бъде намерен в изходната директория (output/part-00000).

Други платформи за анализ на големи данни

От появата на Hadoop има редица други платформи за анализ на големи данни, които си заслужава да бъдат разгледани. Те варират от прости предложения, базирани на скриптове, до производствени платформи като Hadoop.

Един от най-простите се нарича bashreduce, което предполага възможността за извършване на операции като MapReduce в Bash на множество компютри. bashreduce разчита на Secure Shell (без парола) за клъстер от машини, който да се използва и след това се изпълнява като скрипт за стартиране на задача с помощта на UNIX инструменти (сортиране, awk, netcat и др.).

GraphLab е друго интересно изпълнение на абстракцията MapReduce, фокусирано върху паралелното изпълнение на алгоритмите за машинно обучение. В GraphLab етапът Map дефинира изчисления, които могат да се извършват независимо един от друг (в отделни възли), а етап Reduce комбинира резултатите.

Вижте Ресурси за повече информация.

Заключение

Експериментирайте със Spark

Spark е интересно допълнение към нарастващото семейство платформи за анализ на големи данни. Това е ефективна и удобна (благодарение на прости и ясни скриптове в Scala) платформа за обработка на разпределени набори от данни. И Spark, и Scala са в процес на активно развитие. Развитието на двата ключови интернет ресурса обаче ги прехвърля от категорията на интересните софтуерни проекти с отворен код в категорията на основните уеб технологии.

Изтеглете ресурси

Свързани теми

Коментари