SanchelliosProg
@SanchelliosProg
Java, Android, Software Testing

С чего начать изучать BigData?

Привет, народ. Решил я из обезьяны превратиться в человека. Давно решил, на самом деле, но не понимал как мне изучать алгоритмы и структуры данных, так чтоб было прям интересно до ужаса. Ну, не нужны мне они в повседневной жизни, получается, вот и как-то забываю ими заниматься.

Мой background - Java, Android + немножко Clojure, совсем немножко.

И вот решение, от которого, возможно, вы захотите, как добрые люди, меня отговорить. Уж где-где, а BigData алгоритмы и структуры данных - центральная тема. Могу, конечно, ошибатсья, но, как мне кажется вероятность мала. Но с чего начать? Гуглить, конечно, решение хорошее, но можно выбрать не то, а хочется то, в чём вы, прямо, уверены точно.

Хочу заметить, что тут не стоит задача стать мировым гением в этой сфере, просто так, для себя хочется, мозги, так сказать, поупражнять. Но перспективу полного внедрения в эту сферу я не исключаю, почему бы и нет. Главное - правильно начать и выбрать нужные материалы.

Очень надеюсь на ваши советы, друзья, и резюмируя:

Стоит ли изучать BigData вообще?
И с чего начать?
  • Вопрос задан
  • 16208 просмотров
Решения вопроса 1
voidnugget
@voidnugget
Программист-прагматик
BigData не очень то и связана со структурами данных - в основном это разнообразные пространственные структуры, скорее больше связана с алгоритмами NLP, классификации и машинного обучения.

В первую очередь нужно выбрать средство обработки и хранения.
В случае с Java это HBase Cassandra
HBase - когда пишется в базу очень много, и большинство индексов "самодельные".
Cassandra - когда соотношение чтения / записи 4:3, так как в Cassandra уже есть средства колоночной индексации.

В случае с реальным высоконагрузом это ScyllaDB - обладает теми же особенностями что и HBase, но С++11 и Share-nothing approach и от того в 6-7 раз шустрее.

Для БД до 200Гб хватит банального MySQL'я c R-tree индексом и Engine Archive.
Вот PostgreSQL при правильной настройке спокойно строит B-tree индексы для объёмов данных в 500-700Гб, что для MySQL'я непосильная задача Ну и в PostgreSQL часто приходится дописывать сишные функции агрегации и строить по ним разнообразные индексы, иногда пространственные (gin/gist).

Вот небольшой обзор разных типов индексов.

От себя ещё добавлю MVP-tree для поиска похожих персептивных хэшей и Fusion-tree как более съедобный вариант дерева Ван Емде Боаса.

По поводу хипстер-культа вокруг MongoDB - скажу что PostgreSQL с индексами на хэш-таблицах и небольшими множествами документов в 1.5-3 раза шустрее, потому что "Building Index with Vodka". А нормальная репликация и партицирование напрямую зависит от принципов решения задачи Консенсуса в каждом конкретном приложении, и без понимания работы Raft / Paxos не стоит надеятся на чудеса той же MongoDB или PostgreSQL, они являются не более чем инструментами для решения этой задачи.

MongoDB очень даже ничего для реактивных проектов на основе Meteor, а для всего остального уже GoldenHammer™.

По индексации, надо обязательно-обязательно прочитать книги Ханны Самет
Foundations of Multidimensional and Metric Data St... = Applications of Spatial Data Structures: Computer ... + The Design and Analysis of Spatial Data Structures

В принципе книжки Foundations of Multidimensional and Metric Structures должно хватить с головой, но можно "дочитывать" более полное описание в более древних работах. Одним словом тётка "жжёт", и я не знаю почему это до сих пор никто не перевёл.

Ну после того как разобрались что и где и как хранить, теперь можно думать по поводу обработки...
Есть древняя книжка "Алгоритмы интеллектуального Интернета" и "Программируем коллективный разум" Хоть названия переведены на русский довольно странно и звучат довольно наивно - это хорошее введение в простые средства обработки и анализа данных.

По машинному обучению можно пройти курс Эндрю Ына на курсере.

Есть Южный DataScience-централ, там есть много чего полезного. Его можно почитывать. Есть ещё поверхностные CheetSheet'ы, видел и получше, но не нашёл.

Как DeepLearning адепт советую разобраться с Theano, и методами описанными тут. В продакшенах эта штука до безобразия слоупочна и видел товарищей которые более-менее успешно слезли на Neon.

