Подтвердить что ты не робот

Почему многие относятся к Cassandra как к базе данных, ориентированной на столбцы?

Читая несколько документов и документов в Интернете, я нашел много противоречивой информации о модели данных Кассандры. Есть много таких, которые идентифицируют его как базу данных, ориентированную на столбцы, другую как ориентированную на ряд, а затем определяют ее как гибридный способ обоих.

В соответствии с тем, что я знаю о том, как Cassandra хранит файл, он использует файл * -Index.db для доступа в нужную позицию файла * -Data.db, где он хранит фильтр цветения, индекс столбца, а затем столбцы требуемой строки.

По-моему, это строго ориентировано на ряд. Что-то мне не хватает?

4b9b3361

Ответ 1

Да, терминология, ориентированная на столбцы, немного запутанна.

Модель в Cassandra состоит в том, что строки содержат столбцы. Чтобы получить доступ к самой маленькой единице данных (столбец), вы должны сначала указать имя строки (ключ), а затем имя столбца.

Таким образом, в столбце, который называется Fruit, у вас может быть структура, подобная приведенному ниже примеру (с двумя строками), где типы фруктов являются ключами строк, а столбцы имеют имя и значение.

apple -> colour  weight  price variety
         "red"   100     40    "Cox"

orange -> colour    weight  price  origin
          "orange"  120     50     "Spain"

Одно отличие от реляционной базы данных, основанной на таблицах, состоит в том, что можно опустить столбцы (оранжевые не имеют разнообразия) или добавить произвольные столбцы (оранжевые имеют происхождение) в любое время. Вы все еще можете представить данные выше как таблицу, хотя и редкую, где многие значения могут быть пустыми.

Однако для списков и временных рядов также можно использовать "ориентированную на столбцы" модель, где каждое имя столбца уникально (и здесь у нас есть только одна строка, но у нас могут быть тысячи или миллионы столбцов):

temperature ->  2012-09-01  2012-09-02  2012-09-03 ...
                40          41          39         ...

который сильно отличается от реляционной модели, где нужно было бы моделировать записи временного ряда как rows not columns.

Ответ 2

Кассандра является секционированным хранилищем строк. Строки организованы в таблицы с необходимым первичным ключом.

Разметка означает, что Cassandra может распространять ваши данные через несколько машин в прозрачном приложении. Кассандра автоматическое перераспределение, поскольку машины добавляются и удаляются из кластера.

Хранилище строк означает, что, как реляционные базы данных, Cassandra организует данные по строкам и столбцам.

  • Столбец-ориентированные или столбчатые базы данных хранятся в столбце диска.

    например: Таблица Bonuses таблица

     ID         Last    First   Bonus
     1          Doe     John    8000
     2          Smith   Jane    4000
     3          Beck    Sam     1000
    
  • В ориентированной на строку системе управления базами данных данные будут храниться следующим образом: 1,Doe,John,8000;2,Smith,Jane,4000;3,Beck,Sam,1000;

  • В колонке ориентированной системе управления базами данных данные будут храниться следующим образом: 1,2,3;Doe,Smith,Beck;John,Jane,Sam;8000,4000,1000;

  • Кассандра в основном представляет собой хранилище семейства столбцов

  • Кассандра сохранит вышеуказанные данные, "Bounses" : { row1 : { "ID":1, "Last":"Doe", "First":"John", "Bonus":8000}, row2 : { "ID":2, "Last":"Smith", "First":"Jane", "Bonus":4000} ... }
  • Подробнее читайте здесь.

Надеюсь, что это поможет.

Ответ 3

Вы оба делаете хорошие очки, и это может сбить с толку. В примере, где

apple -> colour  weight  price variety
         "red"   100     40    "Cox"

apple - это ключевое значение, а столбец - это данные, которые содержат все 4 элемента данных. Из того, что было описано, похоже, что все 4 элемента данных хранятся вместе как один объект, а затем анализируются приложением, чтобы вытащить только требуемое значение. Поэтому с точки зрения IO мне нужно прочитать весь объект. ИМХО это по сути строка (или объект), основанная не на столбце.

Хранилище на основе столбцов стало популярным для складирования, поскольку оно предлагает экстремальное сжатие и сокращение ввода-вывода для полного сканирования таблицы (DW), но за счет увеличения IO для OLTP, когда вам нужно вытащить каждый столбец (выберите *). Большинство запросов не нуждаются в каждом столбце, и из-за сжатия IO может быть значительно уменьшено для полного сканирования таблицы всего за несколько столбцов. Позвольте мне привести пример

apple -> colour  weight  price variety
         "red"   100     40    "Cox"

grape -> colour  weight  price variety
         "red"   100     40    "Cox"

У нас есть два разных плода, но оба имеют цвет = красный. Если мы храним цвет на отдельной странице диска (блоке) по весу, цене и разнообразию, единственное, что хранится в цвете, тогда, когда мы сжимаем страницу, мы можем добиться экстремального сжатия из-за большого количества дублирования. Вместо того, чтобы хранить 100 строк (гипотетически) на странице, мы можем хранить 10 000 цветов. Теперь, чтобы читать все с красным цветом, это может быть 1 IO, а не тысячи IO, что действительно хорошо для хранения и аналитики, но плохо для OLTP, если мне нужно обновить всю строку, так как строка может содержать сотни столбцов и одну обновление (или вставка) может потребовать сотни IO.

Если мне не хватает чего-то, я бы не назвал этот столбец основанием, я бы назвал его объектно-ориентированным. По-прежнему неясно, как объекты расположены на диске. Являются ли несколько объектов размещены на одной странице диска? Есть ли способ обеспечить совместное использование объектов с одинаковыми метаданными? До такой степени, что один фрукт может содержать разные данные, чем другой плод, так как его просто метаданные или xml или все, что вы хотите сохранить в самом объекте, есть ли способ гарантировать, что определенные подходящие типы фруктов хранятся вместе для повышения эффективности?

Larry

Ответ 4

Семья столбцов не означает, что она ориентирована на столбцы. Cassandra - это семейство столбцов, но не ориентировано на столбцы. Он сохраняет строку со всеми ее семействами столбцов.

Hbase - это семейство столбцов, а также хранит семейства столбцов с ориентацией на столбцы. Различные семейства столбцов хранятся отдельно в node или могут находиться даже в разных node.