Odchylenia standardowe i wariancje

Średnia i mediana listy liczb są miarami czegoś centralnego: mediana dosłownie znajduje się na środku listy, podczas gdy średnia jest skutecznie w środku dopiero po zważeniu wszystkich pozycji na liście według ich wartości. Ale główne tendencje to tylko jedna rzecz, którą możesz chcieć wiedzieć o swoich danych. Równie ważne jest pytanie, jak daleko od siebie oczekujesz typowych wartości, które nazwiemy rozkładem twoich danych. Możesz sobie wyobrazić zdefiniowanie zakresu swoich danych na wiele sposobów. Jak już powiedzieliśmy, możesz użyć definicji implementowanej przez funkcję zakresu: zakres jest definiowany przez wartości min i maks. Ta definicja pomija dwie rzeczy, których możemy chcieć od rozsądnej definicji rozprzestrzeniania się:

  • Spread powinien obejmować tylko większość danych, a nie wszystkie.
  • Rozpiętość nie powinna być całkowicie determinowana przez dwie najbardziej skrajne wartości w zbiorze danych, które często są wartościami odstającymi, które nie są reprezentatywne dla całego zestawu danych.

Wartości min i max idealnie pasują do wartości odstających, co czyni je dość kruchymi definicjami rozrzutu. Innym sposobem myślenia o tym, co jest nie tak z definicją zakresu minimalnego i maksymalnego, jest rozważenie, co się stanie, jeśli zmienisz resztę danych, pozostawiając te dwie skrajne wartości bez zmian. W praktyce możesz przenieść resztę danych w dowolne limity i uzyskać takie same min. I maks. Innymi słowy, definicja zakresu w oparciu o min i max efektywnie zależy tylko od dwóch twoich punktów danych, niezależnie od tego, czy masz dwa punkty danych czy dwa miliony punktów danych. Ponieważ nie należy ufać żadnemu podsumowaniu danych, które nie jest wrażliwe na znaczną większość punktów danych, przejdziemy do lepszej definicji rozprzestrzeniania się zestawu danych.

Istnieje wiele sposobów, aby spróbować spełnić opisane wcześniej wymagania dotyczące dobrego liczbowego podsumowania danych. Na przykład możesz zobaczyć, który zakres zawiera 50% twoich danych i jest wyśrodkowany wokół mediany. W R jest to dość łatwe do zrobienia:

c(quantile(heights, probs = 0.25), quantile(heights, probs = 0.75))

Lub możesz chcieć bardziej obejmować i znaleźć zakres, który zawiera 95% danych:

c(quantile(heights, probs = 0.025), quantile(heights, probs = 0.975))

To są naprawdę bardzo dobre miary rozprzestrzeniania się twoich danych. Kiedy pracujesz z bardziej zaawansowanymi metodami statystycznymi, tego rodzaju zakresy będą pojawiać się wielokrotnie. Ale historycznie statystycy stosowali nieco inną miarę rozprzestrzeniania się: w szczególności zastosowali definicję zwaną wariancją. Z grubsza chodzi o to, aby zmierzyć, jak daleko przeciętnie dana liczba w twoim zbiorze danych jest od średniej wartości. Zamiast formalnej definicji matematycznej, zdefiniujmy wariancję obliczeniowo, pisząc naszą własną funkcję wariancji:

my.var <- function(x) {

m <- mean(x)

return(sum((x – m) ^ 2) / length(x))

}

Jak zawsze sprawdźmy, czy nasza implementacja działa, porównując ją z var R :

my.var(heights) – var(heights)