Если лезть в Java, то на примере Spotify чаще всего используются связки
Apache Kafka -> Apache HBase -> Apache Storm -> Apache Spark (mllib) -> Apache HBase -> Apache Phoenix -> Hibernate + любой MVC фреймворк и т.п.

Естественно об относительно высокой производительности и хорошем вертикальном масштабировании речи не идёт, если брать C++11 ScyllaDB -> Neon хорошо отпрофилировать и допилить, можно получить в 3-5 раз выше производительность и соответственно гораздо меньшие задержки, но обычно всем влом. REST API под такое обычно пытаются писать на сях (без плюсов) в виде расширений под Nginx, что является довольно породистым извратом - в большинстве случаев банального golang/netty будет достаточно.

В Hadoop стэк сейчас принято не лезть, так как он очень "заынтерпрайсян" и без хорошей поддержки и допилки со стороны вендоров в реальных проектах просто неюзабелен, по этому почти все на него, в той или иной степени, забили. Например, тот же Spotify.

По поводу HA и Zookeeper можно увидеть много срача, особенно в Netflix'e, по этому для менеджмента высокой доступности лучше использовать именно их решения - eureka или для отказоустойчивости Hystrix. Хотя я не могу сказать что это достаточно зрелые проекты - в них тоже хватает изъянов, но они на много шустрее остальных Apache поделок.

Нельзя делать одновременно отказоустойчивые и высокодоступные приложения - потому что CAP теорема имеет место быть.

Ещё есть очень тонкий момент с Java в целом - нужно минимизировать время сборки мусора и лезть в offheap, стоит глянуть как реализованы буферы в netty - это arena аллокатор по типу того что используется jemalloc и различная misc.unsafe ересь. Можно ещё пробовать Hazelcast / Terracotta, но принципиально там тоже самое, только платно и "расспределённо".

Для REST API я чаще всего использую Vert.x и ванильную Java.
Overhead от Scala довольно таки большой, а время компиляции просто вырвиглазное.
Для минимизации копи-пасты вполне безопасно использовать Groovy c @ Immutable и @ CompileStatic.
Но в Vert.x'e он весь "динамичный" :|

Я ничего не могу сказать по поводу производительности Clojure, он местами через чур invokeDynamic. Естественно что ванильная Java будет шустрее, но я без понятия на сколько.

Желаю Вам приятного вечера.

p.s. не везде проставил ссылки просто потому что хочу спать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
dimonchik2013
@dimonchik2013
non progredi est regredi
1) читаешь книжку БигДата www.mann-ivanov-ferber.ru/books/paperbook/big-data
2) идешь на Каггл: https://www.kaggle.com/ осваиваешься
если в п.2 питонщики не побьют - можно в
3) лекции ШАД habrahabr.ru/company/yandex/blog/206058
(где-то в районе Яндекс блога на Хабре ссылки на остальное поищи)

чтобы не сдаться раньше времени - могещь еще материалы конференции посмотреть
bigdataconf.com.ua/2015/agenda

хз только где видео взять, и доклады кой-какие там годичной давности, но все равно
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
BigData - это хранилище множества постоянно собираемых однотипных данных, возможно как-то связанных между собой, обычно "расположенных" вдоль оси временной шкалы.
Для чего Вам собирать какие-то данные в таких объемах? - надо Вам решить ДО "погружения" в эту сферу!
И это зависит от конечной цели: возможно, маркетинговой.
Что может дать BigData в "сыром" виде? - большой объем бесполезных данных.
Что можно делать с помощью BigData? - Например, можно узнать зависимости одних параметров от других на выбранном временном отрезке.
Практические решения с применением BigData? - маркетинг, прогнозирование рисков, любая фильтрация, прогнозы и предсказания поведения изменений любых параметров, содержащихся в хранилище BigData.
Ответ написан
Комментировать
abs0lut
@abs0lut
просто так, для себя хочется, мозги, так сказать, поупражнять.

может тогда Haskell изучить?
Ответ написан
globuzer
@globuzer
gezgrouvingus progreszive ombusgrander greyderzux
имхо, чтобы понимать суть bigdata - нужно жить и понимать изнутри статистические процессы, вероятностные модели, чувствовать математику и не бояться математического анализа, как науки...
это база, база анализа данных, а потом уже инструмент - языки и среды программирования, технологии и тд...
Ответ написан
Комментировать
@ilyakmet
С чего начал я:
1. www.pvsm.ru/klassifikatsiya/40336
2. habrahabr.ru/post/264241 - сейчас на этом этапе.
3. https://yandexdataschool.ru/edu-process/courses/ma... - потом планирую
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы