11 Распределенные хранилища данных
О.В. Сухорослов
11.05.2012
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 1 / 49
План лекции
Введение
HBase
Cassandra
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 2 / 49
Реляционные СУБД
Фиксированная схема, построчное хранение, ACID, SQL,абстрагирование от уровня хранения данныхИзначально не ориентированы на работу с большими объемамиданных в распределенном режиме (+ с высокими скоростямичтения-записи)
Решения по репликации и распределению существующих РСУБДПопытки исправить ситуацию задним числомСложны в установке и сопровожденииСтатическое разбиение данных
Большой частью функциональности приходится жертвоватьJoin, сложные запросы, триггеры, представления, внешние ключии контроль ссылочной целостностиСтановятся очень дорогими в распределенном режиме или вообщене работаютНе удовлетворяют высоким требованиям по скоростичтения-записи
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 3 / 49
Реляционные СУБД
Фиксированная схема, построчное хранение, ACID, SQL,абстрагирование от уровня хранения данныхИзначально не ориентированы на работу с большими объемамиданных в распределенном режиме (+ с высокими скоростямичтения-записи)
Решения по репликации и распределению существующих РСУБДПопытки исправить ситуацию задним числомСложны в установке и сопровожденииСтатическое разбиение данных
Большой частью функциональности приходится жертвоватьJoin, сложные запросы, триггеры, представления, внешние ключии контроль ссылочной целостностиСтановятся очень дорогими в распределенном режиме или вообщене работаютНе удовлетворяют высоким требованиям по скоростичтения-записи
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 3 / 49
Реляционные СУБД
Фиксированная схема, построчное хранение, ACID, SQL,абстрагирование от уровня хранения данныхИзначально не ориентированы на работу с большими объемамиданных в распределенном режиме (+ с высокими скоростямичтения-записи)
Решения по репликации и распределению существующих РСУБДПопытки исправить ситуацию задним числомСложны в установке и сопровожденииСтатическое разбиение данных
Большой частью функциональности приходится жертвоватьJoin, сложные запросы, триггеры, представления, внешние ключии контроль ссылочной целостностиСтановятся очень дорогими в распределенном режиме или вообщене работаютНе удовлетворяют высоким требованиям по скоростичтения-записи
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 3 / 49
Альтернативные решения (aka NoSQL1)
Изначально имеют распределенную архитектуру, ориентированнуюна горизонтальное масштабирование путем добавления новыхузлов
Нарушают классические принципы (нормализация данных,фиксированная схема, ACID) и отказываются от частифункциональности РСУБД (join, вторичные индексы)
Для большого класса задач позволяют делать то, чего не могутРСУБД
Хранить и обеспечивать быстрый, масштабируемый доступ к оченьбольшим таблицам на кластерах из массовых серверов
1http://en.wikipedia.org/wiki/NoSQL_(concept)О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 4 / 49
Пример: webtable
Таблица, хранящая загруженные поисковым роботом страницы иих атрибуты
Количество записей в таблице - миллиардыКлючом является URL страницыАтрибуты - загруженное содержание, язык, MIME-тип,обработанный текст, ссылки, изображения...
Работа с данными таблицыМассовая оффлайн обработка и аналитика (batch, MapReduce)Запись данных роботом (random access)Выдача закэшированного содержимого страниц поиском (randomaccess)
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 5 / 49
Примеры распределенных хранилищ
BigTable (Google)2
Dynamo (Amazon)3
HBaseCassandraVoldemortRiakHypertableMongoDBRedis...
Column vs Key-value storage2http://labs.google.com/papers/bigtable.html3http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 6 / 49
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 7 / 49
HBase
Распределенная “база данных” для HadoopОриентирована на случайный доступ к большим данным в режимереального времениРеализована по образу Google BigtableРаботает поверх HDFS
Проект Apache (май 2010)http://hbase.apache.org/
ПользователиFacebook, Twitter, Yahoo! ...
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 8 / 49
Точнее...
Distributed,Versioned,Column-Oriented,High-Availability,High-PerformanceStore
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 9 / 49
Концептуальная модель данных
Поименованные таблицы, в строках которых хранятся данные
Каждая строка таблицы имеетКлюч (primary key)Произвольный набор колонок
Колонки сгруппированы в “семейства” (column family)Семейства колонок должны быть заданы при создании таблицыВсе колонки семейства имеют общий префикс
content:data, content:language, content:type
Новые колонки внутри семейства можно создавать в любой момент
Внутри ячеек таблицы хранятся данныеПоддерживается хранение несколько версий данныхПо умолчанию версия идентифицируется с помощью временизаписи (timestamp)
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 10 / 49
Концептуальная модель данных
Поименованные таблицы, в строках которых хранятся данные
Каждая строка таблицы имеетКлюч (primary key)Произвольный набор колонок
Колонки сгруппированы в “семейства” (column family)Семейства колонок должны быть заданы при создании таблицыВсе колонки семейства имеют общий префикс
content:data, content:language, content:type
Новые колонки внутри семейства можно создавать в любой момент
Внутри ячеек таблицы хранятся данныеПоддерживается хранение несколько версий данныхПо умолчанию версия идентифицируется с помощью временизаписи (timestamp)
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 10 / 49
Концептуальная модель данных
Поименованные таблицы, в строках которых хранятся данные
Каждая строка таблицы имеетКлюч (primary key)Произвольный набор колонок
Колонки сгруппированы в “семейства” (column family)Семейства колонок должны быть заданы при создании таблицыВсе колонки семейства имеют общий префикс
content:data, content:language, content:type
Новые колонки внутри семейства можно создавать в любой момент
Внутри ячеек таблицы хранятся данныеПоддерживается хранение несколько версий данныхПо умолчанию версия идентифицируется с помощью временизаписи (timestamp)
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 10 / 49
Концептуальная модель данных
Поименованные таблицы, в строках которых хранятся данные
Каждая строка таблицы имеетКлюч (primary key)Произвольный набор колонок
Колонки сгруппированы в “семейства” (column family)Семейства колонок должны быть заданы при создании таблицыВсе колонки семейства имеют общий префикс
content:data, content:language, content:type
Новые колонки внутри семейства можно создавать в любой момент
Внутри ячеек таблицы хранятся данныеПоддерживается хранение несколько версий данныхПо умолчанию версия идентифицируется с помощью временизаписи (timestamp)
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 10 / 49
Концептуальная модель данных
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 11 / 49
Физическая модель данных
Каждая ячейка таблицы хранится в виде(table, row, family:column, timestamp) -> dataПустые ячейки не хранятсяСодержимое ячейки является просто массивом байтНет встроенных типов данных
Строки таблицы отсортированы по ключу
Строки таблицы разбиты вертикально на семейства колонокДанные семейств колонок хранятся вместе (непрерывно на диске),в отсортированном порядке по rowid, column, timestamp
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 12 / 49
Физическая модель данных
Каждая ячейка таблицы хранится в виде(table, row, family:column, timestamp) -> dataПустые ячейки не хранятсяСодержимое ячейки является просто массивом байтНет встроенных типов данных
Строки таблицы отсортированы по ключу
Строки таблицы разбиты вертикально на семейства колонокДанные семейств колонок хранятся вместе (непрерывно на диске),в отсортированном порядке по rowid, column, timestamp
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 12 / 49
Физическая модель данных
Каждая ячейка таблицы хранится в виде(table, row, family:column, timestamp) -> dataПустые ячейки не хранятсяСодержимое ячейки является просто массивом байтНет встроенных типов данных
Строки таблицы отсортированы по ключу
Строки таблицы разбиты вертикально на семейства колонокДанные семейств колонок хранятся вместе (непрерывно на диске),в отсортированном порядке по rowid, column, timestamp
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 12 / 49
Физическая модель данных
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 13 / 49
Структура данных
1 SortedMap(2 RowKey , List(3 SortedMap(4 Column , List(5 Value , Timestamp6 )7 )8 )9 )
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 14 / 49
Row-oriented vs Column-oriented
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 15 / 49
Пример
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 16 / 49
Распределеное хранение данных
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 17 / 49
Распределение данных в HBase
Разбиение данныхТаблицы разбиваются горизонтально на регионы
[startkey , endkey)В самом начале таблица состоит из одного регионаПо мере увеличения размера таблицы происходит автоматическоеразбиение данных на новые регионы
Регионы распределяются между серверами HBase-кластера
Репликация данныхДанные регионов хранятся и реплицируются в HDFS
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 18 / 49
Архитектура HBase-кластера
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 19 / 49
Подробности
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 20 / 49
Доступ к данным
Создание и удаление таблиц, колонок
Чтение данных (Get, Scan)По ключу: все или определенные колонки для строки с даннымключомПо времени: самое позднее значение, определенный моментвремени, N значений, все значенияПо диапазону: итератор по строкам (Scanner)
Начальный и конечный ключи, набор колонок, фильтр
Запись данных (Put)Атомарные изменения одной строки (row lock)Multi-row locking (new)
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 21 / 49
Клиентские интерфейсы
Интерфейс командной строкиHBase Shell
Программный интерфейсJava API
Удаленные программные интерфейсыAvro, REST, Thrift
Web-интерфейс
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 22 / 49
HBase Shell
1 hadoop2 -00:~$ hbase shell2 HBase Shell; enter ’help <RETURN >’ for list of supported commands.3 Type "exit <RETURN >" to leave the HBase Shell4 Version 0.90.1 - cdh3u0 , r, Fri Mar 25 16:10:51 PDT 20115
6 hbase(main ):001:0 > create ’test ’, ’data ’7 0 row(s) in 12.5240 seconds8
9 hbase(main ):002:0 > list10 TABLE11 test12 1 row(s) in 0.0390 seconds13
14 hbase(main ):003:0 > put ’test ’, ’row1 ’, ’data:1’, ’value1 ’15 0 row(s) in 0.1270 seconds16
17 hbase(main ):004:0 > put ’test ’, ’row2 ’, ’data:2’, ’value2 ’18 0 row(s) in 0.0360 seconds19
20 hbase(main ):005:0 > put ’test ’, ’row3 ’, ’data:3’, ’value3 ’21 0 row(s) in 0.0310 seconds
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 23 / 49
HBase Shell
1 hbase(main ):006:0 > scan ’test ’2 ROW COLUMN+CELL3 row1 column=data:1, timestamp =1303416932470 , value=value14 row2 column=data:2, timestamp =1303416939804 , value=value25 row3 column=data:3, timestamp =1303416945399 , value=value36 3 row(s) in 0.2130 seconds7
8 hbase(main ):007:0 > disable ’test ’9 0 row(s) in 12.1800 seconds
10
11 hbase(main ):008:0 > drop ’test ’12 0 row(s) in 1.5430 seconds13
14 hbase(main ):009:0 > exit
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 24 / 49
Java API (org.apache.hadoop.hbase.client)
1 public class ExampleClient {2 public static void main(String [] args) throws IOException {3 Configuration config = HBaseConfiguration.create ();4
5 // Create table6 HBaseAdmin admin = new HBaseAdmin(config );7 HTableDescriptor htd = new HTableDescriptor("test");8 HColumnDescriptor hcd = new HColumnDescriptor("data");9 htd.addFamily(hcd);
10 admin.createTable(htd);11 byte [] tablename = htd.getName ();
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 25 / 49
Java API (org.apache.hadoop.hbase.client)
1 // Run some operations -- a put , a get , and a scan2 HTable table = new HTable(config , tablename );3 byte [] row1 = Bytes.toBytes("row1");4 Put p1 = new Put(row1);5 p1.add(Bytes.toBytes("data"), Bytes.toBytes("1"),6 Bytes.toBytes("value1"));7 table.put(p1);8 Get g = new Get(row1);9 Result result = table.get(g);
10 System.out.println("Get: " + result );11 Scan scan = new Scan ();12 ResultScanner scanner = table.getScanner(scan);13 try {14 for (Result scannerResult: scanner) {15 System.out.println("Scan: " + scannerResult );16 }17 } finally {18 scanner.close ();19 }20
21 // Drop the table22 admin.disableTable(tablename );23 admin.deleteTable(tablename );24 }25 }
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 26 / 49
HBase и Hadoop MapReduce
Пакет org.apache.hadoop.hbase.mapreduce
Форматы данныхTableInputFormat
один map на каждый регион таблицы
TableOutputFormat
Базовые классы Map и ReduceTableMapperTableReducer
Утилита TableMapReduceUtil
Примеры использованияHBASE_DIST/src/examples/mapreduceCellCounter4
4http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/mapreduce/CellCounter.java?view=markup
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 27 / 49
HBase vs СУБД
СУБД HBaseData layout Row-oriented Column-orientedТранзакции Multi-row ACID Single row only
Язык запросов SQL get/put/scan/...Индексы Произвольные колонки Ключи записей
Максимальный объем Терабайты 1PBЧтение/Запись 1K запросов/сек 1M запросов/сек
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 28 / 49
HBase vs HDFS?
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 29 / 49
Область применения HBase
ДаRandom read/writeБольшое кол-во операций/сек + большой объем данныхЧасто повторяющиеся запросы
НетAppend + read all dataУникальные запросы (ad-hoc analytics)Данные могут быть размещены на одном сервере
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 30 / 49
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 31 / 49
Apache Cassandra 5
Распределенное хранилище с моделью данных по образу BigTableи децентрализованной архитектурой по образу Dynamo
Первоначальная разработка - Inbox Search @ Facebook, приучастии авторов Amazon Dynamo2008 - open source2010 - проект Apache Software Foundation2010 - Facebook перешел на использование HBase
5http://cassandra.apache.org/О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 32 / 49
Модель данных
Keyspace = база данных (схема)Column family = таблица
статические / динамические
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 33 / 49
Типы данных
ValidatorОпределяет тип данных для ключей и значений колонок
ComparatorОпределяет тип данных для имен колонокОпределяет порядок сортировки (и хранения) колонок
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 34 / 49
Индексы
PrimaryПо значениям ключейСтроится автоматически
SecondaryПо значениям колонокСоздается по требованию
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 35 / 49
Распределение данных между узлами
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 36 / 49
Стратегия распределения данных
Определяется на уровне всего кластера
Random PatitionerИспользует стратегию consistent hashingtoken = MD5(row_key), 0− 2127
Обеспечивает равномерное распределение данных по узламРекомендуется использовать по-умолчанию
Ordered PartitionerДанные хранятся в отсортированном порядкеtoken = HEX(row_key_prefix)Позволяет делать range scansСложнее в настройке и администрировании
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 37 / 49
Репликация
Стратегия репликации определяется для каждого keyspaceКол-во реплик (replication factor)Распределение реплик по узлам
SimpleStrategyNetworkTopologyStrategy
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 38 / 49
Gossip
Децентрализованный (peer-to-peer) протокол, используемый дляобмена информацией между узлами
Состояние узла и других известных ему узловПозволяет достаточно быстро распространять информацию междуузлами
Seed nodes
Обнаружение отказов
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 39 / 49
Обработка запросов клиентов
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 40 / 49
Теорема CAP 6
В распределенной системе невозможно одновременно обеспечитьсвойства
согласованности данных (consistency)доступности (availability)устойчивости к разделению (partition tolerance)
Из трех свойств одновременно можно обеспечить только дваНеизбежный компромисс
Влияние на реализацию распределенного хранилищаВыбор реализуемых свойств на уровне системы (HBase=CP)Возможность выбора свойств пользователем на уровне отдельныхопераций (Cassandra)
6http://en.wikipedia.org/wiki/CAP_theoremО.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 41 / 49
Уровни согласованности
Могут быть указаны для каждой Read/Write-операции
ONEТребуется ответ только от одной реплики
QUORUM (LOCAL_QUORUM, EACH_QUORUM)Требуется ответ от большинства реплик
ALLТребуется ответ от всех реплик
ANY (только для записи)Требуется ответ от любого узла (не обязательно реплики)
Строгая согласованность достигается при(nodes_written + nodes_read) > replication_factorW=1, R=ALL | W=ALL, R=1 | W=Q, R=Q
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 42 / 49
Eventual Consistency
В любом случае гарантируется согласованность в конечном итогеНекоторое время после записи клиенты могут считыватьустаревшие данныеНо, в конечном итоге, записанные данные распространятся по всейсистеме
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 43 / 49
Базовые механизмы восстановления согласованности
См. Amazon Dynamo
Hinted HandoffRead repairAnti-Entropy
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 44 / 49
Атомарные операции и разрешение конфликтов
Атомарными являются только записи в одну строкуНесколько обновлений строки не являются атомарными
В случае неудачной записи, данные могут быть сохранены начасти репликОткаты не производятся
Для разрешения конфликтов используется timestamp,передаваемый клиентом при записи данных
При записи не осуществляется проверка на уникальность row key(UPSERT)
Есть риск случайно перезаписать данные
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 45 / 49
Распределенные счетчики 7
7http://www.datastax.com/wp-content/uploads/2011/07/cassandra_sf_counters.pdf
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 46 / 49
Клиенты
Thrift RPC API
Command-line (cassandra-cli)
Cassandra Query Language (CQL)Python, Java driverscqlsh
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 47 / 49
Cassandra Query Language (CQL)
1 $ cqlsh 103.263.89.126 91602 cqlsh > CREATE KEYSPACE twissandra WITH3 strategy_class = ’NetworkTopologyStrategy ’4 AND strategy_options:DC1 = 3;5
6 cqlsh > USE twissandra;7
8 cqlsh > CREATE COLUMNFAMILY users (9 ... KEY varchar PRIMARY KEY ,
10 ... password varchar ,11 ... gender varchar ,12 ... session_token varchar ,13 ... state varchar ,14 ... birth_year bigint );15
16 cqlsh > INSERT INTO users (KEY , password) VALUES17 (’jsmith ’, ’ch@ngem3a ’) USING TTL 86400;18 cqlsh > SELECT * FROM users WHERE KEY=’jsmith ’;19 u’jsmith ’ | u’password ’,u’ch@ngem3a ’ | u’ttl ’, 86400
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 48 / 49
Cassandra Query Language (CQL)
1 cqlsh > CREATE INDEX state_key ON users (state);2 cqlsh > CREATE INDEX birth_year_key ON users (birth_year );3
4 cqlsh > SELECT * FROM users5 WHERE state=’TX’ AND6 birth_year =’1968’;7 u’user1 ’ | u’birth_year ’ ,1968 | u’gender ’,u’f’ | ...
О.В. Сухорослов ()11 Распределенные хранилища данных 11.05.2012 49 / 49