Robimy tylko takie sobie zadanie dopasowania implementacji R var. Teoretycznie może to być kilka przyczyn, z których większość to przykłady tego, jak coś może pójść nie tak, gdy założymy, że arytmetyka zmiennoprzecinkowa jest całkowicie dokładna. Ale jest jeszcze jeden powód, dla którego nasz kod nie działa w taki sam sposób, jak wbudowana funkcja w R: formalna definicja wariancji nie dzieli się przez długość wektora, ale raczej przez długość wektora minus jeden. Dzieje się tak, ponieważ wariancja, którą można oszacować na podstawie danych empirycznych, z dość subtelnych powodów okazuje się tendencyjna w dół w stosunku do jej prawdziwej wartości. Aby to naprawić dla zestawu danych z n punktami, zwykle mnożymy swoją ocenę wariancji przez współczynnik skalowania n / (n – 1), co prowadzi do ulepszonej wersji my.var:

my.var <- function(x) {

m <- mean(x)

return(sum((x – m) ^ 2) / (length(x) – 1))

}

my.var(heights) – var(heights)

W tej drugiej wersji my.var doskonale dopasowujemy oszacowanie wariancji przez R. Obawy o zmiennoprzecinkowe, które zgłosiliśmy wcześniej, mogłyby z łatwością pojawić się, gdybyśmy użyli dłuższych wektorów, ale wydaje się, że nie mają znaczenia w przypadku zestawu danych o tym rozmiarze. Wariancja jest bardzo naturalną miarą rozprzestrzeniania się naszych danych, ale niestety jest znacznie większa niż prawie każda z wartości w naszym zbiorze danych. Jednym oczywistym sposobem na dostrzeżenie tego niedopasowania w skali jest spojrzenie na wartości, które są o jedną jednostkę wariancji oddalone od średniej:

c(mean(heights) – var(heights), mean(heights) + var(heights))

#[1] 51.56409 81.17103

Ten zakres jest w rzeczywistości większy niż zakres całego oryginalnego zestawu danych:

c(mean(heights) – var(heights), mean(heights) + var(heights))

#[1] 51.56409 81.17103

range(heights)

#[1] 54.26313 78.99874

Powodem, dla którego jesteśmy tak daleko poza naszymi oryginalnymi danymi, jest to, że zdefiniowaliśmy wariancję, mierząc kwadratową odległość każdej liczby na naszej liście od wartości średniej, ale nigdy nie cofnęliśmy kroku kwadratu. Aby przywrócić wszystko do oryginalnej skali, musimy zastąpić wariancję odchyleniem standardowym, które jest tylko pierwiastkiem kwadratowym wariancji:

my.sd <- function(x) {

return(sqrt(my.var(x)))

}

Zanim zrobimy cokolwiek innego, zawsze dobrze jest sprawdzić, czy Twoja implementacja ma sens w stosunku do R, który nazywa się sd:

my.sd (heights) – sd (heights)

Ponieważ teraz obliczamy wartości we właściwej skali, warto odtworzyć nasze oszacowanie zakresu naszych danych, patrząc na wartości, które są o jedną jednostkę standardowego odchylenia od średniej:

c(mean(heights) – sd(heights), mean(heights) + sd(heights))

# [1] 62.52003 70.21509

range(heights)

#[1] 54.26313 78.99874

Teraz, gdy używamy jednostek odchyleń standardowych zamiast jednostek odchyleń, jesteśmy w stałym zakresie naszych danych. Byłoby jednak miło dowiedzieć się, jak mocno jesteśmy w danych. Jednym ze sposobów jest porównanie zakresu opartego na odchyleniu standardowym z zakresem zdefiniowanym za pomocą kwantyli:

c(mean(heights) – sd(heights), mean(heights) + sd(heights))

# [1] 62.52003 70.21509

c(quantile(heights, probs = 0.25), quantile(heights, probs = 0.75))

# 25% 75%

#63.50562 69.17426Używając funkcji kwantyli, możemy zobaczyć, że około 50% naszych danych jest oddalone o mniej niż jedno standardowe odchylenie od średniej. Jest to dość typowe, szczególnie w przypadku danych o kształcie, jaki mają dane wysokości. Aby jednak ostatecznie sprecyzować ten pomysł na temat kształtu naszych danych, musimy zacząć wizualizować nasze dane i zdefiniować formalne terminy opisujące kształt danych

