Zaawansowane programowanie Spark
Spark zawiera dwa różne typy wspólnych zmiennych - jeden to broadcast variables a po drugie accumulators.
Broadcast variables - służy do wydajnej dystrybucji dużych wartości.
Accumulators - służy do agregowania informacji o konkretnym zbiorze.
Zmienne transmisji
Zmienne rozgłaszania pozwalają programiście przechowywać zmienną tylko do odczytu w pamięci podręcznej na każdym komputerze, zamiast wysyłać jej kopię z zadaniami. Można ich użyć, na przykład, do nadania każdemu węzłowi kopii dużego zbioru danych wejściowych w efektywny sposób. Spark próbuje również dystrybuować zmienne emisji przy użyciu wydajnych algorytmów emisji w celu zmniejszenia kosztów komunikacji.
Akcje Spark są wykonywane przez zestaw etapów, oddzielonych rozproszonymi operacjami „shuffle”. Spark automatycznie rozgłasza wspólne dane potrzebne do zadań na każdym etapie.
Rozgłaszane w ten sposób dane są buforowane w postaci serializowanej i deserializowane przed uruchomieniem każdego zadania. Oznacza to, że jawne tworzenie zmiennych rozgłoszeniowych jest przydatne tylko wtedy, gdy zadania na wielu etapach wymagają tych samych danych lub gdy ważne jest buforowanie danych w formie zdeserializowanej.
Zmienne transmisji są tworzone ze zmiennej v poprzez dzwonienie SparkContext.broadcast(v). Zmienna rozgłoszeniowa jest otokąv, a jego wartość można uzyskać, wywołując metodę valuemetoda. Poniższy kod pokazuje to -
scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))
Output -
broadcastVar: org.apache.spark.broadcast.Broadcast[Array[Int]] = Broadcast(0)
Po utworzeniu zmiennej rozgłoszeniowej należy użyć jej zamiast wartości v w dowolnych funkcjach działających w klastrze, więc vnie jest wysyłany do węzłów więcej niż raz. Dodatkowo obiektv nie powinien być modyfikowany po rozgłoszeniu, aby zapewnić, że wszystkie węzły otrzymają tę samą wartość zmiennej rozgłoszeniowej.
Akumulatory
Akumulatory to zmienne, które są „dodawane” tylko poprzez operację asocjacyjną i dlatego mogą być efektywnie obsługiwane równolegle. Mogą służyć do implementacji liczników (jak w MapReduce) lub sum. Spark natywnie obsługuje akumulatory typów liczbowych, a programiści mogą dodawać obsługę nowych typów. Jeśli akumulatory zostaną utworzone z nazwą, zostaną one wyświetlone w formacieSpark’s UI. Może to być przydatne do zrozumienia postępu wykonywanych etapów (UWAGA - nie jest to jeszcze obsługiwane w Pythonie).
Akumulator jest tworzony z wartości początkowej v poprzez dzwonienie SparkContext.accumulator(v). Zadania uruchomione w klastrze można następnie dodać do niego przy użyciu rozszerzeniaaddmetoda lub operator + = (w Scali i Pythonie). Jednak nie mogą odczytać jego wartości. Tylko program sterownika może odczytać wartość akumulatora, używając jegovalue metoda.
Poniższy kod pokazuje akumulator używany do dodawania elementów tablicy -
scala> val accum = sc.accumulator(0)
scala> sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum += x)
Jeśli chcesz zobaczyć wynik powyższego kodu, użyj następującego polecenia -
scala> accum.value
Wynik
res2: Int = 10
Operacje numeryczne RDD
Spark umożliwia wykonywanie różnych operacji na danych liczbowych przy użyciu jednej z predefiniowanych metod interfejsu API. Operacje numeryczne Spark są implementowane za pomocą algorytmu przesyłania strumieniowego, który umożliwia budowanie modelu po jednym elemencie na raz.
Te operacje są obliczane i zwracane jako plik StatusCounter obiektu przez wywołanie status() metoda.
Poniżej znajduje się lista metod numerycznych dostępnych w programie StatusCounter.
S.Nr | Metody i znaczenie |
---|---|
1 | count() Liczba elementów w RDD. |
2 | Mean() Średnia elementów w RDD. |
3 | Sum() Łączna wartość elementów w RDD. |
4 | Max() Maksymalna wartość spośród wszystkich elementów w RDD. |
5 | Min() Minimalna wartość spośród wszystkich elementów w RDD. |
6 | Variance() Wariancja elementów. |
7 | Stdev() Odchylenie standardowe. |
Jeśli chcesz użyć tylko jednej z tych metod, możesz wywołać odpowiednią metodę bezpośrednio na RDD.