воскресенье, 16 октября 2016 г.

воскресенье, 1 ноября 2015 г.

Неожиданная трансформация PostgreSQL


Вот уже который раз мне задают вопрос: "А зачем нужен весь этот NoSQL. Ведь реляционные СУБД уже вполне себе решают... Вот например зачем нужна Монга, ведь есть PostgreSQL, у него и шардинг есть и json?"

Дружочки, я со всей ответственностью заявляю, PostgreSQL - это уже таки NoSQL база данных :-)
Вы наверно скажете: "Толян, ты сошел с ума!". Ну хорошо, давайте размышлять. В Postgre добавили json - это значит обеспечили schemaless, со всеми вытекающими последствиями. В Postgre добавили шардирование - это значит что она теперь распределенная. А раз так, то она подчиняется CAP теореме, и ей приходиться идти на все те компромиссы, на которые приходиться идти NoSQL системам, чтобы обеспечить согласованность, доступность и устойчивость к разделению. Вы наверно скажете: "Толян, да этож всё равно не NoSQL, а NewSQL". Ребята, как по мне дак это один хрен. Это удел маркетологов, NoSQL от NewSQL отличать :-)

В общем когда начинают сравнивать Монгу и Постгре - говорить надо о двух NoSQL системах, со своими преимуществами и недостатками.

среда, 28 октября 2015 г.

Проблема с запуском Spark приложений под YARN


Получаем вот такое исключение:
Мол, не хватает ему дефолтных значений памяти

Exception in thread "main" java.lang.IllegalArgumentException: Required executor memory (1024+384 MB) is above the max threshold (1024 MB) of this cluster!

Лечиться установкой в конфигурации YARN вот этих параметров в нужные значения:

yarn.nodemanager.resource.memory-mb 
yarn.scheduler.maximum-allocation-mb 

Требуется перезапуск YARN

вторник, 27 октября 2015 г.

Upgrade Java on Cloudera cluster


Ну вот и настало время ставить Java 8 на наш Cloudera-вский кластер.
Как оказалось - это не так уж сложно.

  1. Ствим на все ноды новую версию Java
  2. Тушим кластер
  3. Открываем на каждой рабочей ноде файл:
    /etc/default/cloudera-scm-agent
    и прописываем переменную: 
    export CMF_AGENT_JAVA_HOME="/usr/lib/jvm/java-8-oracle"
  4. Делаем тоже самое для ноды на которой стоит Cloudera manager, плюс открываем файл: /etc/default/cloudera-scm-server
    и прописываем переменную:
    export JAVA_HOME="/usr/lib/jvm/java-8-oracle"
  5. Запускаем кластер
Вот и всё

пятница, 27 марта 2015 г.

Dozebsbit 1.0 Release!

Напилил свой поисковый Java-кеш с блекджеком и low-latency. Дал ему чисто русское, православное имя - Dozensbit 
Если у вас много не структурированных данных, и надо очень быстро выполнять по ним поиск, то это то что вам надо.
Пример: Предположим у нас есть объекты с разным количеством атрибутов. По сути schema-less
User0 : {
  Name : John,
  Age : 32,
  City : [Berlin, Dresden],
}

User1 : {
  Name : Ann,
  Gender : female,
  City : NY,
  HasChildren: true
}
А еще нам надо выполнить вот такой поисковый запрос:
SEARCH User WHERE (City = NY OR City = Berlin) AND Gender = female
Всё это возможно.
Cache<string> cache = new IndexedCache<string>();

MultiValueMap attributes1 = new MultiValueMap();
attributes1.put("name", "john");
attributes1.put("age", "32");
attributes1.put("city", "berlin");
attributes1.put("city", "dresden");

cache.put("This is user #1", attributes1);

//А можно для лаконичности использовать Utils.toMap
cache.put("This is user #2", Utils.toMap("{name:ann,gender:female,city:ny}"));

cache.commit();

QueryBuilder builder = cache.createQuery();

QueryBuilder.Query query = builder
                .start("city", "ny")
                .or("city", "berlin")
                .and("gender", "female")
                .get();

List<string> result = cache.find(query);
Но и это еще не всё. Можно выполнять сложные выборки
QueryBuilder.Query query = cache.createQuery()
               .start(
                        cache.createQuery()
                                .start("city", "berlin")
                                .or("city", "moscow")
                                .get()
                ).and(
                        cache.createQuery()
                                .start("lang", "ru")
                                .or("lang", "en")
                                .get()
                )
                .get();

List<string> result = cache.find(query);
Всё это thread-safe и работает в многопоточной среде.
Выборка по миллиону объектов укладывается в 9 мс - в сложном случае, и 2 мс в простом.
Доступно на GitHub https://github.com/2anikulin/dozensbit/wiki
Там же более подробное описание и бенчмарк