[BIG DATA] GLOSARIUSZ (VI) : PRZETWARZANIE

Dostarczenie zwięzłych, wartościowych informacji, które chcesz uzyskać z morza danych, może być trudne, ale w systemach, które pomagają zmienić twoje zbiory danych w coś sensownego, nastąpił duży postęp. Ponieważ istnieje tak wiele różnych barier, narzędzia te obejmują zarówno szybkie systemy analizy statystycznej, jak i pozyskiwanie ludzkich pomocników.

R

Projekt R jest zarówno językiem specjalistycznym, jak i zestawem modułów skierowanych do osób pracujących ze statystyką. Obejmuje wszystko, od ładowania danych do wykonywania skomplikowanych analiz na nim, a następnie eksportowanie lub wizualizację wyników. Interaktywna powłoka ułatwia eksperymentowanie z danymi, ponieważ możesz bardzo szybko wypróbować wiele różnych podejść. Największym minusem z punktu widzenia przetwarzania danych jest to, że jest przeznaczony do pracy z zestawami danych mieszczącymi się w pamięci pojedynczej maszyny. Można go używać w Hadoop jako inny język przesyłania strumieniowego, ale wiele z najbardziej zaawansowanych funkcji wymaga dostępu do pełnego zestawu danych, aby był skuteczny. R tworzy wspaniałą platformę do tworzenia prototypów do projektowania rozwiązań, które muszą być uruchamiane na ogromnych ilościach danych, lub do zrozumienia mniejszych wyników przetwarzania.

Yahoo! Pipes

Minęło kilka lat odkąd Yahoo! wydała środowisko Pipes, ale wciąż jest niedoścignione narzędzie do budowy prostych potoków danych. Posiada graficzny interfejs, w którym przeciągasz i upuszczasz komponenty, łącząc je w przepływy operacji przetwarzania. Wiele ciekawych interfejsów API firmy Yahoo! jest prezentowanych jako elementy składowe, a także komponenty do importowania stron internetowych i kanałów RSS oraz przesyłania wyników w postaci dynamicznych plików danych. Jako bezpłatne narzędzie skierowane do użytkowników mających praktyczne wymagania techniczne, Pipes nie może obsłużyć ogromnych zestawów danych, ale jest odpowiednikiem taśmy klejącej do wielu mniejszych zadań. Podobne, ale bardziej wyspecjalizowane narzędzia, takie jak Alpine Miner, odniosły wiele sukcesów w komercyjnym świecie, więc mam nadzieję, że interfejs typu Pipes pojawi się częściej w aplikacjach do przetwarzania danych.

Mechanical Turk

Pierwotny Mechanical Turk był nieuczciwym urządzeniem, które wyglądało na robota szachowego, ale było kontrolowane przez ukrytego karła . Usługa Amazon wykorzystuje tę samą zasadę, uznając, że istnieją pewne mentalne zadania o które najskuteczniej można prosić prawdziwych ludzi do wykonania. Może to kosztować zaledwie kilka centów za operację, w zależności od czasu trwania i złożoności każdej małej pracy, którą chcesz wykonać. Niski koszt może sprawić, że poczuje się trochę wyzyskiwać pracowników, ale jest to niesamowicie skuteczny sposób na wprowadzenie prawdziwej inteligencji do twojego systemu. Często będziesz miał poważny problem, który nie jest jeszcze niezawodnie rozwiązany w AI, ale może być szybko wykonany przez osobę. Na przykład możesz podawać zdjęcia, aby uzyskać szacunki dotyczące płci i wieku, czyli coś, czego po prostu nie możesz zrobić niezawodnie przy użyciu czystego kodu. Musisz zintensyfikować myślenie i planowanie przed zintegrowaniem go z systemem, ponieważ nawet przy stosunkowo niskich stawkach jest znacznie droższy w przeliczeniu na operację. Nie można go pobić jako karty wolnej od zła, gdy napotkasz uporczywie problemy z AI.

