вторник, 29 мая 2012 г.

Erlang: первые шаги с Cassandra

Читая обзоры и  сравнения NoSQL решений, я нередко натыкался на мнение о том, что у Cassandra проблемы с документацией.  Пока я знакомился с архитектурой и  CLI-командами системы, проблема с документаций казалась устаревшей. Но  первая же попытка что-то сделать в Erlang  сразу уперлась в долгие часы гугления. По сему, для облегчения своей, и не только, дальнейшей трудовой деятельности выкладываю простенький "how to" по осуществлению базовых операций с Cassandra в Erlang.

1. Thrift 
Для работы с Cassandra в Erlang нужен клиент Thrift и для него сервис Cassandra.
Получить  клиент Thrift для Erlang можно так:
svn co http://svn.apache.org/repos/asf/thrift/trunk/ thrift
Далее скачиваем утилиту  thrift отсюда: http://thrift.apache.org/  и генерируем   сервис Сassandra (windows):
thrift-0.8.0.exe  --gen erl interface/cassandra.thrift
где interface/cassandra.thrift - thrift-файл из дистрибутива Cassandra.
Теперь у нас есть все, что необходимо для работы с Cassandra.

2. Подключение и запись

-include("cassandra_thrift.hrl").
-include("cassandra_types.hrl").
       *       *         *
{ok, C}=thrift_client_util:new("localhost", 9160, cassandra_thrift,[{framed, true}]).
{C1, _} = thrift_client:call(C, 'set_keyspace', ["my_keyspace"]).
thrift_client:call(C1,'insert', ["00000001", #columnParent{column_family="mq"}, #column{name="1234567",value="Hello World !", timestamp=0}, ?cassandra_ConsistencyLevel_ONE ]).



Erlang-клиент Thrift после каждой операции возвращает подключение. Это удобно для рекурсивных вызовов Erlang. Мудрые люди не рекомендуют использовать подключение однажды полученное   thrift_client_util:new(). Почему смотрите здесь: http://stackoverflow.com/questions/10503907/cassandra-thrift-erlang-insert
Не рекомендую  передовать подключение между процессами.
Осталось напомнить, что подключение необходимо закрывать, либо завершать процесс Erlang. Если отрыть слишком много подключений - Erlang  вернет ошибку 'system_limit', что в данном случае свидетельствует об исчерпании лимита системных handles. Количество handles  в windows  можно посмотреть с помощью Process Explorer.

Запись в super column:

{C1, _} =  thrift_client:call(Connect,'insert', [Mid, #columnParent{column_family=" cf_1 ", super_column = "col_A "}, #column{name="S",value= integer_to_list(MState), timestamp=0}, ?cassandra_ConsistencyLevel_ONE])

3. Чтение
try thrift_client:call(Connect,'get',[Key,  #columnPath{column_family="cf_1", super_column="col_A", column = "r"}, ?cassandra_ConsistencyLevel_ONE])  of
{_C1,{ok,Val}} -> dosome()
catch { _, {exception, {notFoundException} = Err}} -> doerr()
end. 
Как видите, спецификация колонки при чтении и записи различается. И Thrift-клиент  использует исключения (с Erlang я уже почти забыл что это такое).



4. Документация

Комментариев нет: