Kwantyle

Jak powiedzieliśmy , mediana to liczba występująca w 50% punkcie twoich danych. Aby lepiej poznać zakres danych, możesz chcieć wiedzieć, jaka wartość jest najniższym punktem w danych. Jest to minimalna wartość zestawu danych, która jest obliczana przy użyciu min w R:

min(heights)

#[1] 54.26313

Aby uzyskać najwyższy / maksymalny punkt w zbiorze danych, należy użyć maks. W R:

max1(heights)

# [1] 78,99874

min. i maks. Razem określają zakres twoich danych:

c(min(heights), max(heights))

#[1] 54.26313 78.99874

range(heights)

#[1] 54.26313 78.99874

Innym sposobem myślenia o tych liczbach jest myślenie o min jako liczbie, o której 0% twoich danych jest poniżej, a maksimum jako o tym, że 100% twoich danych jest poniżej. Myślenie w ten sposób prowadzi do naturalnego rozszerzenia: jak znaleźć liczbę, o którą N% twoich danych jest poniżej? Odpowiedzią na to pytanie jest użycie funkcji kwantyli w R. N-ty kwantyl to dokładnie liczba, o którą N% twoich danych jest poniżej. Domyślnie kwantyl powie ci 0%, 25%, 50%, 75% i 100% punktów w twoich danych:

quantile(heights)

# 0% 25% 50% 75% 100%

#54.26313 63.50562 66.31807 69.17426 78.99874

Aby uzyskać inne lokalizacje, możesz przekazać wybrane wartości odcięcia jako kolejny argument kwantylu o nazwie probs:

quantile(heights, probs = seq(0, 1, by = 0.20))

# 0% 20% 40% 60% 80% 100%

#54.26313 62.85901 65.19422 67.43537 69.81162 78.99874

Tutaj użyliśmy funkcji seq do wygenerowania sekwencji wartości od 0 do 1, która rośnie w przyrostach o 0,20:

seq(0, 1, by = 0,20)

# [1] 0,0 0,2 0,4 0,6 0,8 1,0

Kwantyle nie są podkreślane w tradycyjnych tekstach statystycznych tak często, jak środki i mediany, ale mogą być równie przydatne. Jeśli prowadzisz oddział obsługi klienta i rejestrujesz, ile czasu zajmuje reakcja na obawy klienta, możesz znacznie więcej skorzystać z martwienia się o to, co stanie się z pierwszymi 99% klientów niż martwienie się o to, co stanie się z medianą klienta. A przeciętny klient może być jeszcze mniej informacyjny, jeśli Twoje dane mają dziwny kształt

[BIG DATA] GLOSARIUSZ (V) : SERWERY

“Chmura” jest terminem bardzo niejasnym, ale nastąpiła prawdziwa zmiana w dostępności zasobów komputerowych. Zamiast zakupu lub długoterminowej dzierżawy fizycznej maszyny, która była kiedyś normą, obecnie dużo częściej wynajmuje się komputery uruchamiane jako wirtualne instancje. To sprawia, że dostawca jest ekonomiczny, aby oferować bardzo krótkoterminowe wynajem elastycznej liczby maszyn, co jest idealne dla wielu aplikacji do przetwarzania danych. Możliwość szybkiego uruchomienia dużego klastra pozwala rozwiązać bardzo duże problemy z danymi przy niewielkim budżecie. Ponieważ istnieje wiele firm o odmiennym podejściu do tego rodzaju wynajmu serwerów, przyjrzę się temu, co oferują z perspektywy dewelopera przetwarzania danych.

EC2

Mówiąc prościej, EC2 umożliwia wynajem komputerów na godzinę, z możliwością wyboru różnych konfiguracje pamięci i procesora. Otrzymujesz dostęp do sieci do kompletnego serwera Linux lub Windows, do którego możesz się zalogować jako root, umożliwiając instalację oprogramowania i elastyczną konfigurację systemu. Pod maską te maszyny są faktycznie hostowane wirtualnie, a wiele z nich działa na każdym fizycznym serwerze w centrum danych, dzięki czemu ceny są niskie. Istnieje wiele innych firm oferujących zwirtualizowane serwery, ale EC2 firmy Amazon wyróżnia aplikacje do przetwarzania danych ze względu na rosnący wokół niego ekosystem. Posiada bogaty zestaw migawek maszyn wirtualnych innych producentów i łatwą integrację z S3, zarówno poprzez surowy interfejs, jak i przez opakowanie Elastic Block Storage (EBS), które używa S3 do obsługi czegoś, co wygląda jak tradycyjny system plików. Elastyczna usługa MapReduce ułatwia tworzenie tymczasowych klastrów Hadoop. Możesz nawet przesyłać bardzo duże zestawy danych z fizycznych nośników wysyłanych do Amazon! Największą wadą obsługi obliczeń w serwisie jest niewielka kontrola nad prawdziwym układem sprzętowym tworzonych klastrów dzięki warstwie wirtualizacji. Często stwierdzam, że moje zadania Hadoop są ograniczone przez komunikację sieciową i przesyłanie danych, dlatego bardziej sensowne jest korzystanie z większej liczby maszyn o niższej mocy, niż z nieco bardziej wydajnych serwerów, które prawdopodobnie wybierzesz dla własnego klastra Hadoop. . Model wyceny aukcji na miejscu instancji firmy Amazon doskonale nadaje się do zadań przetwarzania danych w tle. Często można dostać serwery na jedną trzecią normalnych kosztów, a utrata maszyn, jeśli popyt się podniesie, jest niedogodnością, a nie katastrofą.

Silnik Aplikacji Google

Dzięki usłudze Google App Engine piszesz swój kod udostępniania stron WWW w Javie, a Język JVM lub Python i dba o to, aby aplikacja działała w sposób skalowalny, aby mógł obsłużyć dużą liczbę równoczesnych żądań. W przeciwieństwie do EC2 lub tradycyjnego hostingu, masz bardzo ograniczoną kontrolę nad środowiskiem, w którym działa twój kod. To ułatwia dystrybucję na wielu komputerach w celu obsługi ciężkich ładunków, ponieważ tylko twój kod musi zostać przeniesiony, ale robi to sprawiają, że trudno jest uruchomić wszystko, co wymaga elastycznego dostępu do podstawowego systemu. W przypadku tradycyjnego hostingu cały kod działa na jednym komputerze, a więc naturalnie ogranicza się do czasu przechowywania i czasu procesora dostępnego na tym komputerze. Ponieważ App Engine może uruchamiać Twój kod na potencjalnie nieograniczonej liczbie komputerów, Google musiał wprowadzić dość złożony system kwot i fakturowania, aby kontrolować wykorzystanie tych zasobów przez aplikacje. Ponieważ system został pierwotnie zaprojektowany do obsługi usług internetowych obsługujących dużą liczbę krótkich żądań stron, niektóre z tych ograniczeń mogą być trudne dla aplikacji do przetwarzania danych. Przez długi czas żadne żądanie nie mogło trwać dłużej niż 30 sekund, a chociaż zostało to już zniesione dla żądań w tle, inne ograniczenia nadal utrudniają przetwarzanie danych lub kod intensywnie korzystający z transferu.

Elastic Beanstalk

Elastic Beanstalk to warstwa na szczycie usługi EC2, która zajmuje się konfiguracją automatyczne skalowanie klastra serwerów sieci Web za modułem równoważenia obciążenia, pozwalając programistom na wdrażanie aplikacji opartych na Javie bez obawy o wiele szczegółów dotyczących sprzątania. To podejście wysokiego poziomu sprawia, że ​​jest podobny do App Engine i Heroku, ale ponieważ jest to tylko opakowanie dla EC2, możesz również logować się bezpośrednio na komputerach, na których działa kod, aby rozwiązywać problemy lub modyfikować środowisko. Wciąż jest on jednak zasadniczo zaprojektowany pod kątem potrzeb aplikacji internetowych do frontendu, więc większość problemów z przetwarzaniem danych nie pasuje do jego podejścia.

Heroku

Heroku obsługuje aplikacje internetowe Ruby, oferując prosty proces wdrażania, wiele darmowych i płatnych wtyczek oraz łatwą skalowalność. Aby zapewnić szybkie wdrażanie kodu na wielu komputerach, istnieją pewne ograniczenia dotyczące dostępu do podstawowego systemu plików, ale ogólnie środowisko jest bardziej elastyczne niż App Engine. Możesz zainstalować prawie każdy klejnot Ruby, nawet z natywnym kodem, a otrzymasz prawdziwą bazę danych SQL zamiast skalowalnego, ale restrykcyjnego alternatywnego magazynu danych. Heroku nadal koncentruje się na potrzebach aplikacji frontendowych, więc prawdopodobnie będzie ograniczony do interfejsu do aplikacji do przetwarzania danych. W szczególności możesz dobrze wykorzystać swój twardy limit pamięci 300 MB, jeśli zaczniesz wykonywać operacje, które są zbyt intensywne RAM.