Solr / Lucene

Lucene jest biblioteką Java, która obsługuje indeksowanie i przeszukiwanie dużych zbiorów dokumentów, a Solr to aplikacja korzystająca z biblioteki do budowy serwera wyszukiwarki. Początkowo oddzielne projekty, zostały niedawno połączone w jeden zespół open source Apache. Jest przeznaczony do obsługi bardzo dużej ilości danych, z architekturą, która oznacza, że ​​skaluje się poziomo w całym klastrze maszyn. Posiada również bardzo elastyczny system architektury i konfiguracji wtyczek oraz może być zintegrowany z wieloma różnymi źródłami danych. Funkcje te, wraz z dobrze przetestowaną bazą kodu, sprawiają, że jest to doskonały wybór dla każdego, kto musi rozwiązać problem wyszukiwania na dużą skalę.

ElasticSearch

Podobnie jak Solr, ElasticSearch to usługa wyszukiwarek zbudowana na bazie Lucene. Jest to młodszy projekt, skierowany bardziej do ludzi w świecie internetu (w przeciwieństwie do intensywnego korzystania z Solr w przedsiębiorstwach). Umożliwia aktualizację indeksu wyszukiwania przy znacznie niższym opóźnieniu, ma bardziej minimalny interfejs oparty na REST / JSON i opcje konfiguracyjne oraz skaluje się poziomo w bardziej płynny sposób. Nie ma jeszcze społeczności ani liczby współpracowników bardziej utrwalonego projektu i brakuje niektórych z szerszych funkcji oferowanych przez Solr, więc warto je ocenić.

Dataameer

Mimo że jest skierowany na dobrze znany rynek wywiadowczy, Datameer jest interesujący, ponieważ wykorzystuje Hadoop do zasilania jego przetwarzania. Oferuje uproszczone środowisko programistyczne umożliwiające operatorom określenie rodzaju potrzebnej analizy, a następnie przetwarza je w zadania MapReduce za kulisami. Posiada również pewne przyjazne dla użytkownika narzędzia do importowania danych, a także opcje wizualizacji. Jest to znak, gdzie kierujemy się rozwiązaniami do przetwarzania danych, ponieważ lepiej budujemy interfejsy i przechodzimy na wyższe i bardziej wydajne poziomy abstrakcji.

BigSheets

IBM BigSheets to aplikacja internetowa, która umożliwia użytkownikom nietechnicznym zbieranie niestrukturalnych danych z zasobów internetowych i wewnętrznych oraz analizowanie ich w celu tworzenia raportów i wizualizacji. Podobnie jak Datameer, wykorzystuje Hadoop za kulisami do obsługi bardzo dużych ilości danych, wraz z usługami takimi jak OpenCalais, aby poradzić sobie z wydobywaniem użytecznych uporządkowanych informacji z zupy o nieustrukturyzowanym tekście. Jest skierowany do użytkowników, którzy czują się komfortowo z interfejsem arkusza kalkulacyjnego, a nie z tradycyjnymi programistami, więc nie można go używać jako części niestandardowego rozwiązania, ale oferuje pomysły na to, jak sprawić, by aplikacja do przetwarzania danych była dostępna dla zwykłych użytkowników.

Tinkerpop

Grupa programistów pracująca nad oprogramowaniem graficznym Open Source, Tinkerpop stworzyła zintegrowany zestaw narzędzi. Trochę jak stos LAMP do przetwarzania wykresów, projektują zestaw usług, które dobrze współpracują, aby wykonać typowe operacje, takie jak połączenie z wyspecjalizowanymi bazami danych wykresów, pisanie zapytań traversal i udostępnianie całego systemu jako serwera opartego na REST. Jeśli masz do czynienia z danymi wykresowymi, Tinkerpop dostarczy ci interfejsów wysokiego poziomu, które mogą być znacznie wygodniejsze w obsłudze niż bazy danych z surowymi wykresami.

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.