RDD с използване на Spark: Сградата на Apache Spark



Този блог за RDD, използващ Spark, ще ви предостави подробни и всеобхватни познания за RDD, което е основната единица на Spark & ​​Колко полезно е.

, Самата дума е достатъчна, за да генерира искра в съзнанието на всеки инженер на Hadoop. ДА СЕ n в паметта инструмент за обработка което е мълниеносно при клъстерни изчисления. В сравнение с MapReduce, споделянето на данни в паметта прави RDD 10-100x по-бързо отколкото мрежово и дисково споделяне и всичко това е възможно поради RDD (Resilient Distributed Data sets). Ключовите моменти, върху които се фокусираме днес в тази RDD, използвайки статия Spark, са:

Нуждаете се от RDD?

Защо се нуждаем от RDD? -RDD с помощта на Spark





Светът се развива с и Наука за данни поради напредъка в . Алгоритми базиран на Регресия , , и което продължава Разпределени Итеративно изчисление ация мода, която включва повторно използване и споделяне на данни между множество изчислителни единици.

Традиционното техниките се нуждаят от стабилно междинно и разпределено съхранение като HDFS включващи повтарящи се изчисления с репликации на данни и сериализация на данни, което направи процеса много по-бавен. Намирането на решение никога не е било лесно.



Това е където RDD (Resilient Distributed Datasets) достига до голямата картина.

RDD s са лесни за използване и без усилие за създаване, тъй като данните се импортират от източници на данни и се пускат в RDD. Освен това операциите се прилагат за тяхната обработка. Те са a разпределена колекция от памет с разрешения като Само за четене и най-важното, те са Толерантен към повреди .



Ако някой дял за данни на RDD е изгубени , може да се регенерира чрез прилагане на същото трансформация операция на този изгубен дял в родословие , вместо да обработва всички данни от нулата. Този вид подход в сценарии в реално време може да направи чудеса в ситуации на загуба на данни или когато системата не работи.

какво е боб java

Какво представляват RDD?

RDD или ( Устойчив разпределен набор от данни ) е основен структура на данни в Spark. Срокът Устойчив дефинира способността, която генерира данните автоматично или данни търкаляне назад към първоначално състояние когато възникне неочаквано бедствие с вероятност от загуба на данни.

Данните, записани в RDD, са разделен и се съхранява в множество изпълними възли . Ако изпълняващ възел се проваля по време на изпълнение, тогава той незабавно получава резервното копие от следващ изпълним възел . Ето защо RDD се считат за усъвършенстван тип структури от данни в сравнение с други традиционни структури от данни. RDD могат да съхраняват структурирани, неструктурирани и полуструктурирани данни.

Нека да продължим напред с нашия RDD, използвайки блога Spark, и да научим за уникалните характеристики на RDD, което му дава предимство пред други видове структури от данни.

Характеристики на RDD

  • В памет (RAM) Изчисления : Концепцията за изчисление в паметта отвежда обработката на данните до по-бърз и ефективен етап, като цяло производителност на системата е модернизиран.
  • L неговата оценка : Терминът Мързелива оценка казва трансформации се прилагат към данните в RDD, но изходът не се генерира. Вместо това приложените трансформации са регистрирани.
  • Постоянство : Резултантните RDD са винаги многократно.
  • Грубозърнести операции : Потребителят може да приложи трансформации към всички елементи в наборите от данни чрез карта, филтър или Групирай по операции.
  • Толерантен към неизправност : Ако има загуба на данни, системата може търкаля се назад към своя първоначално състояние като използвате регистрирания трансформации .
  • Неизменност : Данните, дефинирани, извлечени или създадени, не могат да бъдат променен след като е влязъл в системата. В случай, че имате нужда от достъп и модификация на съществуващия RDD, трябва да създадете нов RDD, като приложите набор от Трансформация функционира към текущия или предходния RDD.
  • Разделяне : Това е решаваща единица на паралелизъм в Spark RDD. По подразбиране броят на създадените дялове се базира на вашия източник на данни. Можете дори да решите броя на дяловете, които искате да направите, като използвате потребителски дял функции.

Създаване на RDD с помощта на Spark

RDD могат да бъдат създадени в три начина:

  1. Четене на данни от паралелизирани колекции