Średnia, mediany i tryby

Nauka odróżniania średnich i median od siebie jest jedną z najbardziej żmudnych części typowej klasy „Intro to Stats”. Zapoznanie się z tymi pojęciami może trochę potrwać, ale naprawdę uważamy, że musisz je rozróżnić, jeśli chcesz poważnie pracować z danymi. W trosce o lepszą pedagogikę postaramy się wyjaśnić znaczenie tych terminów na dwa całkiem różne sposoby. Najpierw pokażemy Ci, jak obliczać średnią i medianę algorytmicznie. Dla większości hakerów kod jest bardziej naturalnym językiem do wyrażania pomysłów niż symboli matematycznych, dlatego uważamy, że zebranie własnych funkcji w celu obliczenia średnich i median prawdopodobnie będzie miało więcej sensu niż pokazanie definicji równań dla tych dwóch statystyk. W dalszej części tej części pokażemy, jak rozpoznać różnicę między średnią a medianą, patrząc na kształt danych na histogramach i wykresach gęstości. Obliczenie średniej jest niezwykle łatwe. W R zwykle używasz funkcji średniej. Oczywiście, mówiąc o użyciu funkcji czarnej skrzynki, nie oddaje to zbyt wiele intuicji, czym jest środek, więc zastosujmy naszą własną wersję środka, którą nazwiemy my.mean. To tylko jedna linia kodu R, ponieważ odpowiednie pojęcia są już dostępne jako dwie inne funkcje w R: suma i długość.

my.mean <- function(x) {

return(sum(x) / length(x))

}

Ten pojedynczy wiersz kodu ma znaczenie: po prostu sumujesz wszystkie liczby w wektorze, a następnie dzielisz sumę przez długość wektora. Jak można się spodziewać, funkcja ta generuje średnią wartość liczb w wektorze, x. Średnia jest tak łatwa do obliczenia częściowo, ponieważ nie ma nic wspólnego z posortowanymi pozycjami liczb na liście. Mediana jest wręcz przeciwna: całkowicie zależy od względnej pozycji liczb na liście. W R normalnie obliczysz medianę za pomocą mediany, ale napiszmy naszą wersję, którą nazwiemy my.median:

my.median <- function(x) {

sorted.x <- sort(x)

if (length(x) %% 2 == 0)

{

indices <- c(length(x) / 2, length(x) / 2 + 1)

return(mean(sorted.x[indices]))

}

else

{

index <- ceiling(length(x) / 2)

return(sorted.x[index])

}

}

Samo zliczenie linii kodu powinno ci powiedzieć, że mediana wymaga nieco więcej pracy, aby obliczyć niż średnia. W pierwszej kolejności musieliśmy posortować wektor, ponieważ mediana jest zasadniczo liczbą znajdującą się w środku posortowanego wektora. Dlatego mediana jest również nazywana 50. percentylem lub 2. kwartylem. Po posortowaniu wektora możesz łatwo obliczyć dowolny z pozostałych percentyli lub kwantyli, dzieląc listę na dwie części w innym miejscu wzdłuż jej długości. Aby uzyskać 25. percentyl (znany również jako 1. kwartyl), możesz podzielić listę na jedną czwartą jej długości. Jedynym problemem związanym z tymi nieformalnymi definicjami pod względem długości jest to, że nie mają one sensu, jeśli lista zawiera parzystą liczbę pozycji. Jeśli nie ma jednej liczby, która dokładnie znajduje się w środku zbioru danych, musisz wykonać pewne sztuczki, aby uzyskać medianę. Kod, który napisaliśmy w poprzednim przykładzie, obsługuje przypadek wektora parzystej długości, biorąc średnią z dwóch pozycji, które byłyby medianą, gdyby lista zawierała nieparzystą liczbę pozycji. Aby wyjaśnić tę kwestię, oto prosty przykład, w którym mediana musi być wymyślona przez wpisy uśredniające i inny przypadek, w którym mediana jest dokładnie równa środkowej pozycji wektora:

my.vector <- c(0, 100)

my.vector

# [1] 0 100

mean(my.vector)

#[1] 50

median(my.vector)

#[1] 50

my.vector <- c(0, 0, 100)

mean(my.vector)

#[1] 33.33333

median

Wracając do naszego pierwotnego zestawu danych dotyczących wysokości i odważników, obliczmy średnią i medianę danych dotyczących wysokości. To da nam również możliwość przetestowania naszego kodu:

my.mean(heights)

#[1] 66.36756

my.median(heights)

#[1] 66.31807

mean(heights) – my.mean(heights)

#[1] 0

median(heights) – my.median(heights)

#[1] 0

Średnia i mediana w tym przykładzie są bardzo blisko siebie. Za chwilę wyjaśnimy, dlaczego tak jest, biorąc pod uwagę kształt danych, z którymi pracujemy. Ponieważ właśnie opisaliśmy dwie z trzech najważniejszych liczb z kursu statystyk wprowadzających, możesz zastanawiać się, dlaczego nie wspomnieliśmy o tym trybie. Porozmawiamy o trybach za chwilę, ale jest powód, dla którego do tej pory go zignorowaliśmy: tryb, w przeciwieństwie do średniej lub mediany, nie zawsze ma prostą definicję rodzajów wektorów, z którymi pracowaliśmy . Ponieważ automatyzacja nie jest łatwa, R nie ma wbudowanej funkcji, która wytworzy tryb wektora liczb.

Definiowanie trybu dowolnego wektora jest skomplikowane, ponieważ musisz powtórzyć liczby w wektorze, jeśli zamierzasz zdefiniować tryb numerycznie. Gdy liczby w wektorze mogą być dowolnymi wartościami zmiennoprzecinkowymi, jest mało prawdopodobne, aby jakakolwiek pojedyncza wartość liczbowa powtórzyła się w wektorze. Z tego powodu tryby są tak naprawdę zdefiniowane wizualnie tylko dla wielu rodzajów zestawów danych.

To powiedziawszy, jeśli nadal nie masz pewności co do matematyki i zastanawiasz się, jaki powinien być teoretyczny tryb, powinna to być liczba występująca najczęściej w twoim zestawie danych.

[BIG DATA] GLOSARIUSZ (IV) : PRZECHOWYWANIE

Operacje przetwarzania danych na dużą skalę uzyskują dostęp do danych w sposób, w jaki tradycyjne systemy plików nie są przeznaczone. Dane zwykle są zapisywane i odczytywane w dużych partiach, wiele megabajtów naraz. Wydajność ma wyższy priorytet niż funkcje takie jak katalogi, które pomagają zorganizować informacje w sposób przyjazny dla użytkownika. Ogromny rozmiar danych oznacza również, że musi być przechowywany na wielu komputerach w sposób rozproszony. W rezultacie pojawiło się kilka wyspecjalizowanych technologii, które obsługują te potrzeby i wymieniają niektóre funkcje systemów plików ogólnego przeznaczenia wymagane przez standardy POSIX.

S3

Usługa Amazon S3 umożliwia przechowywanie dużych porcji danych w usłudze online z interfejsem, który ułatwia pobieranie danych za pośrednictwem standardowego protokołu internetowego HTTP. Jednym ze sposobów patrzenia na to jest system plików, w którym brakuje niektórych funkcji, takich jak dołączanie, przepisywanie lub zmiana nazwy plików i prawdziwych drzew katalogów. Można go również zobaczyć jako bazę danych klucz / wartość dostępną jako usługa internetowa i zoptymalizowaną do przechowywania dużych ilości danych w każdej wartości. Aby dać konkretny przykład, można przechowywać dane obrazu .png w systemie przy użyciu interfejsu API dostarczonego przez Amazon. Najpierw trzeba utworzyć zasobnik, który jest trochę jak globalny katalog najwyższego poziomu, który jest własnością jednego użytkownika i który musi mieć unikalną nazwę. Następnie podasz nazwę zasobu, nazwę pliku (który może zawierać ukośniki, a więc może wyglądać jak plik w podkatalogu), same dane i wszelkie metadane do utworzenia obiektu. Jeśli określono, że obiekt był publicznie dostępny, można uzyskać do niego dostęp za pośrednictwem dowolnej przeglądarki internetowej pod adresem: http://yourbucket.s3.amazonaws.com/your/ file / name.png. Jeśli podasz odpowiedni typ zawartości w metadanych, zostanie wyświetlony jako obraz w przeglądarce. Bardzo często używam S3, ponieważ jest tani, dobrze udokumentowany, niezawodny, szybki, radzi sobie z dużą ilością ruchu i jest bardzo łatwo dostępny z niemal każdego środowiska, dzięki obsłudze protokołu HTTP dla odczytów. W niektórych aplikacjach używałem go nawet jako surowej bazy danych, gdy nie potrzebowałem możliwości uruchamiania zapytań i przechowywano tylko stosunkowo małą liczbę dużych obiektów danych. Korzysta także z inwestycji Amazon w interfejsy użytkownika i interfejsy API, które zachęciły do ​​rozwoju ekosystemu narzędzi.

Hadoop Distributed File System

Rozproszony system plików Hadoop (HDFS) został zaprojektowany do obsługi aplikacji takich jak zadania  MapReduce, które czytają i zapisują duże ilości danych w partiach, zamiast losowego dostępu do wielu małych plików. Porzuca niektóre wymagania POSIX, aby to osiągnąć, ale w odróżnieniu od S3 obsługuje zmiany nazw i przenoszenie plików wraz z prawdziwymi katalogami. Możesz zapisywać do pliku tylko raz w czasie tworzenia, aby ułatwić obsługę problemów z koherencją podczas przechowywania danych w klastrze komputerów, tak aby buforowane kopie pliku mogły być odczytane z dowolnego z komputerów, które go mają, bez konieczności sprawdzenia, czy zawartość się zmieniła. Oprogramowanie klienckie przechowuje zapisane dane w tymczasowym pliku lokalnym, dopóki nie wystarczy do wypełnienia pełnego bloku HDFS. Wszystkie pliki są przechowywane w tych blokach, z domyślnym rozmiarem 64 MB. Gdy wystarczająca ilość danych zostanie zbuforowana lub operacja zapisu zostanie zamknięta, lokalne dane są wysyłane przez sieć i zapisywane na wielu serwerach w klastrze, aby zapewnić, że nie zostaną utracone, jeśli wystąpi awaria sprzętu. Aby uprościć architekturę, HDFS używa pojedynczego węzła nazwy, aby śledzić, które pliki są przechowywane gdzie. Oznacza to, że istnieje jeden punkt awarii i potencjalne wąskie gardło wydajności. W typowych aplikacjach do przetwarzania danych metadane, za które jest odpowiedzialny, są małe i często nie są dostępne, więc w praktyce zwykle nie powoduje to problemów z wydajnością. Ręczna interwencja potrzebna do awarii węzła nazwy może być jednak problemem dla opiekunów systemu.

Hadoop Distributed File System

Rozproszony system plików Hadoop (HDFS) został zaprojektowany do obsługi aplikacji takich jak zadania MapReduce, które odczytują i zapisują duże ilości danych w partiach, a nie bardziej losowo uzyskują dostęp do wielu małych plików. Porzuca niektóre wymagania POSIX, aby to osiągnąć, ale w odróżnieniu od S3 obsługuje zmiany nazw i przenoszenie plików wraz z prawdziwymi katalogami. Możesz zapisywać do pliku tylko raz w czasie tworzenia, aby ułatwić obsługę problemów z koherencją podczas przechowywania danych w klastrze komputerów, tak aby buforowane kopie pliku mogły być odczytane z dowolnego z komputerów, które go mają, bez konieczności sprawdzenia, czy zawartość się zmieniła. Oprogramowanie klienckie przechowuje zapisane dane w tymczasowym pliku lokalnym, dopóki nie wystarczy do wypełnienia pełnego bloku HDFS. Wszystkie pliki są przechowywane w tych blokach, z domyślnym rozmiarem 64 MB. Gdy wystarczająca ilość danych zostanie zbuforowana lub operacja zapisu zostanie zamknięta, lokalne dane są wysyłane przez sieć i zapisywane na wielu serwerach w klastrze, aby zapewnić, że nie zostaną utracone, jeśli wystąpi awaria sprzętu. Aby uprościć architekturę, HDFS używa pojedynczego węzła nazwy, aby śledzić, które pliki są przechowywane gdzie. Oznacza to, że istnieje jeden punkt awarii i potencjalne wąskie gardło wydajności. W typowych aplikacjach do przetwarzania danych metadane, za które jest odpowiedzialny, są małe i często nie są dostępne, więc w praktyce zwykle nie powoduje to problemów z wydajnością. Ręczna interwencja potrzebna do awarii węzła nazwy może być jednak problemem dla opiekunów systemu.

Podsumowania numeryczne

Jednym z najlepszych sposobów, aby zacząć rozumieć nowy zestaw danych, jest obliczenie prostych podsumowań numerycznych wszystkich kolumn. R jest do tego bardzo dobrze przystosowany. Jeśli masz tylko jedną kolumnę ze zbioru danych jako wektor, podsumowanie wyrzuci najbardziej oczywiste wartości, na które powinieneś najpierw spojrzeć:

data.file <- file.path(‘data’, ’01_heights_weights_genders.csv’)

heights.weights <- read.csv(data.file, header = TRUE, sep = ‘,’)

heights <- with(heights.weights, Height)

summary(heights)

# Min. 1st Qu. Median Mean 3rd Qu. Max.

#54.26 63.51 66.32 66.37 69.17 79.00

Pytanie o streszczenie wektora liczb z R da ci liczby, które widzisz w przykładzie:

  1. Minimalna wartość w wektorze
  2. Pierwszy kwartyl (który jest również nazywany 25. percentylem i jest najmniejszą liczbą, która przekracza 25% twoich danych)
  3. Mediana (inaczej 50 percentyl)
  4. Średnia
  5. Trzeci kwartyl (inaczej 75 percentyl)
  6. Maksymalna wartość

Jest to prawie wszystko, o co powinieneś poprosić, jeśli chcesz szybkiego numerycznego podsumowania zestawu danych. Jedyne, czego tak naprawdę brakuje, to odchylenie standardowe pozycji kolumn, podsumowanie liczbowe, które zdefiniujemy w dalszej części tego rozdziału. Na kolejnych stronach opiszemy, jak obliczyć każdą z liczb, które podsumowanie generuje osobno, a następnie pokażemy, jak je interpretować.

[BIG DATA] GLOSARIUSZ (III) : MapReduce

W tradycyjnym świecie relacyjnych baz danych wszystkie przetwarzanie odbywa się po informacje zostały załadowane do sklepu za pomocą specjalistycznego języka zapytań na wysoce uporządkowanych i zoptymalizowanych strukturach danych. Podejście zapoczątkowane przez Google i przyjęte przez wiele innych firm internetowych polega na stworzeniu potoku, który odczytuje i zapisuje do dowolnych formatów plików, a pośrednie wyniki są przekazywane między etapami jako pliki, a obliczenia są rozproszone na wielu komputerach. Zwykle opiera się na metodzie Map-Reduce, polegającej na rozpowszechnianiu pracy, takie podejście wymaga zupełnie nowego zestawu narzędzi, które opiszę poniżej.

Hadoop

Pierwotnie opracowany przez Yahoo! jako klon infrastruktury MapReduce Google, ale następnie open source, Hadoop dba o uruchomienie kodu w klastrze maszyn. Do jego obowiązków należy dzielenie danych wejściowych, wysyłanie ich do każdej maszyny, uruchamianie kodu na każdym kawałku, sprawdzanie, czy kod działa, wyświetla się albo na dalszych etapach przetwarzania, albo na końcowej lokalizacji wyjściowej, wykonując sortowanie, które ma miejsce między mapą i redukując etapy i wysyłając każdy fragment posortowanych danych do właściwego komputera, i zapisując informacje debugowania na temat postępów każdego zadania, między innymi . Jak można się domyślić z tej listy wymagań, jest to dość złożony system, ale na szczęście został przetestowany przez wielu użytkowników. Wiele się dzieje pod maską, ale przez większość czasu, jako programista, wystarczy dostarczyć kod i dane, i to po prostu działa. Jego popularność oznacza także, że istnieje duży ekosystem powiązanych narzędzi, z których niektóre ułatwiają pisanie poszczególnych etapów przetwarzania, a inne organizują bardziej złożone zadania, które wymagają wielu nakładów i kroków. Jako początkujący użytkownik, najlepszym miejscem na rozpoczęcie jest nauka pisania zadania przesyłania strumieniowego w swoim ulubionym języku skryptowym, ponieważ pozwala to ignorować krwawe szczegóły tego, co dzieje się za kulisami. Jako dojrzały projekt, jednym z największych atutów Hadoop jest zbiór narzędzi do debugowania i raportowania, które został wbudowany. Większość z nich jest dostępna poprzez interfejs sieciowy, który zawiera szczegóły wszystkich uruchomionych i zakończonych zadań i pozwala przejść do błędu i pliki dzienników ostrzeżeń.

Hive

Z Hive możesz programować zadania Hadoop za pomocą SQL. To świetny interfejs dla każdego pochodzące ze środowiska relacyjnej bazy danych, choć szczegóły dotyczące implementacji bazowej nie są całkowicie ukryte. Nadal musisz się martwić o pewne różnice w najbardziej optymalnym sposobie określania połączeń dla najlepszej wydajności i niektórych brakujących funkcji językowych. Hive oferuje możliwość dołączania niestandardowego kodu do sytuacji, które nie pasują do SQL, a także do wielu narzędzi do obsługi danych wejściowych i wyjściowych. Aby z niego skorzystać, należy skonfigurować tabelę strukturalną opisującą dane wejściowe i wyjściowe, wydać komendy ładowania w celu pobrania plików, a następnie wpisać zapytania tak, jak w przypadku każdej innej relacyjnej bazy danych. Należy jednak pamiętać, że ze względu na skupienie się Hadoop na przetwarzaniu w dużej skali, opóźnienie może oznaczać, że nawet proste zadania zajmują minuty, więc nie jest to substytut transakcyjnej bazy danych w czasie rzeczywistym.

