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

в 8:07, , рубрики: cassandra, erlang, Erlang/OTP, thrift, метки: , ,

Читая обзоры и сравнения 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. Документация

Автор: angry_stitch


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js