Читая обзоры и сравнения NoSQL решений, я нередко натыкался на мнение о том, что у Cassandra проблемы с документацией. Пока я знакомился с архитектурой и CLI-командами системы, проблема с документаций казалась устаревшей. Но первая же попытка что-то сделать в Erlang сразу уперлась в долгие часы гугления. По сему, для облегчения своей, и не только, дальнейшей трудовой деятельности выкладываю простенький «how to» по осуществлению базовых операций с Cassandra в Erlang.
1. Thrift
Для работы с Cassandra в Erlang нужен клиент Thrift и для него сервис Cassandra.
Получить клиент Thrift для Erlang можно так:
svn co svn.apache.org/repos/asf/thrift/trunk/ thrift
Далее скачиваем утилиту thrift отсюда: 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="myCF"}, #column{name="col_1",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. Документация
- thrift.apache.org/
- wiki.apache.org/cassandra/API
- Операции перечислены в сгенерированном cassandra_thrift.erl
- www.erlang.org/doc/efficiency_guide/advanced.html
Автор: angry_stitch