Pig

Projekt Apache Pig jest językiem przetwarzania danych proceduralnych zaprojektowanym dla Hadoop. W przeciwieństwie do podejścia Hive polegającego na pisaniu zapytań opartych na logice, za pomocą Pig’a określasz serię kroków do wykonania na danych. Jest bliższy codziennemu językowi skryptowemu, ale posiada wyspecjalizowany zestaw funkcji, które pomagają w rozwiązywaniu typowych problemów z przetwarzaniem danych. Łatwo jest rozbić tekst na ngramy komponentowe, na przykład, a następnie zliczyć, jak często każdy z nich występuje. Obsługiwane są również inne często używane operacje, takie jak filtry i łączenia. Świnka jest zwykle używana, gdy twój problem (lub twoje skłonności) pasuje do podejścia proceduralnego, ale musisz wykonać typowe operacje przetwarzania danych, a nie obliczenia ogólnego przeznaczenia. Świnka została opisana jako “taśma Duct Data” ze względu na jej użyteczność i często jest łączona z niestandardowym kodem strumieniowym napisanym w języku skryptowym dla bardziej ogólnych operacji.

Kaskadowanie

Większość aplikacji Hadoop w świecie rzeczywistym składa się z szeregu kroków przetwarzania, a opcja Kaskadowanie pozwala zdefiniować ten złożony przepływ pracy jako program. Układasz logiczny przebieg potokowania, którego potrzebujesz, zamiast budować go bezpośrednio z Map-Reduce, które zasilają się nawzajem. Aby z niego skorzystać, wywołujesz interfejs API języka Java, łącząc obiekty reprezentujące operacje, które chcesz wykonać na wykresie. System przyjmuje tę definicję, wykonuje pewne sprawdzenia i planowanie oraz wykonuje ją w klastrze Hadoop. Istnieje wiele wbudowanych obiektów dla typowych operacji, takich jak sortowanie, grupowanie i łączenie, i możesz pisać własne obiekty, aby uruchomić niestandardowy kod przetwarzania.

Cascalog

Cascalog to funkcjonalny interfejs przetwarzania danych napisany w Clojure. Pod wpływem starego języka Datalog i opartego na strukturze Cascading, pozwala napisać kod przetwarzający na wysokim poziomie abstrakcji, podczas gdy system dba o to, aby skompletować go do pracy Hadoop. Ułatwia przełączanie między lokalnym wykonaniem na małych ilościach danych w celu przetestowania kodu i zadań produkcyjnych w prawdziwym klastrze Hadoop. Cascalog dziedziczy to samo podejście do kranów wejściowych i wyjściowych i operacji przetwarzania z Kaskadowania, a paradygmat funkcjonalny wydaje się naturalnym sposobem określania przepływów danych. Jest to daleki potomek oryginalnego opakowania Clojure do kaskadowania, kaskadowania-clojure.

mrjob

Mrjob to framework, który pozwala pisać kod do przetwarzania danych, a następnie przezroczyście uruchamiać go lokalnie, na Elastic MapReduce lub na własnym klastrze Hadoop. Napisane w Pythonie nie oferuje tego samego poziomu abstrakcji ani wbudowanych operacji, co kaskadowanie oparte na Javie. Specyfikacje zadań są definiowane jako seria map i redukują kroki, z których każdy jest zaimplementowany jako funkcja Pythona. Świetnie sprawdza się jako framework do wykonywania zadań, a nawet pozwala na dołączanie debuggera do lokalnych przebiegów, aby naprawdę zrozumieć, co dzieje się w kodzie.

Kofeina

Mimo że nie opublikowano na nim żadnych istotnych informacji technicznych, uwzględniam projekt kofeiny Google, ponieważ jest wiele spekulacji, że jest to zamiennik paradygmatu MapReduce. Z raportów i komentarzy firmy wynika, że ​​Google korzysta z nowej wersji systemu plików Google obsługującej mniejsze pliki i rozproszone wzorce. Wygląda również na to, że firma przestawiła się z przetwarzania wsadowego na tworzenie indeksu wyszukiwania, zamiast tego używa dynamicznej bazy danych, aby przyspieszyć aktualizację. Nic nie wskazuje na to, że Google opracuje nowe podejście algorytmiczne, które jest tak szeroko stosowane jak MapReduce, choć nie mogę się doczekać, aby dowiedzieć się więcej o nowej architekturze.

S4

Yahoo! Początkowo tworzył system S4, aby podejmować decyzje dotyczące wyboru i pozycjonowania reklam, ale firma otworzyła go po znalezieniu przydatnym do przetwarzania dowolnych strumieni zdarzeń. S4 pozwala pisać kod do obsługi nielimitowanych strumieni zdarzeń i uruchamia je rozproszone na klastrze maszyn, wykorzystując strukturę ZooKeeper do obsługi szczegółów sprzątania. Piszemy źródła danych i procedury obsługi w Javie, a S4 obsługuje nadawanie danych jako zdarzeń w całym systemie, równoważąc obciążenie pracą na dostępnych maszynach. Skupia się na szybkim powracaniu wyników, z niskim opóźnieniem, dla aplikacji takich jak budowanie w pobliżu wyszukiwarek w czasie rzeczywistym na szybko zmieniających się treściach. To odróżnia ją od Hadoop i ogólnego podejścia MapReduce, które obejmuje etapy synchronizacji w obrębie potoku, a więc pewien stopień opóźnienia. Należy pamiętać, że S4 używa UDP i generalnie nie oferuje gwarancji dostawy dla danych przechodzących przez potok. Zwykle wydaje się możliwe dostosowanie wielkości kolejek w celu uniknięcia utraty danych, ale nakłada to obciążenie na osiągnięcie wymaganego poziomu niezawodności na twórcy aplikacji.

MapR

MapR to komercyjna dystrybucja Hadoop skierowana do przedsiębiorstw. Obejmuje własny systemy plików, które zastępują HDFS, wraz z innymi poprawkami do frameworka, takimi jak rozproszone węzły nazw dla zwiększenia niezawodności. Nowy system plików ma na celu zwiększenie wydajności, a także łatwiejsze tworzenie kopii zapasowych i kompatybilność z NFS, aby ułatwić przesyłanie danych. Model programowania nadal jest standardową wersją Hadoop; nacisk kładziony jest na poprawę infrastruktury otaczającej podstawowe ramy, aby uczynić ją bardziej atrakcyjną dla klientów korporacyjnych

Acunu

Podobnie jak MapR, Acunu jest nową niskopoziomową warstwą do przechowywania danych, która zastępuje tradycyjną system plików, choć jego początkowym celem jest raczej Cassandra niż Hadoop. Pisząc magazyn kluczy / wartości o nazwie Kernel o nazwie Castle, który jest twórcą open-source, twórcy są w stanie zaoferować imponujące zwiększenie prędkości w wielu przypadkach. Struktury danych podnoszące wydajność są również imponujące. Acunu oferuje również niektóre tradycyjne zalety komercyjnie obsługiwanej dystrybucji, takie jak automatyczna konfiguracja i inne narzędzia administracyjne.

Flume

Jednym z typowych zastosowań Hadoop jest pobieranie serwera WWW lub innych dzienników z dużej liczby komputerów i okresowe ich przetwarzanie w celu wyciągnięcia danych analitycznych. Projekt Flume został zaprojektowany, aby proces gromadzenia danych był łatwy i skalowalny, poprzez uruchamianie agentów na maszynach źródłowych, które przekazują aktualizacje danych do kolektorów, które następnie agregują je w duże porcje, które można efektywnie zapisać jako pliki HDFS. Zwykle konfiguruje się go za pomocą narzędzia wiersza poleceń, które obsługuje typowe operacje, takie jak śledzenie pliku lub odsłuchiwanie w gnieździe sieciowym, i ma przestrajalne gwarancje niezawodności, które pozwalają zmniejszyć wydajność i możliwość utraty danych.

Kafka

Kafka to stosunkowo nowy projekt do wysyłania dużej liczby wydarzeń od producentów do konsumentów. Pierwotnie zbudowany w celu połączenia witryny LinkedIn z systemami zaplecza, znajduje się gdzieś pomiędzy S4 i Flume w jego funkcjonalności. W przeciwieństwie do S4, jest trwały i oferuje więcej zabezpieczeń niż system oparty na UDP, ale stara się zachować rozproszony charakter i niewielkie opóźnienie. Można go używać w bardzo podobny sposób do Flume, zachowując wysoką przepustowość, ale z bardziej elastycznym systemem do tworzenia wielu klientów i bazową architekturą, która jest bardziej skoncentrowana na równoległości. Kafka polega na ZooKeeper, aby śledzić jego rozproszone przetwarzanie

Azkaban

Najtrudniejszą częścią budowania działającego systemu przy użyciu tych nowych narzędzi danych jest integracja. Poszczególne usługi muszą być powiązane w sekwencje operacji, które są uruchamiane przez Twoją logikę biznesową, a budowanie tego systemu hydraulicznego jest zaskakująco czasochłonne. Azkaban to projekt open source z LinkedIn, który pozwala zdefiniować, co chcesz zrobić jako przepływ pracy, prawdopodobnie składa się z wielu zależnych kroków, a następnie obsługuje wiele bałaganu szczegółów sprzątania. Śledzi wyniki logów, lokalizuje błędy i wiadomości e-mail dotyczące błędów w momencie ich wystąpienia, a także zapewnia przyjazny interfejs WWW, dzięki czemu można zobaczyć, jak pracują. Zadania są tworzone jako pliki tekstowe, przy użyciu bardzo minimalnego zestawu komend, o dowolnej złożoności oczekiwanej w komendach uniksowych lub programach Java, które wywołuje krok.

Oozie

Oozie to system kontroli pracy, który jest podobny do Azkabanu, ale koncentruje się wyłącznie na nim Hadoop. To nie jest tak duża różnica, jak mogłoby się wydawać, ponieważ większość użytkowników Azkabanu, z którymi się zetknąłem, była również dla Hadoop, ale oznacza to, że integracja Oozie jest nieco bardziej zwarta, szczególnie jeśli korzystasz z Yahoo! dystrybucja obu. Oozie obsługuje również bardziej złożony język do opisywania przepływów pracy, umożliwiając podejmowanie decyzji o działaniu, które są opisane w plikach XML. Istnieje również interfejs API, za pomocą którego można budować własne rozszerzenia funkcjonalności systemu. W porównaniu do Azkabanu, interfejs Ooziego jest mocniejszy, ale także bardziej złożony, dlatego wybór zależy od tego, ile potrzebujesz zaawansowanych funkcji Oozie.

Greenplum

Choć nie jest to całkowicie baza danych NoSQL, system Greenplum oferuje interesujący sposób połączenia elastycznego języka zapytań z rozproszoną wydajnością. Zbudowany na bazie otwartego kodu źródłowego Postgres, dodaje rozproszoną architekturę do uruchomienia na klastrze wielu maszyn, przy jednoczesnym zachowaniu standardowego interfejsu SQL. Automatycznie przesuwa wiersze między komputerami, domyślnie w oparciu o skrót klucza podstawowego tabeli i zapobiega utracie danych zarówno przy użyciu konfiguracji dysków RAID na poszczególnych serwerach, jak i replikacji danych między komputerami. Zwykle jest wdrażany na klastrach maszyn o stosunkowo szybkich procesorach i dużych ilościach pamięci RAM, w przeciwieństwie do standardowego sprzętu, który jest bardziej powszechny w świecie WWW.

Wnioskowanie o znaczeniu

Nawet po ustaleniu rodzaju każdej kolumny nadal możesz nie wiedzieć, co oznacza kolumna. Ustalenie, co opisuje tablica liczb bez etykiety, może być zaskakująco trudne. Wróćmy do tabeli, którą widzieliśmy wcześniej, pokazanej ponownie w tabeli.

O ile większy sens ma ta tabela, jeśli powiemy ci, że a) wiersze opisują poszczególne osoby, b) pierwsza kolumna to fałszywy kod wskazujący, czy dana osoba jest mężczyzną (zapisana jako 1) czy kobietą (zapisana jako 0), c) druga kolumna to wzrost osoby w calach, a d) trzecia kolumna to waga osoby w funtach? Liczby mają nagle znaczenie, gdy zostaną umieszczone we właściwym kontekście, a to wpłynie na to, jak o nich myślisz. Niestety, czasami nie dostaniesz tego rodzaju informacji interpretacyjnych. W takich przypadkach intuicja ludzka, wspomagana przez swobodne przeszukiwanie Google, jest często jedynym narzędziem, które możemy zaproponować. Na szczęście intuicję można znacznie poprawić po przejrzeniu liczbowych i wizualnych podsumowań kolumn, których znaczenia nie rozumiesz.

[BIG DATA] GLOSARIUSZ (II) : BAZY DANYCH NoSQL

Kilka lat temu, programiści WWW zaczęli używać systemu memcached do  tymczasowo przechowuj dane w pamięci RAM, więc często używane wartości mogą być pobierane bardzo szybko, zamiast polegać na wolniejszej ścieżce dostępu do pełnej bazy danych z dysku. Ten schemat kodowania wymagał, aby wszystkie dane były zapisywane przy użyciu tylko prymitywów klucz / wartość, początkowo oprócz tradycyjnych kwerend SQL w głównej bazie danych. Kiedy deweloperzy czuli się bardziej komfortowo z tym podejściem, zaczęli eksperymentować z bazami danych, które używały interfejsu klucz / wartość do przechowywania trwałego, a także pamięci podręcznej, ponieważ i tak musieli już wyrazić większość swoich zapytań w tej formie. Jest to rzadki przykład usunięcia warstwy abstrakcji, ponieważ interfejs klucz / wartość jest mniej ekspresyjny i niższy poziom niż język zapytań, taki jak SQL. Systemy te wymagają więcej pracy od twórców aplikacji, ale oferują także o wiele większą elastyczność i kontrolę nad pracą wykonywaną przez bazę danych. Ten uproszczony interfejs ułatwia również twórcom baz danych tworzenie nowych i eksperymentalnych systemów do testowania nowych rozwiązań spełniających surowe wymagania, takich jak bardzo duże, szeroko rozproszone zestawy danych lub aplikacje o dużej przepustowości. Powszechne zapotrzebowanie na rozwiązania i stosunkowo łatwość opracowywania nowych systemów doprowadziły do ​​rozkwitu nowych baz danych. Ich wspólną cechą jest to, że żaden z nich nie obsługuje tradycyjnego interfejsu SQL, który doprowadził do tego, że ruch nosi nazwę NoSQL. Jest to trochę mylące, ponieważ prawie każde środowisko produkcyjne, w którym są używane, ma bazę danych opartą na języku SQL dla wszystkiego, co wymaga elastycznych zapytań i wiarygodnych transakcji, a gdy produkty dojrzewają, prawdopodobnie niektóre z nich zaczną wspierać język jako opcja. Jeśli “NoSQL” wydaje się zbyt agresywny, pomyśl o tym jako o “NotOnlySQL”. Są to wszystkie narzędzia zaprojektowane do wymiany niezawodności i łatwości użycia tradycyjnych baz danych w celu zapewnienia elastyczności i wydajności wymaganej przez nowe problemy napotykane przez programistów. Przy tak wielu różnych systemach, takich różnorodnych kompromisach w projektowaniu i tak krótkiej historii dla większości, lista ta jest nieuchronnie niekompletna i nieco subiektywna. Przekażę podsumowanie moich własnych doświadczeń i wyświetleń z każdej bazy danych, ale zachęcam do przejrzenia ich oficjalnych stron internetowych, aby uzyskać jak najbardziej aktualny i kompletny widok.

MongoDB

Mongo, którego nazwa pochodzi od “humongous”, to baza danych przeznaczona dla programistów z dość dużymi zbiorami danych, ale chcąca mieć coś łatwego w obsłudze i łatwa w obsłudze. Jest to system zorientowany na dokumenty, z rekordami, które wyglądają podobnie do obiektów JSON. z możliwością przechowywania i zapytania o zagnieżdżone atrybuty Z własnego doświadczenia dużą zaletą jest proaktywne wsparcie ze strony programistów zatrudnionych przez 10gen, firmę handlową, która powstała i wspiera projekt open source. Zawsze miałem szybkie i pomocne odpowiedzi zarówno na kanale IRC, jak i na liście mailingowej, co jest kluczowe, gdy mamy do czynienia z porównywalnie młodymi technologiami, takimi jak te. Obsługuje operacje automatycznego dzielenia i operacje MapReduce.Procesy są napisane w JavaScript, z dostępną interaktywną powłoką i powiązaniami dla wszystkich inne popularne języki.

CouchDB

CouchDB jest podobny pod wieloma względami do MongoDB, jako zorientowana na dokumenty baza danych z interfejsem JavaScript, ale różni się tym, w jaki sposób obsługuje kwerendy, skalowanie i wersjonowanie. Używa wielowariantowej metody kontroli współbieżności, która pomaga w rozwiązywaniu problemów wymagających dostępu do stanu danych w różnych momentach, ale wymaga więcej pracy po stronie klienta, aby obsłużyć kolizje podczas zapisywania, a okresowe cykle zbierania śmieci muszą być uruchamiane, aby usuń stare dane. Nie ma dobrej wbudowanej metody poziomej skalowalności, ale istnieją różne zewnętrzne rozwiązania, takie jak BigCouch, Lounge i Pillow, które obsługują dzielenie danych i przetwarzanie w klastrze maszyn. Przeszukujesz dane, pisząc funkcje JavaScript MapReduce nazywane widokami, które ułatwiają systemowi przetwarzanie w sposób rozproszony. Widoki oferują dużą moc i elastyczność, ale mogą być nieco przytłaczające dla prostych zapytań.

Cassandra

Pierwotnie był to wewnętrzny projekt na Facebooku, Cassandra była otwarta kilka lat temu i stała się standardową rozproszoną bazą danych dla sytuacji, w których warto poświęcić czas na naukę złożonego systemu w zamian za dużą moc i elastyczność. Tradycyjnie długa walka polegała właśnie na stworzeniu działającego klastra, ale wraz z dojrzewaniem projektu stało się to znacznie łatwiejsze. Jest to rozproszony system klucza / wartości o wysoce ustrukturyzowanych wartościach, które są utrzymywane w hierarchii podobnej do klasycznych poziomów baz danych / tabel, z odpowiednikami będącymi obszarami kluczowymi i rodzinami kolumn. Jest bardzo zbliżony do modelu danych używanego przez BigTable Google. Domyślnie dane są automatycznie redukowane i równoważone przy użyciu spójnego mieszania w zakresach kluczy, chociaż można skonfigurować inne schematy. Struktury danych są zoptymalizowane pod kątem stałej wydajności zapisu, kosztem sporadycznie powolnych operacji odczytu. Bardzo przydatną funkcją jest możliwość określenia, ile węzłów musi się zgodzić, zanim zakończy się operacja odczytu lub zapisu. Ustawienie poziomu spójności pozwala dopasować ograniczenia WPR dla konkretnej aplikacji, aby nadać priorytet prędkości nad konsekwencją lub odwrotnie. Interfejs najniższego poziomu dla Cassandry jest dostępny za pośrednictwem Thrift, ale dla większości głównych języków są dostępne bardziej przyjaźni klienci.  Zalecaną opcją do uruchamiania zapytań jest Hadoop. Możesz zainstalować Hadoop bezpośrednio w tym samym klastrze, aby zapewnić lokalność dostępu, i istnieje również dystrybucja Hadoop zintegrowana z Cassandrą dostępna z DataStax. Istnieje interfejs wiersza polecenia, który pozwala wykonywać podstawowe zadania administracyjne, ale jest to zupełnie nieosłonięte kości. Zaleca się wybieranie początkowych tokenów przy pierwszym ustawianiu klastra, ale w przeciwnym razie zdecentralizowana architektura jest dość mało wymagająca w utrzymaniu, poza głównymi problemami.

Redis

Dwie cechy wyróżniają Redisa: zachowuje całą bazę danych w pamięci RAM, a jej wartości mogą być złożonymi strukturami danych. Chociaż cały zbiór danych jest przechowywany w pamięci, jest on również okresowo archiwizowany na dysku, więc można go używać jako trwałej bazy danych. Takie podejście zapewnia szybką i przewidywalną wydajność, ale prędkość spada z urwiska, jeśli rozmiar danych rozszerza się poza dostępną pamięć, a system operacyjny uruchamia pamięć stronicowania do obsługi dostępu. Nie będzie to problemem, jeśli masz małe lub przewidywalne wielkości potrzeb przechowywania, ale wymaga to trochę planowania na przyszłość podczas tworzenia aplikacji. Możesz zarządzać większymi zbiorami danych, grupując wiele maszyn razem, ale odłamanie jest obecnie obsługiwane na poziomie klienta. Istnieje eksperymentalna gałąź kodu pod aktywnym rozwojem, która obsługuje klastrowanie na poziomie serwera. Obsługa złożonych struktur danych jest imponująca, a duża liczba operacji list i zestawów jest obsługiwana szybko po stronie serwera. Ułatwia to np. dołączanie do końca wartości, która jest listą, a następnie przycięcie listy tak, aby zawierała tylko 100 ostatnich elementów. Dzięki tym funkcjom łatwiej jest ograniczyć wzrost danych niż w większości systemów, a także ułatwić życie twórcom aplikacji.

Big Table

BigTable jest dostępny tylko dla programistów spoza Google jako podstawa aplikacji dane magazynu silnika. Mimo to, jako jedna z pionierskich alternatywnych baz danych, warto się przyjrzeć. Ma bardziej złożoną strukturę i interfejs niż wiele datastore NoSQL, z hierarchią i wielowymiarowym dostępem. Pierwszym poziomem, podobnie jak tradycyjne relacyjne bazy danych, jest przechowywanie danych w tabeli. Każda tabela jest podzielona na wiele wierszy, a każdy wiersz jest adresowany za pomocą unikalnego ciągu kluczy. Wartości wewnątrz wiersza są rozmieszczone w komórkach, a każda komórka jest identyfikowana przez identyfikator rodziny kolumn, nazwę kolumny i znacznik czasu, z których każde wyjaśnię poniżej. Klucze wiersza są przechowywane w porządku rosnącym w częściach plików zwanych shards. To gwarantuje, że operacje uzyskujące dostęp do ciągłych zakresów kluczy są wydajne, ale oznacza to, że musisz zastanowić się nad prawdopodobną kolejnością odczytywania kluczy. W jednym z przykładów firma Google odwróciła nazwy domen adresów URL, z których korzystały jako klucze, że wszystkie linki z podobnych domen były w pobliżu; na przykład plik com.google.maps / index.html znajdował się w pobliżu com.google.www / index.html. Możesz myśleć o rodzinie kolumn jako o typie lub klasie w języku programowania. Każda reprezentuje zbiór wartości danych, które mają pewne wspólne właściwości; na przykład można przechowywać zawartość HTML stron internetowych, podczas gdy inne mogą być zaprojektowane tak, by zawierały ciąg znaków języka. Oczekuje się, że liczba pojedynczych rodzin na stół będzie niewielka i powinny one być rzadko zmieniane, więc w praktyce często są wybierane podczas tworzenia tabeli. Mogą mieć powiązane z nimi właściwości, ograniczenia i zachowania. Nazwy kolumn myląco nie przypominają nazw kolumn w relacyjnej bazie danych. Są definiowane dynamicznie, a nie określane z wyprzedzeniem i często przechowują same dane. Jeśli rodzina kolumn reprezentowała przychodzące linki do strony, nazwa kolumny może być adresem URL strony, z której pochodzi link, z zawartością komórki zawierającą tekst łącza. Znacznik czasu umożliwia danej komórce posiadanie wielu wersji w czasie, a także umożliwia wygaśnięcie lub usunięcie starych danych. Dana część danych może zostać unikalnie zaadresowana poprzez przejrzenie w tabeli pełnego identyfikatora, który koncepcyjnie wygląda jak klucz wiersza, następnie rodzina kolumn, a następnie nazwa kolumny i wreszcie znacznik czasu. Możesz łatwo odczytać wszystkie wartości dla danego klucza wiersza w konkretnej rodzinie kolumn, abyś mógł pomyśleć o rodzinie kolumn jako o najbliższym porównaniu do kolumny w relacyjnej bazie danych. Jak można się było spodziewać po Google, BigTable został zaprojektowany do obsługi bardzo dużych obciążeń danych przez uruchamianie na dużych klastrach sprzętu towarowego. Ma gwarancje transakcji dla pojedynczych wierszy, ale nie oferuje żadnej możliwości atomowej zmiany większej liczby wierszy. Wykorzystuje system plików Google jako pamięć bazową, która utrzymuje nadmiarowe kopie wszystkich trwałych plików, dzięki czemu można odzyskiwać po awarii.

HBase

HBase został zaprojektowany jako open-sourceowy klon BigTable Google, więc nie dziwi, że ma bardzo podobny interfejs i opiera się na klonie systemu plików Google o nazwie HDFS. Obsługuje tę samą strukturę danych tabel, kluczy wierszy, rodzin kolumn, nazw kolumn, znaczników czasu i wartości komórek, jednak zaleca się, aby dla każdej tabeli nie występowały więcej niż dwie lub trzy rodziny ze względu na wydajność. HBase jest dobrze zintegrowany z głównym projektem Hadoop, więc łatwo jest pisać i czytać w bazie danych z zadania MapReduce uruchomionego w systemie. Jedną z rzeczy, na które należy zwrócić uwagę, jest to, że opóźnienie poszczególnych odczytów i zapisów może być względnie powolne, ponieważ jest to system rozproszony, a operacje będą obejmować pewien ruch sieciowy. HBase jest w najlepszym wydaniu, gdy wielu klientów korzysta z niej w sposób rozproszony. Jeśli robisz serializowane odczyty i zapisy, być może będziesz musiał pomyśleć o strategii buforowania.

Hypertable

Hypertable jest kolejnym klonem OpenTable o otwartym kodzie źródłowym. Jest napisany w C ++, a nie jak Java, jak HBase, i skupił swoją energię na wysokiej wydajności. W przeciwnym razie jego interfejs następuje w śladach BigTable, z tą samą koncepcją rodziny kolumn i znaczników czasowych.

Voldemort

Klon open source z bazy danych Dynamo Amazon stworzony przez LinkedIn, Voldemort ma klasyczny trzy-operacyjny interfejs klucz / wartość, ale z wyrafinowaną architekturą zaplecza do obsługi uruchamiania w dużych klastrach rozproszonych. Korzysta ze spójnego hashu, aby umożliwić szybkie wyszukiwanie lokalizacji pamięci dla poszczególnych kluczy i ma kontrolę wersji w celu obsługi niespójnych wartości. Operacja odczytu może faktycznie zwrócić wiele wartości dla danego klucza, jeśli zostały napisane przez różnych klientów niemal w tym samym czasie. To następnie obciąża aplikację, aby podjęła sensowne działania naprawcze, gdy otrzyma wiele wartości, w oparciu o znajomość znaczenia zapisywanych danych. Przykładem, z którego korzysta Amazon, jest koszyk na zakupy, w którym zestaw przedmiotów może być połączony razem, tracąc wszelkie świadome skreślenia, ale zachowując wszelkie dodane elementy, co oczywiście ma sens – przynajmniej z perspektywy przychodów!

Riak

Podobnie jak Voldemort, Riak został zainspirowany bazą danych Dynamo firmy Amazon i oferuje interfejs klucz / wartość i jest przeznaczony do pracy w dużych klastrach rozproszonych. Korzysta również ze spójnego hashu i protokołu plotek, aby uniknąć potrzeby stosowania scentralizowanego serwera indeksowania, którego wymaga tabela BigTable, oraz obsługi wersji w celu obsługi konfliktów aktualizacji. Zapytanie jest obsługiwane za pomocą funkcji MapReduce zapisanych w języku Erlang lub JavaScript. Jest to open source na licencji Apache, ale istnieje również zamknięta wersja komercyjna z niektórymi specjalnymi funkcjami zaprojektowanymi dla klientów korporacyjnych.

ZooKeeper

Podczas korzystania z usługi rozproszonej na dużym klastrze maszyn, nawet zadania takie jak czytanie informacji konfiguracyjnych, które są proste w systemach z jednym urządzeniem, mogą być trudne do zrealizowania niezawodnie. Struktura ZooKeeper została pierwotnie zbudowana na Yahoo! aby ułatwić aplikacjom firmy dostęp do informacji konfiguracyjnych w solidny i łatwy do zrozumienia sposób, ale od tego czasu został rozwinięty, aby oferować wiele funkcji ułatwiających koordynację pracy w klastrach rozproszonych. Jednym ze sposobów myślenia o tym jest bardzo wyspecjalizowany magazyn klucz / wartość, z interfejsem, który wygląda bardzo podobnie do systemu plików i obsługuje takie operacje, jak oglądanie wywołań zwrotnych, konsensusy i identyfikatory transakcji, które często są potrzebne do koordynowania algorytmów rozproszonych. To pozwoliło jej działać jako warstwa podstawowa dla usług takich jak LinkedIn Norbert, elastyczna struktura do zarządzania klastrami maszyn. Sam ZooKeeper jest zbudowany tak, aby działał w sposób rozproszony na wielu maszynach i ma bardzo szybkie odczyty, a kosztem zapisów, które są wolniejsze, więcej serwerów jest używanych do hostowania usługi.

Wnioskowanie o typach kolumn w danych

Zanim zrobisz cokolwiek innego z nowym zestawem danych, powinieneś spróbować dowiedzieć się, co reprezentuje każda kolumna w bieżącej tabeli. Niektóre osoby lubią nazywać tę informację słownikiem danych, co oznacza, że ​​możesz otrzymać krótki słowny opis każdej kolumny w zestawie danych. Wyobraź sobie na przykład, że otrzymałeś nieznakowany zestaw danych w Tabeli 

Bez jakichkolwiek danych identyfikujących naprawdę trudno jest ustalić, co zrobić z tymi liczbami. Rzeczywiście, jako punkt wyjścia powinieneś dowiedzieć się, jaki jest typ każdej kolumny: czy pierwsza kolumna jest naprawdę ciągiem, nawet jeśli wygląda na to, że zawiera tylko 0 i 1? W przykładzie UFO w pierwszym rozdziale natychmiast oznaczyliśmy wszystkie kolumny zestawu danych, który otrzymaliśmy. Gdy otrzymamy zestaw danych bez etykiet, możemy użyć niektórych funkcji określania typu wbudowanych w R. Trzy najważniejsze z tych funkcji pokazano w tabeli 

Posiadanie podstawowych informacji o typach dla każdej kolumny może być bardzo ważne, gdy idziemy do przodu, ponieważ pojedyncza funkcja R często robi różne rzeczy w zależności od rodzaju jej danych wejściowych. Te zera i jedynki przechowywane jako znaki w naszym bieżącym zbiorze danych muszą zostać przetłumaczone na liczby, zanim będziemy mogli korzystać z niektórych wbudowanych funkcji w R, ale w rzeczywistości muszą zostać przekonwertowane na czynniki, jeśli będziemy używać innych wbudowane funkcje. Częściowo ta tendencja do przemieszczania się między typami pochodzi z ogólnej tradycji uczenia maszynowego do radzenia sobie z kategorycznymi różnicami. Wiele zmiennych, które naprawdę działają jak etykiety lub kategorie, jest kodowanych matematycznie jako 0 i 1. Możesz myśleć o tych liczbach, jakby były to wartości logiczne: 0 może wskazywać, że wiadomość e-mail nie jest spamem, 1 może oznaczać, że wiadomość e-mail jest spamem. To konkretne użycie zer i jedynek do opisania właściwości jakościowych obiektu jest często nazywane kodowaniem zastępczym w uczeniu maszynowym i statystyce. Atraktyczny system kodowania należy odróżnić od czynników R, które wyrażają właściwości jakościowe za pomocą wyraźnych etykiet. Czynniki w R można traktować jak etykiety, ale w rzeczywistości etykiety są kodowane numerycznie w tle: gdy programista uzyskuje dostęp do etykiety, wartości liczbowe są tłumaczone na etykiety znaków określone w indeksowanej tablicy ciągów znaków. Ponieważ R używa kodowania numerycznego w tle, naiwne próby konwersji etykiet czynnika R na liczby przyniosą dziwne wyniki, ponieważ otrzymasz rzeczywiste liczby schematów kodowania zamiast liczb powiązanych z etykietami tego czynnika. Tabele poniżen pokazują te same dane, ale dane zostały opisane za pomocą trzech różnych schematów kodowania.

W pierwszej tabeli  IsSpam należy traktować bezpośrednio jako czynnik w R, który jest jednym ze sposobów wyrażenia różnic jakościowych. W praktyce może być ładowany jako czynnik lub ciąg, w zależności od używanej funkcji przesiewania danych . Z każdym nowym zestawem danych musisz dowiedzieć się, czy wartości są ładowane poprawnie jako czynniki, czy jako ciągi znaków po tym, jak zdecydujesz, jak chcesz traktować każdą kolumnę R. Jeśli nie masz pewności, często lepiej zacząć od ładowania rzeczy jako ciągów. Zawsze możesz później przekonwertować kolumnę łańcuchową na kolumnę czynnikową. W tabeli drugiej IsSpam jest nadal pojęciem jakościowym, ale jest kodowane przy użyciu wartości liczbowych reprezentujących logiczne rozróżnienie: 1 oznacza, że ​​IsSpam jest prawdziwy, a 0 oznacza, że ​​IsSpam jest fałszywy. Ten styl kodowania numerycznego jest faktycznie wymagany przez niektóre algorytmy uczenia maszynowego. Na przykład glm, domyślna funkcja w R do korzystania z regresji logistycznej i algorytm klasyfikacji, który opiszemy w następnym rozdziale, zakłada, że ​​twoje zmienne są atrapami. Wreszcie, w tabeli trzeciej pokazujemy inny rodzaj kodowania numerycznego dla tej samej koncepcji jakościowej. W tym systemie kodowania ludzie używają +1 i –1 zamiast 1 i 0. Ten styl kodowania różnic jakościowych jest bardzo popularny wśród fizyków, więc w końcu zobaczysz go, gdy przeczytasz więcej o uczeniu maszynowym. Jednak my całkowicie unikamy stosowania tego stylu notacji, ponieważ uważamy, że poruszanie się jest niepotrzebnym źródłem zamieszania

[BIG DATA] GLOSARIUSZ (I) : Terminy

Dokument zorientowany

