2009-03-25 14 views
10

Dokumentacja Hbase wyjaśnia, że ​​należy grupować podobne kolumny w rodziny kolumn, ponieważ fizyczne przechowywanie odbywa się według rodziny kolumn.Hadoop Hbase: Rozmieszczanie rodzin kolumn w tabelach lub nie

Ale co to znaczy umieścić dwie rodziny kolumn w tej samej tabeli, w przeciwieństwie do oddzielnych tabel na grupę kolumn? Czy istnieją konkretne przypadki, gdy tabele "partycjonowania" w ten sposób mają większy sens i przypadki, w których jedna "szeroka" tabela działa lepiej?

Oddzielne tabele powinny prowadzić do oddzielnych "obszarów wierszy", co może być korzystne, gdy niektóre rodziny kolumn (jako całość) są bardzo rzadkie. I odwrotnie, kiedy byłoby korzystne, aby kolumny grup były ze sobą połączone?

Odpowiedz

8

Masz pomysł na rodziny kolumnowe: zasadniczo jest to tylko wskazówka dla HBase do przechowywania i replikacji tych elementów w celu szybszego dostępu.

Jeśli umieścisz dwie rodziny kolumn w tej samej tabeli i zawsze będziesz mieć do nich dostęp za pomocą różnych kluczy, oznacza to, że mają one dwie osobne tabele. Zyskujesz tylko dzięki posiadaniu dwóch rodzin kolumn w tej samej tabeli, do których można uzyskać dostęp za pomocą tych samych kluczy.

Na przykład: jeśli mam kolumny określające całkowitą liczbę odsłon danej witryny, liczbę unikalnych widoków dla tej samej witryny, przeglądarkę, której używa użytkownik do przeglądania witryny, oraz ich połączenie internetowe, mogę zdecyduj, że chcę, aby dwie pierwsze były rodziną kolumnową, a dwie ostatnie - kolejną kolumną rodziny. Tutaj wszystkie cztery są dostępne za pomocą tego samego klucza, a mianowicie strony internetowej, o której mowa, więc zyskuję, mając je w tym samym stole.

Jeśli są w różnych tabelach, musiałbym wykonać operację łączenia na dwóch stołach. Tak naprawdę nie znam liczb, więc nie mogę ci powiedzieć, jak powolna jest operacja podobna do łączenia (ponieważ nie pamiętam, że HBase ma połączenie, ponieważ nie jest relacyjna) i jaki jest punkt krytyczny, w którym dzielenie ich w osobnych tabelach przewyższają ich w tym samym stole (lub odwrotnie).

Oczywiście wszystko zależy od danych, które próbujesz zapisać, więc jeśli nigdy nie będziesz musiał łączyć się między tabelami, chcesz zachować je w osobnych tabelach, ponieważ możesz twierdzić, że nie są one takie związanych ze sobą w pierwszej kolejności.

+0

Mówisz "Dołącz jest drogi". Wydaje się to sugerować, że "łączenie" między grupami kolumn w tej samej tabeli jest tańsze niż łączenie grup kolumn w tabelach. Czy tak jest? Dokumenty HBase nie wydają mi się jasne, jak sądzę. – Thilo

+1

Myślę, że znacznie tańsze jest "łączenie" między kolumnami w tej samej tabeli, ponieważ jest to operacja "get" z dwiema kolumnami o nazwie i jest prymitywna w języku zapytań. "Dołączanie" nie jest jednak prymitywne i trzeba je wdrożyć na własną rękę (co wymaga więcej operacji). –

8

Rodziny kolumn są kompromisem między dostępem zorientowanym wierszem a kolumną. Aby rozszerzyć przykład strony internetowej Chrisa, dostęp do wiersza pobierałby wszystkie dane (kolumny) dla pojedynczej witryny internetowej. Przykładem operacji zorientowanej na kolumnę byłoby zsumowanie liczby odsłon stron we wszystkich witrynach.

Ta ostatnia operacja nie wymaga szczegółów przeglądarki i połączenia, które są znacznie większe niż wartości liczbowe dla liczby wyświetleń i mogłyby znacząco wpłynąć na wydajność zapytania. Dlatego HBase udostępnia rodziny kolumn jako optymalizację obsługującą operacje kolumnowe.

Co do tego, czy kolumny powinny znajdować się w tej samej tabeli ... Po prostu przestrzegałbym normalnych wytycznych modelowania danych i umieściłbym wszystkie kolumny w tej samej tabeli, jeśli są atrybutami tego samego obiektu. Rodziny kolumn dotyczą wydajności, a nie schematu.

+1

"Rodziny kolumn dotyczą wydajności, a nie schematu." To nie było dla mnie jasne, dopóki nie powiedziałeś tego. Dziękuję Ci. –

Powiązane problemy