2017-05-24 91 views
6

W jaki sposób osiąga się agregację za pomocą dynamodb? Mongodb i couchbase mają ograniczoną obsługę map.Jak przeprowadzić podstawową agregację z Dynamodb?

Powiedzmy, że budujemy blog technologiczny, na którym użytkownicy mogą publikować artykuły. I powiedz, że artykuły mogą być oznaczone.

user 
{ 
    id : 1235, 
    name : "John", 
    ... 
} 

article 
{ 
    id : 789, 
    title: "dynamodb use cases", 
    author : 12345 //userid 
    tags : ["dynamodb","aws","nosql","document database"] 
} 

W interfejsie użytkownika chcemy pokazać aktualne tagi użytkownika i odpowiednią liczbę.

Jak uzyskać następujące agregacje?

{ 
    userid : 12, 
    tag_stats:{ 
     "dynamodb" : 3, 
     "nosql" : 8 
    } 
} 

Będziemy dostarczać te dane za pośrednictwem interfejsu API odpoczynku i będzie on często wywoływany. Podobnie jak te informacje są wyświetlane na stronie głównej aplikacji.

  • Potrafię wyodrębnić wszystkie dokumenty i wykonać agregację na poziomie aplikacji. Ale czuję, że moje jednostki pojemności odczytu zostaną wyczerpane.
  • Można używać narzędzi takich jak EMR, redshift, bigquery, aws lambda. Ale myślę, że są one przeznaczone do celów przechowywania danych.

Chciałbym poznać inne i lepsze sposoby osiągnięcia tego samego. W jaki sposób osoby uzyskujące dynamiczne proste zapytania, takie jak te, wybrały dynamodb jako podstawowy magazyn danych, biorąc pod uwagę koszt i czas reakcji.

Odpowiedz

4

Krótka historia: Dynamo tego nie popiera. To nie jest kompilacja dla tego przypadku użycia. Jest przeznaczony do szybkiego dostępu do danych z niskim opóźnieniem. Po prostu nie obsługuje żadnej funkcji agregującej.

Masz trzy główne opcje:

  • Export DynamoDB danych do Redshift lub EMR Hive. Następnie możesz wykonywać zapytania SQL na nieaktualnych danych. Zaletą tego podejścia jest to, że zużywa on jednostki RCU tylko raz, ale będziesz trzymać się przestarzałych danych.

  • Użyj DynamoDB connector dla Hive i bezpośrednio zapytaj DynamoDB. Ponownie możesz pisać dowolne zapytania SQL, ale w tym przypadku będzie on bezpośrednio uzyskiwał dostęp do danych w DynamoDB. Minusem jest to, że będzie zużywał pojemność odczytu na każde zapytanie, które wykonujesz.

  • Zachowaj zagregowane dane w oddzielnej tabeli, używając DynamoDB streams. Na przykład możesz mieć tabelę UserId jako klucz partycji i zagnieżdżoną mapę z tagami i licznikami jako atrybut. Przy każdej aktualizacji oryginalnych danych strumienie DynamoDB wykonają funkcję Lambda lub jakiś kod na hostach, aby zaktualizować tabelę zbiorczą. Jest to najbardziej opłacalna metoda, ale musisz wdrożyć dodatkowy kod dla każdego nowego zapytania.

Oczywiście można wyodrębnić dane na poziomie aplikacji i zebrać je tam, ale nie polecałbym tego. Jeśli nie masz małego stolika, musisz pomyśleć o dławieniu, wykorzystując tylko część udostępnionej pojemności (chcesz zużywać, powiedzmy, 20% twoich RCU dla agregacji, a nie 100%) i jak rozprowadzać swoją pracę wśród wielu pracowników .

Zarówno Redshift, jak i Hive już wiedzą, jak to zrobić. Redshift opiera się na wielu węzłach roboczych, gdy wykonuje zapytanie, a Hive opiera się na Map-Reduce.Ponadto, zarówno Redshift, jak i Hive mogą wykorzystywać predefiniowany procent twojej przepustowości RCU.