val PCRDD = spark.sparkContext.parallelize (Array ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'), 2) val resultRDD = PCRDD.collect () resultRDD.collect ( ) .foreach (println)
  1. Прилагане трансформация на предишни RDD
val words = spark.sparkContext.parallelize (Seq ('Spark', 'is', 'a', 'very', 'power', 'language')) val wordpair = words.map (w = (w.charAt ( 0), w)) wordpair.collect (). Foreach (println)
  1. Четене на данни от външно хранилище или файлови пътища като HDFS или HBase
val Sparkfile = spark.read.textFile ('/ user / edureka_566977 / spark / spark.txt.') Sparkfile.collect ()

Операции, извършени върху RDD:

Има основно два вида операции, които се извършват върху RDD, а именно:

  • Трансформации
  • Действия

Трансформации : The операции ние кандидатстваме за RDD за филтър, достъп и промяна данните в родителския RDD за генериране на последователно RDD е наречен трансформация . Новият RDD връща указател към предишния RDD, осигуряващ зависимостта между тях.

Трансформациите са Мързеливи оценки, с други думи, операциите, приложени върху RDD, които работите, ще бъдат регистрирани, но не изпълнен. Системата изхвърля резултат или изключение след задействане на Действие .

Можем да разделим трансформациите на два типа, както по-долу:

  • Тесни трансформации
  • Широки трансформации

Тесни трансформации Прилагаме тесни трансформации върху a единичен дял на родителския RDD за генериране на нов RDD, тъй като данните, необходими за обработка на RDD, са налични в един дял на родител ASD . Примерите за тесни трансформации са:

  • карта ()
  • филтър ()
  • flatMap ()
  • дял ()
  • mapPartitions ()

Широки трансформации: Прилагаме широката трансформация върху множество дялове за генериране на нов RDD. Данните, необходими за обработка на RDD, са налични в множеството дялове на родител ASD . Примерите за широки трансформации са:

  • намаляванеBy ()
  • съюз ()

Действия : Действията инструктират Apache Spark да кандидатства изчисление и предайте резултата или изключение обратно на RDD на драйвера. Малко от действията включват:

  • събиране ()
  • броя()
  • предприеме()
  • първо ()

Нека на практика приложим операциите върху RDD:

IPL (Индийска висша лига) е турнир по крикет, който е с най-високо ниво. И така, нека днес да се докоснем до набора от данни IPL и да изпълним RDD с помощта на Spark.

  • Първо, нека изтеглим CSV данни за съвпадение на IPL. След изтеглянето му той започва да изглежда като EXCEL файл с редове и колони.

В следващата стъпка запалваме искрата и зареждаме файла match.csv от местоположението му, в моя случай мояcsvместоположението на файла е “/User/edureka_566977/test/matches.csv”

Сега нека започнем с Трансформация част първа:

  • карта ():

Ние използваме Трансформация на картата да приложите специфична операция за преобразуване на всеки елемент от RDD. Тук създаваме RDD с име CKfile, където съхраняваме нашитеcsvфайл. Ние ще създадем още един RDD, наречен Държави съхранявайте подробностите за града .

spark2-shell val CKfile = sc.textFile ('/ user / edureka_566977 / test / matches.csv') CKfile.collect.foreach (println) val state = CKfile.map (_. split (',') (2)) state.collect (). foreach (println)

  • филтър ():

Преобразуване на филтри, самото име описва използването му. Използваме тази операция за преобразуване, за да филтрираме селективните данни от дадена колекция от данни. Кандидатстваме работа с филтър тук, за да получите записите на IPL мачовете за годината 2017 г. и го съхранявайте във филм RDD.

какво представлява смесването на данни в таблицата
val fil = CKfile.filter (line => line.contains ('2017')) fil.collect (). foreach (println)

  • flatMap ():

Ние прилагаме flatMap е операция за преобразуване на всеки от елементите на RDD, за да създадем нов RDD. Подобно е на преобразуването на Map. тук кандидатствамеПлоска картада се изплюйте мачовете на град Хайдерабад и съхранявайте данните вfilRDDRDD.

val filRDD = fil.flatMap (line => line.split ('Hyderabad')). collect ()

  • дял ():

Всяка информация, която записваме в RDD, е разделена на определен брой дялове. Използваме тази трансформация, за да намерим брой дялове данните всъщност са разделени на.

val fil = CKfile.filter (line => line.contains ('2017')) fil.partitions.size

  • mapPartitions ():

Ние разглеждаме MapPatitions като алтернатива на Map () иза всеки() заедно. Използваме mapPartitions тук, за да намерим брой редове ние имаме в нашия RDD.

val fil = CKfile.filter (line => line.contains ('2016')) fil.mapPartitions (idx => Array (idx.size) .iterator) .collect

  • намаляванеBy ():

Ние използвамеНамалетеBy() На Двойки ключ-стойност . Използвахме тази трансформация върху нашатаcsvфайл, за да намерите плейъра с най-високият човек на мачовете .

val ManOfTheMatch = CKfile.map (_. split (',') (13)) val MOTMcount = ManOfTheMatch.map (WINcount => (WINcount, 1)) val ManOTH = MOTMcount.reduceByKey ((x, y) => x + y) .map (tup => (tup._2, tup._1)) sortByKey (false) ManOTH.take (10) .foreach (println)

  • union ():

Името обяснява всичко, Ние използваме трансформация на съюз е да клуб два RDD заедно . Тук създаваме две RDD, а именно fil и fil2. fil RDD съдържа записите за 2017 IPL мачове и fil2 RDD съдържа 2016 IPL мачове.

val fil = CKfile.filter (line => line.contains ('2017')) val fil2 = CKfile.filter (line => line.contains ('2016')) val uninRDD = fil.union (fil2)

Нека започнем с Действие част, където показваме действителната продукция:

  • collect ():

Събирането е действието, с което използваме покажете съдържанието в RDD.

val CKfile = sc.textFile ('/ user / edureka_566977 / test / matches.csv') CKfile.collect.foreach (println)

  • броя():

Брояе действие, което използваме за преброяване на брой записи присъства в RDD.Тукние използваме тази операция, за да преброим общия брой записи в нашия файл match.csv.

val CKfile = sc.textFile ('/ user / edureka_566977 / test / matches.csv') CKfile.count ()

  • предприеме():

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

val statecountm = Scount.reduceByKey ((x, y) => x + y) .map (tup => (tup._2, tup._1)) sortByKey (false) statecountm.collect (). foreach (println) statecountm. take (10) .foreach (println)

  • първо ():

First () е операция за действие, подобна на събиране () и take ()тоизползва се за отпечатване на най-горния отчет s изхода Тук използваме първата () операция за намиране на максимален брой изиграни мачове в определен град и получаваме Мумбай като резултат.

val CKfile = sc.textFile ('/ user / edureka_566977 / test / matches.csv') val state = CKfile.map (_. split (',') (2)) val Scount = state.map (Scount => ( Scount, 1)) scala & gt val statecount = Scount.reduceByKey ((x, y) => x + y) .collect.foreach (println) Scount.reduceByKey ((x, y) => x + y) .collect.foreach (println) val statecountm = Scount.reduceByKey ((x, y) => x + y) .map (tup => (tup._2, tup._1)) sortByKey (false) statecountm.first ()

За да направим процеса си на изучаване на RDD с помощта на Spark, още по-интересен, измислих интересен случай на употреба.

RDD с използване на Spark: Покемон

  • Първо, Нека изтеглим файл Pokemon.csv и го заредим в искрата, както направихме във файла Matches.csv.
val PokemonDataRDD1 = sc.textFile ('/ user / edureka_566977 / PokemonFile / PokemonData.csv') PokemonDataRDD1.collect (). foreach (println)

Покемоните всъщност се предлагат в голямо разнообразие. Нека намерим няколко разновидности.

  • Премахване на схема от файла Pokemon.csv

Може да не се нуждаем от Схема на файла Pokemon.csv. Следователно го премахваме.

val Head = PokemonDataRDD1.first () val NoHeader = PokemonDataRDD1.filter (line =>! line.equals (Head))

  • Намиране на броя на дялове нашият pokemon.csv се разпространява в.
println ('No.ofpartitions =' + NoHeader.partitions.size)

  • Воден покемон

Намиране на брой водни покемони

val WaterRDD = PokemonDataRDD1.filter (line => line.contains ('Water')) WaterRDD.collect (). foreach (println)

  • Огнен покемон

Намиране на брой Fire pokemon

val FireRDD = PokemonDataRDD1.filter (line => line.contens ('Fire')) FireRDD.collect (). foreach (println)

  • Също така можем да открием население на различен тип покемони, използвайки функцията count
WaterRDD.count () FireRDD.count ()

  • Тъй като харесвам играта на отбранителна стратегия нека намерим покемона с максимална защита.
val defenceList = NoHeader.map {x => x.split (',')}. map {x => (x (6) .toDouble)} println ('Highest_Defence:' + defenceList.max ())

  • Ние знаем максимума стойност на защитната сила но не знаем кой покемон е. така че, нека открием кое е това Покемон.
val defWithPokemonName = NoHeader.map {x => x.split (',')}. map {x => (x (6) .toDouble, x (1))} val MaxDefencePokemon = defWithPokemonName.groupByKey.takeOrdered (1) (Поръчка [Double] .reverse.on (_._ 1)) MaxDefencePokemon.foreach (println)

  • Сега нека да подредим покемона с най-малко отбраната
val minDefencePokemon = defenceList.distinct.sortBy (x => x.toDouble, true, 1) minDefencePokemon.take (5) .foreach (println)

  • Сега нека видим покемоните с a по-малко отбранителна стратегия.
val PokemonDataRDD2 = sc.textFile ('/ user / edureka_566977 / PokemonFile / PokemonData.csv') val Head2 = PokemonDataRDD2.first () val NoHeader2 = PokemonDataRDD2.filter (line =>! line.eemN defadWon .map {x => x.split (',')}. map {x => (x (6) .toDouble, x (1))} val MinDefencePokemon2 = defWithPokemonName2.groupByKey.takeOrdered (1) (Подреждане [Double ] .on (_._ 1)) MinDefencePokemon2.foreach (println)

И така, с това стигнахме до края на този RDD, използвайки статия Spark. Надявам се, че искрихме малко вашите познания за RDD, техните характеристики и различните видове операции, които могат да бъдат извършени върху тях.

Тази статия, базирана на е предназначен да ви подготви за изпит за сертифициране на разработчици на Cloudera Hadoop and Spark (CCA175). Ще получите задълбочени познания за Apache Spark и Spark Ecosystem, която включва Spark RDD, Spark SQL, Spark MLlib и Spark Streaming. Ще получите изчерпателни знания за езика за програмиране Scala, HDFS, Sqoop, Flume, Spark GraphX ​​и система за съобщения като Kafka.

видове набори в java