W tradycyjnej relacyjnej bazie danych użytkownik rozpoczyna od określenia serii typów kolumn i nazw dla tabeli. Informacje są następnie dodawane jako wiersze wartości, a każda z tych nazwanych kolumn jest komórką każdego wiersza. Nie można podać dodatkowych wartości, które nie zostały określone podczas tworzenia tabeli, a każda wartość musi być obecna, nawet jeśli jest to wartość NULL. Przechowywanie dokumentów zamiast tego umożliwia wpisanie każdego rekordu jako serii nazw wraz z powiązanymi wartościami, które można zobrazować jako obiekt JavaScript, słownik Python lub mieszanie Ruby. Nie określasz z wyprzedzeniem, jakie nazwy będą występować w każdej tabeli przy użyciu schematu. Teoretycznie każdy rekord może zawierać zupełnie inny zestaw nazwanych wartości, chociaż w praktyce warstwa aplikacji często opiera się na nieformalnym schemacie, a kod klienta oczekuje obecności określonych nazwanych wartości. Główną zaletą tego zorientowanego na dokumenty podejścia jest jego elastyczność. Możesz dodawać lub usuwać równoważniki kolumn bez żadnych kar, o ile warstwa aplikacji nie opiera się na usuniętych wartościach. Dobrą analogią jest różnica między językami, w których deklarowane są typy zmiennych z wyprzedzeniem, a tymi, w których typ jest wywnioskowany przez kompilator lub interpreter. Tracisz informacje, które można wykorzystać do automatycznego sprawdzania poprawności i optymalizacji pod względem wydajności, ale prototypowanie i eksperymentowanie staje się o wiele łatwiejsze.

Przechowywanie kluczy / wartości

System memcached wprowadził wielu programistów internetowych do mocy przetwarzania magazynu danych, takiego jak gigantyczna tablica asocjacyjna, odczytywania i zapisywania wartości opartych wyłącznie na unikalnym kluczu. Prowadzi to do bardzo prostego interfejsu, z trzema prymitywnymi operacjami, aby uzyskać dane powiązane z określonym kluczem, do przechowywania niektórych danych na kluczu oraz do usunięcia klucza i jego danych. W przeciwieństwie do relacyjnych baz danych, z czystym magazynem kluczy / wartości, nie można uruchamiać zapytań, choć niektóre mogą oferować rozszerzenia, takie jak możliwość znalezienia wszystkich kluczy pasujących do wyrażenia z dziką kartą. Oznacza to, że kod aplikacji musi obsługiwać wszelkie skomplikowane operacje poza prymitywnymi wywołaniami, które może wykonać w sklepie. Dlaczego każdy programista chce wykonać tę dodatkową pracę? W przypadku bardziej złożonych baz danych często płacisz karę za złożoność lub wydajność w przypadku funkcji, na które możesz nie zwrócić uwagi, takich jak pełna zgodność z ACID. Dzięki magazynom kluczy / wartości otrzymujesz bardzo podstawowe elementy składowe, które mają bardzo przewidywalne właściwości wydajności i możesz tworzyć bardziej złożone operacje przy użyciu tego samego języka, co reszta aplikacji. Wiele wymienionych tu baz danych stara się zachować prostotę interfejsu czystych kluczy / wartości, ale z dodatkowymi funkcjami dodanymi w celu spełnienia typowych wymagań. Wydaje się prawdopodobne, że istnieje słodka cecha funkcjonalności, która zachowuje niektóre zalety minimalnych sklepów kluczowych / wartościowych, nie wymagając od twórcy aplikacji tyle samo powielonego wysiłku.

Skalowanie poziome lub pionowe

Tradycyjne architektury baz danych są zaprojektowane tak, aby działały dobrze na jednym komputerze, a najprostszym sposobem obsługi większych operacji jest uaktualnienie maszyny przy użyciu szybszego procesora lub większej ilości pamięci. Takie podejście do zwiększania prędkości jest znane jako skalowanie pionowe. Nowsze systemy przetwarzania danych, takie jak Hadoop i Cassandra, są zaprojektowane do pracy na klastrach serwerów o stosunkowo niskiej specyfikacji, a więc najprostszym sposobem na obsłużenie większej ilości danych jest dodanie większej liczby tych maszyn do klastra. Takie horyzontalne podejście do skalowania wydaje się być tańsze w miarę wzrostu liczby operacji i rozmiaru danych, a bardzo duże potoki przetwarzania danych są zbudowane na modelu poziomym. Koszt tego podejścia jest jednak kosztowny. Pisanie kodu obsługi rozproszonych danych jest trudne i wymaga kompromisów między szybkością, skalowalnością, odpornością na uszkodzenia i tradycyjnymi celami bazy danych, takimi jak atomowość i spójność.

MapReduce

MapReduce to wzorzec projektowy algorytmu, który powstał w funkcjonalnym świecie programowania. Składa się z trzech kroków. Najpierw piszesz funkcję mapowania lub skrypt, który przechodzi przez twoje dane wejściowe i wypisuje serię kluczy i wartości do użycia przy obliczaniu wyników. Klucze służą do grupowania razem bitów danych, które będą potrzebne do obliczenia pojedynczego wyniku wyjściowego. Nieuporządkowana lista kluczy i wartości jest następnie poddawana krokowi sortowania, który zapewnia, że ​​wszystkie fragmenty mające ten sam klucz znajdują się obok siebie w pliku. Etap reduktora przechodzi następnie przez sortowane wyjście i odbiera wszystkie wartości, które mają ten sam klucz w sąsiednim bloku. To może brzmieć jak bardzo okrężny sposób budowania twoich algorytmów, ale jego główną zaletą jest to, że usuwa nieplanowane losowe dostępy, z całym rozproszeniem i zbieraniem przetwarzanym w fazie sortowania. Nawet na pojedynczych urządzeniach zwiększa to wydajność, dzięki zwiększonemu dostępowi do pamięci, ale także pozwala na łatwe dzielenie procesu na dużą liczbę maszyn, radząc sobie z danymi wejściowymi w wielu niezależnych porcjach i dzieląc dane na podstawie klucz. Hadoop jest najbardziej znanym publicznym systemem do uruchamiania algorytmów MapReduce, ale wiele nowoczesnych baz danych, takich jak MongoDB, również obsługuje je jako opcję. Warto nawet w dość tradycyjnym systemie, ponieważ jeśli umiesz napisać zapytanie w formularzu MapReduce, będziesz mógł go wydajnie uruchomić na tylu maszynach, jakie masz.

Sharding

Każda baza danych rozproszona na wielu komputerach wymaga pewnego schematu, aby zdecydować, na których maszynach należy przechowywać dane dane. System odłamywania decyduje o tym dla każdego wiersza w tabeli, używając jego klucza. W najprostszym przypadku programista aplikacji określi jawną regułę do wykorzystania w przypadku shardingu. Na przykład, jeśli dysponujesz 10 klastrem maszynowym i kluczem numerycznym, możesz użyć ostatniej cyfry dziesiętnej klucza, aby zdecydować, na którym komputerze chcesz przechowywać dane. Ponieważ zarówno kod przechowywania i pobierania wie o tej zasadzie, gdy trzeba uzyskać wiersz, można przejść bezpośrednio do maszyny, która go posiada. Największym problemem z shardingiem jest równomierne rozłożenie danych między maszynami i radzenie sobie ze zmianami rozmiaru klastra. Na tym samym przykładzie wyobraź sobie, że klawisze numeryczne często kończą się na zero; doprowadzi to do wyjątkowo niezrównoważonej dystrybucji, w której pojedyncza maszyna jest nadużywana i staje się wąskim gardłem. Jeśli rozmiar klastra zostanie rozszerzony z dziesięciu do piętnastu maszyn, możemy przełączyć się na schemat piętnastki modulo do przypisywania danych, ale będzie to wymagało hurtowego tasowania wszystkich danych w klastrze. Aby złagodzić ból tych problemów, do podziału danych stosuje się bardziej złożone schematy. Niektóre z nich polegają na centralnym katalogu, w którym znajdują się lokalizacje poszczególnych kluczy. Ten poziom pośredni umożliwia przenoszenie danych pomiędzy komputerami, gdy dany fragment staje się zbyt duży (aby przywrócić równowagę dystrybucji), kosztem konieczności dodatkowego wyszukiwania w katalogu dla każdej operacji. Informacje zawarte w katalogu są zwykle dość małe i dość statyczne, więc jest to dobry kandydat do lokalnego buforowania, o ile zauważane są rzadkie zmiany. Innym popularnym podejściem jest użycie spójnego hashu do shardowania. Ta technika używa małej tabeli dzielącej możliwy zakres wartości skrótu na zakresy, z których jeden jest przypisany do każdego fragmentu. Dane wyszukiwania wymagane przez klientów są wyjątkowo lekkie, z zaledwie kilkoma wartościami liczbowymi na węzeł, dzięki czemu można je udostępniać i buforować w sposób wydajny, ale ma on wystarczającą elastyczność, aby umożliwić szybkie ponowne równoważenie dystrybucji wartości po dodaniu i usunięciu węzłów, lub nawet gdy jeden węzeł jest przeciążony, w przeciwieństwie do ustalonych funkcji modulo.